Implemented a basic logger
This commit is contained in:
parent
b058cbe288
commit
20f1d2b5ac
|
@ -0,0 +1,105 @@
|
|||
|
||||
#ifndef PARCEL_LOGGER_H
|
||||
#define PARCEL_LOGGER_H
|
||||
|
||||
#include <utility.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PAC_SYNTAX_ERROR,
|
||||
PAC_NAMING_ERROR,
|
||||
PAC_INTERNAL_ERROR
|
||||
|
||||
} pac_error_e;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PAC_SYNTAX_ERROR_UNSPECIFIED,
|
||||
PAC_SYNTAX_ERROR_STRAY,
|
||||
PAC_SYNTAX_ERROR_MISSING_TOKEN,
|
||||
PAC_SYNTAX_ERROR_ODD_TOKEN
|
||||
|
||||
} pac_syntax_error_e;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PAC_RESTRICTED_ERROR_INVALID_RULE_NAME
|
||||
|
||||
} pac_naming_error_e;
|
||||
|
||||
typedef struct pac_syntax_error
|
||||
{
|
||||
usz_t line;
|
||||
usz_t column;
|
||||
|
||||
pac_syntax_error_e type;
|
||||
union pac_syntax_error_specifics
|
||||
{
|
||||
struct pac_syntax_error_stray
|
||||
{
|
||||
rune_t sign;
|
||||
} stray;
|
||||
|
||||
struct pac_syntax_error_missing_token
|
||||
{
|
||||
char *wanted_token;
|
||||
char *hint;
|
||||
} missing_token;
|
||||
|
||||
struct pac_syntax_error_odd_token
|
||||
{
|
||||
usz_t num_valid_options;
|
||||
char *valid_options[16];
|
||||
char *found_token;
|
||||
char *hint;
|
||||
} odd_token;
|
||||
|
||||
} specifics;
|
||||
|
||||
} pac_syntax_error_s;
|
||||
|
||||
typedef struct pac_naming_error
|
||||
{
|
||||
usz_t line;
|
||||
usz_t column;
|
||||
|
||||
pac_naming_error_e type;
|
||||
union pac_naming_error_specifics
|
||||
{
|
||||
struct pac_naming_error_invalid_rule_name
|
||||
{
|
||||
char *given_rule_name;
|
||||
} invalid_rule_name;
|
||||
} specifics;
|
||||
|
||||
} pac_naming_error_s;
|
||||
|
||||
|
||||
typedef struct pac_error
|
||||
{
|
||||
pac_error_e type;
|
||||
union pac_error_data
|
||||
{
|
||||
pac_syntax_error_s syntax_error;
|
||||
pac_naming_error_s naming_error;
|
||||
} specifics;
|
||||
|
||||
} pac_error_s;
|
||||
|
||||
typedef struct pac_logger
|
||||
{
|
||||
usz_t allocated_errors;
|
||||
usz_t num_errors;
|
||||
pac_error_s *errors;
|
||||
|
||||
pac_arena_s string_arena;
|
||||
|
||||
} pac_logger_s;
|
||||
|
||||
pac_logger_s pac_create_logger ();
|
||||
void pac_log_syntax_error (pac_logger_s *logger, pac_syntax_error_s error);
|
||||
void pac_log_naming_error (pac_logger_s *logger, pac_naming_error_s error);
|
||||
|
||||
void * pac_log_alloc (pac_logger_s *logger, usz_t num_bytes);
|
||||
|
||||
#endif // PARCEL_LOGGER_H
|
|
@ -0,0 +1,45 @@
|
|||
#include <logger.h>
|
||||
|
||||
pac_logger_s pac_create_logger()
|
||||
{
|
||||
pac_logger_s logger;
|
||||
logger.allocated_errors = 1024;
|
||||
logger.num_errors = 0;
|
||||
logger.errors = calloc(sizeof(pac_error_s), logger.allocated_errors);
|
||||
logger.string_arena = pac_create_arena(32768);
|
||||
|
||||
return logger;
|
||||
}
|
||||
|
||||
void pac_resize_log_if_needed(pac_logger_s *logger)
|
||||
{
|
||||
if(logger->num_errors >= logger->allocated_errors)
|
||||
{
|
||||
logger->allocated_errors *= 2;
|
||||
logger->errors =
|
||||
realloc(logger->errors, sizeof(pac_error_s) * logger->allocated_errors);
|
||||
}
|
||||
}
|
||||
|
||||
void pac_log_syntax_error(pac_logger_s *logger, pac_syntax_error_s error)
|
||||
{
|
||||
pac_resize_log_if_needed(logger);
|
||||
logger->errors[logger->num_errors].type = PAC_SYNTAX_ERROR;
|
||||
logger->errors[logger->num_errors].specifics.syntax_error = error;
|
||||
++logger->num_errors;
|
||||
}
|
||||
|
||||
void pac_log_naming_error(pac_logger_s *logger, pac_naming_error_s error)
|
||||
{
|
||||
pac_resize_log_if_needed(logger);
|
||||
logger->errors[logger->num_errors].type = PAC_NAMING_ERROR;
|
||||
logger->errors[logger->num_errors].specifics.naming_error = error;
|
||||
++logger->num_errors;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void * pac_log_alloc(pac_logger_s *logger, usz_t num_bytes)
|
||||
{
|
||||
return ac_arena_alloc(logger->string_arena, num_bytes);
|
||||
}
|
Loading…
Reference in New Issue