aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libfonts.h4
-rw-r--r--libfonts_parse_encoding_line.c114
2 files changed, 56 insertions, 62 deletions
diff --git a/libfonts.h b/libfonts.h
index b39989b..02a9fa0 100644
--- a/libfonts.h
+++ b/libfonts.h
@@ -2132,7 +2132,9 @@ void libfonts_deallocate_encoding(struct libfonts_encoding *);
* Unless `*encodingp` is `NULL`, it shall being as
* zero-initialised, except lists may be preallocated.
* @param statep Pointer to some memory that the function may use to
- * keep track of its state; should point to 0 initially
+ * keep track of its state; should point to 0 initially;
+ * if the file is complete, the value will be reset to 0
+ * at the end of the file
* @param line The line to parse; parsing stops at the first newline
* or NUL byte
* @param endp Output parameter for the parsing end, i.e. the first
diff --git a/libfonts_parse_encoding_line.c b/libfonts_parse_encoding_line.c
index 1c96074..597547a 100644
--- a/libfonts_parse_encoding_line.c
+++ b/libfonts_parse_encoding_line.c
@@ -64,7 +64,7 @@ get_uints(uintmax_t *u1p, uintmax_t *u2p, uintmax_t *u3p, uintmax_t max,
if (u > (max - digit) / 10) {
u = max;
while (isdigit(*++s));
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "value too large: in excess of 0x%jX", max);
break;
}
u = u * 10 + digit;
@@ -141,10 +141,8 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
keyword = NO_KEYWORD;
if (keyword != NO_KEYWORD) {
- if (line[keyword_len] && !isblank(line[keyword_len])) {
- /* TODO warning */
- goto out;
- }
+ if (line[keyword_len] && !isblank(line[keyword_len]))
+ goto bad_keyword;
line = &line[keyword_len];
while (isblank(*line))
line++;
@@ -153,7 +151,7 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
switch (keyword) {
case STARTENCODING:
if (*statep != 0) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "STARTENCODING nested inside another STARTENCODING");
break;
}
if (!*encodingp) {
@@ -165,24 +163,22 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
(*encodingp)->name = get_string(line, &line);
if (!(*encodingp)->name)
goto enomem;
- if (!*(*encodingp)->name) {
- /* TODO warning */
- }
+ if (!*(*encodingp)->name)
+ warning(ctx, 0, "libfonts_parse_encoding_line", "empty string as name of encoding");
*statep = ENCODING_LEVEL;
break;
case ENDENCODING:
if ((*statep & LEVEL_MASK) == MAPPING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "missing ENDMAPPING");
} else if ((*statep & LEVEL_MASK) != ENCODING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "ENDENCODING without corresponding STARTENCODING");
break;
}
- if (*line && *line != '\n' && *line != '#') {
- /* TODO warning */
- }
+ if (*line && *line != '\n' && *line != '#')
+ warning(ctx, 0, "libfonts_parse_encoding_line", "unexpected data after ENDENCODING keyword");
if ((*statep & HAVE_FIRST_INDEX_BYTE_2_BIT) && (*encodingp)->size_cols) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "dual-byte FIRSTINDEX was combined with single-byte SIZE");
(*encodingp)->first_index_col = 0;
}
ret = 1;
@@ -191,7 +187,7 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
case ALIAS:
if ((*statep & LEVEL_MASK) != ENCODING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "ALIAS keyword in wrong scope");
break;
}
if ((*encodingp)->naliases > SIZE_MAX / sizeof(*(*encodingp)->aliases) - 1)
@@ -203,39 +199,34 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
(*encodingp)->aliases[(*encodingp)->naliases] = get_string(line, &line);
if (!(*encodingp)->aliases[(*encodingp)->naliases])
goto enomem;
- if (!*(*encodingp)->aliases[(*encodingp)->naliases]) {
- /* TODO warning */
- }
+ if (!*(*encodingp)->aliases[(*encodingp)->naliases])
+ warning(ctx, 0, "libfonts_parse_encoding_line", "empty string as alias name of encoding");
(*encodingp)->naliases += 1;
break;
case SIZE:
if ((*statep & LEVEL_MASK) != ENCODING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "SIZE keyword in wrong scope");
break;
} else if (*statep & HAVE_SIZE_BIT) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "multiple SIZE declarations in encoding");
}
ju2 = 0;
r = get_uints(&ju1, &ju2, NULL, 0x100, line, &line, ctx);
if (r < 0) {
goto fail;
} else if (r == 0) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "missing numerical data");
break;
} else if (r > 2) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "excess numerical data");
break;
} else if (*line && *line != '\n' && *line != '#') {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "unexpected non-numerical data");
break;
}
- if (!ju1) {
- /* TODO warning */
- break;
- }
- if (r > 1 && !ju2) {
- /* TODO warning */
+ if (!ju1 || (r > 1 && !ju2)) {
+ warning(ctx, 0, "libfonts_parse_encoding_line", "invalid SIZE of zero");
break;
}
(*encodingp)->size_rows = (uint16_t)ju1;
@@ -245,16 +236,16 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
case FIRSTINDEX:
if ((*statep & LEVEL_MASK) != ENCODING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "FIRSTINDEX keyword in wrong scope");
break;
} else if (*statep & HAVE_FIRST_INDEX_BIT) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "multiple FIRSTINDEX declarations in encoding");
}
r = get_uints(&ju1, &ju2, NULL, 0xFF, line, &line, ctx);
if (r < 0) {
goto fail;
} else if (r == 0) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "missing numerical data");
break;
} else if (r == 1) {
ju2 = 0;
@@ -262,11 +253,11 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
} else if (r == 2) {
*statep |= HAVE_FIRST_INDEX_BYTE_2_BIT;
} else {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "excess numerical data");
break;
}
if (*line && *line != '\n' && *line != '#') {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "unexpected non-numerical data");
break;
}
(*encodingp)->first_index_row = (uint16_t)ju1;
@@ -276,9 +267,9 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
case STARTMAPPING:
if ((*statep & LEVEL_MASK) == MAPPING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "missing ENDMAPPING");
} else if ((*statep & LEVEL_MASK) != ENCODING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "STARTMAPPING keyword in wrong scope");
break;
}
if ((*encodingp)->nmappings > SIZE_MAX / sizeof(*(*encodingp)->mappings) - 1)
@@ -290,47 +281,48 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
(*encodingp)->mappings[(*encodingp)->nmappings].entries = NULL;
(*encodingp)->mappings[(*encodingp)->nmappings].nentries = 0;
(*encodingp)->mappings[(*encodingp)->nmappings].target = get_string(line, &line);
- if (!(*encodingp)->mappings[(*encodingp)->nmappings].target) {
- /* TODO warning */
- break;
- }
- if (!*(*encodingp)->mappings[(*encodingp)->nmappings].target) {
- /* TODO warning */
- }
+ if (!(*encodingp)->mappings[(*encodingp)->nmappings].target)
+ goto enomem;
+ if (!*(*encodingp)->mappings[(*encodingp)->nmappings].target)
+ warning(ctx, 0, "libfonts_parse_encoding_line", "empty string as target encoding");
(*encodingp)->nmappings += 1;
*statep = (*statep & ~LEVEL_MASK) | MAPPING_LEVEL;
break;
case ENDMAPPING:
if ((*statep & LEVEL_MASK) != MAPPING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "ENDMAPPING without corresponding STARTMAPPING");
break;
}
- if (*line && *line != '\n' && *line != '#') {
- /* TODO warning */
- }
+ if (*line && *line != '\n' && *line != '#')
+ warning(ctx, 0, "libfonts_parse_encoding_line", "unexpected data after ENDMAPPING keyword");
*statep = (*statep & ~LEVEL_MASK) | ENCODING_LEVEL;
break;
case UNDEFINE:
if ((*statep & LEVEL_MASK) != MAPPING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "UNDEFINE keyword in wrong scope");
break;
}
r = get_uints(&ju1, &ju2, NULL, UINT32_C(0xFFFFFFFF), line, &line, ctx);
if (r < 0) {
goto fail;
} else if (r == 0) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "missing numerical data");
break;
} else if (r == 1) {
ju2 = ju1;
- } else if (r > 2) {
- /* TODO warning */
+ } else if (r == 2) {
+ if (ju2 < ju1) {
+ warning(ctx, 0, "libfonts_parse_encoding_line", "reversed range");
+ break;
+ }
+ } else {
+ warning(ctx, 0, "libfonts_parse_encoding_line", "excess numerical data");
break;
}
if (*line && *line != '\n' && *line != '#') {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "unexpected non-numerical data");
break;
}
mapping = &(*encodingp)->mappings[(*encodingp)->nmappings - 1];
@@ -348,18 +340,18 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
case NO_KEYWORD:
if ((*statep & LEVEL_MASK) != MAPPING_LEVEL) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "index mapping in wrong scope");
break;
}
r = get_uints(&ju1, &ju2, &ju3, UINT32_C(0xFFFFFFFF), line, &line, ctx);
if (r < 0) {
goto fail;
} else if (r == 0) {
- /* TODO warning internal error */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "internal error");
break;
} else if (r == 1) {
if (!*line || *line == '\n' || *line == '#') {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "missing data");
break;
}
} else if (r == 2) {
@@ -367,15 +359,15 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
ju2 = ju1;
} else if (r == 3) {
if (ju2 < ju1) {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "reversed range");
break;
}
} else {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "excess numerical data");
break;
}
if (r != 1 && *line && *line != '\n' && *line != '#') {
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "unexpected non-numerical data");
break;
}
@@ -402,7 +394,7 @@ libfonts_parse_encoding_line(struct libfonts_encoding **encodingp, int *statep,
break;
default:
- /* TODO warning internal error */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "internal error");
break;
}
@@ -421,7 +413,7 @@ fail:
goto out;
bad_keyword:
- /* TODO warning */
+ warning(ctx, 0, "libfonts_parse_encoding_line", "unrecognised keyword");
goto out;
}