add functions and global variable in the parser

This commit is contained in:
grimhilt 2023-11-25 18:43:36 +01:00
parent 60c6c6b8c4
commit c286c7eaed
8 changed files with 237 additions and 73 deletions

View File

@ -1,6 +1,7 @@
CC = gcc
CFLAGS := -std=c99 -Wall -Wextra -Werror -pedantic -Wvla
OBJ_RUN := src/student.c
INO_FILE := ref.ino
all: run
@ -10,13 +11,13 @@ all: run
prepare: CFLAGS += -shared
prepare: src/main.o src/pin_handler.o
ar crs src/pin_handler.a $^
tar czf student.tar.gz src/pin_handler.a src/student.c src/default_student.c Makefile student.ino src/parser.c
tar czf student.tar.gz src/pin_handler.a src/student.c src/default_student.c Makefile $(INO_FILE) src/parser.c
parser: src/parser.o student.ino
parser: src/parser.o $(INO_FILE)
@$(CC) $(CFLAGS) -o $@ src/parser.o
@./parser ./student.ino
@./parser $(INO_FILE)
run: parser $(OBJ_RUN) student.ino
run: parser $(OBJ_RUN) $(INO_FILE)
@$(CC) -o main $(OBJ_RUN) src/pin_handler.a
@./main

View File

@ -1,4 +1,5 @@
#include <stddef.h>
#include <stdio.h>
#define L1 1
#define L2 2
@ -9,9 +10,10 @@
#define C3 7
#define C4 8
void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer);
void set_pin(int id, short state, size_t *row, size_t *col, char *sequence,
size_t *pointer);
void student(char *sequence, size_t *pointer)
{
size_t row = 0;
size_t col = 0;
static char *sequence;
static size_t *pointer;
static size_t row_main = 0;
static size_t col_main = 0;

View File

@ -1,5 +1,6 @@
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include "student.h"
int main(void)

View File

@ -1,9 +1,9 @@
#define _GNU_SOURCE
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <err.h>
void parser(FILE *fd);
@ -28,25 +28,12 @@ int main(int argc, char **argv)
return 0;
}
char *get_id(char *buf, size_t buf_size, size_t *i)
char *get_id(char *buf, 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 *comma = strchr(buf, ',');
*comma = 0;
*i = comma - buf + 1;
return strchr(buf, '(') + 1;
}
char *get_state(char *buf, size_t buf_size, size_t *i)
@ -64,7 +51,7 @@ char *get_state(char *buf, size_t buf_size, size_t *i)
return buf + *i;
}
}
errx(2, "Error when compiling, HIGH or LOW not found in a digitalWrite");
errx(2, "Error when parsing, HIGH or LOW not found in a digitalWrite");
}
void skip_end(char *buf, size_t buf_size, size_t *i)
@ -83,14 +70,14 @@ size_t convert_fct(char *buf, size_t start, size_t buf_size, FILE *dst)
if (!strncmp("digitalWrite", (buf + start), size_str))
{
index += size_str + 1;
char *id = get_id(buf, buf_size, &index);
char *id = get_id(buf, &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);
fwrite(", &row_main, &col_main, sequence, pointer);", 1, 43, dst);
skip_end(buf, buf_size, &index);
}
else if (!strncmp("delay", (buf + start), 5))
@ -99,15 +86,27 @@ size_t convert_fct(char *buf, size_t start, size_t buf_size, FILE *dst)
}
return index;
}
void write_buf(char *buf, size_t start, size_t buf_size, FILE *dst, size_t *nb_bracket)
void basic_write_buf(char *buf, size_t buf_size, FILE *dst)
{
for (size_t i = start; i < buf_size; i++)
for (size_t i = 0; i < buf_size; i++)
{
if (buf[i] == '}')
size_t index = convert_fct(buf, i, buf_size, dst);
if (index < buf_size)
fwrite(buf + index, 1, 1, dst);
i = index;
}
}
void write_buf(char *buf, size_t buf_size, FILE *dst, size_t *nb_bracket)
{
for (size_t i = 0; i < buf_size; i++)
{
if (buf[i] == '}')
*nb_bracket -= 1;
else if (buf[i] == '{')
else if (buf[i] == '{')
*nb_bracket += 1;
if (nb_bracket != 0)
{
size_t index = convert_fct(buf, i, buf_size, dst);
@ -118,16 +117,57 @@ void write_buf(char *buf, size_t start, size_t buf_size, FILE *dst, size_t *nb_b
}
}
size_t find_loop(char *buf, size_t buf_size)
void count_bracket(char *buf, size_t buf_size, size_t *nb_bracket)
{
for (size_t i = 0; i < buf_size; i++)
{
if (buf[i] == '}')
*nb_bracket -= 1;
else if (buf[i] == '{')
*nb_bracket += 1;
}
}
int is_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 1;
}
}
return buf_size + 1;
return 0;
}
int is_global_variable(char *buf)
{
if (!strncmp("// START GLOBAL VARIABLE", buf, 24))
{
return 1;
}
return 0;
}
int out_global_variable(char *buf)
{
if (!strncmp("// END GLOBAL VARIABLE", buf, 22))
{
return 1;
}
return 0;
}
int is_setup(char *buf, size_t buf_size)
{
for (size_t i = 0; i < buf_size - 6; i++)
{
if (!strncmp("setup()", (buf + i), 6))
{
return 1;
}
}
return 0;
}
FILE *init_student()
@ -140,11 +180,11 @@ FILE *init_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);
fclose(default_student);
return student;
}
@ -155,25 +195,69 @@ void parser(FILE *fd)
ssize_t bytes_read = 0;
size_t nb_bracket = -1;
short in_loop = 0;
short in_setup = 0;
short in_global_variable = 0;
FILE *student = init_student();
while ((bytes_read = getline(&buf, &buf_size, fd)) != -1)
{
if (in_loop)
if (in_global_variable)
{
write_buf(buf, 0, bytes_read, student, &nb_bracket);
if (out_global_variable(buf))
{
in_global_variable = 0;
fwrite("while (1) {\n", 1, 11, student);
}
else
{
basic_write_buf(buf, bytes_read, student);
}
}
else if ((in_loop & 1) == 1)
{
write_buf(buf, bytes_read, student, &nb_bracket);
if (nb_bracket == 0)
{
in_loop &= 2;
fwrite("}", 1, 1, student);
}
}
else if (in_setup & 1)
{
count_bracket(buf, bytes_read, &nb_bracket);
if (nb_bracket == 0)
{
in_setup &= 2;
}
}
else
{
size_t index_loop = find_loop(buf, buf_size);
if (index_loop != buf_size + 1)
if (is_global_variable(buf))
{
in_loop = 1;
in_global_variable = 1;
fwrite("void student(char *seq, size_t *ptr) {\n", 1, 39,
student);
fwrite("sequence = seq;\n", 1, 16, student);
fwrite("pointer = ptr;\n", 1, 15, student);
}
else if (is_loop(buf, buf_size))
{
in_loop = 3;
nb_bracket = 1;
}
else if (is_setup(buf, buf_size))
{
in_setup = 3;
nb_bracket = 1;
}
else if (in_setup & 2)
{
basic_write_buf(buf, bytes_read, student);
}
}
}
if (buf)
free(buf);
fclose(student);
if (!in_loop)
errx(2, "Could not find the main loop function");
if (!(in_loop & 2))
errx(2, "parser: Could not find the main loop function");
}

View File

@ -1,7 +1,8 @@
#include "pin_handler.h"
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <err.h>
static void set_data(size_t *wire, size_t id_mat, short state, size_t *pointer)
{
@ -19,16 +20,17 @@ static void set_data(size_t *wire, size_t id_mat, short state, size_t *pointer)
*wire = 0;
}
static void read_digit(char *sequence, size_t *pointer, size_t *row, size_t *col)
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'},
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' },
};
sequence[*pointer] = keyboard[*row - 1][*col - 1];
@ -37,6 +39,8 @@ static void read_digit(char *sequence, size_t *pointer, size_t *row, size_t *col
if (keyboard[*row - 1][*col - 1] == '#')
{
if (DEBUG_LEVEL >= 1)
printf("full sequence: %s\n", sequence);
if (!strcmp(CODE, sequence))
{
errx(0, "Code found: %s\n", sequence);
@ -46,8 +50,11 @@ static void read_digit(char *sequence, size_t *pointer, size_t *row, size_t *col
}
}
void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer)
void set_pin(int id, short state, size_t *row, size_t *col, char *sequence,
size_t *pointer)
{
if (DEBUG_LEVEL >= 2)
printf("set pin %i, state: %u\n", id, state);
if (id <= 4)
{
set_data(row, id, state, pointer);

View File

@ -1,9 +1,11 @@
#ifndef PIN_HANDLER_H
#define PIN_HANDLER_H
#define CODE "1#"
#define CODE "1234#"
#define DEBUG_LEVEL 1
#include <stddef.h>
void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer);
void set_pin(int id, short state, size_t *row, size_t *col, char *sequence,
size_t *pointer);
#endif // PIN_HANDLER_H

View File

@ -1,4 +1,5 @@
#include <stddef.h>
#include <stdio.h>
#define L1 1
#define L2 2
@ -9,22 +10,83 @@
#define C3 7
#define C4 8
void set_pin(int id, short state, size_t *row, size_t *col, char *sequence, size_t *pointer);
void set_pin(int id, short state, size_t *row, size_t *col, char *sequence,
size_t *pointer);
void student(char *sequence, size_t *pointer)
static char *sequence;
static size_t *pointer;
static size_t row_main = 0;
static size_t col_main = 0;
void set_number(char nb)
{
size_t row = 0;
size_t col = 0;
// 1
set_pin(C1, 1, &row, &col, sequence, pointer);
set_pin(L1, 1, &row, &col, sequence, pointer);
const char keyboard[4][4] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' },
};
set_pin(C1, 0, &row, &col, sequence, pointer);
set_pin(L1, 0, &row, &col, sequence, pointer);
int row = 0;
int col = 0;
int found = 0;
for (; !found && row < 4; row++)
{
col = 0;
for (; !found && col < 4; col++)
{
if (keyboard[row][col] == nb)
{
found = 1;
row--;
col--;
}
}
}
// #
set_pin(C3, 1, &row, &col, sequence, pointer);
set_pin(L4, 1, &row, &col, sequence, pointer);
int pins[8] = { L1, L2, L3, L4, C1, C2, C3, C4 };
set_pin(pins[4 + col], 1, &row_main, &col_main, sequence, pointer);
set_pin(pins[row], 1, &row_main, &col_main, sequence, pointer);
}
void reset_all_pin()
{
int pins[8] = { L1, L2, L3, L4, C1, C2, C3, C4 };
for (size_t i = 0; i < 8; i++)
{
set_pin(pins[i], 0, &row_main, &col_main, sequence, pointer);
}
}
void student(char *seq, size_t *ptr)
{
sequence = seq;
pointer = ptr;
int nb = 1000;
int max_nb = 9999;
while (1)
{
if (nb <= max_nb)
{
int tmp_nb = nb;
char nbs[4];
int place = 3;
while (tmp_nb > 0)
{
nbs[place] = '0' + (tmp_nb % 10);
tmp_nb /= 10;
place--;
}
for (size_t i = 0; i < 4; i++)
{
reset_all_pin();
set_number(nbs[i]);
}
reset_all_pin();
set_number('#');
nb++;
}
}
}

View File

@ -11,6 +11,11 @@ void setup() {
// to complete
}
// START GLOBAL VARIABLE
// END GLOBAL VARIABLE
void loop() {
// 1
digitalWrite(C1, HIGH);