diff options
author | pommicket <pommicket@gmail.com> | 2022-01-10 15:12:24 -0500 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2022-01-10 15:12:24 -0500 |
commit | b963bc91e6bc1612e920dffd4a32aa9d310f4ff3 (patch) | |
tree | 69775c18a5951decdff8cb482e94871037fd5ae1 | |
parent | f192249c65fc036b55c169e90bf5e63ba149f658 (diff) |
#include
-rw-r--r-- | 05/main.b | 6 | ||||
-rw-r--r-- | 05/main.c | 10 | ||||
-rw-r--r-- | 05/preprocess.b | 112 |
3 files changed, 107 insertions, 21 deletions
@@ -61,6 +61,7 @@ function main local input_filename local output_filename local pptokens + local processed_pptokens dat_banned_objmacros = 255 dat_banned_fmacros = 255 @@ -78,7 +79,10 @@ function main pptokens = split_into_preprocessing_tokens(input_filename) print_pptokens(pptokens) print_separator() - pptokens = translation_phase_4(input_filename, pptokens) + processed_pptokens = malloc(16000000) + translation_phase_4(input_filename, pptokens, processed_pptokens) + free(pptokens) + pptokens = processed_pptokens print_pptokens(pptokens) print_object_macros() print_function_macros() @@ -1,12 +1,14 @@ -#define f(x) x x +#define F(x) x x -f(2 +F(2 3) #define STRINGIFY(x) #x -#define MY_FILE STRINGIFY(some_file.c) #define LINE_NUMBER 1982 +#define INC_FILE STRINGIFY(macro_test.c) -#line LINE_NUMBER MY_FILE +#include INC_FILE /* include macro test */ + +xglue(LINE_,NUMBER) #pragma diff --git a/05/preprocess.b b/05/preprocess.b index dfb6210..c457bb7 100644 --- a/05/preprocess.b +++ b/05/preprocess.b @@ -380,11 +380,6 @@ function split_into_preprocessing_tokens :str_unterminated_string string Unterminated string or character literal. byte 0 -; :bad_pptoken -; compile_error(filename, line_number, .str_bad_pptoken) -; :str_bad_pptoken -; string Bad preprocessing token. -; byte 0 :no_newline_at_end_of_file compile_error(filename, 0, .str_no_newline_at_end_of_file) :str_no_newline_at_end_of_file @@ -471,7 +466,7 @@ function pptoken_skip_to_newline function translation_phase_4 argument filename argument input - local output + argument output local in local out local p @@ -479,10 +474,21 @@ function translation_phase_4 local b local macro_name local line_number - - output = malloc(16000000) + local temp_out + out = output in = input + + ; output line directive to put us in the right place for included files + *1out = '$ + out += 1 + *1out = '1 + out += 1 + *1out = 32 + out += 1 + out = strcpy(out, filename) + out += 1 + line_number = 0 :phase4_line @@ -523,6 +529,8 @@ function translation_phase_4 if b != 0 goto pp_directive_pragma b = str_equals(in, .str_line) if b != 0 goto pp_directive_line + b = str_equals(in, .str_include) + if b != 0 goto pp_directive_include goto unrecognized_directive :pp_directive_error fputs(2, filename) @@ -530,10 +538,13 @@ function translation_phase_4 fputn(2, line_number) fputs(2, .str_directive_error) exit(1) + :str_directive_error + string : #error + byte 10 + byte 0 :pp_directive_line global 1000 dat_directive_line_text - local temp_out temp_out = &dat_directive_line_text macro_replacement_to_terminator(filename, &line_number, &in, &temp_out, 10) temp_out = &dat_directive_line_text @@ -708,12 +719,72 @@ function translation_phase_4 :str_unrecognized_pragma string Unrecognized #pragma. byte 0 - :str_directive_error - string : #error - byte 10 - byte 0 - :phase4_end - return output + :pp_directive_include + global 1000 dat_directive_include_text + local inc_filename + temp_out = &dat_directive_include_text + inc_filename = malloc(4000) + pptoken_skip(&in) + macro_replacement_to_terminator(filename, &line_number, &in, &temp_out, 10) + temp_out = &dat_directive_include_text + pptoken_skip_spaces(&temp_out) + if *1temp_out == '" goto pp_include_string + if *1temp_out == '< goto pp_include_angle_brackets + goto bad_include + + :pp_include_string + p = inc_filename + temp_out += 1 + :pp_include_string_loop + c = *1temp_out + temp_out += 1 + if c == '" goto pp_include_string_loop_end + if c == 10 goto bad_include ; no terminating quote + *1p = c + p += 1 + goto pp_include_string_loop + :pp_include_string_loop_end + temp_out += 1 ; skip null separator after terminating quote + pptoken_skip_spaces(&temp_out) + if *1temp_out != 0 goto bad_include ; stuff after filename + goto pp_include_have_filename + :pp_include_angle_brackets + p = inc_filename + temp_out += 1 + :pp_include_angle_brackets_loop + c = *1temp_out + temp_out += 1 + if c == '> goto pp_include_angle_brackets_loop_end + if c == 10 goto bad_include ; no terminating > + if c == 0 goto pp_include_angle_brackets_loop ; separators between pptokens + *1p = c + p += 1 + goto pp_include_angle_brackets_loop + :pp_include_angle_brackets_loop_end + temp_out += 1 ; skip null separator after terminating > + pptoken_skip_spaces(&temp_out) + if *1temp_out != 0 goto bad_include ; stuff after filename + goto pp_include_have_filename + :pp_include_have_filename + + local included_pptokens + included_pptokens = split_into_preprocessing_tokens(inc_filename) + out = translation_phase_4(inc_filename, included_pptokens, out) + free(included_pptokens) + free(inc_filename) + + ; output a line directive to put us back in the right place + *1out = '$ + out += 1 + p = itos(line_number) + out = strcpy(out, p) + *1out = 32 + out += 1 + out = strcpy(out, filename) + out += 1 + + goto process_pptoken + :unrecognized_directive compile_error(filename, line_number, .str_unrecognized_directive) :str_unrecognized_directive @@ -744,7 +815,16 @@ function translation_phase_4 :str_bad_line_directive string Bad #line. byte 0 - + :bad_include + compile_error(filename, line_number, .str_bad_include) + :str_bad_include + string Bad #include. + byte 0 + + + :phase4_end + return out + ; returns a pointer to the replacement pptokens, or 0 if this macro is not defined function look_up_macro argument macros |