[= AutoGen5 Template -*- Mode: C -*-
x=fixincl.x =]
[=
 (if (version-compare >= autogen-version "5.18.1")
     (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 =]
};
