[= AutoGen5 Template -*- Mode: C -*-
x=fixincl.x =]
[= (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? "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 =] };[=
  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 =]
};
