1 2 /* Install modified versions of certain ANSI-incompatible system header 3 files which are fixed to work correctly with ANSI C and placed in a 4 directory that GCC will search. 5 6 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 7 Free Software Foundation, Inc. 8 9 This file is part of GCC. 10 11 GCC is free software; you can redistribute it and/or modify 12 it under the terms of the GNU General Public License as published by 13 the Free Software Foundation; either version 2, or (at your option) 14 any later version. 15 16 GCC is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU General Public License for more details. 20 21 You should have received a copy of the GNU General Public License 22 along with GCC; see the file COPYING. If not, write to 23 the Free Software Foundation, 51 Franklin Street, Fifth Floor, 24 Boston, MA 02110-1301, USA. */ 25 26 #ifndef GCC_FIXLIB_H 27 #define GCC_FIXLIB_H 28 29 #include "config.h" 30 #include "system.h" 31 #include <signal.h> 32 33 #include "xregex.h" 34 #include "libiberty.h" 35 36 #ifndef STDIN_FILENO 37 # define STDIN_FILENO 0 38 #endif 39 #ifndef STDOUT_FILENO 40 # define STDOUT_FILENO 1 41 #endif 42 43 #if ! defined( SIGCHLD ) && defined( SIGCLD ) 44 # define SIGCHLD SIGCLD 45 #endif 46 47 #ifndef SIGQUIT 48 #define SIGQUIT SIGTERM 49 #endif 50 #ifndef SIGIOT 51 #define SIGIOT SIGTERM 52 #endif 53 #ifndef SIGPIPE 54 #define SIGPIPE SIGTERM 55 #endif 56 #ifndef SIGALRM 57 #define SIGALRM SIGTERM 58 #endif 59 #ifndef SIGKILL 60 #define SIGKILL SIGTERM 61 #endif 62 63 typedef int t_success; 64 65 #define FAILURE (-1) 66 #define SUCCESS 0 67 #define PROBLEM 1 68 69 #define SUCCEEDED(p) ((p) == SUCCESS) 70 #define SUCCESSFUL(p) SUCCEEDED (p) 71 #define FAILED(p) ((p) < SUCCESS) 72 #define HADGLITCH(p) ((p) > SUCCESS) 73 74 #ifndef DEBUG 75 # define STATIC static 76 #else 77 # define STATIC 78 #endif 79 80 #define tSCC static const char 81 #define tCC const char 82 #define tSC static char 83 84 /* If this particular system's header files define the macro `MAXPATHLEN', 85 we happily take advantage of it; otherwise we use a value which ought 86 to be large enough. */ 87 #ifndef MAXPATHLEN 88 # define MAXPATHLEN 4096 89 #endif 90 91 #ifndef EXIT_SUCCESS 92 # define EXIT_SUCCESS 0 93 #endif 94 #ifndef EXIT_FAILURE 95 # define EXIT_FAILURE 1 96 #endif 97 98 #define EXIT_BROKEN 3 99 100 #define NUL '\0' 101 102 #ifndef NOPROCESS 103 #define NOPROCESS ((pid_t) -1) 104 #define NULLPROCESS ((pid_t)0) 105 106 #define EXIT_PANIC 99 107 #endif /* NOPROCESS */ 108 109 #define IGNORE_ARG(a) ((void)(a)) 110 111 typedef enum t_bool 112 { 113 BOOL_FALSE, BOOL_TRUE 114 } t_bool; 115 116 typedef int apply_fix_p_t; /* Apply Fix Predicate Type */ 117 118 #define APPLY_FIX 0 119 #define SKIP_FIX 1 120 121 #define ENV_TABLE \ 122 _ENV_( pz_machine, BOOL_TRUE, "TARGET_MACHINE", \ 123 "output from config.guess" ) \ 124 \ 125 _ENV_( pz_orig_dir, BOOL_TRUE, "ORIGDIR", \ 126 "directory of fixincl and applyfix" ) \ 127 \ 128 _ENV_( pz_src_dir, BOOL_TRUE, "SRCDIR", \ 129 "directory of original files" ) \ 130 \ 131 _ENV_( pz_input_dir, BOOL_TRUE, "INPUT", \ 132 "current directory for fixincl" ) \ 133 \ 134 _ENV_( pz_dest_dir, BOOL_TRUE, "DESTDIR", \ 135 "output directory" ) \ 136 \ 137 _ENV_( pz_mn_name_pat, BOOL_FALSE, "MN_NAME_PAT", \ 138 "regex matching forbidden identifiers" ) \ 139 \ 140 _ENV_( pz_verbose, BOOL_FALSE, "VERBOSE", \ 141 "amount of user entertainment" ) \ 142 \ 143 _ENV_( pz_find_base, BOOL_TRUE, "FIND_BASE", \ 144 "leader to trim from file names" ) 145 146 #define _ENV_(v,m,n,t) extern tCC* v; 147 ENV_TABLE 148 #undef _ENV_ 149 150 /* Test Descriptor 151 152 Each fix may have associated tests that determine 153 whether the fix needs to be applied or not. 154 Each test has a type (from the te_test_type enumeration); 155 associated test text; and, if the test is TT_EGREP or 156 the negated form TT_NEGREP, a pointer to the compiled 157 version of the text string. 158 159 */ 160 typedef enum 161 { 162 TT_TEST, TT_EGREP, TT_NEGREP, TT_FUNCTION 163 } te_test_type; 164 165 typedef struct test_desc tTestDesc; 166 167 struct test_desc 168 { 169 te_test_type type; 170 const char *pz_test_text; 171 regex_t *p_test_regex; 172 }; 173 174 typedef struct patch_desc tPatchDesc; 175 176 /* Fix Descriptor 177 178 Everything you ever wanted to know about how to apply 179 a particular fix (which files, how to qualify them, 180 how to actually make the fix, etc...) 181 182 NB: the FD_ defines are BIT FLAGS, even though 183 some are mutually exclusive 184 185 */ 186 #define FD_MACH_ONLY 0x0000 187 #define FD_MACH_IFNOT 0x0001 188 #define FD_SHELL_SCRIPT 0x0002 189 #define FD_SUBROUTINE 0x0004 190 #define FD_REPLACEMENT 0x0008 191 #define FD_SKIP_TEST 0x8000 192 193 typedef struct fix_desc tFixDesc; 194 struct fix_desc 195 { 196 tCC* fix_name; /* Name of the fix */ 197 tCC* file_list; /* List of files it applies to */ 198 tCC** papz_machs; /* List of machine/os-es it applies to */ 199 int test_ct; 200 int fd_flags; 201 tTestDesc* p_test_desc; 202 tCC** patch_args; 203 long unused; 204 }; 205 206 typedef struct { 207 int type_name_len; 208 tCC* pz_type; 209 tCC* pz_TYPE; 210 tCC* pz_gtype; 211 } t_gnu_type_map; 212 213 extern int gnu_type_map_ct; 214 215 #ifdef HAVE_MMAP_FILE 216 #define UNLOAD_DATA() do { if (curr_data_mapped) { \ 217 munmap ((void*)pz_curr_data, data_map_size); close (data_map_fd); } \ 218 else free ((void*)pz_curr_data); } while(0) 219 #else 220 #define UNLOAD_DATA() free ((void*)pz_curr_data) 221 #endif 222 223 /* 224 * Exported procedures 225 */ 226 char * load_file_data ( FILE* fp ); 227 228 #ifdef IS_CXX_HEADER_NEEDED 229 t_bool is_cxx_header ( tCC* filename, tCC* filetext ); 230 #endif /* IS_CXX_HEADER_NEEDED */ 231 232 #ifdef SKIP_QUOTE_NEEDED 233 tCC* skip_quote ( char q, char* text ); 234 #endif 235 236 void compile_re ( tCC* pat, regex_t* re, int match, tCC *e1, tCC *e2 ); 237 238 void apply_fix ( tFixDesc* p_fixd, tCC* filname ); 239 apply_fix_p_t 240 run_test ( tCC* t_name, tCC* f_name, tCC* text ); 241 242 #ifdef SEPARATE_FIX_PROC 243 char* make_raw_shell_str ( char* pz_d, tCC* pz_s, size_t smax ); 244 #endif 245 246 t_bool mn_get_regexps ( regex_t** label_re, regex_t** name_re, tCC *who ); 247 248 void initialize_opts ( void ); 249 #endif /* ! GCC_FIXLIB_H */ 250