blob: 5f4135028f9856292e239e65d439f02e85e8b1c8 [file] [log] [blame]
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +05301#!/bin/sh
2##############################################################################
micky3879b9f5e72025-07-08 18:04:53 -04003# Copyright 2019-2020,2023 Thomas E. Dickey #
4# Copyright 2007-2010,2011 Free Software Foundation, Inc. #
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +05305# #
6# Permission is hereby granted, free of charge, to any person obtaining a #
7# copy of this software and associated documentation files (the "Software"), #
8# to deal in the Software without restriction, including without limitation #
9# the rights to use, copy, modify, merge, publish, distribute, distribute #
10# with modifications, sublicense, and/or sell copies of the Software, and to #
11# permit persons to whom the Software is furnished to do so, subject to the #
12# following conditions: #
13# #
14# The above copyright notice and this permission notice shall be included in #
15# all copies or substantial portions of the Software. #
16# #
17# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
18# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
19# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
20# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
21# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
22# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
23# DEALINGS IN THE SOFTWARE. #
24# #
25# Except as contained in this notice, the name(s) of the above copyright #
26# holders shall not be used in advertising or otherwise to promote the sale, #
27# use or other dealings in this Software without prior written #
28# authorization. #
29##############################################################################
micky3879b9f5e72025-07-08 18:04:53 -040030# $Id: MKcaptab.sh,v 1.20 2023/04/22 15:12:57 tom Exp $
31
32if test $# != 0
33then
34 AWK="$1"; shift 1
35else
36 AWK=awk
37fi
38
39if test $# != 0
40then
41 OPT1="$1"; shift 1
42else
43 OPT1="-0"
44fi
45
46if test $# != 0
47then
48 OPT2="$1"; shift 1
49else
50 OPT2="tinfo/MKcaptab.awk"
51fi
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053052
Steve Kondikae271bc2015-11-15 02:50:53 +010053cat <<EOF
54/*
55 * generated by $0
56 */
57
58EOF
59
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053060cat <<'EOF'
61/*
62 * comp_captab.c -- The names of the capabilities indexed via a hash
63 * table for the compiler.
64 *
65 */
66
67#include <curses.priv.h>
68#include <tic.h>
69#include <hashsize.h>
70
micky3879b9f5e72025-07-08 18:04:53 -040071/* *INDENT-OFF* */
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053072EOF
73
micky3879b9f5e72025-07-08 18:04:53 -040074cat "$@" |./make_hash 1 info $OPT1
75cat "$@" |./make_hash 3 cap $OPT1
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053076
micky3879b9f5e72025-07-08 18:04:53 -040077cat "$@" |$AWK -f $OPT2 bigstrings=$OPT1 tablename=capalias
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053078
micky3879b9f5e72025-07-08 18:04:53 -040079cat "$@" |$AWK -f $OPT2 bigstrings=$OPT1 tablename=infoalias
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053080
81cat <<EOF
micky3879b9f5e72025-07-08 18:04:53 -040082/* *INDENT-ON* */
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053083
84#if $OPT1
85static void
86next_string(const char *strings, unsigned *offset)
87{
Steve Kondikae271bc2015-11-15 02:50:53 +010088 *offset += (unsigned) strlen(strings + *offset) + 1;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053089}
90
91static const struct name_table_entry *
92_nc_build_names(struct name_table_entry **actual,
micky3879b9f5e72025-07-08 18:04:53 -040093 const name_table_data * source,
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053094 const char *strings)
95{
Steve Kondikae271bc2015-11-15 02:50:53 +010096 if (*actual == 0) {
97 *actual = typeCalloc(struct name_table_entry, CAPTABSIZE);
98 if (*actual != 0) {
99 unsigned n;
100 unsigned len = 0;
101 for (n = 0; n < CAPTABSIZE; ++n) {
102 (*actual)[n].nte_name = strings + len;
103 (*actual)[n].nte_type = source[n].nte_type;
104 (*actual)[n].nte_index = source[n].nte_index;
105 (*actual)[n].nte_link = source[n].nte_link;
106 next_string(strings, &len);
107 }
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530108 }
Steve Kondikae271bc2015-11-15 02:50:53 +0100109 }
110 return *actual;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530111}
112
113#define add_alias(field) \\
114 if (source[n].field >= 0) { \\
115 (*actual)[n].field = strings + source[n].field; \\
116 }
117
118static const struct alias *
119_nc_build_alias(struct alias **actual,
micky3879b9f5e72025-07-08 18:04:53 -0400120 const alias_table_data * source,
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530121 const char *strings,
Steve Kondikae271bc2015-11-15 02:50:53 +0100122 size_t tablesize)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530123{
Steve Kondikae271bc2015-11-15 02:50:53 +0100124 if (*actual == 0) {
125 *actual = typeCalloc(struct alias, tablesize + 1);
126 if (*actual != 0) {
127 size_t n;
128 for (n = 0; n < tablesize; ++n) {
129 add_alias(from);
130 add_alias(to);
131 add_alias(source);
132 }
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530133 }
Steve Kondikae271bc2015-11-15 02:50:53 +0100134 }
135 return *actual;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530136}
137
138#define build_names(root) _nc_build_names(&_nc_##root##_table, \\
139 root##_names_data, \\
140 root##_names_text)
141#define build_alias(root) _nc_build_alias(&_nc_##root##alias_table, \\
142 root##alias_data, \\
143 root##alias_text, \\
144 SIZEOF(root##alias_data))
145#else
146#define build_names(root) _nc_ ## root ## _table
147#define build_alias(root) _nc_ ## root ## alias_table
148#endif
149
micky3879b9f5e72025-07-08 18:04:53 -0400150NCURSES_EXPORT(const struct name_table_entry *)
151_nc_get_table(bool termcap)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530152{
micky3879b9f5e72025-07-08 18:04:53 -0400153 return termcap ? build_names(cap) : build_names(info);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530154}
155
micky3879b9f5e72025-07-08 18:04:53 -0400156NCURSES_EXPORT(const HashValue *)
157_nc_get_hash_table(bool termcap)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530158{
micky3879b9f5e72025-07-08 18:04:53 -0400159 return termcap ? _nc_cap_hash_table : _nc_info_hash_table;
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530160}
161
micky3879b9f5e72025-07-08 18:04:53 -0400162NCURSES_EXPORT(const struct alias *)
163_nc_get_alias_table(bool termcap)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530164{
micky3879b9f5e72025-07-08 18:04:53 -0400165 return termcap ? build_alias(cap) : build_alias(info);
Steve Kondikae271bc2015-11-15 02:50:53 +0100166}
167
168static HashValue
169info_hash(const char *string)
170{
171 long sum = 0;
172
173 DEBUG(9, ("hashing %s", string));
174 while (*string) {
micky3879b9f5e72025-07-08 18:04:53 -0400175 sum += (long) (UChar(*string) + (UChar(*(string + 1)) << 8));
Steve Kondikae271bc2015-11-15 02:50:53 +0100176 string++;
177 }
178
179 DEBUG(9, ("sum is %ld", sum));
180 return (HashValue) (sum % HASHTABSIZE);
181}
182
183#define TCAP_LEN 2 /* only 1- or 2-character names are used */
184
185static HashValue
186tcap_hash(const char *string)
187{
188 char temp[TCAP_LEN + 1];
189 int limit = 0;
190
191 while (*string) {
192 temp[limit++] = *string++;
193 if (limit >= TCAP_LEN)
194 break;
195 }
196 temp[limit] = '\0';
197 return info_hash(temp);
198}
199
200static int
201compare_tcap_names(const char *a, const char *b)
202{
203 return !strncmp(a, b, (size_t) TCAP_LEN);
204}
205
206static int
207compare_info_names(const char *a, const char *b)
208{
209 return !strcmp(a, b);
210}
211
micky3879b9f5e72025-07-08 18:04:53 -0400212static const HashData hash_data[2] =
213{
214 {HASHTABSIZE, _nc_info_hash_table, info_hash, compare_info_names},
215 {HASHTABSIZE, _nc_cap_hash_table, tcap_hash, compare_tcap_names}
Steve Kondikae271bc2015-11-15 02:50:53 +0100216};
217
micky3879b9f5e72025-07-08 18:04:53 -0400218NCURSES_EXPORT(const HashData *)
219_nc_get_hash_info(bool termcap)
Steve Kondikae271bc2015-11-15 02:50:53 +0100220{
221 return &hash_data[(termcap != FALSE)];
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530222}
223
224#if NO_LEAKS
micky3879b9f5e72025-07-08 18:04:53 -0400225NCURSES_EXPORT(void)
226_nc_comp_captab_leaks(void)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530227{
228#if $OPT1
Steve Kondikae271bc2015-11-15 02:50:53 +0100229 FreeIfNeeded(_nc_cap_table);
230 FreeIfNeeded(_nc_info_table);
231 FreeIfNeeded(_nc_capalias_table);
232 FreeIfNeeded(_nc_infoalias_table);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530233#endif
234}
235#endif /* NO_LEAKS */
236EOF