diff --git a/Readme.md b/Readme.md index b6baadb..21f2482 100644 --- a/Readme.md +++ b/Readme.md @@ -8,6 +8,7 @@ Refactor c/c++ files (and problably others) with ease. * `-src` : Source file to refactor * `-dst` : Destination file after the refactor (omit to use the same as source) * `-spec` : Specification containing rules to use for the refactor. +* `-debug` : Use only if on debug build and desire to attach to process. ## Syntax : @@ -45,3 +46,4 @@ TODO: * Test to see how much needs to be ported for other platforms (if at all) * Setup as api. * Provide binaries in the release page for github. (debug and release builds) +* Directive to ignore comments (with a way to specify the comment signature). Right now comments that meet the signature of words or namespaces are refactored. diff --git a/project/Bloat.cpp b/project/Bloat.cpp index 208b716..675b45c 100644 --- a/project/Bloat.cpp +++ b/project/Bloat.cpp @@ -9,7 +9,7 @@ namespace Memory void setup() { - zpl_arena_init_from_allocator( & Global_Arena, zpl_heap(), zpl_megabytes(2) ); + zpl_arena_init_from_allocator( & Global_Arena, zpl_heap(), Initial_Reserve ); if ( Global_Arena.total_size == 0 ) { diff --git a/project/IO.cpp b/project/IO.cpp index f129dde..cb439d6 100644 --- a/project/IO.cpp +++ b/project/IO.cpp @@ -18,7 +18,8 @@ namespace IO uw Current_Size = 0; uw Largest_Src_Size = 0; - zpl_arena MemPerist; + zpl_arena MemSpec; + zpl_arena MemSrc; } using namespace StaticData; @@ -49,16 +50,17 @@ namespace IO zpl_file_close( & src ); } - while ( left--, left > 1 ); + while ( path++, left--, left > 1 ); - uw persist_size = ZPL_ARRAY_GROW_FORMULA( Largest_Src_Size ); + uw persist_size = Largest_Src_Size * 2 + 8; - zpl_arena_init_from_allocator( & MemPerist, zpl_heap(), persist_size ); + zpl_arena_init_from_allocator( & MemSrc, zpl_heap(), persist_size ); } void cleanup() { - zpl_arena_free( & MemPerist ); + zpl_arena_free( & MemSpec ); + zpl_arena_free( & MemSrc ); } Array_Line get_specification() @@ -78,22 +80,23 @@ namespace IO fatal("No content in specificaiton to process"); } - char* content = rcast( char*, zpl_alloc( zpl_arena_allocator( & MemPerist), fsize + 1) ); + zpl_arena_init_from_allocator( & MemSpec, zpl_heap(), fsize * 2 + 8 ); + + char* content = rcast( char*, zpl_alloc( zpl_arena_allocator( & MemSpec), fsize + 1) ); zpl_file_read( & file, content, fsize); zpl_file_close( & file ); content[fsize] = 0; - Array_Line lines = zpl_str_split_lines( zpl_arena_allocator( & MemPerist ), content, false ); + Array_Line lines = zpl_str_split_lines( zpl_arena_allocator( & MemSpec ), content, false ); return lines; } char* get_next_source() { - zpl_memset( MemPerist.physical_start, 0, MemPerist.total_allocated); - MemPerist.total_allocated = 0; - MemPerist.temp_count = 0; + zpl_memset( MemSrc.physical_start, 0, MemSrc.total_allocated); + zpl_free_all( zpl_arena_allocator( & MemSrc) ); Current++; @@ -111,7 +114,7 @@ namespace IO if ( Current_Size <= 0 ) return nullptr; - Current_Content = rcast( char* , zpl_alloc( zpl_arena_allocator( & MemPerist), Current_Size + 1) ); + Current_Content = rcast( char* , zpl_alloc( zpl_arena_allocator( & MemSrc), Current_Size + 1) ); zpl_file_read( & file, Current_Content, Current_Size ); zpl_file_close( & file ); @@ -138,7 +141,6 @@ namespace IO } zpl_file_write( & file_dest, refacotred, zpl_string_length(refacotred) ); - zpl_file_close( & file_dest ); } } diff --git a/project/Spec.cpp b/project/Spec.cpp index 8fb61ca..3009758 100644 --- a/project/Spec.cpp +++ b/project/Spec.cpp @@ -38,15 +38,30 @@ namespace Spec // Helper function for process(). forceinline - void find_next_token( zpl_string& token, char*& line, u32& length ) + void find_next_token( Tok& type, zpl_string& token, char*& line, u32& length ) { zpl_string_clear( token ); length = 0; - while ( zpl_char_is_alphanumeric( line[length] ) || line[length] == '_' ) + #define current line[length] + if (type == Tok::Include) { - length++; + // Allows for '.' + while ( zpl_char_is_alphanumeric( current ) + || current == '_' + || current == '.' ) + { + length++; + } } + else + { + while ( zpl_char_is_alphanumeric( current ) || current == '_' ) + { + length++; + } + } + #undef current if ( length == 0 ) { @@ -119,15 +134,15 @@ namespace Spec } } - u32 length = 0; - - // Find a valid token - find_next_token( token, line, length ); - + u32 length = 0; Tok type = Tok::Num_Tok; bool ignore = false; Entry entry {}; + + // Find a valid token + find_next_token( type, token, line, length ); + // Will be reguarded as an ignore. if ( is_tok( Tok::Not, token, length )) { @@ -143,7 +158,7 @@ namespace Spec } // Find the category token - find_next_token( token, line, length ); + find_next_token( type, token, line, length ); } if ( is_tok( Tok::Word, token, length ) ) @@ -174,8 +189,8 @@ namespace Spec lines++; continue; } - - find_next_token( token, line, length ); + + find_next_token( type, token, line, length ); // First argument is signature. entry.Sig = zpl_string_make_length( g_allocator, token, length ); @@ -285,7 +300,7 @@ namespace Spec } } - find_next_token( token, line, length ); + find_next_token( type, token, line, length ); // Second argument is substitute. entry.Sub = zpl_string_make_length( g_allocator, token, length ); diff --git a/project/bloat.hpp b/project/bloat.hpp index 94c29b8..b4437cd 100644 --- a/project/bloat.hpp +++ b/project/bloat.hpp @@ -90,6 +90,8 @@ ct char const* Msg_Invalid_Value = "INVALID VALUE PROVIDED"; namespace Memory { + ct uw Initial_Reserve = zpl_megabytes(2); + extern zpl_arena Global_Arena; #define g_allocator zpl_arena_allocator( & Memory::Global_Arena) diff --git a/project/refactor.cpp b/project/refactor.cpp index 1318ea9..b601e98 100644 --- a/project/refactor.cpp +++ b/project/refactor.cpp @@ -9,15 +9,27 @@ void parse_options( int num, char** arguments ) { zpl_opts opts; - zpl_opts_init( & opts, g_allocator, "refactor"); + zpl_opts_init( & opts, zpl_heap(), "refactor"); zpl_opts_add( & opts, "num", "num" , "Number of files to refactor" , ZPL_OPTS_INT ); zpl_opts_add( & opts, "src" , "src" , "File/s to refactor" , ZPL_OPTS_STRING); zpl_opts_add( & opts, "dst" , "dst" , "File/s post refactor" , ZPL_OPTS_STRING); zpl_opts_add( & opts, "spec", "spec", "Specification for refactoring", ZPL_OPTS_STRING); +#if Build_Debug + zpl_opts_add( & opts, "debug", "debug", "Allows for wait to attach", ZPL_OPTS_FLAG); +#endif + if (opts_custom_compile( & opts, num, arguments)) { sw num = 0; + + #if Build_Debug + if ( zpl_opts_has_arg( & opts, "debug" ) ) + { + zpl_printf("Will wait (pause available for attachment)"); + char pause = getchar(); + } + #endif if ( zpl_opts_has_arg( & opts, "num" ) ) { @@ -158,7 +170,7 @@ zpl_arena Refactor_Buffer; void refactor() { - ct static char const* include_sig = "#include \""; + ct static char const* include_sig = "include"; struct Token { @@ -220,12 +232,23 @@ void refactor() if ( include_sig[0] != src[0] ) continue; + if ( zpl_strncmp( include_sig, src, sizeof(include_sig) - 1 ) != 0 ) + { + break; + } + + src += sizeof(include_sig) - 1; + + // Ignore whitespace + while ( zpl_char_is_space( src[0] ) || src[0] == '\"' || src[0] == '<' ) + { + src++; + } + u32 sig_length = zpl_string_length( ignore->Sig ); - current = zpl_string_set( current, include_sig ); - current = zpl_string_append_length( current, src, sig_length ); - current = zpl_string_append_length( current, "\"", 1 ); - // Formats current into: #include "Sig>" + zpl_string_clear( current ); + current = zpl_string_append_length( current, ignore->Sig, sig_length ); if ( zpl_string_are_equal( ignore->Sig, current ) ) { @@ -233,7 +256,8 @@ void refactor() const sw length = zpl_string_length( current ); - move_forward( length ); + // The + 1 is for the closing " or > of the include + move_forward( length + 1 ); // Force end of line. while ( src[0] != '\n' ) @@ -332,21 +356,30 @@ void refactor() if ( include_sig[0] != src[0] ) continue; + if ( zpl_strncmp( include_sig, src, sizeof(include_sig) - 1 ) != 0 ) + { + break; + } + + src += sizeof(include_sig) - 1; + + // Ignore whitespace + while ( zpl_char_is_space( src[0] ) || src[0] == '\"' || src[0] == '<' ) + { + src++; + } + u32 sig_length = zpl_string_length( include->Sig ); - current = zpl_string_set( current, include_sig ); - current = zpl_string_append_length( current, src, sig_length ); - current = zpl_string_append_length( current, "\"", 1 ); - // Formats current into: #include "Sig>" + zpl_string_clear( current ); + current = zpl_string_append_length( current, include->Sig, sig_length ); if ( zpl_string_are_equal( include->Sig, current ) ) { Token entry {}; - const sw length = zpl_string_length( current ); - entry.Start = pos; - entry.End = pos + length; + entry.End = pos + sig_length; entry.Sig = include->Sig; if ( include->Sub != nullptr ) @@ -359,10 +392,10 @@ void refactor() log_fmt("\nFound %-81s line %d, column %d", current, line, col ); - move_forward( length ); + move_forward( sig_length ); // Force end of line. - while ( src[0] != '\0' ) + while ( src[0] != '\n' ) { move_forward( 1 ); } @@ -486,14 +519,19 @@ void refactor() } while ( --left ); + if (zpl_array_count( tokens ) == 0) + { + return; + } + // Prep data for building the content left = zpl_array_count( tokens); char* content = IO::Current_Content; + zpl_string refactored = zpl_string_make_reserve( zpl_arena_allocator( & Refactor_Buffer ), buffer_size ); + // Generate the refactored file content. - static zpl_string - refactored = zpl_string_make_reserve( zpl_arena_allocator( & Refactor_Buffer ), buffer_size ); { Token* entry = tokens; sw previous_end = 0; @@ -521,7 +559,7 @@ void refactor() previous_end = entry->End; entry++; } - while ( --left ); + while ( --left > 0 ); entry--; @@ -533,7 +571,7 @@ void refactor() IO::write( refactored ); - zpl_string_clear( refactored ); + zpl_free_all( zpl_arena_allocator( & Refactor_Buffer )); } int main( int num, char** arguments )