#define _GNU_SOURCE #include #include #include #include int main(int argc, char **argv) { FILE *input; char *line = NULL; size_t line_length = 0; if (argc == 1 || argv[1][0] == '-') input = stdin; else if ((input = fopen(argv[1], "r")) == NULL) { printf("Cannot open file %s\n", argv[1]); return -1; } int32_t calibration_value = 0; while (getline(&line, &line_length, input) != -1) { int32_t current_calibration_value = 0; int8_t last_digit = 0; for (size_t i = 0; i < line_length-1; ++i) { if (line[i]>>4 == 0x3) { if (current_calibration_value == 0) current_calibration_value = (line[i]&0xf) * 10; last_digit = line[i]&0xf; } else { int8_t digit = 0; switch (line[i]) { case 'o': // 1 if (i+2 <= line_length) if (line[i+1] == 'n' && line[i+2] == 'e') { digit = 1; } break; case 't': // 2 3 if (i+2 <= line_length) if (line[i+1] == 'w' && line[i+2] == 'o') { digit = 2; break; } if (i+4 <= line_length) if (line[i+1] == 'h' && line[i+2] == 'r' && line[i+3] == 'e' && line[i+4] == 'e') { digit = 3; } break; case 'f': // 4 5 if (i+3 <= line_length) if (line[i+1] == 'o' && line[i+2] == 'u' && line[i+3] == 'r') { digit = 4; break; } if (i+3 <= line_length) if (line[i+1] == 'i' && line[i+2] == 'v' && line[i+3] == 'e') { digit = 5; } break; case 's': // 6 7 if (i+2 <= line_length) if (line[i+1] == 'i' && line[i+2] == 'x') { digit = 6; break; } if (i+4 <= line_length) if (line[i+1] == 'e' && line[i+2] == 'v' && line[i+3] == 'e' && line[i+4] == 'n') { digit = 7; } break; case 'e': // 8 if (i+4 <= line_length) if (line[i+1] == 'i' && line[i+2] == 'g' && line[i+3] == 'h' && line[i+4] == 't') { digit = 8; } break; case 'n': // 9 if (i+3 <= line_length) if (line[i+1] == 'i' && line[i+2] == 'n' && line[i+3] == 'e') { digit = 9; } break; } if (digit != 0) { if (current_calibration_value == 0) current_calibration_value = digit * 10; last_digit = digit; } } } if (current_calibration_value != 0) calibration_value += current_calibration_value + last_digit; memset(line, 0, line_length); } printf("%d\n", calibration_value); return 0; }