Merge branch 'master' of https://bitbucket.org/4coder/4coder
commit
8862c2b5b6
File diff suppressed because one or more lines are too long
|
@ -458,6 +458,56 @@ get_indentation_marks(Application_Links *app, Partition *part, Buffer_Summary *b
|
||||||
return(indent_marks);
|
return(indent_marks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_indent_lines_minimum(Application_Links *app, Buffer_Summary *buffer,
|
||||||
|
int32_t start_pos, int32_t end_pos,
|
||||||
|
int32_t *line_start_out, int32_t *line_end_out){
|
||||||
|
int32_t line_start = buffer_get_line_index(app, buffer, start_pos);
|
||||||
|
int32_t line_end = buffer_get_line_index(app, buffer, end_pos) + 1;
|
||||||
|
|
||||||
|
*line_start_out = line_start;
|
||||||
|
*line_end_out = line_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_indent_lines_whole_tokens(Application_Links *app, Buffer_Summary *buffer, Cpp_Token_Array tokens,
|
||||||
|
int32_t start_pos, int32_t end_pos,
|
||||||
|
int32_t *line_start_out, int32_t *line_end_out){
|
||||||
|
int32_t line_start = buffer_get_line_index(app, buffer, start_pos);
|
||||||
|
int32_t line_end = buffer_get_line_index(app, buffer, end_pos);
|
||||||
|
|
||||||
|
for (;line_start > 0;){
|
||||||
|
int32_t line_start_pos = 0;
|
||||||
|
Cpp_Token *token = get_first_token_at_line(app, buffer, tokens, line_start, &line_start_pos);
|
||||||
|
if (token->start < line_start_pos){
|
||||||
|
line_start = buffer_get_line_index(app, buffer, token->start);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;line_end+1 < buffer->line_count;){
|
||||||
|
int32_t next_line_start_pos = 0;
|
||||||
|
Cpp_Token *token = get_first_token_at_line(app, buffer, tokens, line_end+1, &next_line_start_pos);
|
||||||
|
if (token && token->start < next_line_start_pos){
|
||||||
|
line_end = buffer_get_line_index(app, buffer, token->start+token->size);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (line_end >= buffer->line_count){
|
||||||
|
line_end = buffer->line_count;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
line_end += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*line_start_out = line_start;
|
||||||
|
*line_end_out = line_end;
|
||||||
|
}
|
||||||
|
|
||||||
static bool32
|
static bool32
|
||||||
buffer_auto_indent(Application_Links *app, Partition *part, Buffer_Summary *buffer,
|
buffer_auto_indent(Application_Links *app, Partition *part, Buffer_Summary *buffer,
|
||||||
int32_t start, int32_t end, int32_t tab_width, Auto_Indent_Flag flags){
|
int32_t start, int32_t end, int32_t tab_width, Auto_Indent_Flag flags){
|
||||||
|
@ -468,25 +518,32 @@ buffer_auto_indent(Application_Links *app, Partition *part, Buffer_Summary *buff
|
||||||
|
|
||||||
Temp_Memory temp = begin_temp_memory(part);
|
Temp_Memory temp = begin_temp_memory(part);
|
||||||
|
|
||||||
// Stage 1: Setup
|
// Stage 1: Read the tokens to be used for indentation.
|
||||||
// Read the tokens to be used for indentation.
|
|
||||||
// Get the first and last lines to indent.
|
|
||||||
Cpp_Token_Array tokens;
|
Cpp_Token_Array tokens;
|
||||||
tokens.count = app->buffer_token_count(app, buffer);
|
tokens.count = app->buffer_token_count(app, buffer);
|
||||||
tokens.max_count = tokens.count;
|
tokens.max_count = tokens.count;
|
||||||
tokens.tokens = push_array(part, Cpp_Token, tokens.count);
|
tokens.tokens = push_array(part, Cpp_Token, tokens.count);
|
||||||
app->buffer_read_tokens(app, buffer, 0, tokens.count, tokens.tokens);
|
app->buffer_read_tokens(app, buffer, 0, tokens.count, tokens.tokens);
|
||||||
|
|
||||||
int32_t line_start = buffer_get_line_index(app, buffer, start);
|
// Stage 2: Decide where the first and last lines are.
|
||||||
int32_t line_end = buffer_get_line_index(app, buffer, end) + 1;
|
// The lines in the range [line_start,line_end) will be indented.
|
||||||
|
int32_t do_whole_tokens = 1;
|
||||||
|
|
||||||
// Stage 2: Decide Indent Amounts
|
int32_t line_start = 0, line_end = 0;
|
||||||
// Get an array representing how much each line in [line_start,line_end]
|
if (do_whole_tokens){
|
||||||
// should be indented.
|
get_indent_lines_whole_tokens(app, buffer, tokens, start, end, &line_start, &line_end);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
get_indent_lines_minimum(app, buffer, start, end, &line_start, &line_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stage 3: Decide Indent Amounts
|
||||||
|
// Get an array representing how much each line in
|
||||||
|
// the range [line_start,line_end) should be indented.
|
||||||
int32_t *indent_marks =
|
int32_t *indent_marks =
|
||||||
get_indentation_marks(app, part, buffer, tokens, line_start, line_end, tab_width);
|
get_indentation_marks(app, part, buffer, tokens, line_start, line_end, tab_width);
|
||||||
|
|
||||||
// Stage 3: Set the Line Indents
|
// Stage 4: Set the Line Indents
|
||||||
Indent_Options opts = {0};
|
Indent_Options opts = {0};
|
||||||
opts.empty_blank_lines = (flags & AutoIndent_ClearLine);
|
opts.empty_blank_lines = (flags & AutoIndent_ClearLine);
|
||||||
opts.use_tabs = (flags & AutoIndent_UseTab);
|
opts.use_tabs = (flags & AutoIndent_UseTab);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#define EXEC_COMMAND_SIG(n) bool32 n(Application_Links *app, Command_ID command_id)
|
#define EXEC_COMMAND_SIG(n) bool32 n(Application_Links *app, Command_ID command_id)
|
||||||
#define EXEC_SYSTEM_COMMAND_SIG(n) bool32 n(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int32_t path_len, char *command, int32_t command_len, Command_Line_Input_Flag flags)
|
#define EXEC_SYSTEM_COMMAND_SIG(n) bool32 n(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int32_t path_len, char *command, int32_t command_len, Command_Line_Interface_Flag flags)
|
||||||
#define CLIPBOARD_POST_SIG(n) void n(Application_Links *app, int32_t clipboard_id, char *str, int32_t len)
|
#define CLIPBOARD_POST_SIG(n) void n(Application_Links *app, int32_t clipboard_id, char *str, int32_t len)
|
||||||
#define CLIPBOARD_COUNT_SIG(n) int32_t n(Application_Links *app, int32_t clipboard_id)
|
#define CLIPBOARD_COUNT_SIG(n) int32_t n(Application_Links *app, int32_t clipboard_id)
|
||||||
#define CLIPBOARD_INDEX_SIG(n) int32_t n(Application_Links *app, int32_t clipboard_id, int32_t item_index, char *out, int32_t len)
|
#define CLIPBOARD_INDEX_SIG(n) int32_t n(Application_Links *app, int32_t clipboard_id, int32_t item_index, char *out, int32_t len)
|
||||||
|
|
|
@ -282,7 +282,7 @@ default_keys(Bind_Helper *context){
|
||||||
|
|
||||||
bind(context, key_f2, MDFR_NONE, toggle_mouse);
|
bind(context, key_f2, MDFR_NONE, toggle_mouse);
|
||||||
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
|
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
|
||||||
bind(context, key_f4, MDFR_ALT, exit_4coder);
|
bind(context, 'E', MDFR_ALT, exit_4coder);
|
||||||
|
|
||||||
end_map(context);
|
end_map(context);
|
||||||
|
|
||||||
|
|
|
@ -364,11 +364,10 @@ buffer_seek_string_forward(Application_Links *app, Buffer_Summary *buffer,
|
||||||
read_str.size = size;
|
read_str.size = size;
|
||||||
|
|
||||||
char chunk[1024];
|
char chunk[1024];
|
||||||
int32_t chunk_size = sizeof(chunk);
|
|
||||||
Stream_Chunk stream = {0};
|
Stream_Chunk stream = {0};
|
||||||
stream.max_end = end;
|
stream.max_end = end;
|
||||||
|
|
||||||
if (init_stream_chunk(&stream, app, buffer, pos, chunk, chunk_size)){
|
if (init_stream_chunk(&stream, app, buffer, pos, chunk, sizeof(chunk))){
|
||||||
int32_t still_looping = 1;
|
int32_t still_looping = 1;
|
||||||
do{
|
do{
|
||||||
for(; pos < stream.end; ++pos){
|
for(; pos < stream.end; ++pos){
|
||||||
|
@ -419,11 +418,10 @@ buffer_seek_string_backward(Application_Links *app, Buffer_Summary *buffer,
|
||||||
read_str.size = size;
|
read_str.size = size;
|
||||||
|
|
||||||
char chunk[1024];
|
char chunk[1024];
|
||||||
int32_t chunk_size = sizeof(chunk);
|
|
||||||
Stream_Chunk stream = {0};
|
Stream_Chunk stream = {0};
|
||||||
stream.min_start = min;
|
stream.min_start = min;
|
||||||
|
|
||||||
if (init_stream_chunk(&stream, app, buffer, pos, chunk, chunk_size)){
|
if (init_stream_chunk(&stream, app, buffer, pos, chunk, sizeof(chunk))){
|
||||||
int32_t still_looping = 1;
|
int32_t still_looping = 1;
|
||||||
do{
|
do{
|
||||||
for(; pos >= stream.start; --pos){
|
for(; pos >= stream.start; --pos){
|
||||||
|
@ -573,7 +571,8 @@ buffer_get_line_index(Application_Links *app, Buffer_Summary *buffer, int32_t po
|
||||||
}
|
}
|
||||||
|
|
||||||
static Cpp_Token*
|
static Cpp_Token*
|
||||||
get_first_token_at_line(Application_Links *app, Buffer_Summary *buffer, Cpp_Token_Array tokens, int32_t line){
|
get_first_token_at_line(Application_Links *app, Buffer_Summary *buffer, Cpp_Token_Array tokens, int32_t line,
|
||||||
|
int32_t *line_start_out = 0){
|
||||||
int32_t line_start = buffer_get_line_start(app, buffer, line);
|
int32_t line_start = buffer_get_line_start(app, buffer, line);
|
||||||
Cpp_Get_Token_Result get_token = cpp_get_token(&tokens, line_start);
|
Cpp_Get_Token_Result get_token = cpp_get_token(&tokens, line_start);
|
||||||
|
|
||||||
|
@ -581,7 +580,14 @@ get_first_token_at_line(Application_Links *app, Buffer_Summary *buffer, Cpp_Toke
|
||||||
get_token.token_index += 1;
|
get_token.token_index += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Cpp_Token *result = tokens.tokens + get_token.token_index;
|
if (line_start_out){
|
||||||
|
*line_start_out = line_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cpp_Token *result = 0;
|
||||||
|
if (get_token.token_index < tokens.count){
|
||||||
|
result = tokens.tokens + get_token.token_index;
|
||||||
|
}
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,7 @@ access call. An access call is usually one the returns a summary struct. If a
|
||||||
4coder object has a particular protection flag set and the corresponding bit is
|
4coder object has a particular protection flag set and the corresponding bit is
|
||||||
not set in the access field, that 4coder object is hidden. On the other hand if
|
not set in the access field, that 4coder object is hidden. On the other hand if
|
||||||
a protection flag is set in the access parameter and the object does not have
|
a protection flag is set in the access parameter and the object does not have
|
||||||
that protection flag, the object is still returned from the access call.) TODO */
|
that protection flag, the object is still returned from the access call.) */
|
||||||
ENUM(uint32_t, Access_Flag){
|
ENUM(uint32_t, Access_Flag){
|
||||||
/* DOC(AccessOpen does not include any bits, it indicates that the access should
|
/* DOC(AccessOpen does not include any bits, it indicates that the access should
|
||||||
only return objects that have no protection flags set.) */
|
only return objects that have no protection flags set.) */
|
||||||
|
@ -218,6 +218,23 @@ ENUM(uint32_t, Access_Flag){
|
||||||
AccessAll = 0xFF
|
AccessAll = 0xFF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* DOC(A Dirty_State value describes whether changes have been made to a buffer
|
||||||
|
or to an underlying file since the last sync time between the two. Saving a buffer
|
||||||
|
to it's file or loading the buffer from the file both act as sync points.) */
|
||||||
|
ENUM(uint32_t, Dirty_State){
|
||||||
|
/* DOC(DirtyState_UpToDate indicates that there are no unsaved changes and
|
||||||
|
the underlying system file still agrees with the buffer's state.) */
|
||||||
|
DirtyState_UpToDate,
|
||||||
|
|
||||||
|
/* DOC(DirtyState_UnsavedChanges indicates that there have been changes in the
|
||||||
|
buffer since the last sync point.) */
|
||||||
|
DirtyState_UnsavedChanges,
|
||||||
|
|
||||||
|
/* DOC(DirtyState_UnsavedChanges indicates that the underlying file has been
|
||||||
|
edited since the last sync point with the buffer.) */
|
||||||
|
DirtyState_UnloadedChanges
|
||||||
|
};
|
||||||
|
|
||||||
/* DOC(A Seek_Boundary_Flag field specifies a set of "boundary" types used in seeks for the
|
/* DOC(A Seek_Boundary_Flag field specifies a set of "boundary" types used in seeks for the
|
||||||
beginning or end of different types of words.) */
|
beginning or end of different types of words.) */
|
||||||
ENUM(uint32_t, Seek_Boundary_Flag){
|
ENUM(uint32_t, Seek_Boundary_Flag){
|
||||||
|
@ -227,8 +244,8 @@ ENUM(uint32_t, Seek_Boundary_Flag){
|
||||||
BoundaryCamelCase = 0x8
|
BoundaryCamelCase = 0x8
|
||||||
};
|
};
|
||||||
|
|
||||||
/* DOC(A Command_Line_Input_Flag field specifies the behavior of a call to a command line interface.) */
|
/* DOC(A Command_Line_Interface_Flag field specifies the behavior of a call to a command line interface.) */
|
||||||
ENUM(uint32_t, Command_Line_Input_Flag){
|
ENUM(uint32_t, Command_Line_Interface_Flag){
|
||||||
/* DOC(If CLI_OverlapWithConflict is set if output buffer of the new command is already
|
/* DOC(If CLI_OverlapWithConflict is set if output buffer of the new command is already
|
||||||
in use by another command which is still executing, the older command relinquishes control
|
in use by another command which is still executing, the older command relinquishes control
|
||||||
of the buffer and both operate simultaneously with only the newer command outputting to
|
of the buffer and both operate simultaneously with only the newer command outputting to
|
||||||
|
@ -561,7 +578,8 @@ struct Buffer_Edit{
|
||||||
};
|
};
|
||||||
|
|
||||||
/* DOC(Buffer_Summary acts as a handle to a buffer and describes the state of the buffer.)
|
/* DOC(Buffer_Summary acts as a handle to a buffer and describes the state of the buffer.)
|
||||||
DOC_SEE(Access_Flag) */
|
DOC_SEE(Access_Flag)
|
||||||
|
DOC_SEE(Dirty_State) */
|
||||||
struct Buffer_Summary{
|
struct Buffer_Summary{
|
||||||
/* DOC(
|
/* DOC(
|
||||||
This field indicates whether the Buffer_Summary describes a buffer that is open in 4coder.
|
This field indicates whether the Buffer_Summary describes a buffer that is open in 4coder.
|
||||||
|
@ -595,6 +613,9 @@ struct Buffer_Summary{
|
||||||
/* DOC(This field specifies the length of the buffer_name string.) */
|
/* DOC(This field specifies the length of the buffer_name string.) */
|
||||||
int32_t buffer_name_len;
|
int32_t buffer_name_len;
|
||||||
|
|
||||||
|
/* DOC(This field indicates the dirty state of the buffer.) */
|
||||||
|
Dirty_State dirty;
|
||||||
|
|
||||||
/* DOC(If this is not a null summary, this field indicates whether the buffer is set to lex tokens.) */
|
/* DOC(If this is not a null summary, this field indicates whether the buffer is set to lex tokens.) */
|
||||||
bool32 is_lexed;
|
bool32 is_lexed;
|
||||||
/* DOC(If this is not a null summary, this field indicates whether the buffer has up to date tokens available.
|
/* DOC(If this is not a null summary, this field indicates whether the buffer has up to date tokens available.
|
||||||
|
|
|
@ -15,8 +15,10 @@
|
||||||
#define FCPP_INTERNAL FCPP_LINK
|
#define FCPP_INTERNAL FCPP_LINK
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#define FSTRING_IMPLEMENTATION
|
#if !defined(FSTRING_GUARD)
|
||||||
#include "4coder_string.h"
|
# define FSTRING_IMPLEMENTATION
|
||||||
|
# include "4coder_string.h"
|
||||||
|
#endif
|
||||||
#include "4cpp_lexer_types.h"
|
#include "4cpp_lexer_types.h"
|
||||||
#include "4cpp_lexer_tables.c"
|
#include "4cpp_lexer_tables.c"
|
||||||
|
|
||||||
|
|
17
4ed.cpp
17
4ed.cpp
|
@ -1989,13 +1989,20 @@ App_Step_Sig(app_step){
|
||||||
models->hooks[hook_start](&models->app_links);
|
models->hooks[hook_start](&models->app_links);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char space[512];
|
||||||
|
String cl_filename = make_fixed_width_string(space);
|
||||||
|
copy_ss(&cl_filename, models->hot_directory.string);
|
||||||
|
|
||||||
|
i32 cl_filename_len = cl_filename.size;
|
||||||
|
|
||||||
i32 i = 0;
|
i32 i = 0;
|
||||||
Panel *panel = models->layout.used_sentinel.next;
|
Panel *panel = models->layout.used_sentinel.next;
|
||||||
for (; i < models->settings.init_files_count; ++i, panel = panel->next){
|
for (; i < models->settings.init_files_count; ++i, panel = panel->next){
|
||||||
String filename = make_string_slowly(models->settings.init_files[i]);
|
cl_filename.size = cl_filename_len;
|
||||||
|
append_sc(&cl_filename, models->settings.init_files[i]);
|
||||||
|
|
||||||
if (i < models->layout.panel_count){
|
if (i < models->layout.panel_count){
|
||||||
view_open_file(system, models, panel->view, filename);
|
view_open_file(system, models, panel->view, cl_filename);
|
||||||
view_show_file(panel->view);
|
view_show_file(panel->view);
|
||||||
Assert("Earlier" && panel->view->file_data.file != 0);
|
Assert("Earlier" && panel->view->file_data.file != 0);
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -2009,14 +2016,14 @@ App_Step_Sig(app_step){
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
view_open_file(system, models, 0, filename);
|
view_open_file(system, models, 0, cl_filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < models->layout.panel_count){
|
if (i < models->layout.panel_count){
|
||||||
view_set_file(panel->view, models->message_buffer, models);
|
view_set_file(panel->view, models->message_buffer, models);
|
||||||
view_show_file(panel->view);
|
view_show_file(panel->view);
|
||||||
|
|
||||||
++i;
|
++i;
|
||||||
panel = panel->next;
|
panel = panel->next;
|
||||||
}
|
}
|
||||||
|
@ -2498,7 +2505,7 @@ App_Step_Sig(app_step){
|
||||||
"-4coder now supports proper, borderless, fullscreen with the flag -F\n"
|
"-4coder now supports proper, borderless, fullscreen with the flag -F\n"
|
||||||
" and fullscreen can be toggled with <control pageup>.\n"
|
" and fullscreen can be toggled with <control pageup>.\n"
|
||||||
" (This sometimes causes artifacts on the Windows task bar)\n"
|
" (This sometimes causes artifacts on the Windows task bar)\n"
|
||||||
"-<alt f4> to exit\n"
|
"-<alt E> to exit\n"
|
||||||
"-hook on exit for the customization system\n"
|
"-hook on exit for the customization system\n"
|
||||||
"-tokens now exposed in customization system\n"
|
"-tokens now exposed in customization system\n"
|
||||||
"-mouse release events in customization system\n"
|
"-mouse release events in customization system\n"
|
||||||
|
|
|
@ -31,6 +31,8 @@ fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Working_Set *wor
|
||||||
buffer->file_name = file->name.source_path.str;
|
buffer->file_name = file->name.source_path.str;
|
||||||
buffer->buffer_name = file->name.live_name.str;
|
buffer->buffer_name = file->name.live_name.str;
|
||||||
|
|
||||||
|
buffer->dirty = file->state.dirty;
|
||||||
|
|
||||||
buffer->is_lexed = file->settings.tokens_exist;
|
buffer->is_lexed = file->settings.tokens_exist;
|
||||||
|
|
||||||
if (file->state.token_array.tokens &&
|
if (file->state.token_array.tokens &&
|
||||||
|
@ -180,9 +182,9 @@ DOC_SEE(Command_ID)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(allen): This is a bit of a mess and needs to be fixed soon
|
// TODO(allen): This is a bit of a mess and needs to be fixed soon.
|
||||||
API_EXPORT bool32
|
API_EXPORT bool32
|
||||||
Exec_System_Command(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int32_t path_len, char *command, int32_t command_len, Command_Line_Input_Flag flags)/*
|
Exec_System_Command(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int32_t path_len, char *command, int32_t command_len, Command_Line_Interface_Flag flags)/*
|
||||||
DOC_PARAM(view, If the view parameter is non-null it specifies a view to display the command's output buffer.)
|
DOC_PARAM(view, If the view parameter is non-null it specifies a view to display the command's output buffer.)
|
||||||
DOC_PARAM(buffer, The buffer the command will output to is specified by the buffer parameter.
|
DOC_PARAM(buffer, The buffer the command will output to is specified by the buffer parameter.
|
||||||
See Buffer_Identifier for information on how this type specifies a buffer.)
|
See Buffer_Identifier for information on how this type specifies a buffer.)
|
||||||
|
|
29
4ed_file.cpp
29
4ed_file.cpp
|
@ -100,12 +100,6 @@ struct Undo_Data{
|
||||||
b32 current_block_normal;
|
b32 current_block_normal;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum File_Sync_State{
|
|
||||||
SYNC_GOOD,
|
|
||||||
SYNC_BEHIND_OS,
|
|
||||||
SYNC_UNSAVED
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Text_Effect{
|
struct Text_Effect{
|
||||||
i32 start, end;
|
i32 start, end;
|
||||||
u32 color;
|
u32 color;
|
||||||
|
@ -143,7 +137,7 @@ struct Editing_File_State{
|
||||||
|
|
||||||
Text_Effect paste_effect;
|
Text_Effect paste_effect;
|
||||||
|
|
||||||
File_Sync_State sync;
|
Dirty_State dirty;
|
||||||
u32 ignore_behind_os;
|
u32 ignore_behind_os;
|
||||||
|
|
||||||
File_Edit_Positions edit_pos_space[16];
|
File_Edit_Positions edit_pos_space[16];
|
||||||
|
@ -671,6 +665,7 @@ touch_file(Working_Set *working_set, Editing_File *file){
|
||||||
struct Hot_Directory{
|
struct Hot_Directory{
|
||||||
String string;
|
String string;
|
||||||
File_List file_list;
|
File_List file_list;
|
||||||
|
// TODO(allen): eliminate slash
|
||||||
char slash;
|
char slash;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -765,7 +760,7 @@ inline b32
|
||||||
buffer_needs_save(Editing_File *file){
|
buffer_needs_save(Editing_File *file){
|
||||||
b32 result = 0;
|
b32 result = 0;
|
||||||
if (!file->settings.unimportant){
|
if (!file->settings.unimportant){
|
||||||
if (file->state.sync == SYNC_UNSAVED){
|
if (file->state.dirty == DirtyState_UnsavedChanges){
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -776,8 +771,8 @@ inline b32
|
||||||
buffer_can_save(Editing_File *file){
|
buffer_can_save(Editing_File *file){
|
||||||
b32 result = 0;
|
b32 result = 0;
|
||||||
if (!file->settings.unimportant){
|
if (!file->settings.unimportant){
|
||||||
if (file->state.sync == SYNC_UNSAVED ||
|
if (file->state.dirty == DirtyState_UnsavedChanges ||
|
||||||
file->state.sync == SYNC_BEHIND_OS){
|
file->state.dirty == DirtyState_UnloadedChanges){
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -814,26 +809,26 @@ file_set_to_loading(Editing_File *file){
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
file_mark_clean(Editing_File *file){
|
file_mark_clean(Editing_File *file){
|
||||||
if (file->state.sync != SYNC_BEHIND_OS){
|
if (file->state.dirty != DirtyState_UnloadedChanges){
|
||||||
file->state.sync = SYNC_GOOD;
|
file->state.dirty = DirtyState_UpToDate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
file_mark_dirty(Editing_File *file){
|
file_mark_dirty(Editing_File *file){
|
||||||
if (file->state.sync != SYNC_BEHIND_OS){
|
if (file->state.dirty != DirtyState_UnloadedChanges){
|
||||||
file->state.sync = SYNC_UNSAVED;
|
file->state.dirty = DirtyState_UnsavedChanges;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
file_mark_behind_os(Editing_File *file){
|
file_mark_behind_os(Editing_File *file){
|
||||||
file->state.sync = SYNC_BEHIND_OS;
|
file->state.dirty = DirtyState_UnloadedChanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline File_Sync_State
|
inline Dirty_State
|
||||||
file_get_sync(Editing_File *file){
|
file_get_sync(Editing_File *file){
|
||||||
return (file->state.sync);
|
return (file->state.dirty);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
|
|
@ -782,7 +782,7 @@ starts_new_line(u8 character){
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
file_synchronize_times(System_Functions *system, Editing_File *file){
|
file_synchronize_times(System_Functions *system, Editing_File *file){
|
||||||
file->state.sync = SYNC_GOOD;
|
file->state.dirty = DirtyState_UpToDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
|
@ -3217,9 +3217,9 @@ get_exhaustive_info(System_Functions *system, Working_Set *working_set, Exhausti
|
||||||
result.message = null_string;
|
result.message = null_string;
|
||||||
if (result.is_loaded){
|
if (result.is_loaded){
|
||||||
switch (file_get_sync(file)){
|
switch (file_get_sync(file)){
|
||||||
case SYNC_GOOD: result.message = message_loaded; break;
|
case DirtyState_UpToDate: result.message = message_loaded; break;
|
||||||
case SYNC_BEHIND_OS: result.message = message_unsynced; break;
|
case DirtyState_UnsavedChanges: result.message = message_unsaved; break;
|
||||||
case SYNC_UNSAVED: result.message = message_unsaved; break;
|
case DirtyState_UnloadedChanges: result.message = message_unsynced; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4037,8 +4037,8 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
||||||
message = null_string;
|
message = null_string;
|
||||||
if (!file->settings.unimportant){
|
if (!file->settings.unimportant){
|
||||||
switch (file_get_sync(file)){
|
switch (file_get_sync(file)){
|
||||||
case SYNC_BEHIND_OS: message = message_unsynced; break;
|
case DirtyState_UnloadedChanges: message = message_unsynced; break;
|
||||||
case SYNC_UNSAVED: message = message_unsaved; break;
|
case DirtyState_UnsavedChanges: message = message_unsaved; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4058,8 +4058,8 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
||||||
message = null_string;
|
message = null_string;
|
||||||
if (!file->settings.unimportant){
|
if (!file->settings.unimportant){
|
||||||
switch (file_get_sync(file)){
|
switch (file_get_sync(file)){
|
||||||
case SYNC_BEHIND_OS: message = message_unsynced; break;
|
case DirtyState_UnloadedChanges: message = message_unsynced; break;
|
||||||
case SYNC_UNSAVED: message = message_unsaved; break;
|
case DirtyState_UnsavedChanges: message = message_unsaved; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5132,13 +5132,13 @@ draw_file_bar(Render_Target *target, View *view, Editing_File *file, i32_Rect re
|
||||||
|
|
||||||
if (!file->settings.unimportant){
|
if (!file->settings.unimportant){
|
||||||
switch (file_get_sync(file)){
|
switch (file_get_sync(file)){
|
||||||
case SYNC_BEHIND_OS:
|
case DirtyState_UnloadedChanges:
|
||||||
{
|
{
|
||||||
persist String out_of_sync = make_lit_string(" !");
|
persist String out_of_sync = make_lit_string(" !");
|
||||||
intbar_draw_string(target, &bar, out_of_sync, pop2_color);
|
intbar_draw_string(target, &bar, out_of_sync, pop2_color);
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
case SYNC_UNSAVED:
|
case DirtyState_UnsavedChanges:
|
||||||
{
|
{
|
||||||
persist String out_of_sync = make_lit_string(" *");
|
persist String out_of_sync = make_lit_string(" *");
|
||||||
intbar_draw_string(target, &bar, out_of_sync, pop2_color);
|
intbar_draw_string(target, &bar, out_of_sync, pop2_color);
|
||||||
|
|
10
TODO.txt
10
TODO.txt
|
@ -41,7 +41,7 @@
|
||||||
; [X] switch to file "4ed.cpp" with "win32_4ed.cpp" open
|
; [X] switch to file "4ed.cpp" with "win32_4ed.cpp" open
|
||||||
; [X] inserting new line at top of file ~ scrolling jump when window is unaligned
|
; [X] inserting new line at top of file ~ scrolling jump when window is unaligned
|
||||||
; [X] saving/killing *compilation* doesn't work
|
; [X] saving/killing *compilation* doesn't work
|
||||||
; [X] line wrapping also doesn't work
|
; [X] line wrapping also doesn't work
|
||||||
; [X] save as corruptitates the filename
|
; [X] save as corruptitates the filename
|
||||||
; [X] crash when leaving maximized mode and view get's weird
|
; [X] crash when leaving maximized mode and view get's weird
|
||||||
; [X] decrease scroll speed on short windows
|
; [X] decrease scroll speed on short windows
|
||||||
|
@ -87,18 +87,14 @@
|
||||||
|
|
||||||
; BEFORE I SHIP
|
; BEFORE I SHIP
|
||||||
;
|
;
|
||||||
; [X] why are command line files not loading any more?
|
|
||||||
; [X] tokens in the custom API
|
; [X] tokens in the custom API
|
||||||
; [X] token seeking on custom side
|
; [X] token seeking on custom side
|
||||||
; [X] auto indent on the custom side
|
; [X] auto indent on the custom side
|
||||||
; [] indent whole comments
|
; [X] indent whole comments
|
||||||
; [] inserting lines at end of block comment
|
; [] inserting lines at end of block comment
|
||||||
; [] clean up and comment the auto indent code to allow for customizations
|
; [] clean up and comment the auto indent code to allow for customizations
|
||||||
; [] more built in options for auto indenting
|
; [] more built in options for auto indenting
|
||||||
; [] expose dirty flags
|
|
||||||
; [] occasionally missing the (!) mark on files on windows
|
; [] occasionally missing the (!) mark on files on windows
|
||||||
; [] scroll down on compilation buffer durring compilation
|
|
||||||
;
|
|
||||||
;
|
;
|
||||||
|
|
||||||
; TODOS
|
; TODOS
|
||||||
|
@ -143,6 +139,8 @@
|
||||||
; [X] file out of sync
|
; [X] file out of sync
|
||||||
; [X] mouse down/up distinction
|
; [X] mouse down/up distinction
|
||||||
; [X] case insensitive interactive switch buffer
|
; [X] case insensitive interactive switch buffer
|
||||||
|
; [X] expose dirty flags
|
||||||
|
; [X] why are command line files not loading any more?
|
||||||
|
|
||||||
;
|
;
|
||||||
; [] binary buffers
|
; [] binary buffers
|
||||||
|
|
|
@ -806,6 +806,11 @@ IS_FULLSCREEN_SIG(system_is_fullscreen){
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal
|
||||||
|
SEND_EXIT_SIGNAL_SIG(system_send_exit_signal){
|
||||||
|
linuxvars.keep_running = 0;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Clipboard
|
// Clipboard
|
||||||
//
|
//
|
||||||
|
@ -1502,6 +1507,7 @@ LinuxLoadSystemCode(){
|
||||||
linuxvars.system.show_mouse_cursor = system_show_mouse_cursor;
|
linuxvars.system.show_mouse_cursor = system_show_mouse_cursor;
|
||||||
linuxvars.system.toggle_fullscreen = system_toggle_fullscreen;
|
linuxvars.system.toggle_fullscreen = system_toggle_fullscreen;
|
||||||
linuxvars.system.is_fullscreen = system_is_fullscreen;
|
linuxvars.system.is_fullscreen = system_is_fullscreen;
|
||||||
|
linuxvars.system.send_exit_signal = system_send_exit_signal;
|
||||||
|
|
||||||
// clipboard
|
// clipboard
|
||||||
linuxvars.system.post_clipboard = system_post_clipboard;
|
linuxvars.system.post_clipboard = system_post_clipboard;
|
||||||
|
@ -2214,10 +2220,23 @@ LinuxFatalErrorMsg(const char* msg)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int win_w = 450;
|
const int num_cols = 50;
|
||||||
int win_h = 150 + (strlen(msg) / 40) * 24;
|
int win_w = (num_cols + 10) * 9;
|
||||||
|
int win_h = 140;
|
||||||
|
|
||||||
Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, win_w, win_h, 0, 0, 0x2EA44F);
|
{
|
||||||
|
const char *start_p = msg, *space_p = NULL;
|
||||||
|
for(const char* p = msg; *p; ++p){
|
||||||
|
if(*p == ' ') space_p = p;
|
||||||
|
if(*p == '\n' || p - start_p > num_cols){
|
||||||
|
win_h += 18;
|
||||||
|
start_p = space_p ? space_p + 1 : p;
|
||||||
|
space_p = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, win_w, win_h, 0, 0, 0x227A3B);
|
||||||
XStoreName(dpy, w, "4coder Error");
|
XStoreName(dpy, w, "4coder Error");
|
||||||
|
|
||||||
XSizeHints* sh = XAllocSizeHints();
|
XSizeHints* sh = XAllocSizeHints();
|
||||||
|
@ -2239,26 +2258,26 @@ LinuxFatalErrorMsg(const char* msg)
|
||||||
Atom WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
|
Atom WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
|
||||||
XSetWMProtocols(dpy, w, &WM_DELETE_WINDOW, 1);
|
XSetWMProtocols(dpy, w, &WM_DELETE_WINDOW, 1);
|
||||||
|
|
||||||
|
LinuxSetIcon(dpy, w);
|
||||||
|
|
||||||
XMapRaised(dpy, w);
|
XMapRaised(dpy, w);
|
||||||
XSync(dpy, False);
|
XSync(dpy, False);
|
||||||
|
|
||||||
XSelectInput(dpy, w, ExposureMask | StructureNotifyMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask);
|
XSelectInput(dpy, w, ExposureMask | StructureNotifyMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask);
|
||||||
|
|
||||||
XFontStruct* font = XLoadQueryFont(dpy, "-*-fixed-*-*-*-*-*-140-*-*-*-*-iso8859-1");
|
XFontStruct* font = XLoadQueryFont(dpy, "-*-fixed-bold-*-*-*-*-140-*-*-*-*-iso8859-1");
|
||||||
if(!font){
|
if(!font){
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
XGCValues gcv;
|
XGCValues gcv;
|
||||||
gcv.foreground = WhitePixel(dpy, 0);
|
gcv.foreground = WhitePixel(dpy, 0);
|
||||||
gcv.background = 0x2EA44F;
|
|
||||||
gcv.line_width = 2;
|
gcv.line_width = 2;
|
||||||
gcv.font = font->fid;
|
gcv.font = font->fid;
|
||||||
|
|
||||||
GC gc = XCreateGC(dpy, w, GCForeground | GCBackground | GCFont | GCLineWidth, &gcv);
|
GC gc1 = XCreateGC(dpy, w, GCForeground | GCFont | GCLineWidth, &gcv);
|
||||||
|
|
||||||
gcv.foreground = BlackPixel(dpy, 0);
|
gcv.foreground = BlackPixel(dpy, 0);
|
||||||
GC gc2 = XCreateGC(dpy, w, GCForeground | GCBackground | GCFont | GCLineWidth, &gcv);
|
GC gc2 = XCreateGC(dpy, w, GCForeground | GCFont | GCLineWidth, &gcv);
|
||||||
|
|
||||||
int button_trigger = 0;
|
int button_trigger = 0;
|
||||||
int button_hi = 0;
|
int button_hi = 0;
|
||||||
|
@ -2273,7 +2292,6 @@ LinuxFatalErrorMsg(const char* msg)
|
||||||
|
|
||||||
if(ev.type == ConfigureNotify){
|
if(ev.type == ConfigureNotify){
|
||||||
redraw = 1;
|
redraw = 1;
|
||||||
|
|
||||||
win_w = ev.xconfigure.width;
|
win_w = ev.xconfigure.width;
|
||||||
win_h = ev.xconfigure.height;
|
win_h = ev.xconfigure.height;
|
||||||
}
|
}
|
||||||
|
@ -2292,6 +2310,13 @@ LinuxFatalErrorMsg(const char* msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ev.type == KeyPress){
|
||||||
|
KeySym sym = XLookupKeysym(&ev.xkey, 0);
|
||||||
|
if(sym == XK_Escape || sym == XK_Return){
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(ev.type == ButtonPress && ev.xbutton.button == Button1){
|
if(ev.type == ButtonPress && ev.xbutton.button == Button1){
|
||||||
if(button_hi) button_trigger = 1;
|
if(button_hi) button_trigger = 1;
|
||||||
redraw = 1;
|
redraw = 1;
|
||||||
|
@ -2312,6 +2337,10 @@ LinuxFatalErrorMsg(const char* msg)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DRAW_STR(x, y, str, len) \
|
||||||
|
XDrawString(dpy, w, gc2, (x)+1, (y)+1, (str), (len)); \
|
||||||
|
XDrawString(dpy, w, gc1, (x) , (y) , (str), (len))
|
||||||
|
|
||||||
if(redraw){
|
if(redraw){
|
||||||
XClearWindow(dpy, w);
|
XClearWindow(dpy, w);
|
||||||
|
|
||||||
|
@ -2323,38 +2352,39 @@ LinuxFatalErrorMsg(const char* msg)
|
||||||
const char title[] = "4coder - Fatal Error";
|
const char title[] = "4coder - Fatal Error";
|
||||||
int width = XTextWidth(font, title, sizeof(title)-1);
|
int width = XTextWidth(font, title, sizeof(title)-1);
|
||||||
int x = (win_w/2) - (width/2);
|
int x = (win_w/2) - (width/2);
|
||||||
XDrawString(dpy, w, gc2, x+2, y+2, title, sizeof(title)-1);
|
DRAW_STR(x, y, title, sizeof(title)-1);
|
||||||
XDrawString(dpy, w, gc, x, y, title, sizeof(title)-1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
y += 36;
|
y += 36;
|
||||||
|
int width = XTextWidth(font, "x", 1) * num_cols;
|
||||||
int width = XTextWidth(font, "x", 1) * 40;
|
|
||||||
int x = (win_w/2) - (width/2);
|
int x = (win_w/2) - (width/2);
|
||||||
|
|
||||||
for(const char* p = line_start; *p; ++p){
|
for(const char* p = line_start; *p; ++p){
|
||||||
if(*p == ' ') last_space = p;
|
if(*p == ' ') last_space = p;
|
||||||
if(p - line_start > 40){
|
if(p - line_start > num_cols || *p == '\n' || !p[1]){
|
||||||
if(!last_space) last_space = p;
|
|
||||||
|
|
||||||
XDrawString(dpy, w, gc2, x+2, y+2, line_start, last_space - line_start);
|
const char* new_line_start = last_space + 1;
|
||||||
XDrawString(dpy, w, gc, x, y, line_start, last_space - line_start);
|
if(!last_space || *p == '\n' || !p[1]){
|
||||||
line_start = *last_space == ' ' ? last_space + 1 : p;
|
new_line_start = last_space = (p + !p[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
DRAW_STR(x, y, line_start, last_space - line_start);
|
||||||
|
|
||||||
|
line_start = new_line_start;
|
||||||
last_space = NULL;
|
last_space = NULL;
|
||||||
y += 18;
|
y += 18;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
XDrawString(dpy, w, gc2, x+2, y+2, line_start, strlen(line_start));
|
XDrawRectangles(dpy, w, gc1, &button_rect, 1);
|
||||||
XDrawString(dpy, w, gc, x, y, line_start, strlen(line_start));
|
|
||||||
|
|
||||||
XDrawRectangles(dpy, w, gc, &button_rect, 1);
|
|
||||||
if(button_hi || button_trigger){
|
if(button_hi || button_trigger){
|
||||||
XDrawRectangle(dpy, w, gc2, button_rect.x+1, button_rect.y+1, button_rect.width-2, button_rect.height-2);
|
XDrawRectangle(dpy, w, gc2, button_rect.x+1, button_rect.y+1, button_rect.width-2, button_rect.height-2);
|
||||||
}
|
}
|
||||||
XDrawString(dpy, w, gc2, button_rect.x + 22, button_rect.y + 17, "Drat!", 5);
|
|
||||||
XDrawString(dpy, w, gc, button_rect.x + 20, button_rect.y + 15, "Drat!", 5);
|
DRAW_STR(button_rect.x + 20, button_rect.y + 15, "Drat!", 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#undef DRAW_STR
|
||||||
}
|
}
|
||||||
|
|
||||||
internal int
|
internal int
|
||||||
|
@ -3279,7 +3309,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
Cursor xcursors[APP_MOUSE_CURSOR_COUNT] = {
|
Cursor xcursors[APP_MOUSE_CURSOR_COUNT] = {
|
||||||
None,
|
None,
|
||||||
XCreateFontCursor(linuxvars.XDisplay, XC_arrow),
|
None,
|
||||||
XCreateFontCursor(linuxvars.XDisplay, XC_xterm),
|
XCreateFontCursor(linuxvars.XDisplay, XC_xterm),
|
||||||
XCreateFontCursor(linuxvars.XDisplay, XC_sb_h_double_arrow),
|
XCreateFontCursor(linuxvars.XDisplay, XC_sb_h_double_arrow),
|
||||||
XCreateFontCursor(linuxvars.XDisplay, XC_sb_v_double_arrow)
|
XCreateFontCursor(linuxvars.XDisplay, XC_sb_v_double_arrow)
|
||||||
|
@ -3433,6 +3463,8 @@ main(int argc, char **argv)
|
||||||
linuxvars.input.clipboard = null_string;
|
linuxvars.input.clipboard = null_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b32 keep_running = linuxvars.keep_running;
|
||||||
|
|
||||||
linuxvars.app.step(
|
linuxvars.app.step(
|
||||||
&linuxvars.system,
|
&linuxvars.system,
|
||||||
&linuxvars.target,
|
&linuxvars.target,
|
||||||
|
@ -3443,7 +3475,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
if(result.perform_kill){
|
if(result.perform_kill){
|
||||||
break;
|
break;
|
||||||
} else {
|
} else if(!keep_running && !linuxvars.keep_running){
|
||||||
linuxvars.keep_running = 1;
|
linuxvars.keep_running = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -904,7 +904,7 @@ win32_init_drive_strings(Drive_Strings *dstrings){
|
||||||
// for the ability to handle them very quickly when nothing strange is
|
// for the ability to handle them very quickly when nothing strange is
|
||||||
// going on.
|
// going on.
|
||||||
internal int32_t
|
internal int32_t
|
||||||
win32_canonical_ansi_name(Drive_Strings *dstrings, char *src, i32 len, char *dst, i32 max){
|
win32_canonical_ascii_name(Drive_Strings *dstrings, char *src, i32 len, char *dst, i32 max){
|
||||||
char *wrt = dst;
|
char *wrt = dst;
|
||||||
char *wrt_stop = dst + max;
|
char *wrt_stop = dst + max;
|
||||||
char *src_stop = src + len;
|
char *src_stop = src + len;
|
||||||
|
@ -978,7 +978,7 @@ win32_canonical_ansi_name(Drive_Strings *dstrings, char *src, i32 len, char *dst
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Get_Canonical_Sig(system_get_canonical){
|
Sys_Get_Canonical_Sig(system_get_canonical){
|
||||||
i32 result = win32_canonical_ansi_name(&win32vars.dstrings, filename, len, buffer, max);
|
i32 result = win32_canonical_ascii_name(&win32vars.dstrings, filename, len, buffer, max);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue