Switch to new format which allows unlimited numbers of chains and
usually saves 2K in both data file and program memory. Updated libc required.
This commit is contained in:
parent
c14170612e
commit
c9887a654b
@ -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++)
|
||||
|
Loading…
x
Reference in New Issue
Block a user