/*
 * Miscellaneous helpers for common operations.
 */

// TOP

#if !defined(FCODER_HELPER_H)
#define FCODER_HELPER_H

// TODO(allen): Stop handling files this way!  My own API should be able to do this!!?!?!?!!?!?!!!!?
// NOTE(allen): Actually need binary buffers for some stuff to work, but not this parsing thing here.
#include <stdio.h>

struct Bind_Helper{
    Binding_Unit *cursor, *start, *end;
    Binding_Unit *header, *group;
    i32 write_total;
    i32 error;
};

#define BH_ERR_NONE 0
#define BH_ERR_MISSING_END 1
#define BH_ERR_MISSING_BEGIN 2
#define BH_ERR_OUT_OF_MEMORY 3

struct Bind_Buffer{
    void *data;
    i32 size;
};

////////////////////////////////

struct File_Handle_Path{
    FILE *file;
    String path;
};

struct File_Name_Data{
    String file_name;
    String data;
};

struct File_Name_Path_Data{
    String file_name;
    String path;
    String data;
};

////////////////////////////////

struct Buffer_Rect{
    i32 char0;
    i32 line0;
    i32 char1;
    i32 line1;
};

////////////////////////////////

struct Stream_Chunk{
    Application_Links *app;
    Buffer_Summary *buffer;
    
    char *base_data;
    i32 start;
    i32 end;
    i32 min_start;
    i32 max_end;
    b32 add_null;
    u32 data_size;
    
    char *data;
};

// NOTE(allen|4.0.31): Stream_Tokens has been deprecated in favor of the Token_Iterator below.
// For examples of usage: 4coder_function_list.cpp 4coder_scope_commands.cpp
// If you want to keep your code working easily uncomment the typedef for Stream_Tokens.
struct Stream_Tokens_DEP{
    Application_Links *app;
    Buffer_Summary *buffer;
    
    Cpp_Token *base_tokens;
    Cpp_Token *tokens;
    i32 start;
    i32 end;
    i32 count;
    i32 token_count;
};
//typedef Stream_Tokens_DEP Stream_Tokens;

struct Token_Range{
    Cpp_Token *first;
    Cpp_Token *one_past_last;
};

struct Token_Iterator{
    // TODO(allen): source buffer
    Cpp_Token *token;
    Token_Range range;
};

////////////////////////////////

struct Sort_Pair_i32{
    i32 index;
    i32 key;
};

////////////////////////////////

struct Buffer_Insertion
{
    Application_Links *app;
    Buffer_ID buffer;
    i32 at;
};

#endif

// BOTTOM