xref: /dragonfly/contrib/libedit/src/makelist (revision 698e9e6cd5f042847de67460caaa3fde98cdfe99)
1#!/bin/sh -
2#         $NetBSD: makelist,v 1.29 2016/05/09 21:46:56 christos Exp $
3#
4# Copyright (c) 1992, 1993
5#         The Regents of the University of California.  All rights reserved.
6#
7# This code is derived from software contributed to Berkeley by
8# Christos Zoulas of Cornell University.
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions
12# are met:
13# 1. Redistributions of source code must retain the above copyright
14#    notice, this list of conditions and the following disclaimer.
15# 2. Redistributions in binary form must reproduce the above copyright
16#    notice, this list of conditions and the following disclaimer in the
17#    documentation and/or other materials provided with the distribution.
18# 3. Neither the name of the University nor the names of its contributors
19#    may be used to endorse or promote products derived from this software
20#    without specific prior written permission.
21#
22# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32# SUCH DAMAGE.
33#
34#         @(#)makelist        5.3 (Berkeley) 6/4/93
35
36# makelist.sh: Automatically generate header files...
37
38LC_ALL=C
39LANG=C
40export LC_ALL LANG
41
42if [ "x$AWK" = "x" ]
43then
44   AWK=awk
45fi
46
47USAGE="Usage: $0 -h|-fc|-fh|-bh <filenames>"
48
49if [ "x$1" = "x" ]
50then
51    echo $USAGE 1>&2
52    exit 1
53fi
54
55FLAG="$1"
56shift
57
58FILES="$@"
59
60case $FLAG in
61
62-h)
63    set - `echo $FILES | sed -e 's/\\./_/g'`
64    hdr="_h_`basename $1`"
65    cat $FILES | $AWK '
66          BEGIN {
67              printf("/* Automatically generated file, do not edit */\n");
68              printf("#ifndef %s\n#define %s\n", "'$hdr'", "'$hdr'");
69          }
70          /\(\):/ {
71              pr = substr($2, 1, 2);
72              if (pr == "vi" || pr == "em" || pr == "ed") {
73                    name = substr($2, 1, length($2) - 3);
74#
75# XXX:    need a space between name and prototype so that -fc and -fh
76#         parsing is much easier
77#
78                    printf("libedit_private el_action_t\t%s (EditLine *, wint_t);\n",
79                        name);
80              }
81          }
82          END {
83              printf("#endif /* %s */\n", "'$hdr'");
84          }'
85          ;;
86
87#         generate help.h from various .c files
88#
89-bh)
90    cat $FILES | $AWK '
91          BEGIN {
92              printf("/* Automatically generated file, do not edit */\n");
93              printf("static const struct el_bindings_t el_func_help[] = {\n");
94              low = "abcdefghijklmnopqrstuvwxyz_";
95              high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
96              for (i = 1; i <= length(low); i++)
97                    tr[substr(low, i, 1)] = substr(high, i, 1);
98          }
99          /\(\):/ {
100              pr = substr($2, 1, 2);
101              if (pr == "vi" || pr == "em" || pr == "ed") {
102                    name = substr($2, 1, length($2) - 3);
103                    uname = "";
104                    fname = "";
105                    for (i = 1; i <= length(name); i++) {
106                        s = substr(name, i, 1);
107                        uname = uname tr[s];
108                        if (s == "_")
109                              s = "-";
110                        fname = fname s;
111                    }
112
113                    printf("    { %-30.30s %-30.30s\n","L\"" fname "\",", uname ",");
114                    ok = 1;
115              }
116          }
117          /^ \*/ {
118              if (ok) {
119                    printf("      L\"");
120                    for (i = 2; i < NF; i++)
121                        printf("%s ", $i);
122                    printf("%s\" },\n", $i);
123                    ok = 0;
124              }
125          }
126          END {
127              printf("};\n");
128          }'
129          ;;
130
131#         generate fcns.h from various .h files
132#
133-fh)
134    cat $FILES | $AWK '/el_action_t/ { print $3 }' | \
135    sort | tr '[:lower:]' '[:upper:]' | $AWK '
136          BEGIN {
137              printf("/* Automatically generated file, do not edit */\n");
138              count = 0;
139          }
140          {
141              printf("#define\t%-30.30s\t%3d\n", $1, count++);
142          }
143          END {
144              printf("#define\t%-30.30s\t%3d\n", "EL_NUM_FCNS", count);
145          }'
146          ;;
147
148#         generate func.h from various .h files
149#
150-fc)
151    cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK '
152          BEGIN {
153              printf("/* Automatically generated file, do not edit */\n");
154              printf("static const el_func_t el_func[] = {");
155              maxlen = 80;
156              needn = 1;
157              len = 0;
158          }
159          {
160              clen = 25 + 2;
161              len += clen;
162              if (len >= maxlen)
163                    needn = 1;
164              if (needn) {
165                    printf("\n    ");
166                    needn = 0;
167                    len = 4 + clen;
168              }
169              s = $1 ",";
170              printf("%-26.26s ", s);
171          }
172          END {
173              printf("\n};\n");
174          }'
175          ;;
176
177*)
178    echo $USAGE 1>&2
179    exit 1
180    ;;
181
182esac
183