diff options
author | Ash Wolf <ninji@wuffs.org> | 2022-10-25 20:30:28 +0100 |
---|---|---|
committer | Ash Wolf <ninji@wuffs.org> | 2022-10-25 20:30:28 +0100 |
commit | d0b9848c54e6f85ab713f059dcd1ddef7e57caa6 (patch) | |
tree | 5bdb9dbf6c853780bc444dc92bf6f9fa3a95742a /CompilerTools.c | |
parent | 685f22a6a0a5403c76316a2390c021a7b0f7597d (diff) | |
download | MWCC-d0b9848c54e6f85ab713f059dcd1ddef7e57caa6.tar.gz MWCC-d0b9848c54e6f85ab713f059dcd1ddef7e57caa6.zip |
a bunch of compiler stuff
Diffstat (limited to 'CompilerTools.c')
-rw-r--r-- | CompilerTools.c | 1244 |
1 files changed, 0 insertions, 1244 deletions
diff --git a/CompilerTools.c b/CompilerTools.c deleted file mode 100644 index d2ff19d..0000000 --- a/CompilerTools.c +++ /dev/null @@ -1,1244 +0,0 @@ -#include "CompilerTools.h" - -static short lheaplockcount; -static void (*heaperror)(); -static Allocator bheap; -static Allocator oheap; -static Allocator aheap; -static Allocator lheap; -static Allocator gheap; -long hash_name_id; -StringNode **name_hash_nodes; -void (*GListErrorProc)(); - -void CompilerGetPString(short index, unsigned char *str) { - COS_GetPString(str, 10100, index); -} - -void CompilerGetCString(short index, char *str) { - COS_GetString(str, 10100, index); -} - -unsigned char *CTool_CtoPstr(char *input) { - char *work = input; - int length = 0; - int i; - - while (*work) { - ++length; - ++work; - } - - for (i = length; i > 0; i--) { - work[0] = work[-1]; - --work; - } - - input[0] = length; - return (unsigned char *) input; -} - -static void GListError() { - if (GListErrorProc) - GListErrorProc(); -} - -int InitGList(GList *list, long capacity) { - if ((list->data = COS_NewOSHandle(capacity)) == 0) - if ((list->data = COS_NewHandle(capacity)) == 0) - return -1; - list->size = 0; - list->expansion = capacity >> 1; - list->capacity = capacity; - return 0; -} - -void FreeGList(GList *list) { - if (list->data != 0) { - COS_FreeHandle(list->data); - list->data = 0; - } - list->capacity = 0; - list->size = 0; -} - -void LockGList(GList *list) { - COS_LockHandleHi(list->data); -} - -void UnlockGList(GList *list) { - COS_UnlockHandle(list->data); -} - -void ShrinkGList(GList *list) { - COS_ResizeHandle(list->data, list->capacity = list->size); -} - -void AppendGListData(GList *list, const void *data, long size) { - if ((list->size + size) > list->capacity) { - if (!COS_ResizeHandle(list->data, list->capacity += size + list->expansion)) - GListError(); - } - - memcpy(*list->data + list->size, data, size); - list->size += size; -} - -void AppendGListNoData(GList *list, long size) { - if ((list->size + size) > list->capacity) { - if (!COS_ResizeHandle(list->data, list->capacity += size + list->expansion)) - GListError(); - } - - list->size += size; -} - -void AppendGListByte(GList *list, char v) { - if ((list->size + 1) > list->capacity) { - if (!COS_ResizeHandle(list->data, list->capacity += 1 + list->expansion)) - GListError(); - } - - (*list->data)[list->size++] = v; -} - -void AppendGListWord(GList *list, short v) { - char *p; - - if ((list->size + 2) > list->capacity) { - if (!COS_ResizeHandle(list->data, list->capacity += 2 + list->expansion)) - GListError(); - } - - p = *list->data + list->size; - list->size += 2; - *(p++) = ((unsigned char *) &v)[0]; - *(p++) = ((unsigned char *) &v)[1]; -} - -void AppendGListTargetEndianWord(GList *list, short v) { - char *p; - - if ((list->size + 2) > list->capacity) { - if (!COS_ResizeHandle(list->data, list->capacity += 2 + list->expansion)) - GListError(); - } - - p = *list->data + list->size; - list->size += 2; - *(p++) = ((unsigned char *) &v)[0]; - *(p++) = ((unsigned char *) &v)[1]; -} - -void AppendGListLong(GList *list, long v) { - char *p; - - if ((list->size + 4) > list->capacity) { - if (!COS_ResizeHandle(list->data, list->capacity += 4 + list->expansion)) - GListError(); - } - - p = *list->data + list->size; - list->size += 4; - *(p++) = ((unsigned char *) &v)[0]; - *(p++) = ((unsigned char *) &v)[1]; - *(p++) = ((unsigned char *) &v)[2]; - *(p++) = ((unsigned char *) &v)[3]; -} - -void AppendGListTargetEndianLong(GList *list, long v) { - char *p; - - if ((list->size + 4) > list->capacity) { - if (!COS_ResizeHandle(list->data, list->capacity += 4 + list->expansion)) - GListError(); - } - - p = *list->data + list->size; - list->size += 4; - *(p++) = ((unsigned char *) &v)[0]; - *(p++) = ((unsigned char *) &v)[1]; - *(p++) = ((unsigned char *) &v)[2]; - *(p++) = ((unsigned char *) &v)[3]; -} - -void AppendGListID(GList *list, const char *str) { - unsigned long size = strlen(str) + 1; - if ((list->size + size) > list->capacity) { - if (!COS_ResizeHandle(list->data, list->capacity += size + list->expansion)) - GListError(); - } - - memcpy(*list->data + list->size, str, size); - list->size += size; -} - -void AppendGListName(GList *list, const char *str) { - unsigned long size = strlen(str); - if ((list->size + size) > list->capacity) { - if (!COS_ResizeHandle(list->data, list->capacity += size + list->expansion)) - GListError(); - } - - memcpy(*list->data + list->size, str, size); - list->size += size; -} - -void RemoveGListData(GList *list, long size) { - list->size -= size; - if (list->capacity > (list->size + list->expansion * 2)) - COS_ResizeHandle(list->data, list->capacity = list->size + list->expansion); -} - -char GetGListByte(GList *list) { - unsigned char *p; - char r; - - p = (unsigned char *) (*list->data + list->size); - list->size++; - r = p[0]; - return r; -} - -short GetGListWord(GList *list) { - unsigned char *p; - union { unsigned char bytes[2]; short s; } data; - - p = (unsigned char *) (*list->data + list->size); - list->size += 2; - data.bytes[0] = p[0]; - data.bytes[1] = p[1]; - return data.s; -} - -long GetGListLong(GList *list) { - unsigned char *p; - union { unsigned char bytes[4]; long l; } data; - - p = (unsigned char *) (*list->data + list->size); - list->size += 4; - data.bytes[0] = p[0]; - data.bytes[1] = p[1]; - data.bytes[2] = p[2]; - data.bytes[3] = p[3]; - return data.l; -} - -short GetGListID(GList *list, char *buf) { - short len; - char *p; - - len = 1; - p = *list->data + list->size; - while (*p) { - *(buf++) = *(p++); - len++; - } - - *buf = *p; - list->size += len; - return len; -} - -void GetGListData(GList *list, char *buf, long size) { - memcpy(buf, *list->data + list->size, size); - list->size += size; -} - -static long hashpjw(const char *str) { - unsigned long work = 0; - unsigned long tmp; - - while (*str) { - work = (work << 4) + *str; - tmp = work & 0xF0000000; - if (tmp) { - work ^= (tmp >> 24); - work ^= tmp; - } - str++; - } - - return work % 0xFFFFFD; -} - -static short PHash(const unsigned char *str) { - short result; - short counter; - unsigned char work; - const unsigned char *p; - - result = str[0] & 0xFF; - p = &str[1]; - if (str[0] & 0xFF) { - counter = result; - work = 0; - while (counter > 0) { - work = (work >> 3) | (work << 5); - work += *p; - --counter; - ++p; - } - - result = (result << 8) | work; - } - - return result & 0x7FF; -} - -short CHash(const char *str) { - /* not matching :( */ - unsigned char len; - short result; // orig r4 - unsigned char work; // orig r5 - short counter; // orig r3 - - // counter,result,work -> r3=work, r4=counter, r5=result - // result,counter,work -> r3=work, r4=result, r5=counter - // work,result,counter -> r3=work, r4=result, r5=counter - // work,counter,result -> r3=work, r4=counter, r5=result - // counter,work,result -> r3=work, r4=counter, r5=result - // result,work,counter -> r3=work, r4=result, r5=counter - - // i am: r4 = result, r5 = counter, r3 = work - - len = strlen(str); - result = len; - if (len) { - counter = len; - work = 0; - while (counter > 0) { - work = (work >> 3) | (work << 5); - work = work + *str; - //work = *(str++) + (unsigned char) ((work >> 3) | (work << 5)); - counter--; - str++; - } - result = result << 8; - result = result | work; - } - - return result & 0x7FF; -} - -StringNode *GetHashNameNode(const char *str) { - StringNode *node; - short hash; - - hash = CHash(str); - node = name_hash_nodes[hash]; - if (node == 0) { - node = (StringNode *) galloc(strlen(str) + sizeof(StringNode)); - name_hash_nodes[hash] = node; - node->next = 0; - node->index = hash_name_id++; - node->hash = hash; - strcpy(node->data, str); - return node; - } else { - for (;;) { - if (strcmp(str, node->data) == 0) { - if (node->index < 0) - node->index = hash_name_id++; - return node; - } - - if (node->next == 0) { - node->next = (StringNode *) galloc(strlen(str) + sizeof(StringNode)); - node = node->next; - node->next = 0; - node->index = hash_name_id++; - node->hash = hash; - strcpy(node->data, str); - return node; - } else { - node = node->next; - } - } - } -} - -StringNode *GetHashNameNodeHash(const char *str, short hash) { - StringNode *node; - - node = name_hash_nodes[hash]; - if (node == 0) { - node = (StringNode *) galloc(strlen(str) + sizeof(StringNode)); - name_hash_nodes[hash] = node; - node->next = 0; - node->index = hash_name_id++; - node->hash = hash; - strcpy(node->data, str); - return node; - } else { - for (;;) { - if (strcmp(str, node->data) == 0) - return node; - - if (node->next == 0) { - node->next = (StringNode *) galloc(strlen(str) + sizeof(StringNode)); - node = node->next; - node->next = 0; - node->index = hash_name_id++; - node->hash = hash; - strcpy(node->data, str); - return node; - } else { - node = node->next; - } - } - } -} - -StringNode *GetHashNameNodeHash2(const char *str, short hash) { - StringNode *node; - - node = name_hash_nodes[hash]; - if (node == 0) { - node = (StringNode *) galloc(strlen(str) + sizeof(StringNode)); - name_hash_nodes[hash] = node; - node->next = 0; - node->index = -1; - node->hash = hash; - strcpy(node->data, str); - return node; - } else { - for (;;) { - if (strcmp(str, node->data) == 0) - return node; - - if (node->next == 0) { - node->next = (StringNode *) galloc(strlen(str) + sizeof(StringNode)); - node = node->next; - node->next = 0; - node->index = -1; - node->hash = hash; - strcpy(node->data, str); - return node; - } else { - node = node->next; - } - } - } -} - -StringNode *GetHashNameNodeExport(const char *str) { - // not matching - StringNode *node; - short hash; - - hash = CHash(str); - if ((node = name_hash_nodes[hash]) == 0) { - node = (StringNode *) galloc(strlen(str) + sizeof(StringNode)); - name_hash_nodes[hash] = node; - node->next = 0; - node->index = -1; - node->hash = hash; - strcpy(node->data, str); - return node; - } else { - for (;;) { - if (strcmp(str, node->data) == 0) - return node; - - if (node->next == 0) { - node->next = (StringNode *) galloc(strlen(str) + sizeof(StringNode)); - node = node->next; - node->next = 0; - node->index = -1; - node->hash = hash; - strcpy(node->data, str); - return node; - } else { - node = node->next; - } - } - } -} - -long GetHashNameNodeExportID(StringNode *node) { - if (node->index < 0) - node->index = hash_name_id++; - return node->index; -} - -StringNode *GetHashNameNodeByID(long id) { - StringNode *node; - short i; - - for (i = 0; i < 2048; i++) { - for (node = name_hash_nodes[i]; node; node = node->next) { - if (id == node->index) - return node; - } - } - - return 0; -} - -void NameHashExportReset() { - short i; - StringNode *node; - - for (i = 0; i < 0x800; i++) { - node = name_hash_nodes[i]; - while (node) { - node->index = -1; - node = node->next; - } - } - - hash_name_id = 1; -} - -void NameHashWriteNameTable(GList *list) { - StringNode *node; - StringNode **nodes; - short grp; - int i; - - nodes = (StringNode **) galloc(sizeof(StringNode *) * hash_name_id); - - for (grp = 0; grp < 0x800; grp++) { - node = name_hash_nodes[grp]; - while (node) { - if (node->index > 0) - nodes[node->index] = node; - node = node->next; - } - } - - for (i = 1; i < hash_name_id; i++) { - node = nodes[i]; - AppendGListWord(list, node->hash); - AppendGListID(list, node->data); - } - - if (list->size & 1) - AppendGListByte(list, 0); -} - -void NameHashWriteTargetEndianNameTable(GList *list) { - StringNode *node; - StringNode **nodes; - short grp; - int i; - - nodes = (StringNode **) galloc(sizeof(StringNode *) * hash_name_id); - memclrw(nodes, sizeof(StringNode *) * hash_name_id); - - for (grp = 0; grp < 0x800; grp++) { - node = name_hash_nodes[grp]; - while (node) { - if (node->index > 0) - nodes[node->index] = node; - node = node->next; - } - } - - for (i = 1; i < hash_name_id; i++) { - node = nodes[i]; - if (node == 0) { - AppendGListTargetEndianWord(list, 0); - AppendGListID(list, ""); - } else { - AppendGListTargetEndianWord(list, node->hash); - AppendGListID(list, node->data); - } - } - - if (list->size & 1) - AppendGListByte(list, 0); -} - -void InitNameHash() { - name_hash_nodes = (StringNode **) galloc(0x800 * sizeof(StringNode *)); - memclrw(name_hash_nodes, 0x800 * sizeof(StringNode *)); - hash_name_id = 1; -} - -long CTool_TotalHeapSize() { - long total = 0; - AllocatorBlock *block; - - for (block = gheap.blockList; block; block = block->nextBlock) { - total += block->size; - } - for (block = lheap.blockList; block; block = block->nextBlock) { - total += block->size; - } - for (block = aheap.blockList; block; block = block->nextBlock) { - total += block->size; - } - for (block = oheap.blockList; block; block = block->nextBlock) { - total += block->size; - } - for (block = bheap.blockList; block; block = block->nextBlock) { - total += block->size; - } - - return total; -} - -static void getheapinfo(HeapInfo *result, Allocator *heap) { - AllocatorBlock *block; - - result->_4 = heap->paddingSize; - for (block = heap->blockList; block; block = block->nextBlock) { - result->_8 += block->size - sizeof(AllocatorBlock); - result->xx_C += block->remaining; - result->_0++; - if (block->remaining > result->_18) - result->_18 = block->remaining; - } - - result->_10 = result->_8 / result->_0; - result->_14 = result->xx_C / result->_0; -} - -void CTool_GetHeapInfo(HeapInfo *result, unsigned char heapID) { - memclrw(result, sizeof(HeapInfo)); - - switch (heapID) { - case 0: - getheapinfo(result, &gheap); - break; - case 1: - getheapinfo(result, &lheap); - break; - case 2: - getheapinfo(result, &aheap); - break; - case 3: - getheapinfo(result, &oheap); - break; - case 4: - getheapinfo(result, &bheap); - break; - case 5: - getheapinfo(result, &gheap); - getheapinfo(result, &lheap); - getheapinfo(result, &aheap); - getheapinfo(result, &oheap); - getheapinfo(result, &bheap); - break; - } -} - -static void MoreHeapSpace(Allocator *alloc, long size) { - Handle blockHandle; - long blockSize; - AllocatorBlock *block; - - block = alloc->blockList; - if (block) { - alloc->lastBlockUsed->remaining = alloc->remaining; - while (block) { - if (block->remaining >= size) - goto gotBlock; - block = block->nextBlock; - } - } - - /* create new block */ - blockSize = size + alloc->paddingSize; - if (systemHandles) { - blockHandle = COS_NewOSHandle(blockSize << 1); - if (blockHandle != 0) - goto createdTempDoubleBlock; - blockHandle = COS_NewOSHandle(blockSize); - if (blockHandle != 0) - goto createdBlock; - } - blockHandle = COS_NewHandle(blockSize); - if (blockHandle != 0) - goto createdBlock; - - if (heaperror) - heaperror(); - return; - - createdTempDoubleBlock: - blockSize <<= 1; - goto createdBlock; - createdBlock: - COS_LockHandleHi(blockHandle); - block = (AllocatorBlock *) *blockHandle; - block->nextBlock = alloc->blockList; - alloc->blockList = block; - block->handle = blockHandle; - block->size = blockSize; - block->remaining = blockSize - sizeof(AllocatorBlock); - gotBlock: - alloc->lastBlockUsed = block; - alloc->remaining = block->remaining; - alloc->ptrToFreeArea = ((char *) block) + block->size - block->remaining; -} - -int initheaps(heaperror_t failureCallback) { - heaperror = 0; - lheaplockcount = 0; - - memclrw(&gheap, sizeof(Allocator)); - memclrw(&lheap, sizeof(Allocator)); - memclrw(&aheap, sizeof(Allocator)); - memclrw(&oheap, sizeof(Allocator)); - memclrw(&bheap, sizeof(Allocator)); - - gheap.paddingSize = 0x38000; - lheap.paddingSize = 0x10000; - aheap.paddingSize = 0x4000; - oheap.paddingSize = 0x40000; - bheap.paddingSize = 0x4000; - - MoreHeapSpace(&gheap, 0); - MoreHeapSpace(&lheap, 0); - MoreHeapSpace(&aheap, 0); - MoreHeapSpace(&oheap, 0); - MoreHeapSpace(&bheap, 0); - - gheap.paddingSize = 0x8000; - lheap.paddingSize = 0x8000; - - heaperror = failureCallback; - - if (!gheap.lastBlockUsed || !lheap.lastBlockUsed || !aheap.lastBlockUsed || !oheap.lastBlockUsed || !bheap.lastBlockUsed) - return -1; - else - return 0; -} - -int initgheap(heaperror_t failureCallback) { - heaperror = 0; - lheaplockcount = 0; - - memclrw(&gheap, sizeof(Allocator)); - memclrw(&lheap, sizeof(Allocator)); - memclrw(&aheap, sizeof(Allocator)); - memclrw(&oheap, sizeof(Allocator)); - memclrw(&bheap, sizeof(Allocator)); - - gheap.paddingSize = 0x38000; - MoreHeapSpace(&gheap, 0); - gheap.paddingSize = 0x8000; - - heaperror = failureCallback; - - if (!gheap.lastBlockUsed) - return -1; - else - return 0; -} - -heaperror_t getheaperror() { - return heaperror; -} - -void setheaperror(heaperror_t failureCallback) { - heaperror = failureCallback; -} - -static void relheap(Allocator *alloc) { - AllocatorBlock *block; - Handle handle; - - block = alloc->blockList; - while (block) { - handle = block->handle; - block = block->nextBlock; - COS_FreeHandle(handle); - } - - memclrw(alloc, sizeof(Allocator)); -} - -void releaseheaps() { - relheap(&gheap); - relheap(&lheap); - relheap(&aheap); - relheap(&oheap); - relheap(&bheap); -} - -void releasegheap() { - relheap(&gheap); -} - -void releaseoheap() { - relheap(&gheap); - oheap.paddingSize = 0x40000; - MoreHeapSpace(&oheap, 0); -} - -char *galloc(long size) { - long alignedSize; - char *ptr; - - alignedSize = (size & ~7) + 8; - if (gheap.remaining < alignedSize) - MoreHeapSpace(&gheap, alignedSize); - - gheap.remaining -= alignedSize; - ptr = (char *) gheap.ptrToFreeArea; - gheap.ptrToFreeArea = ptr + alignedSize; - return ptr; -} - -char *lalloc(long size) { - long alignedSize; - char *ptr; - - alignedSize = (size & ~7) + 8; - if (lheap.remaining < alignedSize) - MoreHeapSpace(&lheap, alignedSize); - - lheap.remaining -= alignedSize; - ptr = (char *) lheap.ptrToFreeArea; - lheap.ptrToFreeArea = ptr + alignedSize; - return ptr; -} - -char *aalloc(long size) { - long alignedSize; - char *ptr; - - alignedSize = (size & ~7) + 8; - if (aheap.remaining < alignedSize) - MoreHeapSpace(&aheap, alignedSize); - - aheap.remaining -= alignedSize; - ptr = (char *) aheap.ptrToFreeArea; - aheap.ptrToFreeArea = ptr + alignedSize; - return ptr; -} - -char *oalloc(long size) { - long alignedSize; - char *ptr; - - alignedSize = (size & ~7) + 8; - if (oheap.remaining < alignedSize) - MoreHeapSpace(&oheap, alignedSize); - - oheap.remaining -= alignedSize; - ptr = (char *) oheap.ptrToFreeArea; - oheap.ptrToFreeArea = ptr + alignedSize; - return ptr; -} - -char *balloc(long size) { - long alignedSize; - char *ptr; - - alignedSize = (size & ~7) + 8; - if (bheap.remaining < alignedSize) - MoreHeapSpace(&bheap, alignedSize); - - bheap.remaining -= alignedSize; - ptr = (char *) bheap.ptrToFreeArea; - bheap.ptrToFreeArea = ptr + alignedSize; - return ptr; -} - -void locklheap() { - lheaplockcount++; -} - -void unlocklheap() { - if (lheaplockcount > 0) - --lheaplockcount; -} - -void freelheap() { - AllocatorBlock *block; - - if (lheaplockcount == 0) { - block = lheap.blockList; - lheap.lastBlockUsed = block; - lheap.ptrToFreeArea = ((char *) block) + sizeof(AllocatorBlock); - lheap.remaining = block->size - sizeof(AllocatorBlock); - - while (block) { - block->remaining = block->size - sizeof(AllocatorBlock); - block = block->nextBlock; - } - } -} - -void freeaheap() { - AllocatorBlock *block; - - block = aheap.blockList; - aheap.lastBlockUsed = block; - aheap.ptrToFreeArea = ((char *) block) + sizeof(AllocatorBlock); - aheap.remaining = block->size - sizeof(AllocatorBlock); - - while (block) { - block->remaining = block->size - sizeof(AllocatorBlock); - block = block->nextBlock; - } -} - -void freeoheap() { - AllocatorBlock *block; - - block = oheap.blockList; - oheap.lastBlockUsed = block; - oheap.ptrToFreeArea = ((char *) block) + sizeof(AllocatorBlock); - oheap.remaining = block->size - sizeof(AllocatorBlock); - - while (block) { - block->remaining = block->size - sizeof(AllocatorBlock); - block = block->nextBlock; - } -} - -void freebheap() { - AllocatorBlock *block; - - block = bheap.blockList; - bheap.lastBlockUsed = block; - bheap.ptrToFreeArea = ((char *) block) + sizeof(AllocatorBlock); - bheap.remaining = block->size - sizeof(AllocatorBlock); - - while (block) { - block->remaining = block->size - sizeof(AllocatorBlock); - block = block->nextBlock; - } -} - -char *ScanHex(char *str, long *output, Boolean *overflow) { - long work; - int ch; - - work = 0; - *overflow = 0; - - for (;;) { - ch = *str; - if (ch >= '0' && ch <= '9') { - ch = ch - '0'; - } else if (ch >= 'A' && ch <= 'F') { - ch = ch - 'A' + 10; - } else if (ch >= 'a' && ch <= 'f') { - ch = ch - 'a' + 10; - } else { - break; - } - - if (work & 0xF0000000) - *overflow = 1; - work = (work << 4) | (short) ch; - ++str; - } - - *output = work; - return str; -} - -char *ScanOct(char *str, long *output, Boolean *overflow) { - short digit; - long work; - - work = 0; - *overflow = 0; - - for (;;) { - digit = *str - '0'; - if (digit >= 0 && digit <= 9) { - if (digit >= 8) { - *overflow = 1; - ++str; - break; - } - } else { - break; - } - - if (work & 0xE0000000) - *overflow = 1; - work = (work << 3) | digit; - ++str; - } - - *output = work; - return str; -} - -char *ScanDec(char *str, long *output, Boolean *overflow) { - short digit; - unsigned long work; - - work = 0; - *overflow = 0; - - for (;;) { - digit = *str - '0'; - if (digit >= 0 && digit <= 9) { - if (work >= 0x19999999 && (work > 0x19999999 || digit > 5)) - *overflow = 1; - } else { - break; - } - - work = (work << 3) + (work << 1) + digit; - ++str; - } - - *output = work; - return str; -} - -static char *UnmangleClassname(char *work, char **pNameStart, short *pNameLength, char **a4, short *a5, Boolean a6) { - char ch; - short len; - char *p2; - short len2; - short i; - short wtf; - - *pNameLength = 0; - if (*(work++) != '_') - return work; - if (*(work++) != '_') { - return work; - } else { - len = 0; - while (work[0] >= '0' && work[0] <= '9') { - len = (len * 10) + work[0] - '0'; - ++work; - } - - if (len > 0) { - *pNameStart = work; - *pNameLength = len; - - if (a6) { - p2 = *a4; - len2 = *a5; - i = 0; - wtf = len; - while (i < wtf && len2 < 255) { - *(p2++) = work[i]; - ++i; - ++len2; - } - if (len2 < 255) { - *(p2++) = ':'; - len2++; - } - if (len2 < 255) { - *(p2++) = ':'; - len2++; - } - *a4 = p2; - *a5 = len2; - } - } - - return work + len; - } -} - -static char *UnmangleAppend(char *src, char srcLen, char **pOutput, short *pOutputLen) { - char *output; - short i; - short outputLen; - - output = *pOutput; - outputLen = *pOutputLen; - - for (i = 0; i < srcLen && outputLen < 255; i++, outputLen++) { - *(output++) = src[i]; - } - - *pOutput = output; - *pOutputLen = outputLen; -} - -void OldUnmangle(char *input, char *output, Boolean flag) { - short var26; - char *nameStart; - short nameLength; - char *saved; - int i; - - if (*input == '.') - ++input; - - var26 = 0; - saved = input; - if (input[0] == '_' && input[1] == '_') { - if (input[2] == 'c' && input[3] == 't') { - saved = UnmangleClassname(&input[4], &nameStart, &nameLength, &output, &var26, flag); - if (nameLength == 0) - goto invalid; - UnmangleAppend(nameStart, nameLength, &output, &var26); - } else if (input[2] == 'd' && input[3] == 't') { - saved = UnmangleClassname(&input[4], &nameStart, &nameLength, &output, &var26, flag); - if (nameLength == 0) - goto invalid; - if (var26 <= 255) { - *(output++) = '~'; - var26++; - } - UnmangleAppend(nameStart, nameLength, &output, &var26); - } else if (input[2] == 'n' && input[3] == 'w') { - saved = UnmangleClassname(&input[4], &nameStart, &nameLength, &output, &var26, flag); - UnmangleAppend("operator new", 15, &output, &var26); - } else if (input[2] == 'd' && input[3] == 'l') { - saved = UnmangleClassname(&input[4], &nameStart, &nameLength, &output, &var26, flag); - UnmangleAppend("operator delete", 15, &output, &var26); - } else { - invalid: - strncpy(output, input, 256); - return; - } - } else { - i = 0; - while (*saved) { - ++saved; - ++i; - if (saved[0] == '_' && saved[1] == '_') { - saved = UnmangleClassname(saved, &nameStart, &nameLength, &output, &var26, flag); - break; - } - } - UnmangleAppend(input, i, &output, &var26); - } - - if (flag && saved[0] == 'F') { - if (saved[1] == 'v') { - UnmangleAppend("(void)", 6, &output, &var26); - } else { - UnmangleAppend("(...)", 5, &output, &var26); - } - } - - *output = 0; -} - -short hash(char *str) { - char hash = 0; - - while (*str) { - hash = hash << 1; - hash ^= *(str++); - } - - return hash & 0x7F; -} - -void memclr(void *buffer, long size) { - memset(buffer, 0, size); -} - -void memclrw(void *buffer, long size) { - memset(buffer, 0, size); -} - -void CToLowercase(char *src, char *dst) { - char ch; - - do { - ch = tolower(*(src++)); - *(dst++) = ch; - } while (ch); -} - -int getbit(long v) { - switch (v) { - case 0: return -1; - case 1: return 0; - case 2: return 1; - case 4: return 2; - case 8: return 3; - case 0x10: return 4; - case 0x20: return 5; - case 0x40: return 6; - case 0x80: return 7; - case 0x100: return 8; - case 0x200: return 9; - case 0x400: return 10; - case 0x800: return 11; - case 0x1000: return 12; - case 0x2000: return 13; - case 0x4000: return 14; - case 0x8000: return 15; - case 0x10000: return 16; - case 0x20000: return 17; - case 0x40000: return 18; - case 0x80000: return 19; - case 0x100000: return 20; - case 0x200000: return 21; - case 0x400000: return 22; - case 0x800000: return 23; - case 0x1000000: return 24; - case 0x2000000: return 25; - case 0x4000000: return 26; - case 0x8000000: return 27; - case 0x10000000: return 28; - case 0x20000000: return 29; - case 0x40000000: return 30; - case 0x80000000: return 31; - default: return -2; - } -} - -void CTool_EndianConvertWord64(WtfWord64 value, unsigned long long *p) { - union { unsigned char bytes[8]; WtfWord64 w; } data; - data.w.a = value.a; - data.w.b = value.b; - memcpy(p, data.bytes, 8); -} - -unsigned short CTool_EndianConvertInPlaceWord16Ptr(unsigned short *p) { - unsigned short v; - v = *p; - // this probably has a conversion on non-ppc - *p = v; - return v; -} - -unsigned long CTool_EndianConvertInPlaceWord32Ptr(unsigned long *p) { - unsigned long v; - v = *p; - // this probably has a conversion on non-ppc - *p = v; - return v; -} - -void CTool_EndianConvertVector128() { - // not correct but idc -} - -StringNode *CTool_GetPathName(const FSSpec *spec, long *mdDat) { - char buffer[256]; - COS_FileGetPathName(buffer, spec, mdDat); - return GetHashNameNodeExport(buffer); -} - -Boolean strcat_safe(char *dst, const char *src, int maxLen) { - int len; - char ch; - - len = strlen(dst); - dst += len; - maxLen -= len; - if (maxLen < 0) - return 1; - - while (maxLen != 0) { - ch = *(dst++) = *(src++); - if (ch == 0) - break; - --maxLen; - } - - if (maxLen == 0 && dst[-1]) { - dst[-1] = 0; - return 1; - } else { - return 0; - } -} |