4.0.16 build ready

master
Allen Webster 2017-02-06 08:49:00 -05:00
parent 783d1f2fc6
commit 9fff7704df
12 changed files with 193 additions and 62 deletions

View File

@ -524,7 +524,6 @@ CUSTOM_COMMAND_SIG(exit_4coder){
send_exit_signal(app);
}
//
// Interactive Commands
//

View File

@ -44,7 +44,7 @@ get_build_directory(Application_Links *app, Buffer_Summary *buffer, String *dir_
if (!result){
int32_t len = directory_get_hot(app, dir_out->str,
dir_out->memory_size - dir_out->size);
if (len + dir_out->size < dir_out->memory_size){
if (dir_out->size + len < dir_out->memory_size){
dir_out->size += len;
result = BuildDir_AtHot;
}
@ -53,6 +53,17 @@ get_build_directory(Application_Links *app, Buffer_Summary *buffer, String *dir_
return(result);
}
static void
save_all_dirty_buffers(Application_Links *app){
for (Buffer_Summary buffer = get_buffer_first(app, AccessOpen);
buffer.exists;
get_buffer_next(app, &buffer, AccessOpen)){
if (buffer.dirty == DirtyState_UnsavedChanges){
save_buffer(app, &buffer, buffer.file_name, buffer.file_name_len, 0);
}
}
}
// TODO(allen): Better names for the "standard build search" family.
static int32_t
standard_build_search(Application_Links *app, View_Summary *view, Buffer_Summary *active_buffer, String *dir, String *command, int32_t perform_backup, int32_t use_path_in_command, String filename, String commandname){
@ -82,6 +93,10 @@ standard_build_search(Application_Links *app, View_Summary *view, Buffer_Summary
append_s_char(&message, '\n');
print_message(app, message.str, message.size);
if (automatically_save_changes_on_build){
save_all_dirty_buffers(app);
}
exec_system_command(app, view, buffer_identifier(literal("*compilation*")), dir->str, dir->size, command->str, command->size, CLI_OverlapWithConflict);
result = true;
break;

View File

@ -45,8 +45,7 @@ default_keys(Bind_Helper *context){
bind(context, 's', MDFR_ALT, show_scrollbar);
bind(context, 'w', MDFR_ALT, hide_scrollbar);
// TODO(allen): This is apparently not working on Linux, must investigate.
bind(context, key_f2, MDFR_CTRL, toggle_mouse);
bind(context, '@', MDFR_ALT, toggle_mouse);
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
bind(context, 'E', MDFR_ALT, exit_4coder);
@ -108,6 +107,7 @@ default_keys(Bind_Helper *context){
bind(context, '}', MDFR_CTRL, open_long_braces_break);
bind(context, 'i', MDFR_ALT, if0_off);
bind(context, '1', MDFR_ALT, open_file_in_quotes);
bind(context, '2', MDFR_ALT, open_matching_file_cpp);
bind(context, '0', MDFR_CTRL, write_zero_struct);
bind(context, 'I', MDFR_CTRL, list_all_functions_current_buffer);

View File

@ -196,6 +196,7 @@ struct Fkey_Command{
char command[128];
char out[128];
bool32 use_build_panel;
bool32 save_dirty_buffers;
};
struct Project{
@ -211,6 +212,8 @@ struct Project{
bool32 close_all_code_when_this_project_closes;
bool32 close_all_files_when_project_opens;
bool32 open_recursively;
};
static Project null_project = {};
@ -579,11 +582,14 @@ config_array_good(Config_Array_Reader *array_reader){
// Configuration
//
static bool32 enable_code_wrapping = 1;
static bool32 automatically_adjust_wrapping = 1;
static bool32 enable_code_wrapping = true;
static bool32 automatically_adjust_wrapping = true;
static bool32 automatically_indent_text_on_save = true;
static bool32 automatically_save_changes_on_build = true;
static int32_t default_wrap_width = 672;
static int32_t default_min_base_width = 550;
static bool32 automatically_indent_text_on_save = 1;
static char default_theme_name_space[256] = {0};
static String default_theme_name = make_fixed_width_string(default_theme_name_space);
@ -625,6 +631,7 @@ get_default_font_name(){
}
// 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>
static bool32
@ -692,6 +699,7 @@ process_config_file(Application_Links *app){
config_bool_var(item, "enable_code_wrapping", 0, &enable_code_wrapping);
config_bool_var(item, "automatically_adjust_wrapping", 0, &automatically_adjust_wrapping);
config_bool_var(item, "automatically_indent_text_on_save", 0, &automatically_indent_text_on_save);
config_bool_var(item, "automatically_save_changes_on_build", 0, &automatically_save_changes_on_build);
config_int_var(item, "default_wrap_width", 0, &new_wrap_width);
config_int_var(item, "default_min_base_width", 0, &new_min_base_width);

View File

@ -339,6 +339,71 @@ CUSTOM_COMMAND_SIG(open_in_other){
}
//
// File Navigating
//
static bool32
get_cpp_matching_file(Application_Links *app, Buffer_Summary buffer, Buffer_Summary *buffer_out){
bool32 result = false;
char space[512];
String file_name = make_string_cap(space, 0, sizeof(space));
append(&file_name, make_string(buffer.file_name, buffer.file_name_len));
String extension = file_extension(file_name);
String new_extensions[2] = {0};
int32_t new_extensions_count = 0;
if (match(extension, "cpp") || match(extension, "cc")){
new_extensions[0] = make_lit_string("h");
new_extensions[1] = make_lit_string("hpp");
new_extensions_count = 2;
}
else if (match(extension, "c")){
new_extensions[0] = make_lit_string("h");
new_extensions_count = 1;
}
else if (match(extension, "h")){
new_extensions[0] = make_lit_string("c");
new_extensions[1] = make_lit_string("cpp");
new_extensions_count = 2;
}
else if (match(extension, "hpp")){
new_extensions[0] = make_lit_string("cpp");
new_extensions_count = 1;
}
remove_extension(&file_name);
int32_t base_pos = file_name.size;
for (int32_t i = 0; i < new_extensions_count; ++i){
String ext = new_extensions[i];
file_name.size = base_pos;
append(&file_name, ext);
if (open_file(app, buffer_out, file_name.str, file_name.size, false, true)){
result = true;
break;
}
}
return(result);
}
CUSTOM_COMMAND_SIG(open_matching_file_cpp){
View_Summary view = get_active_view(app, AccessAll);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessAll);
Buffer_Summary new_buffer = {0};
if (get_cpp_matching_file(app, buffer, &new_buffer)){
get_view_next_looped(app, &view, AccessAll);
view_set_buffer(app, &view, new_buffer.buffer_id, 0);
set_active_view(app, &view);
}
}
//
// Execute Arbitrary Command
//
@ -367,6 +432,9 @@ CUSTOM_COMMAND_SIG(execute_arbitrary_command){
else if (match_ss(bar.string, make_lit_string("open all code"))){
exec_command(app, open_all_code);
}
else if (match_ss(bar.string, make_lit_string("open all code recursive"))){
exec_command(app, open_all_code_recursive);
}
else if(match_ss(bar.string, make_lit_string("close all code"))){
exec_command(app, close_all_code);
}

View File

@ -246,9 +246,9 @@ get_line_x_rect(View_Summary *view){
return(rect);
}
static int32_t
open_file(Application_Links *app, Buffer_Summary *buffer_out, char *filename, int32_t filename_len, int32_t background, int32_t never_new){
int32_t result = false;
static bool32
open_file(Application_Links *app, Buffer_Summary *buffer_out, char *filename, int32_t filename_len, bool32 background, bool32 never_new){
bool32 result = false;
Buffer_Summary buffer = get_buffer_by_name(app, filename, filename_len, AccessProtected|AccessHidden);
if (buffer.exists){

View File

@ -96,51 +96,57 @@ close_all_files_with_extension(Application_Links *app, Partition *scratch_part,
}
static void
open_all_files_with_extension(Application_Links *app, Partition *scratch_part, char **extension_list, int32_t extension_count){
Temp_Memory temp = begin_temp_memory(scratch_part);
int32_t max_size = partition_remaining(scratch_part);
char *memory = push_array(scratch_part, char, max_size);
String dir = make_string_cap(memory, 0, max_size);
dir.size = directory_get_hot(app, dir.str, dir.memory_size);
int32_t dir_size = dir.size;
// NOTE(allen|a3.4.4): Here we get the list of files in this directory.
// Notice that we free_file_list at the end.
open_all_files_with_extension_internal(Application_Links *app, String dir, char **extension_list, int32_t extension_count, bool32 recursive){
File_List list = get_file_list(app, dir.str, dir.size);
int32_t dir_size = dir.size;
for (int32_t i = 0; i < list.count; ++i){
File_Info *info = list.infos + i;
if (!info->folder){
bool32 is_match = 1;
if (info->folder){
if (recursive){
dir.size = dir_size;
append(&dir, info->filename);
append(&dir, "/");
open_all_files_with_extension_internal(app, dir, extension_list, extension_count, recursive);
}
}
else{
bool32 is_match = true;
if (extension_count > 0){
is_match = 0;
is_match = false;
String extension = make_string_cap(info->filename, info->filename_len, info->filename_len+1);
extension = file_extension(extension);
for (int32_t j = 0; j < extension_count; ++j){
if (match(extension, extension_list[j])){
is_match = 1;
is_match = true;
break;
}
}
}
if (is_match){
// NOTE(allen): There's no way in the 4coder API to use relative
// paths at the moment, so everything should be full paths. Which is
// managable. Here simply set the dir string size back to where it
// was originally, so that new appends overwrite old ones.
dir.size = dir_size;
append_sc(&dir, info->filename);
append(&dir, info->filename);
create_buffer(app, dir.str, dir.size, 0);
}
}
}
}
free_file_list(app, list);
}
static void
open_all_files_with_extension(Application_Links *app, Partition *scratch_part, char **extension_list, int32_t extension_count, bool32 recursive){
Temp_Memory temp = begin_temp_memory(scratch_part);
int32_t max_size = 4096;
char *memory = push_array(scratch_part, char, max_size);
String dir = make_string_cap(memory, 0, max_size);
dir.size = directory_get_hot(app, dir.str, dir.memory_size);
open_all_files_with_extension_internal(app, dir, extension_list, extension_count, recursive);
end_temp_memory(temp);
}
@ -149,7 +155,13 @@ open_all_files_with_extension(Application_Links *app, Partition *scratch_part, c
CUSTOM_COMMAND_SIG(open_all_code){
int32_t extension_count = 0;
char **extension_list = get_current_code_extensions(&extension_count);
open_all_files_with_extension(app, &global_part, extension_list, extension_count);
open_all_files_with_extension(app, &global_part, extension_list, extension_count, false);
}
CUSTOM_COMMAND_SIG(open_all_code_recursive){
int32_t extension_count = 0;
char **extension_list = get_current_code_extensions(&extension_count);
open_all_files_with_extension(app, &global_part, extension_list, extension_count, true);
}
CUSTOM_COMMAND_SIG(close_all_code){
@ -231,6 +243,13 @@ CUSTOM_COMMAND_SIG(load_project){
}
}
{
bool32 open_recursively = false;
if (config_bool_var(item, "open_recursively", 0, &open_recursively)){
current_project.open_recursively = open_recursively;
}
}
{
#if defined(_WIN32)
#define FKEY_COMMAND "fkey_command_win"
@ -257,7 +276,7 @@ CUSTOM_COMMAND_SIG(load_project){
config_array_good(&array_reader);
config_array_next_item(&array_reader, &array_item)){
if (item_index >= 3){
if (item_index >= 4){
break;
}
@ -265,8 +284,8 @@ CUSTOM_COMMAND_SIG(load_project){
append_int_to_str(&msg, item_index);
append(&msg, "] = ");
bool32 read_string = 0;
bool32 read_bool = 0;
bool32 read_string = false;
bool32 read_bool = false;
char *dest_str = 0;
int32_t dest_str_size = 0;
@ -278,20 +297,26 @@ CUSTOM_COMMAND_SIG(load_project){
{
dest_str = current_project.fkey_commands[index-1].command;
dest_str_size = sizeof(current_project.fkey_commands[index-1].command);
read_string = 1;
read_string = true;
}break;
case 1:
{
dest_str = current_project.fkey_commands[index-1].out;
dest_str_size = sizeof(current_project.fkey_commands[index-1].out);
read_string = 1;
read_string = true;
}break;
case 2:
{
dest_bool = &current_project.fkey_commands[index-1].use_build_panel;
read_bool = 1;
read_bool = true;
}break;
case 3:
{
dest_bool = &current_project.fkey_commands[index-1].save_dirty_buffers;
read_bool = true;
}break;
}
@ -342,9 +367,14 @@ CUSTOM_COMMAND_SIG(load_project){
}
// Open all project files
if (current_project.open_recursively){
exec_command(app, open_all_code_recursive);
}
else{
exec_command(app, open_all_code);
}
}
}
end_temp_memory(temp);
}
@ -369,11 +399,18 @@ CUSTOM_COMMAND_SIG(load_project){
static void
exec_project_fkey_command(Application_Links *app, int32_t command_ind){
char *command = current_project.fkey_commands[command_ind].command;
char *out = current_project.fkey_commands[command_ind].out;
bool32 use_build_panel = current_project.fkey_commands[command_ind].use_build_panel;
Fkey_Command *fkey = &current_project.fkey_commands[command_ind];
char *command = fkey->command;
if (command[0] != 0){
char *out = fkey->out;
bool32 use_build_panel = fkey->use_build_panel;
bool32 save_dirty_buffers = fkey->save_dirty_buffers;
if (save_dirty_buffers){
save_all_dirty_buffers(app);
}
int32_t command_len = str_size(command);
View_Summary view_ = {0};

View File

@ -2372,6 +2372,12 @@ App_Step_Sig(app_step){
"If you're new to 4coder there are some tutorials at http://4coder.net/tutorials.html\n"
"\n"
"Newest features:\n"
"-<alt 2> If the current file is a C++ code file, this opens the matching header.\n"" If the current file is a C++ header, this opens the matching code file.\n"
"-Option to automatically save changes on build in the config file.\n"
" This works for builds triggered by <alt m>.\n"
"-Option in project files to have certain fkey commands save changes.\n"
"\n"
"New in alpha 4.0.15:\n"
"-<ctrl I> find all functions in the current buffer and list them in a jump buffer\n"
"-option to set user name in config.4coder\n"
" The user name is used in <alt t> and <alt y> comment writing commands\n"

View File

@ -1125,10 +1125,11 @@ API_EXPORT bool32
Save_Buffer(Application_Links *app, Buffer_Summary *buffer, char *filename, int32_t filename_len, uint32_t flags)
/*
DOC_PARAM(buffer, The buffer parameter specifies the buffer to save to a file.)
DOC_PARAM(filename, The filename parameter specifies the name of the file to associated to the buffer; it need not be null terminated.)
DOC_PARAM(filename, The filename parameter specifies the name of the file to write with the contents of the buffer; it need not be null terminated.)
DOC_PARAM(filename_len, The filename_len parameter specifies the length of the filename string.)
DOC_PARAM(flags, This parameter is not currently used and should be set to 0 for now.)
DOC_RETURN(This call returns non-zero on success.)
DOC(Often it will make sense to set filename and filename_len to buffer.filename and buffer.filename_len)
*/{
Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system;

Binary file not shown.

View File

@ -1,16 +1,13 @@
extensions=".c.cpp.h.hpp.bat.sh";
open_recursively=false;
fkey_command_win[1] = {"build.bat", "*compilation*", true};
fkey_command_win[2] = {"site\\build.bat", "*compilation*", true};
fkey_command_win[3] = {"string\\build.bat", "*compilation*", true};
fkey_command_win[1] = {"build.bat", "*compilation*", true , true };
fkey_command_win[2] = {"site\\build.bat", "*compilation*", true , true };
fkey_command_win[3] = {"string\\build.bat", "*compilation*", true , true };
fkey_command_win[5] = {"..\\misc\\run.bat", "*run*", false, false};
fkey_command_win[12] = {"package.bat", "*package*", false, true };
fkey_command_win[5] = {"..\\misc\\run.bat", "*run*"};
fkey_command_win[12] = {"package.bat", "*package*"};
fkey_command_linux[1] = {"./build.sh", "*compilation*", true};
fkey_command_linux[2] = {"site/build.sh", "*compilation*", true};
fkey_command_linux[5] = {"../build/4ed", "*run*"};
fkey_command_linux[12] = {"./package.sh", "*package*"};
fkey_command_linux[1] = {"./build.sh", "*compilation*", true , true };
fkey_command_linux[2] = {"site/build.sh", "*compilation*", true , true };
fkey_command_linux[5] = {"../build/4ed", "*run*", false, false};
fkey_command_linux[12] = {"./package.sh", "*package*", false, true };