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(&reg, bagNameReg, REG_EXTENDED) || regexec(&reg, *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(&reg);
    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(&reg, enclosedBagReg, REG_EXTENDED) || regexec(&reg, *line, matchCount, matches, 0)) {
    52          regfree(&reg);
    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(&reg);
    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  }