aocc22

Advent of Code 2022
git clone git://www.tkruger.se/aocc22.git
Log | Files | Refs | README

reading.c (2117B)


      1 #include "reading.h"
      2 
      3 size_t readall(char **output, char *filename) {
      4   FILE *f = NULL;
      5 
      6   f = fopen(filename, "r");
      7 
      8   if (f == NULL) {
      9     perror("Error when opening file");
     10     exit(EXIT_FAILURE);
     11   }
     12 
     13   char buffer[MAXIMUM_FILESIZE_BYTES];
     14   size_t read_size = fread(buffer, 1, MAXIMUM_FILESIZE_BYTES, f);
     15 
     16   if (read_size == MAXIMUM_FILESIZE_BYTES) {
     17     perror("File is to big?!");
     18     exit(EXIT_FAILURE);
     19   }
     20 
     21   *output = (char *)malloc(read_size + 1);
     22   memcpy(*output, buffer, read_size);
     23   (*output)[read_size] = '\0';
     24 
     25   return read_size;
     26 }
     27 
     28 size_t readlines(char ***lines, char *filename) {
     29   FILE *f = fopen(filename, "r");
     30 
     31   if (f == NULL) {
     32     perror("Error when opening file");
     33     exit(EXIT_FAILURE);
     34   }
     35 
     36   size_t tl_nalloc = LINES_ALLOC_MIN;
     37   size_t ntl = 0;
     38   char **tl = calloc(tl_nalloc, sizeof(*tl));
     39 
     40   char line_buffer[MAXIMUM_LINE_BYTES];
     41   while (fgets(line_buffer, MAXIMUM_LINE_BYTES, f)) {
     42     if (ntl == tl_nalloc) {
     43       tl_nalloc <<= 1;
     44       tl = realloc(tl, tl_nalloc * sizeof(*tl));
     45     }
     46 
     47     tl[ntl] = strdup(line_buffer);
     48 
     49     ntl++;
     50   }
     51 
     52   tl = realloc(tl, ntl * sizeof(*tl));
     53   *lines = tl;
     54 
     55   return (ntl);
     56 }
     57 
     58 int read_next_u64(uint64_t *n, FILE *fp) {
     59   int r, c = 0;
     60 
     61   // skip to next numerical char
     62   while ((r = fgetc(fp)) != EOF) {
     63     if ((int)'0' <= r && r <= (int)'9')
     64       break;
     65   }
     66   if (r == EOF)
     67     return EOF;
     68 
     69   // read an unsigned int
     70   *n = (uint64_t)(r - (int)'0');
     71   c++;
     72   while ((r = fgetc(fp)) != EOF) {
     73     if ((int)'0' <= r && r <= (int)'9') {
     74       *n = (*n) * 10UL + (uint64_t)(r - (int)'0');
     75       c++;
     76     } else {
     77       break;
     78     }
     79   }
     80 
     81   return c;
     82 }
     83 
     84 char *sread_next_u64(uint64_t *n, char *s) {
     85   char *fc = s;
     86 
     87   // skip to next numerical char
     88   while (*fc != '\0') {
     89     if ('0' <= *fc && *fc <= '9')
     90       break;
     91     fc++;
     92   }
     93   if (*fc == '\0')
     94     return NULL;
     95 
     96   // read an unsigned int
     97   *n = (uint64_t)(*fc - '0');
     98   fc++;
     99   while (*fc != EOF) {
    100     if ('0' <= *fc && *fc <= '9') {
    101       *n = (*n) * 10UL + (uint64_t)(*fc - '0');
    102     } else {
    103       break;
    104     }
    105     fc++;
    106   }
    107 
    108   if (*fc == '\0')
    109     return NULL;
    110 
    111   return fc;
    112 }