Add C day 2
parent
edcc3caf91
commit
66706d26f2
|
@ -0,0 +1,7 @@
|
|||
both: p1 p2
|
||||
|
||||
p1:
|
||||
gcc -o main1 part_1.c -lcs50 -I../include ../include/parse.c
|
||||
|
||||
p2:
|
||||
gcc -o main2 part_2.c -lcs50 -I../include ../include/parse.c
|
|
@ -0,0 +1,100 @@
|
|||
Game 1: 7 blue, 6 green, 3 red; 3 red, 5 green, 1 blue; 1 red, 5 green, 8 blue; 3 red, 1 green, 5 blue
|
||||
Game 2: 9 green, 1 blue, 12 red; 1 blue, 18 green, 8 red; 2 blue, 6 green, 13 red; 3 blue, 13 red, 7 green; 5 blue, 4 red, 4 green; 6 blue, 7 green, 4 red
|
||||
Game 3: 5 blue, 9 red, 14 green; 10 green, 3 blue; 11 red, 2 blue, 8 green; 5 red, 2 blue; 5 blue, 7 green, 8 red
|
||||
Game 4: 2 red, 3 blue, 2 green; 17 green, 6 blue, 1 red; 3 blue, 5 green, 1 red; 4 red, 1 blue, 16 green; 5 red, 4 blue, 13 green; 14 green, 5 blue, 6 red
|
||||
Game 5: 3 red, 17 green, 10 blue; 9 blue, 5 green; 14 green, 9 blue, 11 red
|
||||
Game 6: 4 green, 18 blue, 3 red; 6 green, 8 blue, 9 red; 4 green, 9 blue, 7 red; 9 red, 1 green, 12 blue
|
||||
Game 7: 1 blue, 14 green; 1 red, 4 blue, 15 green; 3 blue, 6 green; 3 blue, 2 green, 1 red; 1 red, 3 green, 1 blue
|
||||
Game 8: 10 red, 3 blue, 3 green; 5 blue, 7 red, 3 green; 3 red, 3 green, 11 blue; 1 red, 7 green, 10 blue; 13 blue, 5 green, 5 red; 1 green, 17 blue, 3 red
|
||||
Game 9: 1 blue, 6 green; 7 green, 2 red; 3 red, 2 green; 1 blue, 4 red, 3 green; 7 green, 1 blue, 1 red
|
||||
Game 10: 14 green, 6 blue, 1 red; 8 green, 5 red, 1 blue; 8 green, 5 blue, 5 red; 2 green, 3 blue, 5 red
|
||||
Game 11: 1 blue, 2 green; 1 blue, 1 green, 7 red; 1 blue, 4 green, 7 red; 2 red, 2 green, 1 blue
|
||||
Game 12: 5 blue, 12 green, 12 red; 11 green, 3 red; 14 green, 3 blue, 18 red
|
||||
Game 13: 2 green, 6 red; 6 red, 5 blue; 7 red, 3 blue, 8 green; 7 red, 8 green; 3 blue, 2 green, 3 red; 1 blue, 8 red, 6 green
|
||||
Game 14: 18 green, 6 blue, 5 red; 5 blue, 15 red, 19 green; 7 green, 11 blue, 20 red; 5 red, 18 green, 7 blue
|
||||
Game 15: 3 red, 16 green, 1 blue; 11 green, 6 red, 1 blue; 12 green, 2 red; 17 green, 1 blue, 14 red
|
||||
Game 16: 3 red, 2 green, 5 blue; 1 green, 6 blue, 1 red; 1 green, 2 blue, 3 red; 1 blue, 1 red; 5 blue, 1 green, 2 red
|
||||
Game 17: 3 blue, 6 red; 1 blue, 2 red; 1 blue, 1 green, 7 red; 1 green, 7 red, 2 blue; 7 red, 1 blue; 1 green, 8 red, 1 blue
|
||||
Game 18: 6 green, 10 red; 6 red, 7 green; 10 red, 11 green; 10 red, 2 blue, 5 green
|
||||
Game 19: 2 blue; 1 blue, 4 green, 6 red; 7 green, 6 red, 2 blue; 2 blue, 5 red, 4 green; 1 green, 10 red
|
||||
Game 20: 6 red, 5 green, 10 blue; 5 blue, 5 green, 9 red; 7 blue, 3 green, 3 red; 9 blue, 12 red, 1 green
|
||||
Game 21: 4 red, 18 blue, 14 green; 3 green, 14 blue, 5 red; 5 green, 12 blue; 1 blue, 2 red, 1 green; 5 red, 11 green, 7 blue; 17 green, 4 red, 15 blue
|
||||
Game 22: 1 blue, 14 green, 4 red; 7 green, 10 red; 9 green, 1 blue, 9 red; 1 blue, 8 green, 5 red
|
||||
Game 23: 4 blue, 5 green, 2 red; 6 blue, 8 red, 4 green; 4 blue, 17 red, 14 green
|
||||
Game 24: 3 green, 8 blue; 3 blue, 5 green, 13 red; 17 red, 4 green
|
||||
Game 25: 19 red, 9 blue, 1 green; 3 green, 18 red, 6 blue; 1 green, 7 red, 7 blue; 8 blue, 1 red
|
||||
Game 26: 10 green, 12 blue, 2 red; 9 red; 10 blue, 12 green, 9 red
|
||||
Game 27: 2 blue, 8 green, 6 red; 5 green, 9 red; 4 red, 11 green
|
||||
Game 28: 10 blue, 20 red; 14 blue, 3 green, 2 red; 9 red, 12 blue, 1 green
|
||||
Game 29: 4 red, 1 blue, 2 green; 1 green, 6 red, 1 blue; 15 red
|
||||
Game 30: 1 red, 13 blue, 6 green; 3 blue, 4 green; 19 blue, 11 green; 1 red, 11 green, 14 blue
|
||||
Game 31: 10 red, 12 green; 12 green, 10 red; 2 blue, 15 red, 12 green; 2 green, 2 blue, 15 red; 9 green, 5 red, 2 blue
|
||||
Game 32: 5 blue, 5 green, 8 red; 5 green, 6 red; 5 blue, 8 red, 4 green; 5 green, 3 blue, 6 red
|
||||
Game 33: 1 red, 9 green, 5 blue; 17 green, 4 blue; 3 green, 2 blue; 10 green, 2 blue; 1 blue, 4 green; 2 green, 9 blue
|
||||
Game 34: 11 blue, 11 red, 9 green; 13 red, 3 blue, 5 green; 9 green, 12 blue, 5 red; 13 red, 8 blue, 5 green
|
||||
Game 35: 1 green, 3 red, 7 blue; 1 red, 3 green, 9 blue; 1 blue, 2 green, 1 red; 11 blue, 5 red, 6 green
|
||||
Game 36: 4 blue, 12 green, 16 red; 7 blue, 11 green; 8 green, 5 blue, 1 red; 14 green, 3 red
|
||||
Game 37: 13 red, 5 blue, 9 green; 1 red, 10 blue, 14 green; 1 green, 2 blue, 10 red; 13 red, 10 blue; 1 blue, 8 green
|
||||
Game 38: 3 red, 4 blue, 8 green; 1 red, 11 blue, 4 green; 13 blue, 8 green; 3 red, 3 green, 10 blue; 1 red, 1 blue, 1 green; 1 green, 2 red, 10 blue
|
||||
Game 39: 9 red, 7 blue, 1 green; 15 red, 4 green, 1 blue; 2 green, 8 blue, 7 red; 6 blue, 11 red; 12 red, 2 blue, 7 green
|
||||
Game 40: 13 red, 3 green, 1 blue; 3 green, 10 red; 16 red
|
||||
Game 41: 1 blue, 3 red; 7 blue, 5 red, 3 green; 4 red, 3 blue, 2 green; 2 blue, 5 red, 1 green; 3 green, 4 red, 3 blue; 5 blue, 2 red
|
||||
Game 42: 1 red, 4 green; 11 red, 4 green; 13 red; 1 blue, 10 red; 1 blue, 2 red, 4 green
|
||||
Game 43: 11 green, 13 red, 1 blue; 11 green, 9 red, 2 blue; 7 green; 13 green, 15 red; 1 blue, 14 green
|
||||
Game 44: 5 green, 14 blue, 15 red; 13 blue, 15 green; 9 green, 15 red, 6 blue
|
||||
Game 45: 16 red, 8 blue; 1 green, 4 blue, 6 red; 4 blue, 8 red; 12 red, 3 blue, 3 green; 2 green, 4 red, 4 blue; 2 green, 8 blue, 10 red
|
||||
Game 46: 12 blue, 3 green, 12 red; 9 red, 9 blue; 3 green, 12 red; 10 red, 6 green; 2 red, 7 blue
|
||||
Game 47: 9 green, 6 red; 1 blue, 7 red, 10 green; 1 green, 2 red; 1 red, 3 green
|
||||
Game 48: 9 blue, 5 green, 13 red; 14 green, 4 red; 15 red, 9 green, 1 blue; 4 blue, 6 red, 13 green; 9 green, 8 blue, 8 red
|
||||
Game 49: 5 blue, 3 red; 1 green, 2 red, 5 blue; 1 green, 7 blue; 3 green
|
||||
Game 50: 8 red, 6 green; 10 blue, 4 green, 6 red; 8 green, 11 blue, 9 red
|
||||
Game 51: 5 blue; 13 blue; 1 red, 2 blue, 1 green; 1 red, 8 blue
|
||||
Game 52: 7 blue; 1 red, 2 green, 12 blue; 1 red, 5 blue; 2 red, 7 blue, 4 green; 3 green, 2 red, 2 blue
|
||||
Game 53: 10 blue, 12 red; 3 green, 5 blue, 3 red; 14 red, 4 green, 7 blue; 1 red, 14 blue
|
||||
Game 54: 2 blue, 14 red, 3 green; 3 green, 7 red; 2 blue, 3 green, 9 red; 3 green, 7 red; 1 green, 14 red, 1 blue
|
||||
Game 55: 3 green, 9 red, 12 blue; 5 blue, 5 green, 2 red; 7 green, 14 red, 12 blue
|
||||
Game 56: 1 blue, 3 red, 4 green; 5 red, 8 green, 1 blue; 3 green, 1 blue, 2 red
|
||||
Game 57: 8 blue, 13 red, 2 green; 3 blue, 5 red; 7 red, 2 green; 2 red, 5 blue, 3 green; 1 green, 4 blue
|
||||
Game 58: 4 green, 3 red, 2 blue; 5 green, 2 blue, 10 red; 11 green, 1 red, 2 blue; 4 red, 5 green
|
||||
Game 59: 5 green; 4 green, 2 blue; 1 red, 9 green; 7 green, 2 blue; 16 green, 1 blue
|
||||
Game 60: 6 green, 5 blue, 1 red; 5 blue, 3 green, 6 red; 1 green, 5 blue, 14 red; 6 red, 4 blue, 3 green
|
||||
Game 61: 2 green, 6 red, 6 blue; 6 blue, 3 red; 1 green, 2 red, 2 blue; 1 red, 2 green; 5 red, 1 green, 2 blue; 2 green, 6 red, 6 blue
|
||||
Game 62: 18 green, 8 blue, 1 red; 8 green, 4 red; 13 blue, 1 red, 3 green; 7 blue, 2 green, 4 red; 4 blue, 12 green, 5 red; 12 green, 11 blue
|
||||
Game 63: 2 red, 3 blue; 10 green, 13 red, 1 blue; 11 red, 3 green, 4 blue
|
||||
Game 64: 1 green, 16 red; 17 blue, 9 red, 1 green; 14 red, 7 blue
|
||||
Game 65: 7 blue, 11 red, 11 green; 7 red, 11 green; 3 blue, 13 red, 11 green; 5 green, 6 blue; 11 blue, 8 red, 3 green
|
||||
Game 66: 3 blue, 1 green, 3 red; 5 blue, 2 green, 5 red; 1 blue, 2 green, 7 red; 2 blue, 6 red; 7 red, 2 green, 2 blue; 2 red
|
||||
Game 67: 1 blue, 6 red, 2 green; 1 blue, 10 green, 6 red; 8 red, 2 blue, 4 green; 7 green, 9 red, 1 blue; 8 red, 7 green; 5 green, 1 blue
|
||||
Game 68: 15 blue, 8 green, 2 red; 6 blue, 2 green; 5 red, 6 green, 8 blue; 6 red, 11 green, 7 blue; 1 red, 3 blue; 5 red, 6 green, 5 blue
|
||||
Game 69: 5 blue, 4 green; 1 green, 11 red, 9 blue; 4 green, 15 blue, 6 red; 11 blue, 4 green, 5 red; 8 red, 3 green; 5 blue, 8 red
|
||||
Game 70: 5 blue, 4 red, 8 green; 6 blue, 6 green; 14 blue, 7 red, 1 green; 2 green, 6 blue, 3 red; 7 red, 11 blue, 3 green
|
||||
Game 71: 13 red, 6 blue, 10 green; 7 red, 12 green; 9 green, 14 red, 2 blue
|
||||
Game 72: 9 red, 3 green, 3 blue; 8 red, 7 blue, 5 green; 3 blue, 2 green, 1 red; 1 red, 2 blue, 2 green; 10 red, 7 green, 6 blue
|
||||
Game 73: 4 green, 3 red; 1 red; 2 red, 2 blue, 2 green; 1 blue, 3 red, 1 green; 2 blue, 3 red, 2 green; 1 red, 1 blue
|
||||
Game 74: 12 green, 4 red, 4 blue; 3 red, 13 green; 1 red, 13 green, 1 blue; 1 red, 3 blue, 6 green; 6 blue, 5 red, 4 green; 7 blue, 5 green, 1 red
|
||||
Game 75: 11 red, 1 green; 12 blue, 1 red; 2 blue, 1 green, 4 red; 11 red; 12 red, 6 green, 10 blue; 4 green, 5 blue, 7 red
|
||||
Game 76: 2 blue, 5 red, 6 green; 1 red, 10 green, 11 blue; 7 red, 11 green; 4 red, 10 blue, 10 green; 7 blue, 16 green, 2 red
|
||||
Game 77: 2 blue, 11 red, 4 green; 6 green, 3 blue, 2 red; 2 blue, 2 red, 7 green; 8 red, 14 blue, 5 green; 5 green, 2 blue, 18 red
|
||||
Game 78: 9 red, 7 green, 6 blue; 12 blue, 6 red; 1 red, 15 blue, 7 green; 3 blue, 11 green, 1 red
|
||||
Game 79: 3 blue; 1 blue; 1 red, 1 blue, 1 green; 3 blue; 5 blue, 1 red; 1 blue, 1 green, 1 red
|
||||
Game 80: 18 blue, 13 green, 7 red; 18 blue, 3 green, 3 red; 2 red, 9 blue, 14 green
|
||||
Game 81: 11 blue, 6 green, 3 red; 8 green, 12 red, 10 blue; 5 red, 4 blue, 13 green
|
||||
Game 82: 2 blue, 3 red; 4 blue, 17 red; 9 red; 12 red; 1 green, 6 blue, 7 red; 20 red
|
||||
Game 83: 1 blue, 1 red; 3 red, 1 blue; 3 red, 5 green; 1 blue, 2 green, 4 red; 5 green, 3 blue, 2 red
|
||||
Game 84: 4 red, 2 blue, 2 green; 8 red, 10 blue; 1 green, 15 red, 8 blue
|
||||
Game 85: 15 green; 11 red, 2 blue, 5 green; 8 red, 2 blue, 12 green; 15 red, 10 green; 10 red, 15 green; 17 red, 1 blue, 11 green
|
||||
Game 86: 6 blue, 1 red; 2 green, 1 red, 8 blue; 2 green, 10 blue; 10 blue, 2 green; 1 red, 5 blue
|
||||
Game 87: 4 red, 4 blue; 18 red, 8 blue; 16 red; 4 red, 1 green, 3 blue; 14 red, 9 blue
|
||||
Game 88: 11 green, 7 blue, 4 red; 3 red; 2 blue, 12 red, 19 green; 13 red, 3 blue, 2 green
|
||||
Game 89: 1 green, 1 red; 1 blue, 1 red, 6 green; 6 green, 3 red; 5 green, 2 red, 6 blue; 7 blue, 2 red, 8 green; 1 red, 2 blue
|
||||
Game 90: 3 green, 3 red, 3 blue; 5 green, 2 blue, 3 red; 1 blue, 2 red; 11 green, 1 blue, 2 red; 1 green, 3 blue, 4 red
|
||||
Game 91: 7 blue, 2 red; 2 blue, 1 red, 1 green; 6 blue, 1 red; 1 red, 7 blue
|
||||
Game 92: 11 green, 16 blue; 17 red, 7 blue, 9 green; 11 green, 3 blue, 12 red; 2 blue, 1 green, 6 red
|
||||
Game 93: 6 red, 1 blue, 3 green; 1 blue, 8 red, 7 green; 3 red, 5 green; 1 red, 2 green; 3 red, 7 green; 2 green, 15 red, 1 blue
|
||||
Game 94: 7 blue, 2 red, 2 green; 9 blue, 4 red, 2 green; 9 blue, 5 red, 3 green; 1 blue, 4 red, 3 green; 4 red, 1 green, 7 blue; 9 blue, 3 green, 3 red
|
||||
Game 95: 1 blue, 2 green, 2 red; 6 green, 6 red, 1 blue; 3 blue, 5 red, 2 green; 1 blue; 5 green, 2 red, 2 blue
|
||||
Game 96: 3 blue, 6 red, 5 green; 5 blue, 8 green, 9 red; 2 red, 5 green, 1 blue; 6 green, 4 blue, 3 red; 2 green, 2 blue; 6 blue, 4 green
|
||||
Game 97: 6 green, 8 blue, 5 red; 9 green, 6 blue; 3 green, 3 blue; 2 blue, 10 green, 4 red
|
||||
Game 98: 11 blue, 1 green, 9 red; 5 green, 1 blue, 6 red; 13 blue, 6 green, 10 red; 6 blue, 4 green, 9 red
|
||||
Game 99: 4 red, 3 green, 3 blue; 6 blue, 4 green, 11 red; 3 green, 15 red; 1 blue, 6 green, 14 red
|
||||
Game 100: 14 green, 6 blue, 12 red; 2 green, 1 blue, 2 red; 12 red, 7 blue, 3 green; 1 blue, 12 red, 8 green
|
|
@ -0,0 +1,76 @@
|
|||
#include <cs50.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <parse.h>
|
||||
|
||||
// 1957 is too low
|
||||
|
||||
// The amount of games expected
|
||||
const int games = 100;
|
||||
|
||||
// How many of each cube are allowed
|
||||
const int allowed_red = 12;
|
||||
const int allowed_green = 13;
|
||||
const int allowed_blue = 14;
|
||||
|
||||
// How many letter each color takes up
|
||||
const int chars_red = strlen("red");
|
||||
const int chars_green = strlen("green");
|
||||
const int chars_blue = strlen("blue");
|
||||
|
||||
// Pre-defined functions
|
||||
int game_score(char *text);
|
||||
|
||||
int main(void) {
|
||||
int sum = 0;
|
||||
|
||||
char *inputs[games];
|
||||
for (int i = 0; i < games; i++) {
|
||||
inputs[i] = get_string("");
|
||||
}
|
||||
|
||||
for (int i = 0; i < games; i++) {
|
||||
sum += game_score(inputs[i]);
|
||||
}
|
||||
|
||||
printf("%i\n", sum);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Determine a game's score.
|
||||
*/
|
||||
int game_score(char *text) {
|
||||
int value = 0;
|
||||
int game;
|
||||
int *cursor = &value;
|
||||
|
||||
parse_token(text, cursor, "Game ");
|
||||
parse_int(text, cursor, &game);
|
||||
parse_token(text, cursor, ":");
|
||||
|
||||
do
|
||||
{
|
||||
int number;
|
||||
|
||||
parse_token(text, cursor, " ");
|
||||
parse_int(text, cursor, &number);
|
||||
parse_token(text, cursor, " ");
|
||||
|
||||
if (parse_token(text, cursor, "red")) {
|
||||
if (number > allowed_red) {
|
||||
return 0;
|
||||
}
|
||||
} else if (parse_token(text, cursor, "green")) {
|
||||
if (number > allowed_green) {
|
||||
return 0;
|
||||
}
|
||||
} else if (parse_token(text, cursor, "blue")) {
|
||||
if (number > allowed_blue) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (parse_token(text, cursor, ";") || parse_token(text, cursor, ","));
|
||||
|
||||
return game;
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
#include <cs50.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <parse.h>
|
||||
|
||||
// 1957 is too low
|
||||
|
||||
// The amount of games expected
|
||||
const int games = 100;
|
||||
|
||||
// How many of each cube are allowed
|
||||
const int allowed_red = 12;
|
||||
const int allowed_green = 13;
|
||||
const int allowed_blue = 14;
|
||||
|
||||
// How many letter each color takes up
|
||||
const int chars_red = strlen("red");
|
||||
const int chars_green = strlen("green");
|
||||
const int chars_blue = strlen("blue");
|
||||
|
||||
// Pre-defined functions
|
||||
int game_score(char *text);
|
||||
|
||||
int main(void) {
|
||||
int sum = 0;
|
||||
|
||||
char *inputs[games];
|
||||
for (int i = 0; i < games; i++) {
|
||||
inputs[i] = get_string("");
|
||||
}
|
||||
|
||||
for (int i = 0; i < games; i++) {
|
||||
sum += game_score(inputs[i]);
|
||||
}
|
||||
|
||||
printf("%i\n", sum);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Determine a game's score.
|
||||
*/
|
||||
int game_score(char *text) {
|
||||
int value = 0;
|
||||
int game;
|
||||
int *cursor = &value;
|
||||
int red = 0, green = 0, blue = 0;
|
||||
|
||||
parse_token(text, cursor, "Game ");
|
||||
parse_int(text, cursor, &game);
|
||||
parse_token(text, cursor, ":");
|
||||
|
||||
do
|
||||
{
|
||||
int number;
|
||||
|
||||
parse_token(text, cursor, " ");
|
||||
parse_int(text, cursor, &number);
|
||||
parse_token(text, cursor, " ");
|
||||
|
||||
if (parse_token(text, cursor, "red")) {
|
||||
if (number > red) {
|
||||
red = number;
|
||||
}
|
||||
} else if (parse_token(text, cursor, "green")) {
|
||||
if (number > green) {
|
||||
green = number;
|
||||
}
|
||||
} else if (parse_token(text, cursor, "blue")) {
|
||||
if (number > blue) {
|
||||
blue = number;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (parse_token(text, cursor, ";") || parse_token(text, cursor, ","));
|
||||
|
||||
return red * green * blue;
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
/* This parsing library aims to imitate how Elm parses strings.
|
||||
|
||||
In contrast to Elm, however, this function makes use of the side-effects that
|
||||
C brings, allowing for impurity and a lack of need to return values.
|
||||
|
||||
Instead, every parser merely returns a boolean that expresses whether it had
|
||||
parsed successfully.
|
||||
*/
|
||||
|
||||
#include <parse.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
const bool DEBUG = false;
|
||||
|
||||
/* Parse a single char and fetch the result.
|
||||
*/
|
||||
bool parse_char(char *text, int *cursor, char *c) {
|
||||
int length = strlen(text);
|
||||
|
||||
if (DEBUG) printf("Parsing a char : ");
|
||||
|
||||
if (*cursor == length) {
|
||||
if (DEBUG) printf("Reached end of string [FAIL]\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
*c = text[*cursor];
|
||||
*cursor = *cursor + 1;
|
||||
if (DEBUG) printf("%c [Success]\n", *c);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Parse an integer.
|
||||
*/
|
||||
bool parse_int(char *text, int *cursor, int *output) {
|
||||
int is_negative = parse_token(text, cursor, "-");
|
||||
|
||||
if (DEBUG) printf("Parsing int : ");
|
||||
int answer = 0;
|
||||
char c = text[*cursor];
|
||||
|
||||
if (c < '0' || c > '9') {
|
||||
if (DEBUG) printf("%c [FAIL]\n", c);
|
||||
return false;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (DEBUG) printf("%c", c);
|
||||
answer = (answer * 10) + (c - '0');
|
||||
*cursor = *cursor + 1;
|
||||
c = text[*cursor];
|
||||
}
|
||||
while (c >= '0' && c <= '9');
|
||||
|
||||
if (DEBUG) printf(" [Success ]\n");
|
||||
|
||||
if (is_negative) {
|
||||
answer = -1 * answer;
|
||||
}
|
||||
|
||||
*output = answer;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Parse a token of text.
|
||||
*/
|
||||
bool parse_token(char *text, int *cursor, char *token) {
|
||||
int length = strlen(token), text_length = strlen(text);
|
||||
if (DEBUG) printf("Parsing token \"%s\" : ", token);
|
||||
|
||||
if (text_length - *cursor < length) {
|
||||
if (DEBUG) printf("Token too long, won't fit. [FAIL]\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < length; i++) {
|
||||
if (DEBUG) printf("%c", text[*cursor + i]);
|
||||
if (text[*cursor + i] != token[i]) {
|
||||
if (DEBUG) printf(" [FAIL]\n");
|
||||
*cursor = *cursor + i;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (DEBUG) printf(" [Success]\n");
|
||||
*cursor = *cursor + length;
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
/* This parsing library aims to imitate how Elm parses strings.
|
||||
|
||||
In contrast to Elm, however, this function makes use of the side-effects that
|
||||
C brings, allowing for impurity and a lack of need to return values.
|
||||
|
||||
Instead, every parser merely returns a boolean that expresses whether it had
|
||||
parsed successfully.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
/* Parse a single char and fetch the result.
|
||||
*/
|
||||
bool parse_char(char *text, int *cursor, char *c);
|
||||
|
||||
/* Parse an integer.
|
||||
*/
|
||||
bool parse_int(char *text, int *cursor, int *output);
|
||||
|
||||
/* Parse a token of text.
|
||||
*/
|
||||
bool parse_token(char *text, int *cursor, char *token);
|
Loading…
Reference in New Issue