aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/err.h4
-rw-r--r--src/parse.c36
-rw-r--r--src/parse.h3
3 files changed, 32 insertions, 11 deletions
diff --git a/src/err.h b/src/err.h
index 5a3b9bc..256c5a9 100644
--- a/src/err.h
+++ b/src/err.h
@@ -6,14 +6,14 @@
#define ERR(...) \
do { \
- fprintf(stderr, "\e[1;31merror:\e[0m " __VA_ARGS__); \
+ fprintf(stderr, "\x1B[1;31merror:\x1B[0m " __VA_ARGS__); \
fprintf(stderr, "\n"); \
exit(EXIT_FAILURE); \
} while (0)
#define WARN(...) \
do { \
- fprintf(stderr, "\e[1;35mwarning:\e[0m " __VA_ARGS__); \
+ fprintf(stderr, "\x1B[1;35mwarning:\x1B[0m " __VA_ARGS__); \
fprintf(stderr, "\n"); \
} while (0)
diff --git a/src/parse.c b/src/parse.c
index 2b298d0..cb459e5 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -7,12 +7,13 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
+#include <errno.h>
static const char *curfname;
#define ERR_AT(l, c, ...) \
do { \
- fprintf(stderr, "\e[1m%s:%zu:%zu:\e[0m ", \
+ fprintf(stderr, "\x1B[1m%s:%zu:%zu:\x1B[0m ", \
curfname, (l), (c)); \
ERR(__VA_ARGS__); \
} while (0)
@@ -25,7 +26,7 @@ static const char *curfname;
#define WARN_AT(l, c, ...) \
do { \
- fprintf(stderr, "\e[1m%s:%zu:%zu:\e[0m ", \
+ fprintf(stderr, "\x1B[1m%s:%zu:%zu:\x1B[0m ", \
curfname, (l), (c)); \
WARN(__VA_ARGS__); \
} while (0)
@@ -109,6 +110,7 @@ static void sub_parse_deftype(size_t line, size_t col, bool is_union)
struct parse_deftype_s dt = {
.line = line,
.col = col,
+ .is_used = false,
.is_union = is_union,
.member_list_len = 0,
};
@@ -259,8 +261,15 @@ static bool sub_parse_op(void)
if (t.type != TOK_UINT)
ERR_AT(t.line, t.col, "invalid hkey_size `%s`", t.val);
+ errno = EILSEQ;
r.hkey_size = strtoul(t.val, NULL, 10);
+ if (errno == ERANGE)
+ ERR_AT(t.line, t.col, "hkey_size `%s` too large", t.val);
+
+ if (r.hkey_size == 0)
+ ERR_AT(t.line, t.col, "hkey_size cannot be 0");
+
r.hkey_size_seen = true;
return true;
@@ -363,7 +372,7 @@ struct parse_result_s parse(FILE *f, const char *fname)
struct tok_s t;
struct parse_var_s *vcur, *vtmp;
- struct parse_deftype_s *d;
+ struct parse_deftype_s *dcur, *dtmp;
r.hkey_size = 16;
strcpy(r.hkey_name, "key");
@@ -387,7 +396,7 @@ struct parse_result_s parse(FILE *f, const char *fname)
}
if (r.vars == NULL) {
- fprintf(stderr, "\e[1m%s:\e[0m ", fname);
+ fprintf(stderr, "\x1B[1m%s:\x1B[0m ", fname);
ERR("config must specify at fewest one variable rule");
}
@@ -396,17 +405,26 @@ struct parse_result_s parse(FILE *f, const char *fname)
case PARSE_TYPE_DEFTYPE:
case PARSE_TYPE_ARRAY_DEFTYPE:
case PARSE_TYPE_HASH_DEFTYPE:
- HASH_FIND_STR(r.deftypes, vcur->deftype_name, d);
- if (d == NULL) {
+ HASH_FIND_STR(r.deftypes, vcur->deftype_name, dcur);
+ if (dcur == NULL) {
ERR_AT(vcur->line, vcur->col,
"rule for variable `%s` references undefined type `%s`",
vcur->name, vcur->deftype_name);
}
+ dcur->is_used = true;
default:
continue;
}
}
+ HASH_ITER(hh, r.deftypes, dcur, dtmp) {
+ if (!dcur->is_used) {
+ WARN_AT(dcur->line, dcur->col,
+ "struct `%s` defined but not used",
+ dcur->name);
+ }
+ }
+
if (!r.fun_suf_seen) {
j = 0;
@@ -419,7 +437,7 @@ struct parse_result_s parse(FILE *f, const char *fname)
for (i = j; fname[i] != '\0' && fname[i] != '.'
&& i - j < r.hkey_size; i++) {
if (!isalnum(fname[i]) && fname[i] != '_') {
- fprintf(stderr, "\e[1m%s:\e[0m ", fname);
+ fprintf(stderr, "\x1B[1m%s:\x1B[0m ", fname);
ERR("no function suffix specified, and could not generate one");
}
r.fun_suf[i - j] = fname[i];
@@ -428,11 +446,11 @@ struct parse_result_s parse(FILE *f, const char *fname)
r.fun_suf[i - j] = '\0';
if (r.fun_suf[0] == '\0') {
- fprintf(stderr, "\e[1m%s:\e[0m ", fname);
+ fprintf(stderr, "\x1B[1m%s:\x1B[0m ", fname);
ERR("no function suffix specified, and could not generate one");
}
- fprintf(stderr, "\e[1m%s:\e[0m ", fname);
+ fprintf(stderr, "\x1B[1m%s:\x1B[0m ", fname);
WARN("no function suffix specified. using `%s`...", r.fun_suf);
}
diff --git a/src/parse.h b/src/parse.h
index 09eed9f..b9f2ceb 100644
--- a/src/parse.h
+++ b/src/parse.h
@@ -9,6 +9,8 @@
#define PARSE_DEFTYPE_MAX_LEN 32
+/* very important these stay in order.
+ * things like ">= PARSE_TYPE_ARRAY_BOOL" used */
enum parse_type_e {
PARSE_TYPE_BOOL = 0,
PARSE_TYPE_STRING = 1,
@@ -57,6 +59,7 @@ struct parse_deftype_s {
char name[TOK_MAX_LEN];
size_t line;
size_t col;
+ bool is_used;
bool is_union;
unsigned member_list_len;
enum parse_type_e member_type_list[PARSE_DEFTYPE_MAX_LEN];