summaryrefslogtreecommitdiff
path: root/compiler_and_linker/FrontEnd/C
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--compiler_and_linker/FrontEnd/C/CPrep.c126
-rw-r--r--compiler_and_linker/FrontEnd/Common/CompilerTools.c67
2 files changed, 128 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;
}
}
diff --git a/compiler_and_linker/FrontEnd/Common/CompilerTools.c b/compiler_and_linker/FrontEnd/Common/CompilerTools.c
index fff4809..272cd81 100644
--- a/compiler_and_linker/FrontEnd/Common/CompilerTools.c
+++ b/compiler_and_linker/FrontEnd/Common/CompilerTools.c
@@ -53,6 +53,69 @@ unsigned char *CTool_CtoPstr(char *cstr) {
return (unsigned char *) cstr;
}
+#ifdef CW_64_BIT_SUPPORT
+enum { PoolCapacity = 64 };
+typedef struct ITPPool {
+ void *pointers[PoolCapacity];
+ UInt32 baseIndex;
+ UInt32 size;
+ struct ITPPool *next;
+} ITPPool;
+static ITPPool *poolHead;
+static ITPPool *poolTail;
+
+void *CTool_ResolveIndexToPointer(UInt32 index) {
+ ITPPool *pool = poolHead;
+
+ if (index == 0)
+ return NULL;
+
+ while (pool && index >= PoolCapacity) {
+ pool = pool->next;
+ index -= PoolCapacity;
+ }
+
+ if (pool && index < pool->size)
+ return pool->pointers[index];
+ else
+ return NULL;
+}
+
+UInt32 CTool_CreateIndexFromPointer(void *ptr) {
+ ITPPool *pool = poolTail;
+ UInt32 index;
+
+ if (ptr == NULL)
+ return 0;
+
+ if (!pool || pool->size >= PoolCapacity) {
+ pool = lalloc(sizeof(ITPPool));
+ pool->size = 0;
+ if (poolTail) {
+ pool->baseIndex = poolTail->baseIndex + PoolCapacity;
+ poolTail->next = pool;
+ } else {
+ pool->baseIndex = 0;
+ // always reserve index 0 for NULL
+ pool->pointers[0] = NULL;
+ pool->size = 1;
+ poolHead = pool;
+ }
+ poolTail = pool;
+ }
+
+ index = pool->baseIndex + pool->size;
+ pool->pointers[pool->size] = ptr;
+ pool->size++;
+ return index;
+}
+
+static void CTool_ResetPointerPool(void) {
+ poolHead = NULL;
+ poolTail = NULL;
+}
+#endif
+
static void GListError(void) {
if (GListErrorProc)
GListErrorProc();
@@ -845,6 +908,10 @@ void freelheap(void) {
blockp->blockfree = blockp->blocksize - sizeof(HeapBlock);
blockp = blockp->next;
}
+
+#ifdef CW_64_BIT_SUPPORT
+ CTool_ResetPointerPool();
+#endif
}
}