11c3a68e35
* fixincl.tpl: add a check sum acceptance test * fixlib.h: enumerate it * fixincl.c: handle it * README: document it and document the handling of test_text From-SVN: r220215
259 lines
7.0 KiB
Smarty
259 lines
7.0 KiB
Smarty
[= AutoGen5 Template -*- Mode: C -*-
|
|
x=fixincl.x =]
|
|
[=
|
|
(if (version-compare >= autogen-version "5.18")
|
|
(dne "-D" " * " "/* ")
|
|
(dne " * " "/* ") ) =]
|
|
*/
|
|
/* DO NOT SVN-MERGE THIS FILE, EITHER [=
|
|
(define re-ct 0) (define max-mach 0) (define ct 0)
|
|
(define HACK "") (define Hack "") (define tmp "")
|
|
(shell "date") =]
|
|
*
|
|
* You must regenerate it. Use the ./genfixes script.
|
|
*
|
|
*
|
|
* This is part of the fixincl program used to install modified versions of
|
|
* certain ANSI-incompatible system header files which are fixed to work
|
|
* correctly with ANSI C and placed in a directory that GNU C will search.
|
|
*
|
|
* This file contains [=(count "fix")=] fixup descriptions.
|
|
*
|
|
* See README for more information.
|
|
*
|
|
* inclhack copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
|
* 2006, 2007, 2008
|
|
* The Free Software Foundation, Inc.
|
|
*
|
|
* inclhack is free software: you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* inclhack is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
* See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef SED_PROGRAM
|
|
#define SED_PROGRAM "/usr/bin/sed"
|
|
#endif
|
|
static char const sed_cmd_z[] = SED_PROGRAM;
|
|
[=
|
|
|
|
FOR fix =]
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* Description of [=
|
|
(set! Hack (string-capitalize! (get "hackname")))
|
|
(set! HACK (string-upcase! (get "hackname")))
|
|
(if (and (not (exist? "test_text")) (not (exist? "replace")))
|
|
(error (sprintf "include fix '%s' has no test text" Hack )) )
|
|
(. Hack)=] fix
|
|
*/[=
|
|
|
|
# Note that this is not just for debugging purposes, but in case
|
|
some C fix wishes to refer to the regexps it is paired with.
|
|
See commentary at the top of fixfixes.c.
|
|
=]
|
|
tSCC z[=(. Hack)=]Name[] =
|
|
"[=hackname=]";
|
|
|
|
/*
|
|
* File name selection pattern
|
|
*/[=
|
|
|
|
IF (exist? "files") =]
|
|
tSCC z[=(. Hack)=]List[] =
|
|
"[= (join "\\0" (stack "files")) =]\0";[=
|
|
|
|
ELSE =]
|
|
#define z[=(. Hack)=]List (char*)NULL[=
|
|
ENDIF (exist? "files") =]
|
|
/*
|
|
* Machine/OS name selection pattern
|
|
*/[=
|
|
|
|
IF (exist? "mach") =]
|
|
tSCC* apz[=(. Hack)=]Machs[] = {[=
|
|
(set! ct 0) =][=
|
|
|
|
FOR mach =]
|
|
[=
|
|
(set! tmp (get "mach"))
|
|
(set! ct (+ ct (string-length tmp) 5))
|
|
(kr-string tmp)=],[=
|
|
ENDFOR =]
|
|
(const char*)NULL };[=
|
|
|
|
(if (> ct max-mach) (set! max-mach ct)) =][=
|
|
|
|
ELSE =]
|
|
#define apz[=(. Hack)=]Machs (const char**)NULL[=
|
|
ENDIF (exist? "mach") =][=
|
|
|
|
IF (exist? "select")=]
|
|
|
|
/*
|
|
* content selection pattern - do fix if pattern found
|
|
*/[=
|
|
FOR select =]
|
|
tSCC z[=(. Hack)=]Select[=(for-index)=][] =
|
|
[=(kr-string (get "select"))=];[=
|
|
ENDFOR select =][=
|
|
ENDIF =][=
|
|
|
|
IF (exist? "bypass") =]
|
|
|
|
/*
|
|
* content bypass pattern - skip fix if pattern found
|
|
*/[=
|
|
FOR bypass =]
|
|
tSCC z[=(. Hack)=]Bypass[=(for-index)=][] =
|
|
[=(kr-string (get "bypass"))=];[=
|
|
ENDFOR bypass =][=
|
|
ENDIF =][=
|
|
|
|
IF (exist? "sum")=][=
|
|
(if (not (exist? "files"))
|
|
(error "specifying a 'sum' requires specifying 'files'"))
|
|
=]
|
|
|
|
/*
|
|
* file selection - do fix if checksum matches
|
|
*/[=
|
|
FOR sum =]
|
|
tSCC z[=(. Hack)=]Sum[=(for-index)=][] =
|
|
[=(kr-string (get "sum"))=];[=
|
|
ENDFOR sum =][=
|
|
ENDIF =][=
|
|
|
|
IF (exist? "test") =]
|
|
|
|
/*
|
|
* perform the 'test' shell command - do fix on success
|
|
*/[=
|
|
FOR test =]
|
|
tSCC z[=(. Hack)=]Test[=(for-index)=][] =
|
|
[=(kr-string (get "test"))=];[=
|
|
ENDFOR =][=
|
|
ENDIF =][=
|
|
|
|
IF (exist? "c_test") =]
|
|
|
|
/*
|
|
* perform the C function call test
|
|
*/[=
|
|
FOR c_test =]
|
|
tSCC z[=(. Hack)=]FTst[=(for-index)=][] = "[=c_test=]";[=
|
|
ENDFOR c_test =][=
|
|
ENDIF =][=
|
|
|
|
IF (set! ct (+ (count "select") (count "bypass")
|
|
(count "test") (count "c_test")))
|
|
|
|
(= ct 0)
|
|
=]
|
|
#define [=(. HACK)=]_TEST_CT 0
|
|
#define a[=(. Hack)=]Tests (tTestDesc*)NULL[=
|
|
ELSE =]
|
|
|
|
#define [=(. HACK)=]_TEST_CT [=(. ct)=][=
|
|
(set! re-ct (+ re-ct (count "select") (count "bypass"))) =]
|
|
static tTestDesc a[=(. Hack)=]Tests[] = {[=
|
|
|
|
FOR test =]
|
|
{ TT_TEST, z[=(. Hack)=]Test[=(for-index)=], 0 /* unused */ },[=
|
|
ENDFOR test =][=
|
|
|
|
FOR c_test =]
|
|
{ TT_FUNCTION, z[=(. Hack)=]FTst[=(for-index)=], 0 /* unused */ },[=
|
|
ENDFOR c_test =][=
|
|
|
|
FOR bypass =]
|
|
{ TT_NEGREP, z[=(. Hack)=]Bypass[=(for-index)=], (regex_t*)NULL },[=
|
|
ENDFOR bypass =][=
|
|
|
|
FOR select =]
|
|
{ TT_EGREP, z[=(. Hack)=]Select[=(for-index)=], (regex_t*)NULL },[=
|
|
ENDFOR select =][=
|
|
|
|
FOR sum =]
|
|
{ TT_CKSUM, z[=(. Hack)=]Sum[=(for-index)=], 0 /* unused */ },[=
|
|
ENDFOR sum =] };[=
|
|
ENDIF =]
|
|
|
|
/*
|
|
* Fix Command Arguments for [=(. Hack)=]
|
|
*/
|
|
static const char* apz[=(. Hack)=]Patch[] = {[=
|
|
IF (exist? "sed")=] sed_cmd_z[=
|
|
FOR sed=],
|
|
"-e", [=(kr-string (get "sed"))=][=
|
|
ENDFOR sed=],[=
|
|
|
|
ELIF (exist? "shell")=] "sh", "-c",
|
|
[=(kr-string (get "shell"))=],[=
|
|
|
|
ELIF (exist? "c_fix")=]
|
|
[=(kr-string (get "c_fix"))=],[=
|
|
|
|
FOR c_fix_arg =]
|
|
[=(kr-string (get "c_fix_arg"))=],[=
|
|
ENDFOR c_fix_arg =][=
|
|
|
|
ELIF (> (len "replace") 0) =]
|
|
[=(kr-string (get "replace"))=],[=
|
|
|
|
ENDIF=]
|
|
(char*)NULL };
|
|
[=ENDFOR fix=]
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* List of all fixes
|
|
*/[=
|
|
# as of this writing, 49 bytes are needed by the case statement format.
|
|
We also must allow for the size of the target machine machine name.
|
|
This allows for a 79 byte machine name. Better be enough.
|
|
=]
|
|
#define REGEX_COUNT [= (. re-ct) =]
|
|
#define MACH_LIST_SIZE_LIMIT [= (+ 128 max-mach) =]
|
|
#define FIX_COUNT [= (count "fix") =]
|
|
|
|
/*
|
|
* Enumerate the fixes[= # in a way that minimizes diffs :-) =]
|
|
*/
|
|
typedef enum {[=
|
|
|
|
FOR fix "," =]
|
|
[=(string-upcase! (get "hackname"))=]_FIXIDX[=
|
|
ENDFOR
|
|
|
|
=]
|
|
} t_fixinc_idx;
|
|
|
|
tFixDesc fixDescList[ FIX_COUNT ] = {[=
|
|
|
|
|
|
FOR fix ",\n" =][=
|
|
(set! Hack (string-capitalize! (get "hackname")))
|
|
(set! HACK (string-upcase! (get "hackname"))) =]
|
|
{ z[=(. Hack)=]Name, z[=(. Hack)=]List,
|
|
apz[=(. Hack)=]Machs,
|
|
[=(. HACK)=]_TEST_CT, [=
|
|
IF (exist? "not_machine") =]FD_MACH_IFNOT[=
|
|
ELSE =]FD_MACH_ONLY[=
|
|
ENDIF =][=
|
|
IF (exist? "shell") =] | FD_SHELL_SCRIPT[=
|
|
ELIF (exist? "c_fix") =] | FD_SUBROUTINE[=
|
|
ELIF (exist? "replace") =] | FD_REPLACEMENT[=
|
|
ENDIF =],
|
|
a[=(. Hack)=]Tests, apz[=(. Hack)=]Patch, 0 }[=
|
|
|
|
ENDFOR =]
|
|
};
|