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