fixlib.h 4.23 KB
Newer Older
korbb's avatar
korbb committed
1 2 3 4 5

/* 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.

law's avatar
law committed
6
   Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
korbb's avatar
korbb committed
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

This file is part of GNU CC.

GNU CC 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 2, or (at your option)
any later version.

GNU CC 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 GNU CC; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

#ifndef FIXINCLUDES_FIXLIB_H
#define FIXINCLUDES_FIXLIB_H

#include "auto-host.h"
#include "gansidecl.h"
#include "system.h"

#include "gnu-regex.h"
korbb's avatar
korbb committed
33
#include "machname.h"
34
#include "libiberty.h"
korbb's avatar
korbb committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

#ifndef STDIN_FILENO
# define STDIN_FILENO   0
#endif
#ifndef STDOUT_FILENO
# define STDOUT_FILENO  1
#endif

typedef int t_success;

#define FAILURE         (-1)
#define SUCCESS           0
#define PROBLEM           1

#define SUCCEEDED(p)    ((p) == SUCCESS)
#define SUCCESSFUL(p)   SUCCEEDED (p)
#define FAILED(p)       ((p) < SUCCESS)
#define HADGLITCH(p)    ((p) > SUCCESS)


#define tSCC static const char
#define tCC  const char
#define tSC  static char

/* If this particular system's header files define the macro `MAXPATHLEN',
   we happily take advantage of it; otherwise we use a value which ought
   to be large enough.  */
#ifndef MAXPATHLEN
# define MAXPATHLEN     4096
#endif

#ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
#endif
#ifndef EXIT_FAILURE
# define EXIT_FAILURE 1
#endif

#define NUL             '\0'

#ifndef NOPROCESS
#define NOPROCESS	((pid_t) -1)
#define NULLPROCESS	((pid_t)0)

#define EXIT_PANIC	99

81 82
#ifndef HAVE_T_BOOL_ENUM
#define HAVE_T_BOOL_ENUM
korbb's avatar
korbb committed
83 84 85 86
typedef enum
{
  BOOL_FALSE, BOOL_TRUE
} t_bool;
87
#endif
korbb's avatar
korbb committed
88

korbb's avatar
korbb committed
89 90 91 92 93
typedef int apply_fix_p_t;  /* Apply Fix Predicate Type */

#define APPLY_FIX 0
#define SKIP_FIX  1

korbb's avatar
korbb committed
94 95 96
#define _P_(p)	()
#endif

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
/*  Test Descriptor

    Each fix may have associated tests that determine
    whether the fix needs to be applied or not.
    Each test has a type (from the te_test_type enumeration);
    associated test text; and, if the test is TT_EGREP or
    the negated form TT_NEGREP, a pointer to the compiled
    version of the text string.

    */
typedef enum
{
  TT_TEST, TT_EGREP, TT_NEGREP, TT_FUNCTION
} te_test_type;

typedef struct test_desc tTestDesc;

struct test_desc
{
  te_test_type type;
  const char *pz_test_text;
  regex_t *p_test_regex;
};

typedef struct patch_desc tPatchDesc;

/*  Fix Descriptor

    Everything you ever wanted to know about how to apply
    a particular fix (which files, how to qualify them,
    how to actually make the fix, etc...)

    NB:  the FD_ defines are BIT FLAGS

    */
#define FD_MACH_ONLY      0x0000
#define FD_MACH_IFNOT     0x0001
#define FD_SHELL_SCRIPT   0x0002
#define FD_SUBROUTINE     0x0004
#define FD_REPLACEMENT    0x0008
#define FD_SKIP_TEST      0x8000

typedef struct fix_desc tFixDesc;
struct fix_desc
{
korbb's avatar
korbb committed
142 143 144 145 146 147 148 149
  tCC*        fix_name;       /* Name of the fix */
  tCC*        file_list;      /* List of files it applies to */
  tCC**       papz_machs;     /* List of machine/os-es it applies to */
  int         test_ct;
  int         fd_flags;
  tTestDesc*  p_test_desc;
  tCC**       patch_args;
  long        unused;
150 151
};

korbb's avatar
korbb committed
152 153 154 155
/*
 *  Exported procedures
 */
char * load_file_data _P_(( FILE* fp ));
156
#ifdef IS_CXX_HEADER_NEEDED
korbb's avatar
korbb committed
157
t_bool is_cxx_header  _P_(( tCC* filename, tCC* filetext ));
158 159 160 161
#endif /* IS_CXX_HEADER_NEEDED */
#ifdef SKIP_QUOTE_NEEDED
tCC*   skip_quote  _P_(( char  q, char* text ));
#endif
162 163
void   compile_re     _P_(( tCC* pat, regex_t* re, int match,
			    tCC *e1, tCC *e2 ));
164 165 166 167

void apply_fix _P_(( tFixDesc* p_fixd, tCC* filname ));
apply_fix_p_t run_test _P_((tCC* t_name, tCC* f_name, tCC* text ));

korbb's avatar
korbb committed
168 169
#ifdef MN_NAME_PAT
void   mn_get_regexps _P_(( regex_t** label_re, regex_t** name_re,
170
			    tCC *who ));
korbb's avatar
korbb committed
171
#endif
korbb's avatar
korbb committed
172
#endif /* FIXINCLUDES_FIXLIB_H */