Non-include refactors work. Multi-file works.

This commit is contained in:
Edward R. Gonzalez 2023-03-18 03:10:43 -04:00
parent 97967e56d9
commit d0fad572bc
6 changed files with 104 additions and 45 deletions

View File

@ -8,6 +8,7 @@ Refactor c/c++ files (and problably others) with ease.
* `-src` : Source file to refactor * `-src` : Source file to refactor
* `-dst` : Destination file after the refactor (omit to use the same as source) * `-dst` : Destination file after the refactor (omit to use the same as source)
* `-spec` : Specification containing rules to use for the refactor. * `-spec` : Specification containing rules to use for the refactor.
* `-debug` : Use only if on debug build and desire to attach to process.
## Syntax : ## Syntax :
@ -45,3 +46,4 @@ TODO:
* Test to see how much needs to be ported for other platforms (if at all) * Test to see how much needs to be ported for other platforms (if at all)
* Setup as api. * Setup as api.
* Provide binaries in the release page for github. (debug and release builds) * 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.

View File

@ -9,7 +9,7 @@ namespace Memory
void setup() 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 ) if ( Global_Arena.total_size == 0 )
{ {

View File

@ -18,7 +18,8 @@ namespace IO
uw Current_Size = 0; uw Current_Size = 0;
uw Largest_Src_Size = 0; uw Largest_Src_Size = 0;
zpl_arena MemPerist; zpl_arena MemSpec;
zpl_arena MemSrc;
} }
using namespace StaticData; using namespace StaticData;
@ -49,16 +50,17 @@ namespace IO
zpl_file_close( & src ); 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() void cleanup()
{ {
zpl_arena_free( & MemPerist ); zpl_arena_free( & MemSpec );
zpl_arena_free( & MemSrc );
} }
Array_Line get_specification() Array_Line get_specification()
@ -78,22 +80,23 @@ namespace IO
fatal("No content in specificaiton to process"); 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_read( & file, content, fsize);
zpl_file_close( & file ); zpl_file_close( & file );
content[fsize] = 0; 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; return lines;
} }
char* get_next_source() char* get_next_source()
{ {
zpl_memset( MemPerist.physical_start, 0, MemPerist.total_allocated); zpl_memset( MemSrc.physical_start, 0, MemSrc.total_allocated);
MemPerist.total_allocated = 0; zpl_free_all( zpl_arena_allocator( & MemSrc) );
MemPerist.temp_count = 0;
Current++; Current++;
@ -111,7 +114,7 @@ namespace IO
if ( Current_Size <= 0 ) if ( Current_Size <= 0 )
return nullptr; 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_read( & file, Current_Content, Current_Size );
zpl_file_close( & file ); zpl_file_close( & file );
@ -138,7 +141,6 @@ namespace IO
} }
zpl_file_write( & file_dest, refacotred, zpl_string_length(refacotred) ); zpl_file_write( & file_dest, refacotred, zpl_string_length(refacotred) );
zpl_file_close( & file_dest ); zpl_file_close( & file_dest );
} }
} }

View File

@ -38,15 +38,30 @@ namespace Spec
// Helper function for process(). // Helper function for process().
forceinline 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 ); zpl_string_clear( token );
length = 0; length = 0;
while ( zpl_char_is_alphanumeric( line[length] ) || line[length] == '_' ) #define current line[length]
if (type == Tok::Include)
{
// Allows for '.'
while ( zpl_char_is_alphanumeric( current )
|| current == '_'
|| current == '.' )
{ {
length++; length++;
} }
}
else
{
while ( zpl_char_is_alphanumeric( current ) || current == '_' )
{
length++;
}
}
#undef current
if ( length == 0 ) if ( length == 0 )
{ {
@ -120,14 +135,14 @@ namespace Spec
} }
u32 length = 0; u32 length = 0;
// Find a valid token
find_next_token( token, line, length );
Tok type = Tok::Num_Tok; Tok type = Tok::Num_Tok;
bool ignore = false; bool ignore = false;
Entry entry {}; Entry entry {};
// Find a valid token
find_next_token( type, token, line, length );
// Will be reguarded as an ignore. // Will be reguarded as an ignore.
if ( is_tok( Tok::Not, token, length )) if ( is_tok( Tok::Not, token, length ))
{ {
@ -143,7 +158,7 @@ namespace Spec
} }
// Find the category token // Find the category token
find_next_token( token, line, length ); find_next_token( type, token, line, length );
} }
if ( is_tok( Tok::Word, token, length ) ) if ( is_tok( Tok::Word, token, length ) )
@ -175,7 +190,7 @@ namespace Spec
continue; continue;
} }
find_next_token( token, line, length ); find_next_token( type, token, line, length );
// First argument is signature. // First argument is signature.
entry.Sig = zpl_string_make_length( g_allocator, token, length ); 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. // Second argument is substitute.
entry.Sub = zpl_string_make_length( g_allocator, token, length ); entry.Sub = zpl_string_make_length( g_allocator, token, length );

View File

@ -90,6 +90,8 @@ ct char const* Msg_Invalid_Value = "INVALID VALUE PROVIDED";
namespace Memory namespace Memory
{ {
ct uw Initial_Reserve = zpl_megabytes(2);
extern zpl_arena Global_Arena; extern zpl_arena Global_Arena;
#define g_allocator zpl_arena_allocator( & Memory::Global_Arena) #define g_allocator zpl_arena_allocator( & Memory::Global_Arena)

View File

@ -9,16 +9,28 @@
void parse_options( int num, char** arguments ) void parse_options( int num, char** arguments )
{ {
zpl_opts opts; 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, "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, "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, "dst" , "dst" , "File/s post refactor" , ZPL_OPTS_STRING);
zpl_opts_add( & opts, "spec", "spec", "Specification for refactoring", 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)) if (opts_custom_compile( & opts, num, arguments))
{ {
sw num = 0; 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" ) ) if ( zpl_opts_has_arg( & opts, "num" ) )
{ {
num = zpl_opts_integer( & opts, "num", -1 ); num = zpl_opts_integer( & opts, "num", -1 );
@ -158,7 +170,7 @@ zpl_arena Refactor_Buffer;
void refactor() void refactor()
{ {
ct static char const* include_sig = "#include \""; ct static char const* include_sig = "include";
struct Token struct Token
{ {
@ -220,12 +232,23 @@ void refactor()
if ( include_sig[0] != src[0] ) if ( include_sig[0] != src[0] )
continue; 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 ); u32 sig_length = zpl_string_length( ignore->Sig );
current = zpl_string_set( current, include_sig ); zpl_string_clear( current );
current = zpl_string_append_length( current, src, sig_length ); current = zpl_string_append_length( current, ignore->Sig, sig_length );
current = zpl_string_append_length( current, "\"", 1 );
// Formats current into: #include "<ignore->Sig>"
if ( zpl_string_are_equal( ignore->Sig, current ) ) if ( zpl_string_are_equal( ignore->Sig, current ) )
{ {
@ -233,7 +256,8 @@ void refactor()
const sw length = zpl_string_length( current ); 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. // Force end of line.
while ( src[0] != '\n' ) while ( src[0] != '\n' )
@ -332,21 +356,30 @@ void refactor()
if ( include_sig[0] != src[0] ) if ( include_sig[0] != src[0] )
continue; 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 ); u32 sig_length = zpl_string_length( include->Sig );
current = zpl_string_set( current, include_sig ); zpl_string_clear( current );
current = zpl_string_append_length( current, src, sig_length ); current = zpl_string_append_length( current, include->Sig, sig_length );
current = zpl_string_append_length( current, "\"", 1 );
// Formats current into: #include "<ignore->Sig>"
if ( zpl_string_are_equal( include->Sig, current ) ) if ( zpl_string_are_equal( include->Sig, current ) )
{ {
Token entry {}; Token entry {};
const sw length = zpl_string_length( current );
entry.Start = pos; entry.Start = pos;
entry.End = pos + length; entry.End = pos + sig_length;
entry.Sig = include->Sig; entry.Sig = include->Sig;
if ( include->Sub != nullptr ) if ( include->Sub != nullptr )
@ -359,10 +392,10 @@ void refactor()
log_fmt("\nFound %-81s line %d, column %d", current, line, col ); log_fmt("\nFound %-81s line %d, column %d", current, line, col );
move_forward( length ); move_forward( sig_length );
// Force end of line. // Force end of line.
while ( src[0] != '\0' ) while ( src[0] != '\n' )
{ {
move_forward( 1 ); move_forward( 1 );
} }
@ -486,14 +519,19 @@ void refactor()
} }
while ( --left ); while ( --left );
if (zpl_array_count( tokens ) == 0)
{
return;
}
// Prep data for building the content // Prep data for building the content
left = zpl_array_count( tokens); left = zpl_array_count( tokens);
char* content = IO::Current_Content; char* content = IO::Current_Content;
zpl_string refactored = zpl_string_make_reserve( zpl_arena_allocator( & Refactor_Buffer ), buffer_size );
// Generate the refactored file content. // Generate the refactored file content.
static zpl_string
refactored = zpl_string_make_reserve( zpl_arena_allocator( & Refactor_Buffer ), buffer_size );
{ {
Token* entry = tokens; Token* entry = tokens;
sw previous_end = 0; sw previous_end = 0;
@ -521,7 +559,7 @@ void refactor()
previous_end = entry->End; previous_end = entry->End;
entry++; entry++;
} }
while ( --left ); while ( --left > 0 );
entry--; entry--;
@ -533,7 +571,7 @@ void refactor()
IO::write( refactored ); IO::write( refactored );
zpl_string_clear( refactored ); zpl_free_all( zpl_arena_allocator( & Refactor_Buffer ));
} }
int main( int num, char** arguments ) int main( int num, char** arguments )