github.com/cycloss/advent-of-code@v0.0.0-20221210145555-15039b95faa6/2020/day7/day7aux.c (about) 1 #include "day7.h" 2 3 extern hashMap* bagMap; 4 extern arrayList* bagList; 5 6 void bagKvpPrinter(keyValPair* kvpp) { 7 printf("[%s : ", (char*)kvpp->key); 8 for (int i = 0; i < getSize(kvpp->val); i++) { 9 bag* bagp = getItemAt(kvpp->val, i); 10 printf("(%i %s), ", bagp->count, bagp->color); 11 } 12 printf("]\n"); 13 } 14 15 void strPrinter(void* str) { 16 puts((char*)str); 17 } 18 19 char* getBagName(char** line) { 20 char* bagNameReg = "^([a-z]+ [a-z]+) bags contain? "; 21 size_t matchCount = 3; 22 23 regex_t reg; 24 regmatch_t matches[matchCount]; 25 26 if (regcomp(®, bagNameReg, REG_EXTENDED) || regexec(®, *line, matchCount, matches, 0)) { 27 puts("Failed to execute bag name regex"); 28 exit(1); 29 } 30 31 regmatch_t fullMatch = matches[0]; 32 int fullLen = fullMatch.rm_eo - fullMatch.rm_so; 33 34 regmatch_t nameMatch = matches[1]; 35 int len = nameMatch.rm_eo - nameMatch.rm_so; 36 char* matchStr = malloc(sizeof(char) * len + 1); 37 matchStr[len] = '\0'; 38 memcpy(matchStr, *line + nameMatch.rm_so, len); 39 (*line) += fullLen; 40 regfree(®); 41 return matchStr; 42 } 43 44 //double pointer so address can be modified and incremented for next bag 45 bag* getNextBag(char** line) { 46 char* enclosedBagReg = "([1-9]+) ([a-z]+ [a-z]+) bags?[ .,]?[ ]?"; 47 int matchCount = 4; 48 regex_t reg; 49 regmatch_t matches[matchCount]; 50 51 if (regcomp(®, enclosedBagReg, REG_EXTENDED) || regexec(®, *line, matchCount, matches, 0)) { 52 regfree(®); 53 return NULL; 54 } 55 56 bag* currentBag = malloc(sizeof(bag)); 57 58 for (int i = 1;; i++) { 59 60 regmatch_t match = matches[i]; 61 62 if (match.rm_so == -1) { 63 break; 64 } 65 66 int len = match.rm_eo - match.rm_so; 67 char* matchStr = malloc(sizeof(char) * len + 1); 68 matchStr[len] = '\0'; 69 memcpy(matchStr, *line + match.rm_so, len); 70 71 if (i == 1) { 72 currentBag->count = atoi(matchStr); 73 free(matchStr); 74 } else if (i == 2) { 75 currentBag->color = matchStr; 76 regmatch_t fullMatch = matches[0]; 77 int fullLen = fullMatch.rm_eo - fullMatch.rm_so; 78 (*line) += fullLen; 79 } else { 80 puts("Too many matches in bag match"); 81 puts(matchStr); 82 exit(1); 83 } 84 } 85 regfree(®); 86 return currentBag; 87 } 88 89 void freeBag(void* bagp) { 90 bag* b = (bag*)bagp; 91 free(b->color); 92 free(b); 93 } 94 95 void freeMapPair(keyValPair* kvpp) { 96 char* key = kvpp->key; 97 arrayList* l = kvpp->val; 98 iterateListItems(l, freeBag); 99 freeAl(l, false); 100 free(key); 101 } 102 103 void freeBagMap() { 104 iterateMapPairs(bagMap, freeMapPair); 105 freeMap(bagMap, false); 106 }