From 3dad2f4c5ce7fd44015cbd921318b3512c36326e Mon Sep 17 00:00:00 2001 From: thing1 Date: Thu, 4 Jul 2024 13:11:04 +0100 Subject: zippy supports arrays! --- comp/lucas-standen-NEA/code/global/util.c | 111 +++++++++++++++++------------- 1 file changed, 63 insertions(+), 48 deletions(-) (limited to 'comp/lucas-standen-NEA/code/global/util.c') diff --git a/comp/lucas-standen-NEA/code/global/util.c b/comp/lucas-standen-NEA/code/global/util.c index 3b1f97c..d1f2b84 100644 --- a/comp/lucas-standen-NEA/code/global/util.c +++ b/comp/lucas-standen-NEA/code/global/util.c @@ -11,15 +11,10 @@ // functions for user void Die(); // brings down the program -void *CheckedMalloc(long size); // malloc checked with autofree +void *CheckedMalloc(long size); // CheckedMalloc checked with autofree void *CheckedRealloc(void *out, long size); // realloc checked with autofree -int CheckedFree(void *ptr); // frees a pointer if it is in the array MEMptrs -void CheckedFreeALL(); // frees all pointers in the array MEMptrs +literal *giveType(char *tok); -#define MAXPTRS 30000 // maximum allocs done by user - -void *MEMptrs[MAXPTRS] = { NULL }; -size_t currentPtr = 0; void Die(){ perror("zpy parser"); @@ -30,12 +25,6 @@ void *CheckedMalloc(long size){ void *out = malloc(size); if (out == NULL) Die(); - MEMptrs[currentPtr] = out; - currentPtr++; - if (currentPtr > MAXPTRS){ - printf("used %d ptrs!\n", MAXPTRS); - Die(); - } return out; } @@ -43,39 +32,9 @@ void *CheckedRealloc(void *orig, long size){ void *out = realloc(orig, size); if (out == NULL) Die(); - MEMptrs[currentPtr] = out; - currentPtr++; - if (currentPtr > MAXPTRS){ - printf("used %d ptrs!\n", MAXPTRS); - Die(); - } - - for (int i = 0; i < MAXPTRS; i++) - if (MEMptrs[i] == orig && MEMptrs[i] != NULL) MEMptrs[i] = NULL; - return out; } -int CheckedFree(void *ptr){ - if (ptr == NULL) return 1; - for (int i = 0; i < MAXPTRS; i++){ - if (MEMptrs[i] == ptr){ - free(MEMptrs[i]); - MEMptrs[i] = NULL; - return 0; - } - } - return 1; -} - -void CheckedFreeALL(){ - for (int i = 0; i < MAXPTRS; i++){ - if (MEMptrs[i] != NULL){ - free(MEMptrs[i]); - } - } -} - I64 *isNum(char *str){ for (int i = 0; i < strlen(str); i++){ if (isdigit(str[i]) == 0 && str[i] != '-'){ @@ -97,11 +56,67 @@ Float *isFloat(char *str){ out->data = strtod(str, NULL); return out; } + Char *isChar(char *str){ - if (strlen(str) == 1){ - Char *out = malloc(sizeof(Char)); - out->data = str[0]; - return out; + if (str[0] == '\'' && str[strlen(str)-1] == '\''){ + str++; + str[strlen(str)-1] = '\0'; + if (strlen(str) == 1){ + Char *out = CheckedMalloc(sizeof(Char)); + out->data = str[0]; + return out; + } + else return NULL; + } +} + +Arr *isArr(char *str){ + char *strbak = CheckedMalloc(strlen(str)); + memcpy(strbak, str, strlen(str)+1); + if (strbak[0] == '[' && strbak[strlen(strbak)-1] == ']'){ + Arr *arr = CheckedMalloc(sizeof(Arr)); + arr->arr = CheckedMalloc(sizeof(literal)); + strbak++; + strbak[strlen(strbak)-1] = '\0'; + char *tok; + int length = 0; + size_t cCount = 1; + tok = strtok(strbak, ","); + while (tok != NULL){ + cCount++; + arr = CheckedRealloc(arr, sizeof(Arr) * cCount); + arr->arr[cCount - 2] = *giveType(tok); + tok = strtok(NULL, ","); + length++; + } + arr->len = length; + free(strbak - 1); + return arr; + } else { + free(strbak); + return NULL; } - else return NULL; +} + +literal *giveType(char *tok){ + literal *out = CheckedMalloc(sizeof(literal)); + Arr *arr = isArr(tok); + I64 *i64 = isNum(tok); + Float *fl = isFloat(tok); + Char *ch = isChar(tok); + + if (arr != NULL){ + out->arr = arr; + } else if (i64 != NULL){ + out->i64 = i64; + } else if (fl != NULL){ + out->fl = fl; + } else if (ch != NULL){ + out->ch = ch; + } else { + fprintf(stderr, "data %s could not be typed\n", tok); + errno = 22; + Die(); + } + return out; } -- cgit v1.2.3