As some of you already know I'm making my own compiler, I just wrote a function for adding defines to a dedicated temporary file and just need to know if I made any oversights:
Code:
int next_word(
file_pos_t *file_pos,
register _Bool stop_at_newline );
int add_define( lint_t *lint, file_pos_t *file_pos ) {
int ret = next_word( file_pos, 1 );
FILE *out = lint->files[CODE_DEFTAB];
char *text = &(file_pos->text[file_pos->pos]);
int pos, len;
long len_pos;
(void)fseek( out, 0, SEEK_END );
if ( ret != 0 ) return ret;
/* NAME */
if ( fwrite( &file_pos->len, sizeof(int), 1, out ) < sizeof(int) )
return ENOMEM;
if ( fwrite( text, 1, file_pos->len, out ) < file_pos->len )
return ENOMEM;
if ( text[len-1] == '(' ) {
len = file_pos->len;
len_pos = ftell( out );
while ( text[len-1] != ')' ) {
ret = next_word( file_pos, 0 );
if ( ret != 0 ) return ret;
len += file_pos->len;
if ( fwrite( text, 1, file_pos->len, out ) < file_pos->len )
return ENOMEM;
}
(void)fseek( out, len_pos, SEEK_SET );
(void)fwrite( &len, sizeof(int), 1, out );
(void)fseek( out, 0, SEEK_END );
}
ret = next_word( file_pos, 1 );
len = 0;
pos = file_pos->pos;
text = &file_pos->text[pos];
if ( ret == '\n' )
goto add_define_write_len;
while ( 1 ) {
len = file_pos->pos - pos;
len += file_pos->len;
if ( text[len-1] == '\\' ) {
ret = next_word( file_pos, 1 );
continue;
}
if ( ret == '\n' )
break;
}
add_define_write_len:
if ( fwrite( &len, sizeof(int), 1, out ) < sizeof(int) )
return ENOMEM;
if ( len > 0 ) {
if ( fwrite( text, 1, len, out ) < len )
return ENOMEM;
}
return 0;
}
No rush for responses as I'm taking a rather lax attitude to the project in the first place