summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authorkorbb <korbb@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-11 13:41:12 +0000
committerkorbb <korbb@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-11 13:41:12 +0000
commit09fe1d5c948d05ed362b8fa5a028196c8ca44920 (patch)
tree56fe6d3cc1eea556ac96953893b16dc1559b0925 /gcc
parent1c3ed3fe09f22a0fc563e2cc78bf1fc429772c0c (diff)
downloadppe42-gcc-09fe1d5c948d05ed362b8fa5a028196c8ca44920.tar.gz
ppe42-gcc-09fe1d5c948d05ed362b8fa5a028196c8ca44920.zip
Added support for "make check" and the "format" c_fix
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33843 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/fixinc/Makefile.in100
-rw-r--r--gcc/fixinc/check.tpl24
-rw-r--r--gcc/fixinc/fixfixes.c340
-rw-r--r--gcc/fixinc/fixincl.c150
-rwxr-xr-xgcc/fixinc/fixincl.sh2
-rw-r--r--gcc/fixinc/fixincl.tpl10
-rw-r--r--gcc/fixinc/fixlib.h59
-rw-r--r--gcc/fixinc/fixtests.c35
9 files changed, 284 insertions, 452 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 85b21cd28c3..e26be78c65c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,19 @@
+2000-05-11 Bruce Korb <bkorb@gnu.org>
+
+ * fixinc/fixfixes.c(double_slash_fix): obsolete
+ (else_endif_label_fix): obsolete
+ (format_fix): new, unused as yet
+ (main): obsolete
+ * fixinc/fixlib.h: added fix description struct for use by format_fix
+ * fixinc/fixincl.c: removed the struct & test for SIGIOT befure using
+ * fixinc/Makefile.in: compile fixfixes.c and fixtests.c as separate
+ modules. Removed the vestiges of the script version.
+ Added support for "make check".
+ * fixinc/check.tpl: quiet the fixup output
+ * fixinc/fixtests.c(main): obsolete
+ * fixinc/fixincl.sh: don't bother copying fixincl to ..
+ * fixinc/fixincl.tpl: provide for arguments to c_fix routines
+
Thu May 11 11:57:02 MET DST 2000 Jan Hubicka <jh@suse.cz>
* toplev.c (rest_of_compilation): Remove dead code after
diff --git a/gcc/fixinc/Makefile.in b/gcc/fixinc/Makefile.in
index eef5c6215b4..b1d360fd83d 100644
--- a/gcc/fixinc/Makefile.in
+++ b/gcc/fixinc/Makefile.in
@@ -35,13 +35,15 @@ subdir = fixinc
# End of variables for you to override.
-default : gen
+default : all
# Now figure out from those variables how to compile and link.
# Specify the directories to be searched for header files.
# Both . and srcdir are used, in that order.
-INCLUDES = -I. -I.. -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../config -I$(srcdir)/../../include
+#
+INCLUDES = -I. -I.. -I$(srcdir) -I$(srcdir)/.. \
+-I$(srcdir)/../config -I$(srcdir)/../../include
# Always use -I$(srcdir)/config when compiling.
.c.o:
@@ -60,86 +62,64 @@ INCLUDES = -I. -I.. -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../config -I$(srcdir)
## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
LIBERTY = ../../libiberty/libiberty.a
-LIBOBJ = gnu-regex.o fixlib.o $(LIBERTY)
-FIOBJ = fixincl.o server.o procopen.o $(LIBOBJ)
+OBJ = fixincl.o fixtests.o fixfixes.o server.o procopen.o \
+ gnu-regex.o fixlib.o
HDR = server.h gnu-regex.h fixlib.h machname.h
-BIN_TARGET = fixincl fixfixes fixtests
-
-TARGETS = $(BIN_TARGET)
+TARGETS = fixincl
all : $(TARGETS)
gen : fixincl.x
-$(FIOBJ): $(HDR)
-
-fixincl: $(FIOBJ)
- @echo $(CC) $(FIXINC_DEFS) -o $@ $(FIOBJ) ; \
- if $(CC) $(FIXINC_DEFS) -o $@ $(FIOBJ) ; then : ; else \
- rm -f $@ ; (echo "#! /bin/sh" ; echo exit 1 ) > $@ ; \
- chmod 777 $@ ; fi
-
-fixfixes: fixfixes.c $(LIBOBJ)
- $(CC) -o $@ $(FIXINC_DEFS) -DMAIN \
- $(srcdir)/fixfixes.c $(LIBOBJ) $(LIB)
-
-fixtests: fixtests.c $(LIBOBJ)
- $(CC) -o $@ $(FIXINC_DEFS) -DMAIN \
- $(srcdir)/fixtests.c $(LIBOBJ) $(LIB)
-
-fixincl.o : fixincl.x fixincl.c fixfixes.c fixtests.c
-server.o : server.c server.h
-procopen.o : procopen.c server.h
-fixlib.o: machname.h
-
-fixincl.x: fixincl.tpl inclhack.def
- cd $(srcdir) ; $(SHELL) ./genfixes $@
+fixincl: $(OBJ) $(LIBERTY)
+ $(CC) $(FIXINC_DEFS) -o $@ $(OBJ) $(LIBERTY)
-## inclhack.sh: inclhack.def inclhack.tpl hackshell.tpl
-## cd $(srcdir) ; $(SHELL) ./genfixes $@
-##
-## # fixinc.sh, unlike the other two, has _no_ dependency on the .def file.
-## fixincl.sh: inclhack.tpl
-## cd $(srcdir) ; $(SHELL) ./genfixes $@
+$(OBJ) : $(HDR)
+fixincl.o : fixincl.x fixincl.c
+fixtests.o : fixtests.c
+fixfixes.o : fixfixes.c
+server.o : server.c
+procopen.o : procopen.c
+gnu-regex.o : gnu-regex.c
+fixlib.o : fixlib.c
-# This invocation of genfixes is done from the build dir,
-# not the source dir (as above)
+# 'machname.h' is built in the build directory.
+# 'fixincl.x' in the source dir.
#
machname.h: ../specs
$(SHELL) $(srcdir)/genfixes $@
+fixincl.x: fixincl.tpl inclhack.def
+ cd $(srcdir) ; $(SHELL) ./genfixes $@
+
clean:
- rm -f *.o $(TARGETS) fixincl.x machname.h
+ rm -f *.o $(TARGETS) fixincl.x machname.h *~
-# Ensure all the targets are built. If the program "fixincl"
-# failed to compile, link or load, then we install the
-# "inclhack.sh" script. Otherwise, we install that program
-# plus the wrapper script, "fixincl.sh".
+# Build the executable and copy up into gcc dir.
+# We still copy the script because we still have alternative scripts.
#
-install-bin: fixincl fixincl.sh
- @if [ -f ../fixincl ] ; then rm -f ../fixincl || \
- mv -f ../fixincl ../fixincl.$$ || exit 1 ; fi
- @if [ -f ../fixinc.sh ] ; then rm -f ../fixinc.sh || \
- mv -f ../fixinc.sh ../fixinc.sh.$$ || exit 1 ; fi
+install-bin : fixincl
./fixincl -v
- cp fixincl ..
- cp $(srcdir)/fixincl.sh ../fixinc.sh
- chmod 755 ../fixinc.sh ../fixincl
-
-install-sh: fixfixes fixtests inclhack.sh
@if [ -f ../fixinc.sh ] ; then rm -f ../fixinc.sh || \
mv -f ../fixinc.sh ../fixinc.sh.$$ || exit 1 ; fi
- echo Could not install binary fixincludes. ; \
- echo Installing shell script instead.
- @if [ -f ./inclhack.sh ] ; \
- then echo cp ./inclhack.sh ../fixinc.sh ; \
- cp ./inclhack.sh ../fixinc.sh ; \
- else echo cp $(srcdir)/inclhack.sh ../fixinc.sh ; \
- cp $(srcdir)/inclhack.sh ../fixinc.sh ; fi
+ @if [ -f ./fixincl.sh ] ; \
+ then echo cp ./fixincl.sh ../fixinc.sh ; \
+ cp ./fixincl.sh ../fixinc.sh ; \
+ else echo cp $(srcdir)/fixincl.sh ../fixinc.sh ; \
+ cp $(srcdir)/fixincl.sh ../fixinc.sh ; fi
chmod 755 ../fixinc.sh
Makefile: Makefile.in ../config.status
cd .. \
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \
$(SHELL) ./config.status
+
+check : fixincl
+ autogen4 -T $(srcdir)/check.tpl $(srcdir)/inclhack.def
+ $(SHELL) ./check.sh
+ @echo ; echo "diff of diffs:"
+ @if diff testdir/NEWDIFF $(srcdir)/check.diff ; \
+ then rm -rf ./testdir ./check.sh ; \
+ else echo ; echo "Results do not match expectations" ; echo ; \
+ exit 1 ; fi
diff --git a/gcc/fixinc/check.tpl b/gcc/fixinc/check.tpl
index bf71036e62c..56276a0280c 100644
--- a/gcc/fixinc/check.tpl
+++ b/gcc/fixinc/check.tpl
@@ -14,8 +14,9 @@ TARGET_MACHINE='*'
DESTDIR=`pwd`/res
SRCDIR=`pwd`/inc
FIND_BASE='.'
+VERBOSE=1
-export TARGET_MACHINE DESTDIR SRCDIR FIND_BASE
+export TARGET_MACHINE DESTDIR SRCDIR FIND_BASE VERBOSE
mkdir ${DESTDIR} ${SRCDIR}
@@ -39,7 +40,6 @@ cat >> inc/[=
#ifndef [=hackname _up=]_CHECK
- #define [=hackname _up=]_CHECK
[=test_text "\t" _prefix=]
#endif /* [=hackname _up=]_CHECK */
_HACK_EOF_
@@ -50,11 +50,21 @@ _HACK_EOF_
=]
cd inc
-find . -type f | ../../fixincl
+find . -type f | sed 's;\./;;' | sort > ../LIST
+../../fixincl < ../LIST
cd ..
-diff -cr inc res | \
- sed -e 's;^\(\*\*\* inc/[^ ]*\) .*$;\1;' \
- -e 's;^\(--- res/[^ ]*\) .*$;\1;' > NEWDIFF
+
+while read f
+do
+ if [ ! -f res/$f ]
+ then
+ echo "Only in inc: inc/$f"
+ else
+ diff -c inc/$f res/$f | \
+ sed -e '1,2s; .*;;'
+ fi
+done > NEWDIFF < LIST
+
echo
echo Test output check:
[=
@@ -63,7 +73,7 @@ _FOR fix =][=
_IF test_text _exist =]
fgrep [=hackname _up=]_CHECK NEWDIFF > /dev/null 2>&1 || \
- echo "[=_eval hackname _get "#%32s test failed. See inc/"
+ echo "[=_eval hackname _get "#%32s test failed. See testdir/inc/"
_printf =][=
_IF files _exist =][=
files[0] =][=
diff --git a/gcc/fixinc/fixfixes.c b/gcc/fixinc/fixfixes.c
index d9f5aac89b7..04cd328d3f7 100644
--- a/gcc/fixinc/fixfixes.c
+++ b/gcc/fixinc/fixfixes.c
@@ -72,8 +72,7 @@ typedef struct {
} fix_entry_t;
#define FIXUP_TABLE \
- _FT_( "no_double_slash", double_slash_fix ) \
- _FT_( "else_endif_label", else_endif_label_fix ) \
+ _FT_( "format", format_fix ) \
_FT_( "IO_use", IO_use_fix ) \
_FT_( "CTRL_use", CTRL_use_fix) \
_FT_( "IO_defn", IO_defn_fix ) \
@@ -82,9 +81,10 @@ typedef struct {
#define FIX_PROC_HEAD( fix ) \
-static void fix ( filname, text ) \
+static void fix ( filname, text, p_fixd ) \
const char* filname; \
- char* text;
+ char* text; \
+ tFixDesc* p_fixd;
/*
@@ -130,233 +130,101 @@ print_quote( q, text )
}
-FIX_PROC_HEAD( double_slash_fix )
+FIX_PROC_HEAD( format_fix )
{
- /* Now look for the comment markers in the text */
- for (;;)
- {
- char ch = *(text++);
- switch (ch)
- {
- case '/':
- switch (*text) /* do not advance `text' here */
- {
- case '/':
- /*
- We found a "//" pair in open text.
- Delete text to New-Line
- */
- while ((*text != '\n') && (*text != '\0')) text++;
- break;
-
- case '*':
- {
- /* We found a C-style comment. Skip forward to the end */
- char* pz = strstr( (--text)+2, "*/" );
- if (pz == (char*)NULL)
- {
- fputs( text, stdout );
- goto fix_done;
- }
- pz += 2;
- fwrite (text, (pz - text), 1, stdout );
- text = pz;
- }
- break;
-
- default:
- fputc (ch, stdout );
- }
- break;
-
- case NUL:
- goto fix_done;
-
- case '"':
- case '\'':
- text = print_quote (ch, text );
- break;
-
- default:
- fputc (ch, stdout );
- }
-
- } fix_done:;
-
- fclose (stdout);;
-}
-
-
-FIX_PROC_HEAD( else_endif_label_fix )
-{
- static const char label_pat[] = "^[ \t]*#[ \t]*(else|endif)";
- static regex_t label_re;
-
- char ch;
- char* pz_next = (char*)NULL;
- regmatch_t match[2];
+ tSCC zBad[] = "fixincl error: `%s' needs %s c_fix_arg\n";
+ tCC* pz_pat = p_fixd->patch_args[2];
+ tCC* pz_fmt = p_fixd->patch_args[1];
+ const char *p;
+ regex_t re;
+ regmatch_t rm[10];
+
+ /*
+ * We must have a format
+ */
+ if (pz_fmt == (tCC*)NULL) {
+ fprintf( stderr, zBad, p_fixd->fix_name, "replacement-format" );
+ exit( 3 );
+ }
- compile_re (label_pat, &label_re, 1,
- "label pattern", "else_endif_label_fix");
+ /*
+ * IF we don't have a search text, then go find the first
+ * regular expression among the tests.
+ */
+ if (pz_pat == (tCC*)NULL) {
+ tTestDesc* pTD = p_fixd->p_test_desc;
+ int ct = p_fixd->test_ct;
+ for (;;) {
+ if (ct-- <= 0) {
+ fprintf( stderr, zBad, p_fixd->fix_name, "search-text" );
+ exit( 3 );
+ }
- for (;;) /* entire file */
- {
- /*
- See if we need to advance to the next candidate directive
- If the scanning pointer passes over the end of the directive,
- then the directive is inside a comment */
- if (pz_next < text)
- {
- if (regexec (&label_re, text, 2, match, 0) != 0)
- {
- fputs( text, stdout );
- break;
+ if (pTD->type == TT_EGREP) {
+ pz_pat = pTD->pz_test_text;
+ break;
}
- pz_next = text + match[0].rm_eo;
+ pTD++;
}
+ }
- /*
- IF the scan pointer has not reached the directive end, ... */
- if (pz_next > text)
- {
- /*
- Advance the scanning pointer. If we are at the start
- of a quoted string or a comment, then skip the entire unit */
- ch = *text;
-
- switch (ch)
- {
- case '/':
- /*
- Skip comments */
- if (text[1] == '*')
- {
- char* pz = strstr( text+2, "*/" );
- if (pz == (char*)NULL)
- {
- fputs( text, stdout );
- return;
- }
- pz += 2;
- fwrite( text, 1, (pz - text), stdout );
- text = pz;
- continue;
- }
- putc( ch, stdout );
- text++;
- break;
-
- case '"':
- case '\'':
- text = print_quote( ch, text+1 );
- break;
-
- default:
- putc( ch, stdout );
- text++;
- } /* switch (ch) */
- continue;
- } /* if (still shy of directive end) */
-
- /*
- The scanning pointer (text) has reached the end of the current
- directive under test. Check for bogons here. */
- for (;;) /* bogon check */
- {
- char ch = *(text++);
- if (isspace (ch))
- {
- putc( ch, stdout );
- if (ch == '\n')
- {
- /*
- It is clean. No bogons on this directive */
- pz_next = (char*)NULL; /* force a new regex search */
- goto dont_fix_bogon;
- }
- continue;
- }
-
- switch (ch)
- {
- case NUL:
- return;
-
- case '\\':
- /*
- Skip escaped newlines. Otherwise, we have a bogon */
- if (*text != '\n') {
- text--;
- goto fix_the_bogon;
- }
-
- /*
- Emit the escaped newline and keep scanning for possible junk */
- putc( '\\', stdout );
- putc( '\n', stdout );
- text++;
- break;
-
- case '/':
- /*
- Skip comments. Otherwise, we have a bogon */
- if (*text == '*')
- {
- text--;
- pz_next = strstr( text+2, "*/" );
- if (pz_next == (char*)NULL)
- {
- putc( '\n', stdout );
- return;
- }
- pz_next += 2;
- fwrite( text, 1, (pz_next - text), stdout );
- text = pz_next;
- break;
- }
-
- /* FALLTHROUGH */
-
- default:
- /*
- GOTTA BE A BOGON */
- text--;
- goto fix_the_bogon;
- } /* switch (ch) */
- } /* for (bogon check loop) */
-
- fix_the_bogon:
- /*
- `text' points to the start of the bogus data */
- for (;;)
- {
- /*
- NOT an escaped newline. Find the end of line that
- is not preceeded by an escape character: */
- pz_next = strchr( text, '\n' );
- if (pz_next == (char*)NULL)
- {
- putc( '\n', stdout );
- return;
+ /*
+ * Replace every copy of the text we find
+ */
+ compile_re (pz_pat, &re, 1, "format search-text", "format_fix" );
+ while (regexec (&re, text, 10, rm, 0) == 0)
+ {
+ char* apz[10];
+ int i;
+
+ /*
+ * Write the text up to the match
+ */
+ fwrite( text, rm[0].rm_so, 1, stdout );
+
+ /*
+ * Copy all the submatches into separate strings
+ */
+ for (i=0; i<10; i++) {
+ if (rm[i].rm_so == -1) {
+ apz[i] = (char*)NULL;
+ break;
}
-
- if (pz_next[-1] != '\\')
{
- text = pz_next;
- pz_next = (char*)NULL; /* force a new regex search */
- break;
+ int len = rm[i].rm_eo - rm[i].rm_so;
+ apz[i] = (char*)malloc( len + 1 );
+ memcpy( (void*)apz[i], text+rm[i].rm_so, len );
+ apz[i][len] = NUL;
}
+ }
- /*
- The newline was escaped. We gotta keep going. */
- text = pz_next + 1;
+ /*
+ * IF there are any submatches,
+ * THEN only use the submatches in the formatting
+ */
+ if (apz[1] != (char*)NULL)
+ printf( pz_fmt, apz[1], apz[2], apz[3], apz[4],
+ apz[5], apz[6], apz[7], apz[8], apz[9] );
+ else
+ printf( pz_fmt, apz[0] );
+
+ /*
+ * Free our submatch strings
+ */
+ for (i=0; i<10; i++) {
+ if (apz[i] == (char*)NULL)
+ break;
+ free( (void*)apz[i] );
}
- dont_fix_bogon:;
- } /* for (entire file) loop */
+ text += rm[0].rm_eo;
+ }
- return;
+ /*
+ * Dump out the rest of the file
+ */
+ fputs (text, stdout);
}
/* Scan the input file for all occurrences of text like this:
@@ -370,7 +238,7 @@ FIX_PROC_HEAD( else_endif_label_fix )
which is the required syntax per the C standard. (The definition of
_IO also has to be tweaked - see below.) 'IO' is actually whatever you
provide in the STR argument. */
-void
+static void
fix_char_macro_uses (text, str)
const char *text;
const char *str;
@@ -448,7 +316,7 @@ fix_char_macro_uses (text, str)
which is the required syntax per the C standard. (The uses of _IO
also have to be tweaked - see above.) 'IO' is actually whatever
you provide in the STR argument. */
-void
+static void
fix_char_macro_defines (text, str)
const char *text;
const char *str;
@@ -660,15 +528,16 @@ FIX_PROC_HEAD( machine_name_fix )
*/
void
-apply_fix( fixname, filname )
- const char* fixname;
- const char* filname;
+apply_fix( p_fixd, filname )
+ tFixDesc* p_fixd;
+ tCC* filname;
{
#define _FT_(n,p) { n, p },
static fix_entry_t fix_table[] = { FIXUP_TABLE { NULL, NULL }};
#undef _FT_
#define FIX_TABLE_CT ((sizeof(fix_table)/sizeof(fix_table[0]))-1)
+ tCC* fixname = p_fixd->patch_args[0];
char* buf;
int ct = FIX_TABLE_CT;
fix_entry_t* pfe = fix_table;
@@ -687,30 +556,5 @@ apply_fix( fixname, filname )
}
buf = load_file_data (stdin);
- (*pfe->fix_proc)( filname, buf );
+ (*pfe->fix_proc)( filname, buf, p_fixd );
}
-
-#ifdef MAIN
-
-/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- MAIN ROUTINE
-
- This file is both included in fixincl.c and compiled as a separate
- program for use by the inclhack.sh script.
-
-*/
-
-int
-main( argc, argv )
- int argc;
- char** argv;
-{
- if (argc != 3)
- apply_fix ("No test name provided", NULL, NULL, 0 );
-
- apply_fix (argv[2], argv[1]);
- return 0;
-}
-
-#endif
diff --git a/gcc/fixinc/fixincl.c b/gcc/fixinc/fixincl.c
index d69368232b5..9c397358386 100644
--- a/gcc/fixinc/fixincl.c
+++ b/gcc/fixinc/fixincl.c
@@ -38,61 +38,6 @@ Boston, MA 02111-1307, USA. */
static const char program_id[] = "fixincl version 1.1";
-/* 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
-{
- const char* fix_name; /* Name of the fix */
- const char* file_list; /* List of files it applies to */
- const char** papz_machs; /* List of machine/os-es it applies to */
- regex_t* unused;
- int test_ct;
- int fd_flags;
- tTestDesc* p_test_desc;
- const char** patch_args;
-};
-
/* Working environment strings. Essentially, invocation 'options'. */
char *pz_dest_dir = NULL;
char *pz_src_dir = NULL;
@@ -145,14 +90,12 @@ void do_version ();
char *load_file _P_((const char *));
void process _P_((char *, const char *));
void run_compiles ();
-void initialize ();
+void initialize _P_((int argc,char** argv));
void process ();
/* External Source Code */
#include "fixincl.x"
-#include "fixtests.c"
-#include "fixfixes.c"
/* * * * * * * * * * * * * * * * * * *
*
@@ -165,28 +108,7 @@ main (argc, argv)
{
char *file_name_buf;
- switch (argc)
- {
- case 1:
- break;
-
- case 2:
- if (strcmp (argv[1], "-v") == 0)
- do_version ();
- if (freopen (argv[1], "r", stdin) == (FILE*)NULL)
- {
- fprintf (stderr, "Error %d (%s) reopening %s as stdin\n",
- errno, xstrerror (errno), argv[1] );
- exit (EXIT_FAILURE);
- }
- break;
-
- default:
- fputs ("fixincl ERROR: too many command line arguments\n", stderr);
- exit (EXIT_FAILURE);
- }
-
- initialize ();
+ initialize ( argc, argv );
have_tty = isatty (fileno (stderr));
@@ -264,8 +186,8 @@ do_version ()
/* The 'version' option is really used to test that:
1. The program loads correctly (no missing libraries)
- 2. we can correctly run our server shell process
- 3. that we can compile all the regular expressions.
+ 2. that we can compile all the regular expressions.
+ 3. we can correctly run our server shell process
*/
run_compiles ();
sprintf (zBuf, zFmt, program_id);
@@ -276,12 +198,35 @@ do_version ()
/* * * * * * * * * * * * */
void
-initialize ()
+initialize ( argc, argv )
+ int argc;
+ char** argv;
{
static const char var_not_found[] =
"fixincl ERROR: %s environment variable not defined\n\
\tTARGET_MACHINE, DESTDIR, SRCDIR and FIND_BASE are required\n";
+ switch (argc)
+ {
+ case 1:
+ break;
+
+ case 2:
+ if (strcmp (argv[1], "-v") == 0)
+ do_version ();
+ if (freopen (argv[1], "r", stdin) == (FILE*)NULL)
+ {
+ fprintf (stderr, "Error %d (%s) reopening %s as stdin\n",
+ errno, xstrerror (errno), argv[1] );
+ exit (EXIT_FAILURE);
+ }
+ break;
+
+ default:
+ fputs ("fixincl ERROR: too many command line arguments\n", stderr);
+ exit (EXIT_FAILURE);
+ }
+
{
static const char var[] = "TARGET_MACHINE";
pz_machine = getenv (var);
@@ -368,7 +313,9 @@ initialize ()
run_compiles ();
signal (SIGQUIT, SIG_IGN);
+#ifdef SIGIOT
signal (SIGIOT, SIG_IGN);
+#endif
signal (SIGPIPE, SIG_IGN);
signal (SIGALRM, SIG_IGN);
signal (SIGTERM, SIG_IGN);
@@ -438,7 +385,6 @@ run_compiles ()
int fix_ct = FIX_COUNT;
tTestDesc *p_test;
int test_ct;
- int re_ct = REGEX_COUNT;
const char *pz_err;
regex_t *p_re = (regex_t *) malloc (REGEX_COUNT * sizeof (regex_t));
@@ -455,7 +401,12 @@ run_compiles ()
memset ( (void*)&incl_quote_re, '\0', sizeof (regex_t) );
compile_re (incl_quote_pat, &incl_quote_re, 1,
- "quoted include", "run_compiles");
+ "quoted include", "run_compiles");
+
+ /* Allow machine name tests to be ignored (testing, mainly) */
+
+ if ((*pz_machine == '\0') || (*pz_machine == '*'))
+ pz_machine = (char*)NULL;
/* FOR every fixup, ... */
do
@@ -544,20 +495,21 @@ run_compiles ()
{
case TT_EGREP:
case TT_NEGREP:
- /* You might consider putting the following under #ifdef.
- The number of re's used is computed by autogen.
- So, it is static and known at compile time. */
-
- if (--re_ct < 0)
- {
- fputs ("out of RE's\n", stderr);
- exit (EXIT_FAILURE);
- }
+#ifdef DEBUG
+ {
+ static int re_ct = REGEX_COUNT;
+ if (--re_ct < 0)
+ {
+ fputs ("out of RE's\n", stderr);
+ exit (EXIT_FAILURE);
+ }
+ }
+#endif
p_test->p_test_regex = p_re++;
- compile_re (p_test->pz_test_text, p_test->p_test_regex, 0,
- "select test", p_fixd->fix_name);
- }
+ compile_re (p_test->pz_test_text, p_test->p_test_regex, 0,
+ "select test", p_fixd->fix_name);
+ }
p_test++;
}
}
@@ -890,10 +842,8 @@ internal_fix (read_fd, p_fixd)
*/
fcntl (fd[1], F_DUPFD, STDOUT_FILENO);
fcntl (read_fd, F_DUPFD, STDIN_FILENO);
- fdopen (STDIN_FILENO, "r");
- fdopen (STDOUT_FILENO, "w");
- apply_fix (p_fixd->patch_args[0], pz_curr_file);
+ apply_fix (p_fixd, pz_curr_file);
exit (0);
}
diff --git a/gcc/fixinc/fixincl.sh b/gcc/fixinc/fixincl.sh
index 0d42e4a7858..287e62137b8 100755
--- a/gcc/fixinc/fixincl.sh
+++ b/gcc/fixinc/fixincl.sh
@@ -95,7 +95,7 @@ esac
# Original directory.
ORIGDIR=`${PWDCMD}`
-FIXINCL=${ORIGDIR}/fixincl
+FIXINCL=${ORIGDIR}/fixinc/fixincl
export FIXINCL
# Make LIB absolute only if needed to avoid problems with the amd.
diff --git a/gcc/fixinc/fixincl.tpl b/gcc/fixinc/fixincl.tpl
index 5a94b4e06a5..fc5a4421dcd 100644
--- a/gcc/fixinc/fixincl.tpl
+++ b/gcc/fixinc/fixincl.tpl
@@ -158,7 +158,13 @@ const char* apz[=hackname _cap=]Patch[] = {[=
_ELIF shell _exist =] "sh", "-c",
[=shell _krstr=],[=
- _ELIF c_fix _exist =]"[=c_fix=]",[=
+ _ELIF c_fix _exist =]
+ [=
+ c_fix _krstr=],[=
+
+ _FOR c_fix_arg =]
+ [=c_fix_arg _krstr=],[=
+ /c_fix_arg =][=
_ELIF replace _len =]
[=replace _krstr=],[=
@@ -184,7 +190,7 @@ tFixDesc fixDescList[ FIX_COUNT ] = {[=
_FOR fix ",\n" =]
{ z[=hackname _cap=]Name, z[=hackname _cap=]List,
- apz[=hackname _cap=]Machs, (regex_t*)NULL,
+ apz[=hackname _cap=]Machs,
[=hackname _up=]_TEST_CT, [=
_IF not_machine _exist =]FD_MACH_IFNOT[=
_ELSE =]FD_MACH_ONLY[=
diff --git a/gcc/fixinc/fixlib.h b/gcc/fixinc/fixlib.h
index 3e9be5ca2a6..d28aed67668 100644
--- a/gcc/fixinc/fixlib.h
+++ b/gcc/fixinc/fixlib.h
@@ -93,6 +93,61 @@ typedef int apply_fix_p_t; /* Apply Fix Predicate Type */
#define _P_(p) ()
#endif
+/* 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
+{
+ const char* fix_name; /* Name of the fix */
+ const char* file_list; /* List of files it applies to */
+ const char** papz_machs; /* List of machine/os-es it applies to */
+ int test_ct;
+ int fd_flags;
+ tTestDesc* p_test_desc;
+ const char** patch_args;
+ long unused;
+};
+
/*
* Exported procedures
*/
@@ -100,6 +155,10 @@ char * load_file_data _P_(( FILE* fp ));
t_bool is_cxx_header _P_(( tCC* filename, tCC* filetext ));
void compile_re _P_(( tCC* pat, regex_t* re, int match,
tCC *e1, tCC *e2 ));
+
+void apply_fix _P_(( tFixDesc* p_fixd, tCC* filname ));
+apply_fix_p_t run_test _P_((tCC* t_name, tCC* f_name, tCC* text ));
+
#ifdef MN_NAME_PAT
void mn_get_regexps _P_(( regex_t** label_re, regex_t** name_re,
tCC *who ));
diff --git a/gcc/fixinc/fixtests.c b/gcc/fixinc/fixtests.c
index 1507a166af0..8e8567a1ccc 100644
--- a/gcc/fixinc/fixtests.c
+++ b/gcc/fixinc/fixtests.c
@@ -73,7 +73,7 @@ static apply_fix_p_t test ( fname, text ) \
* a backslash. Especially a backslash followed by octal digits.
* We are not doing a correctness syntax check here.
*/
-tSCC*
+static tSCC*
skip_quote( q, text )
char q;
char* text;
@@ -351,36 +351,3 @@ run_test( tname, fname, text )
tname );
exit( 3 );
}
-
-/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- MAIN ROUTINE
-
- This file is both included in fixincl.c and compiled as a separate
- program for use by the inclhack.sh script.
-
-*/
-
-#ifdef MAIN
-
-int
-main( argc, argv )
- int argc;
- char** argv;
-{
- char* fname = *++argv;
- char* tname = *++argv;
- char* buf;
-
- if (argc != 3)
- return run_test( "No test name provided", NULL, NULL, 0 );
-
- fclose( stdin );
- fclose( stdout );
-
- buf = load_file_data (fopen (fname, "r"));
-
- return run_test( tname, fname, buf );
-}
-
-#endif
OpenPOWER on IntegriCloud