/ lib / libedit / src / makelist
makelist
  1  #!/bin/sh -
  2  #	$NetBSD: makelist,v 1.16 2010/04/18 21:17:05 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  
 38  USAGE="Usage: $0 -n|-h|-e|-fc|-fh|-bc|-bh|-m <filenames>"
 39  
 40  if [ "x$1" = "x" ]
 41  then
 42      echo $USAGE 1>&2
 43      exit 1
 44  fi
 45  
 46  FLAG="$1"
 47  shift
 48  
 49  FILES="$@"
 50  
 51  case $FLAG in
 52  
 53  #	generate foo.h file from foo.c
 54  #
 55  -n)
 56      cat << _EOF
 57  #include "config.h"
 58  #undef WIDECHAR
 59  #define NARROWCHAR
 60  #include "${FILES}"
 61  _EOF
 62      ;;
 63      
 64  -h)
 65      set - `echo $FILES | sed -e 's/\\./_/g'`
 66      hdr="_h_`basename $1`"
 67      cat $FILES | $AWK '
 68  	BEGIN {
 69  	    printf("/* Automatically generated file, do not edit */\n");
 70  	    printf("#ifndef %s\n#define %s\n", "'$hdr'", "'$hdr'");
 71  	}
 72  	/\(\):/ {
 73  	    pr = substr($2, 1, 2);
 74  	    if (pr == "vi" || pr == "em" || pr == "ed") {
 75  		name = substr($2, 1, length($2) - 3);
 76  #
 77  # XXX:	need a space between name and prototype so that -fc and -fh
 78  #	parsing is much easier
 79  #
 80  		printf("protected el_action_t\t%s (EditLine *, Int);\n", name);
 81  	    }
 82  	}
 83  	END {
 84  	    printf("#endif /* %s */\n", "'$hdr'");
 85  	}'
 86  	;;
 87  
 88  #	generate help.c from various .c files
 89  #
 90  -bc)
 91      cat $FILES | $AWK '
 92  	BEGIN {
 93  	    printf("/* Automatically generated file, do not edit */\n");
 94  	    printf("#include \"config.h\"\n#include \"el.h\"\n");
 95  	    printf("#include \"chartype.h\"\n");
 96  	    printf("private const struct el_bindings_t el_func_help[] = {\n");
 97  	    low = "abcdefghijklmnopqrstuvwxyz_";
 98  	    high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
 99  	    for (i = 1; i <= length(low); i++)
100  		tr[substr(low, i, 1)] = substr(high, i, 1);
101  	}
102  	/\(\):/ {
103  	    pr = substr($2, 1, 2);
104  	    if (pr == "vi" || pr == "em" || pr == "ed") {
105  		name = substr($2, 1, length($2) - 3);
106  		uname = "";
107  		fname = "";
108  		for (i = 1; i <= length(name); i++) {
109  		    s = substr(name, i, 1);
110  		    uname = uname tr[s];
111  		    if (s == "_")
112  			s = "-";
113  		    fname = fname s;
114  		}
115  
116  		printf("    { %-30.30s %-30.30s\n","STR(\"" fname "\"),", uname ",");
117  		ok = 1;
118  	    }
119  	}
120  	/^ \*/ {
121  	    if (ok) {
122  		printf("      STR(\"");
123  		for (i = 2; i < NF; i++)
124  		    printf("%s ", $i);
125  		printf("%s\") },\n", $i);
126  		ok = 0;
127  	    }
128  	}
129  	END {
130  	    printf("};\n");
131  	    printf("\nprotected const el_bindings_t* help__get()");
132  	    printf("{ return el_func_help; }\n");
133  	}'
134  	;;
135  
136  #	generate help.h from various .c files
137  #
138  -bh)
139      $AWK '
140  	BEGIN {
141  	    printf("/* Automatically generated file, do not edit */\n");
142  	    printf("#ifndef _h_help_c\n#define _h_help_c\n");
143  	    printf("protected const el_bindings_t *help__get(void);\n");
144  	    printf("#endif /* _h_help_c */\n");
145  	}' /dev/null
146  	;;
147  
148  #	generate fcns.h from various .h files
149  #
150  -fh)
151      cat $FILES | $AWK '/el_action_t/ { print $3 }' | \
152      sort | tr '[a-z]' '[A-Z]' | $AWK '
153  	BEGIN {
154  	    printf("/* Automatically generated file, do not edit */\n");
155  	    printf("#ifndef _h_fcns_c\n#define _h_fcns_c\n");
156  	    count = 0;
157  	}
158  	{
159  	    printf("#define\t%-30.30s\t%3d\n", $1, count++);
160  	}
161  	END {
162  	    printf("#define\t%-30.30s\t%3d\n", "EL_NUM_FCNS", count);
163  
164  	    printf("typedef el_action_t (*el_func_t)(EditLine *, Int);");
165  	    printf("\nprotected const el_func_t* func__get(void);\n");
166  	    printf("#endif /* _h_fcns_c */\n");
167  	}'
168  	;;
169  
170  #	generate fcns.c from various .h files
171  #
172  -fc)
173      cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK '
174  	BEGIN {
175  	    printf("/* Automatically generated file, do not edit */\n");
176  	    printf("#include \"config.h\"\n#include \"el.h\"\n");
177  	    printf("private const el_func_t el_func[] = {");
178  	    maxlen = 80;
179  	    needn = 1;
180  	    len = 0;
181  	}
182  	{
183  	    clen = 25 + 2;
184  	    len += clen;
185  	    if (len >= maxlen)
186  		needn = 1;
187  	    if (needn) {
188  		printf("\n    ");
189  		needn = 0;
190  		len = 4 + clen;
191  	    }
192  	    s = $1 ",";
193  	    printf("%-26.26s ", s);
194  	}
195  	END {
196  	    printf("\n};\n");
197  	    printf("\nprotected const el_func_t* func__get() { return el_func; }\n");
198  	}'
199  	;;
200  
201  #	generate editline.c from various .c files
202  #
203  -e)
204  	echo "$FILES" | tr ' ' '\012' | $AWK '
205  	BEGIN {
206  	    printf("/* Automatically generated file, do not edit */\n");
207  	    printf("#define protected static\n");
208  	    printf("#define SCCSID\n");
209  	}
210  	{
211  	    printf("#include \"%s\"\n", $1);
212  	}'
213  	;;
214  
215  #	generate man page fragment from various .c files
216  #
217  -m)
218      cat $FILES | $AWK '
219  	BEGIN {
220  	    printf(".\\\" Section automatically generated with makelist\n");
221  	    printf(".Bl -tag -width 4n\n");
222  	}
223  	/\(\):/ {
224  	    pr = substr($2, 1, 2);
225  	    if (pr == "vi" || pr == "em" || pr == "ed") {
226  		name = substr($2, 1, length($2) - 3);
227  		fname = "";
228  		for (i = 1; i <= length(name); i++) {
229  		    s = substr(name, i, 1);
230  		    if (s == "_")
231  			s = "-";
232  		    fname = fname s;
233  		}
234  
235  		printf(".It Ic %s\n", fname);
236  		ok = 1;
237  	    }
238  	}
239  	/^ \*/ {
240  	    if (ok) {
241  		for (i = 2; i < NF; i++)
242  		    printf("%s ", $i);
243  		printf("%s.\n", $i);
244  		ok = 0;
245  	    }
246  	}
247  	END {
248  	    printf(".El\n");
249  	    printf(".\\\" End of section automatically generated with makelist\n");
250  	}'
251  	;;
252  
253  *)
254      echo $USAGE 1>&2
255      exit 1
256      ;;
257  
258  esac