commit 285d34c72d418c1495e4e18d62b756ece01cae84 Author: grimhilt Date: Sat Nov 11 22:07:07 2023 +0100 completed diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ed47c54 --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +CC = gcc +CFLAGS := -std=c99 -Wall -Wextra -Werror -pedantic -Wvla +OBJ_RUN := src/student.c src/main.o src/pin_handler.o + +all: run + +prepare: src/main.o src/pin_handler.o + +parser: src/parser.o + @$(CC) $(CFLAGS) -o $@ $^ + @./parser ./student.ino + +run: parser $(OBJ_RUN) + @$(CC) -o main $(OBJ_RUN) + @./main + +%.o: %.c + @$(CC) $(LFLAGS) $(CFLAGS) -c -o $@ $< + +clean: + $(RM) src/*.o main parser diff --git a/src/default_student.c b/src/default_student.c new file mode 100644 index 0000000..66ae601 --- /dev/null +++ b/src/default_student.c @@ -0,0 +1,18 @@ +#include "pin_handler.h" +#include + +#define L1 1 +#define L2 2 +#define L3 3 +#define L4 4 +#define C1 5 +#define C2 6 +#define C3 7 +#define C4 8 + + + +void student(char *sequence, size_t *pointer) +{ + size_t row = 0; + size_t col = 0; diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..71953fa --- /dev/null +++ b/src/main.c @@ -0,0 +1,13 @@ +#include +#include +#include "student.h" + +int main(void) +{ + char *sequence = malloc(sizeof(char) * 20); + size_t pointer = 0; + student(sequence, &pointer); + free(sequence); + printf("The code was not found!\n"); + return 1; +} diff --git a/src/parser.c b/src/parser.c new file mode 100644 index 0000000..7d6b98a --- /dev/null +++ b/src/parser.c @@ -0,0 +1,179 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +void parser(FILE *fd); + +int main(int argc, char **argv) +{ + if (argc <= 1) + { + fprintf(stderr, "Usage: ./parser FILE\n"); + return 1; + } + + FILE *fd = fopen(argv[1], "r"); + if (!fd) + { + fprintf(stderr, "Error opening file '%s'\n", argv[0]); + return 1; + } + + parser(fd); + + fclose(fd); + return 0; +} + +char *get_id(char *buf, size_t buf_size, size_t *i) +{ + size_t start_nb = 0; + short previous_number = 0; + for (; *i < buf_size; *i += 1) + { + if ((buf[*i] >= '0' && buf[*i] <= '9') || buf[*i] == 'L' || buf[*i] == 'C') + { + if (!start_nb) + start_nb = *i; + previous_number = 1; + } + else if (previous_number) + { + buf[*i] = 0; + return buf + start_nb; + } + } + errx(2, "Error when compiling, pin number not found in a digitalWrite"); +} + +char *get_state(char *buf, size_t buf_size, size_t *i) +{ + for (; *i < buf_size - 3; *i += 1) + { + if (*i < buf_size - 4 && !strncmp("HIGH", buf + *i, 4)) + { + buf[*i + 4] = 0; + return buf + *i; + } + if (!strncmp("LOW", buf + *i, 3)) + { + buf[*i + 3] = 0; + return buf + *i; + } + } + errx(2, "Error when compiling, HIGH or LOW not found in a digitalWrite"); +} + +void skip_end(char *buf, size_t buf_size, size_t *i) +{ + while (*i < buf_size && buf[*i] != ';') + *i += 1; + *i += 1; +} + +size_t convert_fct(char *buf, size_t start, size_t buf_size, FILE *dst) +{ + const size_t size_str = strlen("digitalWrite"); + if (buf_size - start < size_str) + return start; + size_t index = start; + if (!strncmp("digitalWrite", (buf + start), size_str)) + { + index += size_str + 1; + char *id = get_id(buf, buf_size, &index); + char *state = get_state(buf, buf_size, &index); + state[0] = (state[0] == 'H') ? '1' : '0'; + fwrite("set_pin(", 1, 8, dst); + fwrite(id, 1, strlen(id), dst); + fwrite(", ", 1, 2, dst); + fwrite(state, 1, 1, dst); + fwrite(", &row, &col, sequence, pointer);", 1, 33, dst); + skip_end(buf, buf_size, &index); + } + else if (!strncmp("delay", (buf + start), 5)) + { + index = buf_size; + } + return index; +} +void write_buf(char *buf, size_t start, size_t buf_size, FILE *dst, size_t *nb_bracket) +{ + for (size_t i = start; i < buf_size; i++) + { + if (buf[i] == '}') + *nb_bracket -= 1; + else if (buf[i] == '{') + *nb_bracket += 1; + + if (nb_bracket != 0) + { + size_t index = convert_fct(buf, i, buf_size, dst); + if (index < buf_size) + fwrite(buf + index, 1, 1, dst); + i = index; + } + } +} + +size_t find_loop(char *buf, size_t buf_size) +{ + for (size_t i = 0; i < buf_size - 6; i++) + { + if (!strncmp("loop()", (buf + i), 6)) + { + return i + 6; + } + } + return buf_size + 1; +} + +FILE *init_student() +{ + FILE *student = fopen("./src/student.c", "w+"); + FILE *default_student = fopen("./src/default_student.c", "r"); + if (!student) + errx(1, "Failed to create file 'student.c'"); + if (!default_student) + { + fclose(student); + errx(1, "Failed to open file 'default_student.c'"); + } + int c; + while ((c = fgetc(default_student)) != EOF) + fputc(c, student); + fclose (default_student); + return student; +} + +void parser(FILE *fd) +{ + char *buf = NULL; + size_t buf_size = 0; + ssize_t bytes_read = 0; + size_t nb_bracket = -1; + short in_loop = 0; + FILE *student = init_student(); + while ((bytes_read = getline(&buf, &buf_size, fd)) != -1) + { + if (in_loop) + { + write_buf(buf, 0, bytes_read, student, &nb_bracket); + } + else + { + size_t index_loop = find_loop(buf, buf_size); + if (index_loop != buf_size + 1) + { + in_loop = 1; + } + } + } + if (buf) + free(buf); + fclose(student); + if (!in_loop) + errx(2, "Could not find the main loop function"); +} diff --git a/src/pin_handler.c b/src/pin_handler.c new file mode 100644 index 0000000..8d7333a --- /dev/null +++ b/src/pin_handler.c @@ -0,0 +1,60 @@ +#include "pin_handler.h" +#include +#include +#include + +static void set_data(size_t *wire, size_t id_mat, short state, size_t *pointer) +{ + // set multiple rows or cols at the same time resulting in a undefined + // behavior, the result is then voided + if (state && *wire != 0 && *wire != id_mat) + { + *pointer = 0; + return; + } + + if (state) + *wire = id_mat; + else + *wire = 0; +} + +static void read_digit(char *sequence, size_t *pointer, size_t *row, size_t *col) +{ + if (*row == 0 || *col == 0) + return; + + const char keyboard[4][4] = { + { '1', '2', '3', 'A'}, + { '4', '5', '6', 'B'}, + { '7', '8', '9', 'C'}, + { '*', '0', '#', 'D'}, + }; + + sequence[*pointer] = keyboard[*row - 1][*col - 1]; + *pointer += 1; + sequence[*pointer + 1] = 0; + + if (keyboard[*row - 1][*col - 1] == '#') + { + if (!strcmp(CODE, sequence)) + { + errx(0, "Code found: %s\n", sequence); + } + else + *pointer = 0; + } +} + +void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer) +{ + if (id <= 4) + { + set_data(row, id, state, pointer); + } + else + { + set_data(col, id - 4, state, pointer); + } + read_digit(sequence, pointer, row, col); +} diff --git a/src/pin_handler.h b/src/pin_handler.h new file mode 100644 index 0000000..c4b98ba --- /dev/null +++ b/src/pin_handler.h @@ -0,0 +1,9 @@ +#ifndef PIN_HANDLER_H +#define PIN_HANDLER_H + +#define CODE "1#" + +#include +void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer); + +#endif // PIN_HANDLER_H diff --git a/src/student.c b/src/student.c new file mode 100644 index 0000000..270f6f4 --- /dev/null +++ b/src/student.c @@ -0,0 +1,37 @@ +#include "pin_handler.h" +#include + +#define L1 1 +#define L2 2 +#define L3 3 +#define L4 4 +#define C1 5 +#define C2 6 +#define C3 7 +#define C4 8 + + + +void student(char *sequence, size_t *pointer) +{ + size_t row = 0; + size_t col = 0; + //set_pin(13, 1, &row, &col, sequence, pointer); // sets the digital pin 13 on + // //set_pin(13, 0, &row, &col, sequence, pointer); // sets the digital pin 13 off + // //for (size_t i = 0; i < 5; i++) + //{ + // set_pin(13, 1, &row, &col, sequence, pointer); + //} + + // 1 + set_pin(C1, 1, &row, &col, sequence, pointer); + set_pin(L1, 1, &row, &col, sequence, pointer); + set_pin(C1, 0, &row, &col, sequence, pointer); + set_pin(L1, 0, &row, &col, sequence, pointer); + + // # + set_pin(C3, 1, &row, &col, sequence, pointer); + set_pin(L4, 1, &row, &col, sequence, pointer); + + +} diff --git a/src/student.h b/src/student.h new file mode 100644 index 0000000..f2763cd --- /dev/null +++ b/src/student.h @@ -0,0 +1,7 @@ +#ifndef STUDENT_H +#define STUDENT_H + +#include +void student(char *sequence, size_t *pointer); + +#endif // STUDENT_H diff --git a/student.ino b/student.ino new file mode 100644 index 0000000..c5312cf --- /dev/null +++ b/student.ino @@ -0,0 +1,29 @@ +#define L1 2 +#define L2 3 +#define L3 4 +#define L4 5 +#define C1 6 +#define C2 7 +#define C3 8 +#define C4 9 + +void setup() { + // to complete +} + +void loop() { + // 1 + digitalWrite(C1, HIGH); + digitalWrite(L1, HIGH); + + delay(100); + + digitalWrite(C1, LOW); + digitalWrite(L1, LOW); + + delay(100); + + // # + digitalWrite(C3, HIGH); + digitalWrite(L4, HIGH); +}