summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.bin/colldef/parse.y59
1 files changed, 43 insertions, 16 deletions
diff --git a/usr.bin/colldef/parse.y b/usr.bin/colldef/parse.y
index 95e4994..c180f82 100644
--- a/usr.bin/colldef/parse.y
+++ b/usr.bin/colldef/parse.y
@@ -29,6 +29,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <arpa/inet.h>
#include <err.h>
#include <stdarg.h>
#include <stdio.h>
@@ -58,7 +59,6 @@ u_char __collate_substitute_table[UCHAR_MAX + 1][STR_LEN];
struct __collate_st_char_pri __collate_char_pri_table[UCHAR_MAX + 1];
struct __collate_st_chain_pri *__collate_chain_pri_table;
-int nchains = TABLE_SIZE;
int chain_index;
int prim_pri = 1, sec_pri = 1;
#ifdef COLLATE_DEBUG
@@ -105,6 +105,7 @@ substitute : SUBSTITUTE CHAR WITH STRING {
order : ORDER order_list {
FILE *fp;
int ch, substed, ordered;
+ uint32_t u32;
for (ch = 0; ch < UCHAR_MAX + 1; ch++) {
substed = (__collate_substitute_table[ch][0] != ch);
@@ -115,15 +116,29 @@ order : ORDER order_list {
yyerror("Char 0x%02x can't be ordered since substituted", ch);
}
+ if ((__collate_chain_pri_table = realloc(__collate_chain_pri_table,
+ sizeof(*__collate_chain_pri_table) * (chain_index + 1))) == NULL)
+ yyerror("can't grow chain table");
+ (void)memset(__collate_chain_pri_table[chain_index].str, 0,
+ sizeof(__collate_chain_pri_table[0].str));
+ __collate_chain_pri_table[chain_index].prim = 0;
+ __collate_chain_pri_table[chain_index].sec = 0;
+ chain_index++;
+
if ((fp = fopen(out_file, "w")) == NULL)
err(EX_UNAVAILABLE, "can't open destination file %s",
out_file);
- strcpy(__collate_version, COLLATE_VERSION);
+ strcpy(__collate_version, COLLATE_VERSION1_1);
if (fwrite(__collate_version, sizeof(__collate_version), 1, fp) != 1)
err(EX_IOERR,
"IO error writting collate version to destination file %s",
out_file);
+ u32 = htonl(chain_index);
+ if (fwrite(&u32, sizeof(u32), 1, fp) != 1)
+ err(EX_IOERR,
+ "IO error writting chains number to destination file %s",
+ out_file);
if (fwrite(__collate_substitute_table,
sizeof(__collate_substitute_table), 1, fp) != 1)
err(EX_IOERR,
@@ -135,7 +150,8 @@ order : ORDER order_list {
"IO error writting char table to destination file %s",
out_file);
if (fwrite(__collate_chain_pri_table,
- sizeof(*__collate_chain_pri_table), nchains, fp) != nchains)
+ sizeof(*__collate_chain_pri_table), chain_index, fp) !=
+ chain_index)
err(EX_IOERR,
"IO error writting chain table to destination file %s",
out_file);
@@ -176,10 +192,15 @@ item : CHAR {
__collate_char_pri_table[$1].prim = prim_pri++;
}
| chain {
- if (chain_index >= TABLE_SIZE - 1)
- yyerror("__collate_chain_pri_table overflow");
+ if ((__collate_chain_pri_table = realloc(__collate_chain_pri_table,
+ sizeof(*__collate_chain_pri_table) * (chain_index + 1))) == NULL)
+ yyerror("can't grow chain table");
+ (void)memset(__collate_chain_pri_table[chain_index].str, 0,
+ sizeof(__collate_chain_pri_table[0].str));
(void)strcpy(__collate_chain_pri_table[chain_index].str, curr_chain);
- __collate_chain_pri_table[chain_index++].prim = prim_pri++;
+ __collate_chain_pri_table[chain_index].prim = prim_pri++;
+ __collate_chain_pri_table[chain_index].sec = 0;
+ chain_index++;
}
| CHAR RANGE CHAR {
u_int i;
@@ -226,10 +247,15 @@ prim_sub_item : CHAR {
}
}
| chain {
- if (chain_index >= TABLE_SIZE - 1)
- yyerror("__collate_chain_pri_table overflow");
+ if ((__collate_chain_pri_table = realloc(__collate_chain_pri_table,
+ sizeof(*__collate_chain_pri_table) * (chain_index + 1))) == NULL)
+ yyerror("can't grow chain table");
+ (void)memset(__collate_chain_pri_table[chain_index].str, 0,
+ sizeof(__collate_chain_pri_table[0].str));
(void)strcpy(__collate_chain_pri_table[chain_index].str, curr_chain);
- __collate_chain_pri_table[chain_index++].prim = prim_pri;
+ __collate_chain_pri_table[chain_index].prim = prim_pri;
+ __collate_chain_pri_table[chain_index].sec = 0;
+ chain_index++;
}
;
sec_sub_item : CHAR {
@@ -253,11 +279,15 @@ sec_sub_item : CHAR {
}
}
| chain {
- if (chain_index >= TABLE_SIZE - 1)
- yyerror("__collate_chain_pri_table overflow");
+ if ((__collate_chain_pri_table = realloc(__collate_chain_pri_table,
+ sizeof(*__collate_chain_pri_table) * (chain_index + 1))) == NULL)
+ yyerror("can't grow chain table");
+ (void)memset(__collate_chain_pri_table[chain_index].str, 0,
+ sizeof(__collate_chain_pri_table[0].str));
(void)strcpy(__collate_chain_pri_table[chain_index].str, curr_chain);
__collate_chain_pri_table[chain_index].prim = prim_pri;
- __collate_chain_pri_table[chain_index++].sec = sec_pri++;
+ __collate_chain_pri_table[chain_index].sec = sec_pri++;
+ chain_index++;
}
;
%%
@@ -296,9 +326,6 @@ main(int ac, char **av)
if ((yyin = fopen(*av, "r")) == NULL)
err(EX_UNAVAILABLE, "can't open source file %s", *av);
}
- if ((__collate_chain_pri_table =
- calloc(nchains, sizeof(*__collate_chain_pri_table))) == NULL)
- err(EX_OSERR, "can't allocate chain table");
for (ch = 0; ch <= UCHAR_MAX; ch++)
__collate_substitute_table[ch][0] = ch;
yyparse();
@@ -337,7 +364,7 @@ collate_print_tables(void)
printf("\t'%c' --> \"%s\"\n", i,
__collate_substitute_table[i]);
printf("Chain priority table:\n");
- for (p2 = __collate_chain_pri_table; p2->str[0]; p2++)
+ for (p2 = __collate_chain_pri_table; p2->str[0] != '\0'; p2++)
printf("\t\"%s\" : %d %d\n", p2->str, p2->prim, p2->sec);
printf("Char priority table:\n");
for (i = 0; i < UCHAR_MAX + 1; i++)
OpenPOWER on IntegriCloud