/*
 * Mr. 4th Dimention - Allen Webster
 *
 * 24.03.2018
 *
 * Code wrapping logic
 *
 */

// TOP

#if !defined(FRED_CODE_WRAP_H)
#define FRED_CODE_WRAP_H

struct Code_Wrap_X{
    f32 base_x;
    f32 paren_nesting[32];
    i32 paren_safe_top;
    i32 paren_top;
};
global Code_Wrap_X null_wrap_x  = {};

struct Code_Wrap_State{
    Cpp_Token_Array token_array;
    Cpp_Token *token_ptr;
    Cpp_Token *end_token;
    
    Code_Wrap_X wrap_x;
    
    b32 in_pp_body;
    Code_Wrap_X plane_wrap_x;
    
    i32 *line_starts;
    i32 line_count;
    i32 line_index;
    i32 next_line_start;
    
    f32 x;
    b32 consume_newline;
    
    Gap_Buffer_Stream stream;
    i32 size;
    i32 i;
    
    Font_Pointers font;
    f32 tab_indent_amount;
    f32 byte_advance;
    
    Translation_State tran;
    Translation_Emits emits;
    u32 J;
    Buffer_Model_Step step;
    Buffer_Model_Behavior behavior;
};

struct Code_Wrap_Step{
    i32 position_start;
    i32 position_end;
    
    f32 start_x;
    f32 final_x;
    
    Cpp_Token *this_token;
};

struct Wrap_Current_Shift{
    f32 shift;
    b32 adjust_top_to_this;
};

internal void
file_measure_wraps(System_Functions *system, Mem_Options *mem, Editing_File *file, Font_Pointers font);

#endif

// BOTTOM