diff options
author | Xin LI <delphij@FreeBSD.org> | 2014-02-28 19:18:07 +0000 |
---|---|---|
committer | Xin LI <delphij@FreeBSD.org> | 2014-02-28 19:18:07 +0000 |
commit | a0044ffc69cfe39a3b0b2d208e0952254555afc6 (patch) | |
tree | 7b2d708d03277cdd2560e9ce6572bdafc2e58bab /ncurses/tinfo/MKcaptab.sh | |
parent | 4b819fa20a8d007a10f2d3e8d6a5dedf7f18fc9a (diff) | |
download | src-a0044ffc69cfe39a3b0b2d208e0952254555afc6.tar.gz src-a0044ffc69cfe39a3b0b2d208e0952254555afc6.zip |
Redo import of ncurses 5.9 (stripped).vendor/ncurses/5.9-20110404_stripped
Notes
Notes:
svn path=/vendor/ncurses/dist/; revision=262617
svn path=/vendor/ncurses/5.9-20110404_stripped/; revision=262631; tag=vendor/ncurses/5.9-20110404_stripped
Diffstat (limited to 'ncurses/tinfo/MKcaptab.sh')
-rw-r--r-- | ncurses/tinfo/MKcaptab.sh | 136 |
1 files changed, 99 insertions, 37 deletions
diff --git a/ncurses/tinfo/MKcaptab.sh b/ncurses/tinfo/MKcaptab.sh index 98c04e884309..4d1b53a5bd9a 100644 --- a/ncurses/tinfo/MKcaptab.sh +++ b/ncurses/tinfo/MKcaptab.sh @@ -1,6 +1,6 @@ #!/bin/sh ############################################################################## -# Copyright (c) 2007 Free Software Foundation, Inc. # +# Copyright (c) 2007-2009,2010 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 "Software"), # @@ -26,12 +26,19 @@ # use or other dealings in this Software without prior written # # authorization. # ############################################################################## -# $Id: MKcaptab.sh,v 1.8 2007/08/12 13:13:51 tom Exp $ +# $Id: MKcaptab.sh,v 1.13 2010/12/25 23:43:58 tom Exp $ AWK=${1-awk} OPT1=${2-0} OPT2=${3-tinfo/MKcaptab.awk} DATA=${4-../include/Caps} +cat <<EOF +/* + * generated by $0 + */ + +EOF + cat <<'EOF' /* * comp_captab.c -- The names of the capabilities indexed via a hash @@ -48,7 +55,7 @@ EOF ./make_hash 1 info $OPT1 <$DATA ./make_hash 3 cap $OPT1 <$DATA -$AWK -f $OPT2 bigstrings=$OPT1 tablename=capalias <$DATA +$AWK -f $OPT2 bigstrings=$OPT1 tablename=capalias <$DATA $AWK -f $OPT2 bigstrings=$OPT1 tablename=infoalias <$DATA @@ -58,7 +65,7 @@ cat <<EOF static void next_string(const char *strings, unsigned *offset) { - *offset += strlen(strings + *offset) + 1; + *offset += (unsigned) strlen(strings + *offset) + 1; } static const struct name_table_entry * @@ -66,21 +73,21 @@ _nc_build_names(struct name_table_entry **actual, const name_table_data *source, const char *strings) { - if (*actual == 0) { - *actual = typeCalloc(struct name_table_entry, CAPTABSIZE); - if (*actual != 0) { - unsigned n; - unsigned len = 0; - for (n = 0; n < CAPTABSIZE; ++n) { - (*actual)[n].nte_name = strings + len; - (*actual)[n].nte_type = source[n].nte_type; - (*actual)[n].nte_index = source[n].nte_index; - (*actual)[n].nte_link = source[n].nte_link; - next_string(strings, &len); - } - } + if (*actual == 0) { + *actual = typeCalloc(struct name_table_entry, CAPTABSIZE); + if (*actual != 0) { + unsigned n; + unsigned len = 0; + for (n = 0; n < CAPTABSIZE; ++n) { + (*actual)[n].nte_name = strings + len; + (*actual)[n].nte_type = source[n].nte_type; + (*actual)[n].nte_index = source[n].nte_index; + (*actual)[n].nte_link = source[n].nte_link; + next_string(strings, &len); + } } - return *actual; + } + return *actual; } #define add_alias(field) \\ @@ -94,18 +101,18 @@ _nc_build_alias(struct alias **actual, const char *strings, unsigned tablesize) { - if (*actual == 0) { - *actual = typeCalloc(struct alias, tablesize + 1); - if (*actual != 0) { - unsigned n; - for (n = 0; n < tablesize; ++n) { - add_alias(from); - add_alias(to); - add_alias(source); - } - } + if (*actual == 0) { + *actual = typeCalloc(struct alias, tablesize + 1); + if (*actual != 0) { + unsigned n; + for (n = 0; n < tablesize; ++n) { + add_alias(from); + add_alias(to); + add_alias(source); + } } - return *actual; + } + return *actual; } #define build_names(root) _nc_build_names(&_nc_##root##_table, \\ @@ -122,27 +129,82 @@ _nc_build_alias(struct alias **actual, NCURSES_EXPORT(const struct name_table_entry *) _nc_get_table (bool termcap) { - return termcap ? build_names(cap) : build_names(info) ; + return termcap ? build_names(cap) : build_names(info) ; } -NCURSES_EXPORT(const short *) _nc_get_hash_table (bool termcap) +/* entrypoint used by tack (do not alter) */ +NCURSES_EXPORT(const HashValue *) _nc_get_hash_table (bool termcap) { - return termcap ? _nc_cap_hash_table: _nc_info_hash_table ; + return termcap ? _nc_cap_hash_table: _nc_info_hash_table ; } NCURSES_EXPORT(const struct alias *) _nc_get_alias_table (bool termcap) { - return termcap ? build_alias(cap) : build_alias(info) ; + return termcap ? build_alias(cap) : build_alias(info) ; +} + +static HashValue +info_hash(const char *string) +{ + long sum = 0; + + DEBUG(9, ("hashing %s", string)); + while (*string) { + sum += (long) (*string + (*(string + 1) << 8)); + string++; + } + + DEBUG(9, ("sum is %ld", sum)); + return (HashValue) (sum % HASHTABSIZE); +} + +#define TCAP_LEN 2 /* only 1- or 2-character names are used */ + +static HashValue +tcap_hash(const char *string) +{ + char temp[TCAP_LEN + 1]; + int limit = 0; + + while (*string) { + temp[limit++] = *string++; + if (limit >= TCAP_LEN) + break; + } + temp[limit] = '\0'; + return info_hash(temp); +} + +static int +compare_tcap_names(const char *a, const char *b) +{ + return !strncmp(a, b, TCAP_LEN); +} + +static int +compare_info_names(const char *a, const char *b) +{ + return !strcmp(a, b); +} + +static const HashData hash_data[2] = { + { HASHTABSIZE, _nc_info_hash_table, info_hash, compare_info_names }, + { HASHTABSIZE, _nc_cap_hash_table, tcap_hash, compare_tcap_names } +}; + +NCURSES_EXPORT(const HashData *) _nc_get_hash_info (bool termcap) +{ + return &hash_data[(termcap != FALSE)]; } #if NO_LEAKS NCURSES_EXPORT(void) _nc_comp_captab_leaks(void) { #if $OPT1 - FreeIfNeeded(_nc_cap_table); - FreeIfNeeded(_nc_info_table); - FreeIfNeeded(_nc_capalias_table); - FreeIfNeeded(_nc_infoalias_table); + FreeIfNeeded(_nc_cap_table); + FreeIfNeeded(_nc_info_table); + FreeIfNeeded(_nc_capalias_table); + FreeIfNeeded(_nc_infoalias_table); #endif } #endif /* NO_LEAKS */ |