diff --git a/ncurses/tinfo/MKcaptab.sh b/ncurses/tinfo/MKcaptab.sh
index 98c04e8..20c94a6 100755
--- 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-2010,2011 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.14 2011/10/22 16:34:50 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 @@
 ./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 @@
 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 @@
 		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) \\
@@ -92,20 +99,20 @@
 _nc_build_alias(struct alias **actual,
 		const alias_table_data *source,
 		const char *strings,
-		unsigned tablesize)
+		size_t 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) {
+	    size_t 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 @@
 
 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, (size_t) 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 */
