MWCC/compiler_and_linker/unsorted/CPreprocess.c

677 lines
26 KiB
C

#include "compiler/CPreprocess.h"
#include "compiler/CError.h"
#include "compiler/CMachine.h"
#include "compiler/CParser.h"
#include "compiler/CPrep.h"
#include "compiler/CPrepTokenizer.h"
#include "compiler/CompilerTools.h"
#include "cos.h"
void CPrep_PreprocessDumpNewLine(void) {
if (copts.line_prepdump && pplist.data && filesp >= 0)
AppendGListData(&pplist, "\r", 1);
}
void CPrep_PreprocessDumpFileInfo(Boolean flag) {
char linebuf[512];
int size;
SInt16 tmp16;
SInt32 tmp32;
Str255 filename;
if (pplist.data && filesp >= 0) {
if (nlflag && flag && pplist.size > 0)
AppendGListName(&pplist, "\r");
if (copts.line_prepdump)
size = sprintf(linebuf, "#line %ld\t\"", linenumber);
else
size = sprintf(linebuf, "/* #line %ld\t\"", linenumber);
AppendGListData(&pplist, linebuf, size);
if (copts.fullpath_prepdump) {
if (prep_file->nameNode) {
AppendGListData(&pplist, prep_file->nameNode->name, strlen(prep_file->nameNode->name));
} else {
COS_FileGetPathName(linebuf, &prep_file->textfile, &tmp32);
AppendGListData(&pplist, linebuf, strlen(linebuf));
}
} else {
if (prep_file->nameNode) {
char *work = prep_file->nameNode->name + strlen(prep_file->nameNode->name);
while (work > prep_file->nameNode->name && !strchr("/\\:", work[-1]))
work--;
AppendGListData(&pplist, work, strlen(work));
} else {
COS_FileGetFSSpecInfo(&prep_file->textfile, &tmp16, &tmp32, filename);
AppendGListData(&pplist, &filename[1], filename[0]);
}
}
size = sprintf(linebuf, "\"\t/* stack depth %ld */", filesp);
AppendGListData(&pplist, linebuf, size);
if (copts.line_prepdump && flag)
CPrep_PreprocessDumpNewLine();
nlflag = 1;
}
}
static void CPrep_DumpWString(UInt16 *str, short len) {
int divisor;
int i;
while (len--) {
if (*str < 32) {
AppendGListByte(&pplist, '\\');
switch (*str) {
case 7:
AppendGListByte(&pplist, 'a');
break;
case 8:
AppendGListByte(&pplist, 'b');
break;
case 27:
AppendGListByte(&pplist, 'e');
break;
case 12:
AppendGListByte(&pplist, 'f');
break;
case 10:
AppendGListByte(&pplist, 'n');
break;
case 13:
AppendGListByte(&pplist, 'r');
break;
case 9:
AppendGListByte(&pplist, 't');
break;
case 11:
AppendGListByte(&pplist, 'v');
break;
default:
if (*str >= 8)
AppendGListByte(&pplist, '0' + (*str / 8));
AppendGListByte(&pplist, '0' + (*str % 8));
}
} else if (*str > 255) {
AppendGListByte(&pplist, '\\');
AppendGListByte(&pplist, 'x');
divisor = 0x1000;
for (i = 0; i < 4; i++) {
AppendGListByte(&pplist, "0123456789ABCDEF"[(*str / divisor) % 16]);
divisor /= 16;
}
} else {
switch (*str) {
case '"':
case '\\':
AppendGListByte(&pplist, '\\');
default:
AppendGListByte(&pplist, *str);
}
}
str++;
}
}
static void CPrep_DumpString(UInt8 *str, short len) {
while (len--) {
if (*str < 32) {
AppendGListByte(&pplist, '\\');
switch (*str) {
case 7:
AppendGListByte(&pplist, 'a');
break;
case 8:
AppendGListByte(&pplist, 'b');
break;
case 12:
AppendGListByte(&pplist, 'f');
break;
case 10:
AppendGListByte(&pplist, 'n');
break;
case 13:
AppendGListByte(&pplist, 'r');
break;
case 9:
AppendGListByte(&pplist, 't');
break;
case 11:
AppendGListByte(&pplist, 'v');
break;
default:
if (*str >= 8)
AppendGListByte(&pplist, '0' + (*str / 8));
AppendGListByte(&pplist, '0' + (*str % 8));
}
} else {
switch (*str) {
case '"':
case '\\':
AppendGListByte(&pplist, '\\');
default:
AppendGListByte(&pplist, *str);
}
}
str++;
}
}
void CPrep_Preprocess(void) {
short innertoken;
short token;
char startToken;
char endToken;
int depth;
Boolean save_asmpoundcomment; // r16
Boolean save_cplusplus; // r15
char *p;
startToken = 0;
depth = 0;
if (InitGList(&pplist, 10000))
CError_NoMem();
nlflag = 0;
spaceskip = 0;
if ((token = lex())) {
do {
if (nlflag) {
if (!copts.line_prepdump)
AppendGListData(&pplist, "\r", 1);
} else {
if (spaceskip)
AppendGListByte(&pplist, ' ');
}
while (1) {
switch ((innertoken = token)) {
case '(':
case ')':
case '{':
case '}':
AppendGListByte(&pplist, token);
if (cprep_nostring) {
if (innertoken == startToken) {
depth++;
} else if (innertoken == endToken) {
if (--depth == 0) {
cprep_nostring = 0;
in_assembler = 0;
copts.cplusplus = save_cplusplus;
copts.asmpoundcomment = save_asmpoundcomment;
}
}
}
break;
case TK_INTCONST:
case TK_FLOATCONST:
if (tokenstacklevel > 0)
p = macropos;
else
p = prep_file_start + ts_current[-1].tokenoffset;
AppendGListData(&pplist, p, pos - p);
break;
case TK_IDENTIFIER:
AppendGListData(&pplist, tkidentifier->name, strlen(tkidentifier->name));
break;
case TK_AUTO:
AppendGListData(&pplist, "auto", 4);
break;
case TK_REGISTER:
AppendGListData(&pplist, "register", 8);
break;
case TK_STATIC:
AppendGListData(&pplist, "static", 6);
break;
case TK_EXTERN:
AppendGListData(&pplist, "extern", 6);
break;
case TK_TYPEDEF:
AppendGListData(&pplist, "typedef", 7);
break;
case TK_INLINE:
AppendGListData(&pplist, "inline", 6);
break;
case TK_VOID:
AppendGListData(&pplist, "void", 4);
break;
case TK_CHAR:
AppendGListData(&pplist, "char", 4);
break;
case TK_SHORT:
AppendGListData(&pplist, "short", 5);
break;
case TK_INT:
AppendGListData(&pplist, "int", 3);
break;
case TK_LONG:
AppendGListData(&pplist, "long", 4);
break;
case TK_FLOAT:
AppendGListData(&pplist, "float", 5);
break;
case TK_DOUBLE:
AppendGListData(&pplist, "double", 6);
break;
case TK_SIGNED:
AppendGListData(&pplist, "signed", 6);
break;
case TK_UNSIGNED:
AppendGListData(&pplist, "unsigned", 8);
break;
case TK_STRUCT:
AppendGListData(&pplist, "struct", 6);
break;
case TK_UNION:
AppendGListData(&pplist, "union", 5);
break;
case TK_ENUM:
AppendGListData(&pplist, "enum", 4);
break;
case TK_CLASS:
AppendGListData(&pplist, "class", 5);
break;
case TK_CONST:
AppendGListData(&pplist, "const", 5);
break;
case TK_VOLATILE:
AppendGListData(&pplist, "volatile", 8);
break;
case TK_PASCAL:
AppendGListData(&pplist, "pascal", 6);
break;
case TK_UU_FAR:
AppendGListData(&pplist, "__far", 5);
break;
case TK_ONEWAY:
AppendGListData(&pplist, "oneway", 6);
break;
case TK_IN:
AppendGListData(&pplist, "in", 2);
break;
case TK_OUT:
AppendGListData(&pplist, "out", 3);
break;
case TK_INOUT:
AppendGListData(&pplist, "inout", 5);
break;
case TK_BYCOPY:
AppendGListData(&pplist, "bycopy", 6);
break;
case TK_BYREF:
AppendGListData(&pplist, "byref", 5);
break;
case TK_ASM:
AppendGListData(&pplist, "asm", 3);
endToken = 0;
startToken = 0;
AppendGListByte(&pplist, ' ');
token = lex();
if (token == TK_VOLATILE || (token == TK_IDENTIFIER && !strcmp(tkidentifier->name, "__volatile__"))) {
AppendGListData(&pplist, "volatile", 8);
token = lex();
}
if (token) {
if (token < ' ' || token > 255)
continue;
AppendGListByte(&pplist, token);
if (token == '(') {
startToken = '(';
endToken = ')';
} else if (token == '{') {
startToken = '{';
endToken = '}';
} else {
continue;
}
cprep_nostring = 1;
in_assembler = 1;
depth = 1;
save_asmpoundcomment = copts.asmpoundcomment;
save_cplusplus = copts.cplusplus;
token = lex();
if (token == '"') {
AppendGListByte(&pplist, token);
copts.cplusplus = 0;
copts.asmpoundcomment = 1;
break;
} else if (token == 0) {
break;
}
continue;
}
break;
case TK_CASE:
AppendGListData(&pplist, "case", 4);
break;
case TK_DEFAULT:
AppendGListData(&pplist, "default", 7);
break;
case TK_IF:
AppendGListData(&pplist, "if", 2);
break;
case TK_ELSE:
AppendGListData(&pplist, "else", 4);
break;
case TK_SWITCH:
AppendGListData(&pplist, "switch", 6);
break;
case TK_WHILE:
AppendGListData(&pplist, "while", 5);
break;
case TK_DO:
AppendGListData(&pplist, "do", 2);
break;
case TK_FOR:
AppendGListData(&pplist, "for", 3);
break;
case TK_GOTO:
AppendGListData(&pplist, "goto", 4);
break;
case TK_CONTINUE:
AppendGListData(&pplist, "continue", 8);
break;
case TK_BREAK:
AppendGListData(&pplist, "break", 5);
break;
case TK_RETURN:
AppendGListData(&pplist, "return", 6);
break;
case TK_SIZEOF:
AppendGListData(&pplist, "sizeof", 6);
break;
case TK_CATCH:
AppendGListData(&pplist, "catch", 5);
break;
case TK_DELETE:
AppendGListData(&pplist, "delete", 6);
break;
case TK_FRIEND:
AppendGListData(&pplist, "friend", 6);
break;
case TK_NEW:
AppendGListData(&pplist, "new", 3);
break;
case TK_OPERATOR:
AppendGListData(&pplist, "operator", 8);
break;
case TK_PRIVATE:
AppendGListData(&pplist, "private", 7);
break;
case TK_PROTECTED:
AppendGListData(&pplist, "protected", 9);
break;
case TK_PUBLIC:
AppendGListData(&pplist, "public", 6);
break;
case TK_TEMPLATE:
AppendGListData(&pplist, "template", 8);
break;
case TK_THIS:
AppendGListData(&pplist, "this", 4);
break;
case TK_THROW:
AppendGListData(&pplist, "throw", 5);
break;
case TK_TRY:
AppendGListData(&pplist, "try", 3);
break;
case TK_VIRTUAL:
AppendGListData(&pplist, "virtual", 7);
break;
case TK_INHERITED:
AppendGListData(&pplist, "inherited", 9);
break;
case TK_CONST_CAST:
AppendGListData(&pplist, "const_cast", 10);
break;
case TK_DYNAMIC_CAST:
AppendGListData(&pplist, "dynamic_cast", 12);
break;
case TK_EXPLICIT:
AppendGListData(&pplist, "explicit", 8);
break;
case TK_MUTABLE:
AppendGListData(&pplist, "mutable", 7);
break;
case TK_NAMESPACE:
AppendGListData(&pplist, "namespace", 9);
break;
case TK_REINTERPRET_CAST:
AppendGListData(&pplist, "reinterpret_cast", 16);
break;
case TK_STATIC_CAST:
AppendGListData(&pplist, "static_cast", 11);
break;
case TK_USING:
AppendGListData(&pplist, "using", 5);
break;
case TK_WCHAR_T:
AppendGListData(&pplist, "wchar_t", 7);
break;
case TK_TYPENAME:
AppendGListData(&pplist, "typename", 8);
break;
case TK_TRUE:
AppendGListData(&pplist, "true", 4);
break;
case TK_FALSE:
AppendGListData(&pplist, "false", 5);
break;
case TK_TYPEID:
AppendGListData(&pplist, "typeid", 6);
break;
case TK_EXPORT:
AppendGListData(&pplist, "export", 6);
break;
case TK_UU_STDCALL:
AppendGListData(&pplist, "__stdcall", 9);
break;
case TK_UU_CDECL:
AppendGListData(&pplist, "__cdecl", 7);
break;
case TK_UU_FASTCALL:
AppendGListData(&pplist, "__fastcall", 10);
break;
case TK_UU_DECLSPEC:
AppendGListData(&pplist, "__declspec", 10);
break;
case TK_MULT_ASSIGN:
AppendGListData(&pplist, "*=", 2);
break;
case TK_DIV_ASSIGN:
AppendGListData(&pplist, "/=", 2);
break;
case TK_MOD_ASSIGN:
AppendGListData(&pplist, "%=", 2);
break;
case TK_ADD_ASSIGN:
AppendGListData(&pplist, "+=", 2);
break;
case TK_SUB_ASSIGN:
AppendGListData(&pplist, "-=", 2);
break;
case TK_SHL_ASSIGN:
AppendGListData(&pplist, "<<=", 3);
break;
case TK_SHR_ASSIGN:
AppendGListData(&pplist, ">>=", 3);
break;
case TK_AND_ASSIGN:
AppendGListData(&pplist, "&=", 2);
break;
case TK_XOR_ASSIGN:
AppendGListData(&pplist, "^=", 2);
break;
case TK_OR_ASSIGN:
AppendGListData(&pplist, "|=", 2);
break;
case TK_LOGICAL_OR:
AppendGListData(&pplist, "||", 2);
break;
case TK_LOGICAL_AND:
AppendGListData(&pplist, "&&", 2);
break;
case TK_LOGICAL_EQ:
AppendGListData(&pplist, "==", 2);
break;
case TK_LOGICAL_NE:
AppendGListData(&pplist, "!=", 2);
break;
case TK_LESS_EQUAL:
AppendGListData(&pplist, "<=", 2);
break;
case TK_GREATER_EQUAL:
AppendGListData(&pplist, ">=", 2);
break;
case TK_SHL:
AppendGListData(&pplist, "<<", 2);
break;
case TK_SHR:
AppendGListData(&pplist, ">>", 2);
break;
case TK_INCREMENT:
AppendGListData(&pplist, "++", 2);
break;
case TK_DECREMENT:
AppendGListData(&pplist, "--", 2);
break;
case TK_ARROW:
AppendGListData(&pplist, "->", 2);
break;
case TK_ELLIPSIS:
AppendGListData(&pplist, "...", 3);
break;
case TK_DOT_STAR:
AppendGListData(&pplist, ".*", 2);
break;
case TK_ARROW_STAR:
AppendGListData(&pplist, "->*", 3);
break;
case TK_COLON_COLON:
AppendGListData(&pplist, "::", 2);
break;
case TK_AT_INTERFACE:
AppendGListData(&pplist, "@interface", 10);
break;
case TK_AT_IMPLEMENTATION:
AppendGListData(&pplist, "@implementation", 15);
break;
case TK_AT_PROTOCOL:
AppendGListData(&pplist, "@protocol", 9);
break;
case TK_AT_END:
AppendGListData(&pplist, "@end", 4);
break;
case TK_AT_PRIVATE:
AppendGListData(&pplist, "@private", 8);
break;
case TK_AT_PROTECTED:
AppendGListData(&pplist, "@protected", 10);
break;
case TK_AT_PUBLIC:
AppendGListData(&pplist, "@public", 7);
break;
case TK_AT_CLASS:
AppendGListData(&pplist, "@class", 6);
break;
case TK_AT_SELECTOR:
AppendGListData(&pplist, "@selector", 9);
break;
case TK_AT_ENCODE:
AppendGListData(&pplist, "@encode", 7);
break;
case TK_AT_DEFS:
AppendGListData(&pplist, "@defs", 5);
break;
case TK_SELF:
AppendGListData(&pplist, "self", 4);
break;
case TK_SUPER:
AppendGListData(&pplist, "super", 5);
break;
case TK_BOOL:
if (!copts.cplusplus && copts.c9x)
AppendGListData(&pplist, "_Bool", 5);
else
AppendGListData(&pplist, "bool", 4);
break;
case TK_RESTRICT:
if (copts.c9x)
AppendGListData(&pplist, "restrict", 8);
else
AppendGListData(&pplist, "__restrict", 10);
break;
case TK_UU_VECTOR:
AppendGListData(&pplist, "__vector", 8);
break;
case TK_UU_TYPEOF_UU:
AppendGListData(&pplist, "__typeof__", 10);
break;
case TK_UU_ATTRIBUTE_UU:
AppendGListData(&pplist, "__attribute__", 13);
break;
case TK_UU_ALIGNOF_UU:
AppendGListData(&pplist, "__alignof__", 11);
break;
case TK_UU_UUIDOF:
AppendGListData(&pplist, "__uuidof", 8);
break;
case TK_U_COMPLEX:
AppendGListData(&pplist, "_Complex", 8);
break;
case TK_U_IMAGINARY:
AppendGListData(&pplist, "_Imaginary", 10);
break;
case TK_STRING:
if (ispascalstring) {
AppendGListData(&pplist, "\"\\p", 3);
CPrep_DumpString((UInt8 *) tkstring + 1, tksize - 1);
} else {
AppendGListByte(&pplist, '"');
CPrep_DumpString((UInt8 *) tkstring, tksize - 1);
}
AppendGListByte(&pplist, '"');
break;
case TK_STRING_WIDE:
AppendGListData(&pplist, "L\"", 2);
CPrep_DumpWString((UInt16 *) tkstring, (tksize / stwchar.size) - 1);
AppendGListByte(&pplist, '"');
break;
default:
if (token >= 32 && token <= 255)
AppendGListByte(&pplist, token);
else
CError_FATAL(563);
}
break;
}
CPrep_TokenStreamFlush();
nlflag = 0;
spaceskip = 0;
} while ((token = lex()));
}
AppendGListByte(&pplist, 0);
COS_ResizeHandle(pplist.data, pplist.size);
}