diff options
Diffstat (limited to 'compiler_and_linker/FrontEnd/C/CPrep.c')
-rw-r--r-- | compiler_and_linker/FrontEnd/C/CPrep.c | 126 |
1 files changed, 61 insertions, 65 deletions
diff --git a/compiler_and_linker/FrontEnd/C/CPrep.c b/compiler_and_linker/FrontEnd/C/CPrep.c index 80472b1..36ba0f9 100644 --- a/compiler_and_linker/FrontEnd/C/CPrep.c +++ b/compiler_and_linker/FrontEnd/C/CPrep.c @@ -4137,7 +4137,6 @@ static void prependif(void) { } static void prepifskip(void) { - // this function does something very weird with its code generation that i can't match TStreamElement ts; short t; @@ -4146,78 +4145,75 @@ static void prepifskip(void) { case IfState_1: case IfState_3: case IfState_4: - while (1) { - t = prepskipnextchar(); - pos = nextcharpos; - switch (t) { - case 0: - if (tokenstacklevel > 0) { - poptokenseq(); - } else if (tokenstacklevel > 0 || pos >= prep_file_end) { - if (filesp > 0) { - popfile(); - } else { - was_prep_error = 0; - ts.tokenfile = ifstack[iflevel - 1].file; - ts.tokenoffset = ifstack[iflevel - 1].pos; - CError_SetErrorToken(&ts); - CError_ErrorTerm(CErrorStr119); - iflevel = 0; - return; - } + restart: + t = prepskipnextchar(); + pos = nextcharpos; + switch (t) { + case 0: + if (tokenstacklevel > 0) { + poptokenseq(); + } else if (tokenstacklevel > 0 || pos >= prep_file_end) { + if (filesp > 0) { + popfile(); } else { - CPrep_Error(CErrorStr105); - } - continue; - case '\r': - newline(); - continue; - case '"': - skipendoflinematch((StringPtr) pos, '"'); - continue; - case '\'': - skipendoflinematch((StringPtr) pos, '"'); - continue; - case '#': - t = prepskipnextchar(); - pos = nextcharpos; - switch (t) { - case '\r': - continue; - case 0: - CPrep_Error(CErrorStr102); - default: - pos = ReadIdentifier(pos - 1); - if (!strcmp("if", tkidentifier->name)) { - prepif(); - } else if (!strcmp("ifdef", tkidentifier->name)) { - prepifdef(); - } else if (!strcmp("ifndef", tkidentifier->name)) { - prepifndef(); - } else if (!strcmp("elif", tkidentifier->name)) { - prepelif(); - } else if (!strcmp("else", tkidentifier->name)) { - prepelse(); - } else if (!strcmp("endif", tkidentifier->name)) { - prependif(); - } else { - skipendofline(); - continue; - } + was_prep_error = 0; + ts.tokenfile = ifstack[iflevel - 1].file; + ts.tokenoffset = ifstack[iflevel - 1].pos; + CError_SetErrorToken(&ts); + CError_ErrorTerm(CErrorStr119); + iflevel = 0; + return; } - break; - default: - skipendofline(); - continue; - } - break; + } else { + CPrep_Error(CErrorStr105); + } + goto restart; + case '\r': + newline(); + goto restart; + case '"': + skipendoflinematch((StringPtr) pos, '"'); + goto restart; + case '\'': + skipendoflinematch((StringPtr) pos, '"'); + goto restart; + case '#': + t = prepskipnextchar(); + pos = nextcharpos; + switch (t) { + case '\r': + goto restart; + case 0: + CPrep_Error(CErrorStr102); + default: + pos = ReadIdentifier(pos - 1); + if (!strcmp("if", tkidentifier->name)) { + prepif(); + } else if (!strcmp("ifdef", tkidentifier->name)) { + prepifdef(); + } else if (!strcmp("ifndef", tkidentifier->name)) { + prepifndef(); + } else if (!strcmp("elif", tkidentifier->name)) { + prepelif(); + } else if (!strcmp("else", tkidentifier->name)) { + prepelse(); + } else if (!strcmp("endif", tkidentifier->name)) { + prependif(); + } else { + skipendofline(); + goto restart; + } + } + break; + default: + skipendofline(); + goto restart; } break; case IfState_2: default: return; } - return; } } |