error_buffer -> errors

This commit is contained in:
det-fys 2024-12-28 14:31:05 +01:00
parent 3774c3a9d2
commit 6678a45c7d
5 changed files with 118 additions and 116 deletions

View File

@ -15,7 +15,7 @@ add_executable(Graph
"parser.c" "parser.c"
"tree.c" "tree.c"
"ps_graph.c" "ps_graph.c"
"error_buffer.c" "errors.c"
"math_functions.c" "math_functions.c"
) )
@ -24,10 +24,12 @@ if (MSVC)
target_compile_options(Graph PRIVATE /W4) target_compile_options(Graph PRIVATE /W4)
else() else()
target_compile_options(Graph PRIVATE -Wall -Wextra -pedantic) target_compile_options(Graph PRIVATE -Wall -Wextra -pedantic)
target_link_libraries(Graph PRIVATE m)
endif() endif()
target_compile_definitions(Graph PRIVATE ENABLE_GRAPHVIZ_EXPORT)
# link math # link math
target_link_libraries(Graph PRIVATE m)
# Optionally, set the output directory for the executable # Optionally, set the output directory for the executable
# set_target_properties(Graph PROPERTIES # set_target_properties(Graph PROPERTIES

View File

@ -1,45 +1,45 @@
#include "error_buffer.h" #include "errors.h"
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
void error_buffer_init(struct error_buffer *eb) { void error_buffer_init(struct error_buffer *eb) {
eb->err = ERR_NO_ERR; eb->err = ERR_NO_ERR;
eb->text_len = 0; eb->text_len = 0;
eb->text[0] = 0; eb->text[0] = 0;
} }
void error_set(struct error_buffer *eb, enum error_code err) { void error_set(struct error_buffer *eb, enum error_code err) {
eb->err = err; eb->err = err;
} }
enum error_code error_get(const struct error_buffer *eb) { enum error_code error_get(const struct error_buffer *eb) {
return eb->err; return eb->err;
} }
void error_printf(struct error_buffer *eb, const char *format, ...) { void error_printf(struct error_buffer *eb, const char *format, ...) {
va_list args; va_list args;
int space = MAX_ERROR_MESSAGE_LENGTH - eb->text_len; int space = MAX_ERROR_MESSAGE_LENGTH - eb->text_len;
int write_size; int write_size;
if (space == 0) if (space == 0)
return; return;
va_start(args, format); va_start(args, format);
write_size = vsnprintf(eb->text + eb->text_len, MAX_ERROR_MESSAGE_LENGTH - eb->text_len, format, args); write_size = vsnprintf(eb->text + eb->text_len, MAX_ERROR_MESSAGE_LENGTH - eb->text_len, format, args);
va_end(args); va_end(args);
if (write_size < 0) if (write_size < 0)
return; return;
if (write_size < space) { if (write_size < space) {
eb->text_len += write_size; eb->text_len += write_size;
} }
else { else {
eb->text_len = MAX_ERROR_MESSAGE_LENGTH; eb->text_len = MAX_ERROR_MESSAGE_LENGTH;
} }
} }
const char *error_get_text(const struct error_buffer *eb) { const char *error_get_text(const struct error_buffer *eb) {
return eb->text; return eb->text;
} }

View File

@ -1,67 +1,67 @@
#ifndef ERROR_CODE_H #ifndef ERRORS_H
#define ERROR_CODE_H #define ERRORS_H
#include <stdlib.h> #include <stdlib.h>
#define MAX_ERROR_MESSAGE_LENGTH 512 #define MAX_ERROR_MESSAGE_LENGTH 512
/** /**
* @brief Chybové kódy * @brief Chybové kódy
*/ */
enum error_code { enum error_code {
ERR_NO_ERR = 0, /* Žádná chyba */ ERR_NO_ERR = 0, /* Žádná chyba */
ERR_INVALID_ARGS = 1, /* Neplatné argumenty programu */ ERR_INVALID_ARGS = 1, /* Neplatné argumenty programu */
ERR_INVALID_FUNCTION = 2, /* Zadaná matematická funkce je neplatná */ ERR_INVALID_FUNCTION = 2, /* Zadaná matematická funkce je neplatná */
ERR_INVALID_FILENAME = 3, /* Zadaný název souboru není platný */ ERR_INVALID_FILENAME = 3, /* Zadaný název souboru není platný */
ERR_INVALID_LIMITS = 4, /* Zadané hranice jsou ve špatném formátu */ ERR_INVALID_LIMITS = 4, /* Zadané hranice jsou ve špatném formátu */
ERR_BAD_ALLOC = 5 /* Při alokaci paměti nastala chyba */ ERR_BAD_ALLOC = 5 /* Při alokaci paměti nastala chyba */
}; };
/** /**
* @brief Zásobník pro chybový kód a řetězec popisující chybu * @brief Zásobník pro chybový kód a řetězec popisující chybu
*/ */
struct error_buffer { struct error_buffer {
enum error_code err; enum error_code err;
char text[MAX_ERROR_MESSAGE_LENGTH]; char text[MAX_ERROR_MESSAGE_LENGTH];
size_t text_len; size_t text_len;
}; };
/** /**
* @brief Inicializuje zásobník * @brief Inicializuje zásobník
* *
* @param eb Zásobník * @param eb Zásobník
*/ */
void error_buffer_init(struct error_buffer *eb); void error_buffer_init(struct error_buffer *eb);
/** /**
* @brief Nastaví chybový kód * @brief Nastaví chybový kód
* *
* @param eb Zásobník * @param eb Zásobník
* @param err Chybový kód * @param err Chybový kód
*/ */
void error_set(struct error_buffer *eb, enum error_code err); void error_set(struct error_buffer *eb, enum error_code err);
/** /**
* @brief Přidá do zásobníku formátovaný řetězec * @brief Přidá do zásobníku formátovaný řetězec
* *
* @param eb Zásobník * @param eb Zásobník
*/ */
void error_printf(struct error_buffer *eb, const char *format, ...); void error_printf(struct error_buffer *eb, const char *format, ...);
/** /**
* Vrátí chybový kód * Vrátí chybový kód
* *
* @param eb Zásobník * @param eb Zásobník
* @return Chybový kód * @return Chybový kód
*/ */
enum error_code error_get(const struct error_buffer *eb); enum error_code error_get(const struct error_buffer *eb);
/** /**
* Vrátí řetězec popisující chybu * Vrátí řetězec popisující chybu
* *
* @param eb Zásobník * @param eb Zásobník
* @return Řetězec popisující chybu * @return Řetězec popisující chybu
*/ */
const char *error_get_text(const struct error_buffer *eb); const char *error_get_text(const struct error_buffer *eb);
#endif /* ERROR_CODE_H */ #endif /* ERRORS_H */

4
lex.h
View File

@ -1,7 +1,7 @@
#ifndef LEX_H #ifndef LEX_H
#define LEX_H #define LEX_H
#include "error_buffer.h" #include "errors.h"
#define LEX_DEBUG #define LEX_DEBUG
@ -114,4 +114,4 @@ const char *lex_get_error_text(const struct lexer *lex);
*/ */
const char *lex_token_str(enum token_type token); const char *lex_token_str(enum token_type token);
#endif /* LEX_H */ #endif /* LEX_H */

2
main.c
View File

@ -3,7 +3,7 @@
#include "lex.h" #include "lex.h"
#include "parser.h" #include "parser.h"
#include "ps_graph.h" #include "ps_graph.h"
#include "error_buffer.h" #include "errors.h"
static void print_usage(FILE *f, const char *name) { static void print_usage(FILE *f, const char *name) {
fprintf(f, "Usage: %s <function> <output file> [<range>]\n", name); fprintf(f, "Usage: %s <function> <output file> [<range>]\n", name);