2023-12-25 11:39:35 +12:00

224 lines
6.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <ctype.h>
#include <string.h>
int two_char_two_interger(int a, int b)
{
// int a is the 10's
// int b is the 1's
int num = (a * 10) + b;
// printf("Got number: %i\n", num);
return num;
}
int is_num(char *test_string, char *num_to_match, int mem_length)
{
char *input_copy = malloc(mem_length);
memcpy(input_copy, test_string, (size_t)mem_length);
if (strcmp(input_copy, num_to_match) == 0)
{
return 0;
}
return 1;
}
int main()
{
const char *inputFile = "input";
int fd = open(inputFile, O_RDONLY);
if (fd < 0)
{
printf("\n\"%s \" could not open\n", inputFile);
exit(1);
}
struct stat statbuf;
int err = fstat(fd, &statbuf);
if (err < 0)
{
printf("\n\"%s \" could not open\n", inputFile);
exit(2);
}
char *ptr = mmap(NULL, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (ptr == MAP_FAILED)
{
printf("Mapping Failed\n");
return 1;
}
int in_line = 0;
int first_num = -1;
int last_num;
char cur_char;
int total = 0;
// int numbers[1000];
int freePos = 0;
int lineOffset;
for (int i = 0; i < statbuf.st_size; i++)
{
if (in_line == 0)
{
in_line = 1;
for (i; i < __INT64_MAX__; i++)
{
lineOffset = i;
cur_char = ptr[i];
switch (cur_char)
{
case 'o': // one
if (is_num(&ptr[i], "one", 3) == 0)
{
if (first_num == -1)
{
first_num = 1;
}
last_num = 1;
}
break;
case 't': // two, three
if (is_num(&ptr[i], "two", 3) == 1)
{
if (is_num(&ptr[i], "three", 5) == 0)
{
if (first_num == -1)
{
first_num = 3;
}
last_num = 3;
}
}
else
{
if (first_num == -1)
{
first_num = 2;
}
last_num = 2;
}
break;
case 'f': // four, five
if (is_num(&ptr[i], "four", 4) == 1)
{
if (is_num(&ptr[i], "five", 4) == 0)
{
if (first_num == -1)
{
first_num = 5;
}
last_num = 5;
}
}
else
{
if (first_num == -1)
{
first_num = 4;
}
last_num = 4;
}
break;
case 's': // six, seven
if (is_num(&ptr[i], "six", 3) == 1)
{
if (is_num(&ptr[i], "seven", 5) == 0)
{
if (first_num == -1)
{
first_num = 7;
}
last_num = 7;
}
}
else
{
if (first_num == -1)
{
first_num = 6;
}
last_num = 6;
}
break;
case 'e': // eight
if (is_num(&ptr[i], "eight", 5) == 0)
{
if (first_num == -1)
{
first_num = 8;
}
last_num = 8;
}
break;
case 'n': // nine
if (is_num(&ptr[i], "nine", 4) == 0)
{
if (first_num == -1)
{
first_num = 9;
}
last_num = 9;
}
break;
default:
break;
}
if isdigit (cur_char)
{
if (first_num == -1)
{
// We have not set a first number yet
first_num = (int)cur_char - '0';
last_num = (int)cur_char - '0';
continue;
}
last_num = (int)cur_char - '0';
}
if (cur_char == 0x0A)
{
if (last_num != -1)
{
// printf("First num = %i\t", first_num);
// printf("Last num = %i\n", last_num);
total += two_char_two_interger(first_num, last_num);
}
first_num = -1;
last_num = -1;
in_line = 0;
// printf("Line break\n");
break;
}
}
}
// printf("%X\n", ptr[i]);
}
printf("Total is: %i\n", total);
// ssize_t n = write(1, ptr, statbuf.st_size);
// if (n != statbuf.st_size)
// {
// printf("Write Failed");
// }
err = munmap(ptr, statbuf.st_size);
if (err != 0)
{
printf("Unmapping Failed\n");
return 1;
}
close(fd);
return 0;
}