X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Fmake_hash.c;h=37ac7651424c779a8bd0586ca3aa25c02e488ce6;hp=8fb2538c48f49c0be830022b132021093363d3c6;hb=5eb177874dea59107a1a2ea44f5d8f5bb99550b2;hpb=8b06e371ed1bce3dd6f37138e6becb5e1a562fe0;ds=sidebyside diff --git a/ncurses/tinfo/make_hash.c b/ncurses/tinfo/make_hash.c index 8fb2538c..37ac7651 100644 --- a/ncurses/tinfo/make_hash.c +++ b/ncurses/tinfo/make_hash.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -44,7 +44,7 @@ #include -MODULE_ID("$Id: make_hash.c,v 1.8 2012/02/22 22:40:24 tom Exp $") +MODULE_ID("$Id: make_hash.c,v 1.13 2013/09/28 20:55:47 tom Exp $") /* * _nc_make_hash_table() @@ -59,6 +59,24 @@ MODULE_ID("$Id: make_hash.c,v 1.8 2012/02/22 22:40:24 tom Exp $") #define MODULE_ID(id) /*nothing */ #include +static void +failed(const char *s) +{ + perror(s); + exit(EXIT_FAILURE); +} + +static char * +strmalloc(char *s) +{ + size_t need = strlen(s) + 1; + char *result = malloc(need); + if (result == 0) + failed("strmalloc"); + _nc_STRCPY(result, s, need); + return result; +} + /* * int hash_function(string) * @@ -119,6 +137,18 @@ _nc_make_hash_table(struct name_table_entry *table, #define MAX_COLUMNS BUFSIZ /* this _has_ to be worst-case */ +static int +count_columns(char **list) +{ + int result = 0; + if (list != 0) { + while (*list++) { + ++result; + } + } + return result; +} + static char ** parse_columns(char *buffer) { @@ -126,7 +156,7 @@ parse_columns(char *buffer) int col = 0; - if (list == 0 && (list = typeCalloc(char *, MAX_COLUMNS)) == 0) + if (list == 0 && (list = typeCalloc(char *, (MAX_COLUMNS + 1))) == 0) return (0); if (*buffer != '#') { @@ -201,8 +231,15 @@ main(int argc, char **argv) list = parse_columns(buffer); if (list == 0) /* blank or comment */ continue; + if (column > count_columns(list)) { + fprintf(stderr, "expected %d columns, have %d:\n%s\n", + column, + count_columns(list), + buffer); + exit(EXIT_FAILURE); + } name_table[n].nte_link = -1; /* end-of-hash */ - name_table[n].nte_name = strdup(list[column]); + name_table[n].nte_name = strmalloc(list[column]); if (!strcmp(list[2], "bool")) { name_table[n].nte_type = BOOLEAN; name_table[n].nte_index = BoolCount++; @@ -256,8 +293,7 @@ main(int argc, char **argv) printf("static struct name_table_entry *_nc_%s_table = 0;\n\n", root_name); } else { - printf("static struct name_table_entry %s _nc_%s_table[] =\n", - bigstring ? "" : "const", + printf("static struct name_table_entry const _nc_%s_table[] =\n", root_name); printf("{\n"); for (n = 0; n < CAPTABSIZE; n++) {