1[= AutoGen5 Template -*- Mode: C -*-
2x=fixincl.x =]
3[=
4 (if (version-compare >= autogen-version "5.18")
5     (dne "-D" " * " "/* ")
6     (dne " * " "/* ") ) =]
7 */
8/* DO NOT SVN-MERGE THIS FILE, EITHER [=
9   (define re-ct 0) (define max-mach 0) (define ct 0)
10   (define HACK "") (define Hack "")    (define tmp "")
11   (shell "date") =]
12 *
13 * You must regenerate it.  Use the ./genfixes script.
14 *
15 *
16 * This is part of the fixincl program used to install modified versions of
17 * certain ANSI-incompatible system header files which are fixed to work
18 * correctly with ANSI C and placed in a directory that GNU C will search.
19 *
20 * This file contains [=(count "fix")=] fixup descriptions.
21 *
22 * See README for more information.
23 *
24 *  inclhack copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
25 *                         2006, 2007, 2008
26 *  The Free Software Foundation, Inc.
27 *
28 *  inclhack is free software: you can redistribute it and/or modify it
29 *  under the terms of the GNU General Public License as published by the
30 *  Free Software Foundation, either version 3 of the License, or
31 *  (at your option) any later version.
32 *
33 *  inclhack is distributed in the hope that it will be useful, but
34 *  WITHOUT ANY WARRANTY; without even the implied warranty of
35 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
36 *  See the GNU General Public License for more details.
37 *
38 *  You should have received a copy of the GNU General Public License along
39 *  with this program.  If not, see <http://www.gnu.org/licenses/>.
40 */
41#ifndef SED_PROGRAM
42#define SED_PROGRAM "/usr/bin/sed"
43#endif
44static char const sed_cmd_z[] = SED_PROGRAM;
45[=
46
47FOR fix =]
48/* * * * * * * * * * * * * * * * * * * * * * * * * *
49 *
50 *  Description of [=
51    (set! Hack (string-capitalize! (get "hackname")))
52    (set! HACK (string-upcase!     (get "hackname")))
53    (if (and (not (exist? "test_text")) (not (exist? "replace")))
54        (error (sprintf "include fix '%s' has no test text" Hack )) )
55    (. Hack)=] fix
56 */[=
57
58# Note that this is not just for debugging purposes, but in case
59  some C fix wishes to refer to the regexps it is paired with.
60  See commentary at the top of fixfixes.c.
61=]
62tSCC z[=(. Hack)=]Name[] =
63     "[=hackname=]";
64
65/*
66 *  File name selection pattern
67 */[=
68
69  IF (exist? "files")   =]
70tSCC z[=(. Hack)=]List[] =
71  "[=  (join "\\0" (stack "files")) =]\0";[=
72
73  ELSE                  =]
74#define z[=(. Hack)=]List (char*)NULL[=
75  ENDIF (exist? "files") =]
76/*
77 *  Machine/OS name selection pattern
78 */[=
79
80  IF (exist? "mach")    =]
81tSCC* apz[=(. Hack)=]Machs[] = {[=
82    (set! ct 0) =][=
83
84    FOR mach            =]
85        [=
86      (set! tmp (get "mach"))
87      (set! ct (+ ct (string-length tmp) 5))
88      (kr-string tmp)=],[=
89    ENDFOR              =]
90        (const char*)NULL };[=
91
92    (if (> ct max-mach) (set! max-mach ct)) =][=
93
94  ELSE                  =]
95#define apz[=(. Hack)=]Machs (const char**)NULL[=
96  ENDIF (exist? "mach") =][=
97
98  IF (exist? "select")=]
99
100/*
101 *  content selection pattern - do fix if pattern found
102 */[=
103    FOR select          =]
104tSCC z[=(. Hack)=]Select[=(for-index)=][] =
105       [=(kr-string (get "select"))=];[=
106    ENDFOR select       =][=
107  ENDIF                 =][=
108
109  IF (exist? "bypass")  =]
110
111/*
112 *  content bypass pattern - skip fix if pattern found
113 */[=
114    FOR bypass          =]
115tSCC z[=(. Hack)=]Bypass[=(for-index)=][] =
116       [=(kr-string (get "bypass"))=];[=
117    ENDFOR bypass       =][=
118  ENDIF                 =][=
119
120  IF (exist? "sum")=][=
121     (if (not (exist? "files"))
122         (error "specifying a 'sum' requires specifying 'files'"))
123     =]
124
125/*
126 *  file selection - do fix if checksum matches
127 */[=
128    FOR sum             =]
129tSCC z[=(. Hack)=]Sum[=(for-index)=][] =
130       [=(kr-string (get "sum"))=];[=
131    ENDFOR sum          =][=
132  ENDIF                 =][=
133
134  IF (exist? "test")    =]
135
136/*
137 *  perform the 'test' shell command - do fix on success
138 */[=
139    FOR test            =]
140tSCC z[=(. Hack)=]Test[=(for-index)=][] =
141       [=(kr-string (get "test"))=];[=
142    ENDFOR              =][=
143  ENDIF                 =][=
144
145  IF (exist? "c_test")  =]
146
147/*
148 *  perform the C function call test
149 */[=
150    FOR c_test          =]
151tSCC z[=(. Hack)=]FTst[=(for-index)=][] = "[=c_test=]";[=
152    ENDFOR c_test       =][=
153  ENDIF                 =][=
154
155  IF (set! ct (+ (count "select") (count "bypass")
156              (count "test") (count "c_test")))
157
158     (= ct 0)
159=]
160#define [=(. HACK)=]_TEST_CT  0
161#define a[=(. Hack)=]Tests   (tTestDesc*)NULL[=
162  ELSE =]
163
164#define    [=(. HACK)=]_TEST_CT  [=(. ct)=][=
165        (set! re-ct (+ re-ct (count "select") (count "bypass"))) =]
166static tTestDesc a[=(. Hack)=]Tests[] = {[=
167
168    FOR test            =]
169  { TT_TEST,     z[=(. Hack)=]Test[=(for-index)=],   0 /* unused */ },[=
170    ENDFOR test         =][=
171
172    FOR c_test          =]
173  { TT_FUNCTION, z[=(. Hack)=]FTst[=(for-index)=],   0 /* unused */ },[=
174    ENDFOR c_test       =][=
175
176    FOR bypass          =]
177  { TT_NEGREP,   z[=(. Hack)=]Bypass[=(for-index)=], (regex_t*)NULL },[=
178    ENDFOR bypass       =][=
179
180    FOR select          =]
181  { TT_EGREP,    z[=(. Hack)=]Select[=(for-index)=], (regex_t*)NULL },[=
182    ENDFOR select       =][=
183
184    FOR sum             =]
185  { TT_CKSUM,    z[=(. Hack)=]Sum[=(for-index)=], 0 /* unused */ },[=
186    ENDFOR sum          =] };[=
187  ENDIF =]
188
189/*
190 *  Fix Command Arguments for [=(. Hack)=]
191 */
192static const char* apz[=(. Hack)=]Patch[] = {[=
193    IF   (exist? "sed")=] sed_cmd_z[=
194      FOR sed=],
195    "-e", [=(kr-string (get "sed"))=][=
196      ENDFOR sed=],[=
197
198    ELIF (exist? "shell")=] "sh", "-c",
199    [=(kr-string (get "shell"))=],[=
200
201    ELIF (exist? "c_fix")=]
202    [=(kr-string (get "c_fix"))=],[=
203
204      FOR c_fix_arg =]
205    [=(kr-string (get "c_fix_arg"))=],[=
206      ENDFOR c_fix_arg =][=
207
208    ELIF (> (len "replace") 0) =]
209[=(kr-string (get "replace"))=],[=
210
211    ENDIF=]
212    (char*)NULL };
213[=ENDFOR fix=]
214
215/* * * * * * * * * * * * * * * * * * * * * * * * * *
216 *
217 *  List of all fixes
218 */[=
219#  as of this writing, 49 bytes are needed by the case statement format.
220   We also must allow for the size of the target machine machine name.
221   This allows for a 79 byte machine name.  Better be enough.
222=]
223#define REGEX_COUNT          [= (. re-ct) =]
224#define MACH_LIST_SIZE_LIMIT [= (+ 128 max-mach) =]
225#define FIX_COUNT            [= (count "fix") =]
226
227/*
228 *  Enumerate the fixes[= # in a way that minimizes diffs :-) =]
229 */
230typedef enum {[=
231
232FOR fix "," =]
233    [=(string-upcase! (get "hackname"))=]_FIXIDX[=
234ENDFOR
235
236=]
237} t_fixinc_idx;
238
239tFixDesc fixDescList[ FIX_COUNT ] = {[=
240
241
242FOR fix ",\n" =][=
243    (set! Hack (string-capitalize! (get "hackname")))
244    (set! HACK (string-upcase!     (get "hackname"))) =]
245  {  z[=(. Hack)=]Name,    z[=(. Hack)=]List,
246     apz[=(. Hack)=]Machs,
247     [=(. HACK)=]_TEST_CT, [=
248       IF (exist? "not_machine") =]FD_MACH_IFNOT[=
249       ELSE                      =]FD_MACH_ONLY[=
250       ENDIF =][=
251       IF    (exist? "shell")    =] | FD_SHELL_SCRIPT[=
252       ELIF  (exist? "c_fix")    =] | FD_SUBROUTINE[=
253       ELIF  (exist? "replace")  =] | FD_REPLACEMENT[=
254       ENDIF =],
255     a[=(. Hack)=]Tests,   apz[=(. Hack)=]Patch, 0 }[=
256
257ENDFOR =]
258};
259