summaryrefslogtreecommitdiff
path: root/gcc/fixinc/fixincl.c
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2016-02-08 20:37:34 -0800
committerYamaArashi <shadow962@live.com>2016-02-08 20:37:34 -0800
commita38b952671192d96d107b0ef007d6424dc30525e (patch)
treec1dcf067e7bb2869d4debcf8b3d034054f6ae015 /gcc/fixinc/fixincl.c
parentb5fb6c8ffb25d2057ab7316c218eb67fe538340b (diff)
remove fixinc, protoize, and gcov
Diffstat (limited to 'gcc/fixinc/fixincl.c')
-rwxr-xr-xgcc/fixinc/fixincl.c834
1 files changed, 0 insertions, 834 deletions
diff --git a/gcc/fixinc/fixincl.c b/gcc/fixinc/fixincl.c
deleted file mode 100755
index 4344537..0000000
--- a/gcc/fixinc/fixincl.c
+++ /dev/null
@@ -1,834 +0,0 @@
-/*
- * $Id: fixincl.c,v 1.2 1999/01/13 22:56:21 law Exp $
- *
- * 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.
- *
- * See README-fixinc for more information.
- *
- * fixincl is free software.
- *
- * You may 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.
- *
- * fixincl 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 fixincl. See the file "COPYING". If not,
- * write to: The Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-#include <ctype.h>
-
-#include "regex.h"
-#include "server.h"
-
-#define tSCC static const char
-#define tCC const char
-#define tSC static char
-
-typedef int tSuccess;
-
-#define FAILURE ((tSuccess)-1)
-#define SUCCESS ((tSuccess) 0)
-#define PROBLEM ((tSuccess) 1)
-
-#define SUCCEEDED( p ) ((p) == SUCCESS)
-#define SUCCESSFUL( p ) SUCCEEDED( p )
-#define FAILED( p ) ((p) < SUCCESS)
-#define HADGLITCH( p ) ((p) > SUCCESS)
-
-#define NUL '\0'
-
-typedef enum
- {
- TT_TEST, TT_EGREP, TT_NEGREP
- }
-teTestType;
-
-typedef struct test_desc tTestDesc;
-
-struct test_desc
- {
- teTestType type;
- const char *pzTest;
- regex_t *pTestRegex;
- };
-
-typedef struct patch_desc tPatchDesc;
-
-#define FD_MACH_ONLY 0x0000
-#define FD_MACH_IFNOT 0x0001
-#define FD_SKIP_TEST 0x8000
-
-typedef struct fix_desc tFixDesc;
-struct fix_desc
- {
- const char* pzFixName; /* Name of the fix */
- const char* pzFileList; /* List of files it applies to */
- const char** papzMachs; /* List of machine/os-es it applies to */
- regex_t* pListRegex;
- int testCt;
- int fdFlags;
- tTestDesc* pTestDesc;
- const char** papzPatchArgs;
- };
-
-char *pzDestDir = (char *) NULL;
-char *pzSrcDir = (char *) NULL;
-char *pzMachine = (char *) NULL;
-
-pid_t chainHead = (pid_t) - 1;
-
-const char zInclQuote[] = "^[ \t]*#[ \t]*include[ \t]*\"[^/]";
-regex_t inclQuoteRegex;
-
-char zFileNameBuf[0x8000];
-
-char *loadFile (const char *pzFile);
-void process (char *data, const char *dir, const char *file);
-void runCompiles (void);
-
-#include "fixincl.x"
-
-
-int
-main (argc, argv)
- int argc;
- char **argv;
-{
- static const char zGnuLib[] =
- "This file is part of the GNU C Library";
- static const char zVarNotFound[] =
- "fixincl ERROR: %s environment variable not defined\n";
-
-#ifndef NO_BOGOSITY_LIMITS
-# define BOGUS_LIMIT 256
- size_t loopCt;
-#endif
-
- char *apzNames[BOGUS_LIMIT];
- size_t fileNameCt;
-
- if (argc != 1)
- {
- if (argc != 2)
- {
- fputs ("fixincl ERROR: too many command line arguments\n", stderr);
- exit (EXIT_FAILURE);
- }
-
- if (strcmp (argv[1], "-v") == 0)
- {
- fputs ("$Id: fixincl.c,v 1.2 1999/01/13 22:56:21 law Exp $\n", stderr);
- exit (EXIT_SUCCESS);
- }
-
- freopen (argv[1], "r", stdin);
- }
-
- {
- static const char zVar[] = "TARGET_MACHINE";
- pzMachine = getenv( zVar );
- if (pzMachine == (char *)NULL)
- {
- fprintf( stderr, zVarNotFound, zVar );
- exit (EXIT_FAILURE);
- }
- }
-
- {
- static const char zVar[] = "DESTDIR";
- pzDestDir = getenv( zVar );
- if (pzDestDir == (char *)NULL)
- {
- fprintf( stderr, zVarNotFound, zVar );
- exit (EXIT_FAILURE);
- }
- }
-
- {
- static const char zVar[] = "SRCDIR";
- pzSrcDir = getenv( zVar );
- if (pzSrcDir == (char *)NULL)
- {
- fprintf( stderr, zVarNotFound, zVar );
- exit (EXIT_FAILURE);
- }
- }
-
- runCompiles ();
-
- signal ( SIGQUIT, SIG_IGN );
- signal ( SIGIOT, SIG_IGN );
- signal ( SIGPIPE, SIG_IGN );
- signal ( SIGALRM, SIG_IGN );
- signal ( SIGTERM, SIG_IGN );
- signal ( SIGCHLD, SIG_IGN );
-
-#ifndef NO_BOGOSITY_LIMITS
- for (;;)
- {
- char *pzBuf;
- pid_t child;
-
- /*
- * Only the parent process can read from stdin without
- * confusing the world. (How does the child tell the
- * parent to skip forward? Pipes and files behave differently.)
- */
- for (fileNameCt = 0, pzBuf = zFileNameBuf;
- (fileNameCt < BOGUS_LIMIT)
- && (pzBuf
- < (zFileNameBuf + sizeof (zFileNameBuf) - MAXPATHLEN));
- )
- {
-
- if (fgets (pzBuf, MAXPATHLEN, stdin) == (char *) NULL)
- break;
- while (isspace (*pzBuf))
- pzBuf++;
- apzNames[fileNameCt++] = pzBuf;
- pzBuf += strlen (pzBuf);
- while (isspace (pzBuf[-1]))
- pzBuf--;
- *pzBuf++ = '\0';
- }
-
- if (fileNameCt == 0)
- return EXIT_SUCCESS;
-
- child = fork ();
- if (child == NULLPROCESS)
- break;
-
- if (child == NOPROCESS)
- {
- fprintf (stderr, "Error %d (%s) forking in main\n",
- errno, strerror (errno));
- exit (EXIT_FAILURE);
- }
-
- waitpid (child, (int *) NULL, 0);
- }
-#else
-#error "NON-BOGUS LIMITS NOT SUPPORTED?!?!"
-#endif
-
- /*
- * For every file specified in stdandard in
- * (except as throttled for bogus reasons)...
- */
- for (loopCt = 0; loopCt < fileNameCt; loopCt++)
- {
- char *pzData;
- char *pzFile = apzNames[loopCt];
-
- if (access (pzFile, R_OK) != 0)
- {
- int erno = errno;
- fprintf (stderr, "Cannot access %s from %s\n\terror %d (%s)\n",
- pzFile, getcwd ((char *) NULL, MAXPATHLEN),
- erno, strerror (erno));
- }
- else if (pzData = loadFile (pzFile),
- (pzData != (char *) NULL))
- {
-
- if (strstr (pzData, zGnuLib) == (char *) NULL)
- process (pzData, pzDestDir, pzFile);
-
- free ((void *) pzData);
- }
- }
-
- return EXIT_SUCCESS;
-}
-
-
-char *
-loadFile (pzFile)
- const char *pzFile;
-{
- char *pzDta;
- size_t fileSize;
-
- {
- struct stat stbf;
- if (stat (pzFile, &stbf) != 0)
- {
- fprintf (stderr, "error %d (%s) stat-ing %s\n",
- errno, strerror (errno), pzFile);
- return (char *) NULL;
- }
- fileSize = stbf.st_size;
- }
- if (fileSize == 0)
- return (char *) NULL;
-
- pzDta = (char *) malloc ((fileSize + 16) & ~0x00F);
- if (pzDta == (char *) NULL)
- {
- fprintf (stderr, "error: could not malloc %d bytes\n",
- fileSize);
- exit (EXIT_FAILURE);
- }
-
- {
- FILE *fp = fopen (pzFile, "r");
- size_t sizeLeft = fileSize;
- char *readPtr = pzDta;
-
- if (fp == (FILE *) NULL)
- {
- fprintf (stderr, "error %d (%s) opening %s\n", errno,
- strerror (errno), pzFile);
- free ((void *) pzDta);
- return (char *) NULL;
- }
-
- do
- {
- size_t sizeRead = fread ((void *) readPtr, 1, sizeLeft, fp);
-
- if (sizeRead == 0)
- {
- if (feof (fp))
- break;
-
- if (ferror (fp))
- {
- fprintf (stderr, "error %d (%s) reading %s\n", errno,
- strerror (errno), pzFile);
- free ((void *) pzDta);
- fclose (fp);
- return (char *) NULL;
- }
- }
-
- readPtr += sizeRead;
- sizeLeft -= sizeRead;
- }
- while (sizeLeft != 0);
-
- *readPtr = '\0';
- fclose (fp);
- return pzDta;
- }
-}
-
-
-void
-runCompiles ()
-{
- tSCC zBadComp[] = "fixincl ERROR: cannot compile %s regex for %s\n"
- "\texpr = `%s'\n" "\terror %s\n";
- tFixDesc *pFD = fixDescList;
- int fixCt = FIX_COUNT;
- tTestDesc *pTD;
- int tstCt;
- int reCt = REGEX_COUNT;
- const char *pzErr;
- regex_t *pRegex = (regex_t *) malloc (REGEX_COUNT * sizeof (regex_t));
-
- if (pRegex == (regex_t *) NULL)
- {
- fprintf (stderr, "fixincl ERROR: cannot allocate %d bytes for regex\n",
- REGEX_COUNT * sizeof (regex_t));
- exit (EXIT_FAILURE);
- }
-
- re_set_syntax (RE_SYNTAX_EGREP);
- pzErr = re_compile_pattern (zInclQuote, strlen (zInclQuote),
- &inclQuoteRegex);
- if (pzErr != (char *) NULL)
- {
- fprintf (stderr, zBadComp, "quoted include", "runCompiles",
- zInclQuote, pzErr);
- exit (EXIT_FAILURE);
- }
-
- /*
- * FOR every fixup, ...
- */
- do
- {
- pTD = pFD->pTestDesc;
- tstCt = pFD->testCt;
-
- if (pFD->papzMachs != (const char**)NULL) {
- const char** papzMachs = pFD->papzMachs;
- char* pz = zFileNameBuf;
- char* pzSep = "";
- tCC* pzIfTrue;
- tCC* pzIfFalse;
- tSCC zSkip[] = "skip";
- tSCC zRun[] = "run";
-
- sprintf( pz, "case %s in\n", pzMachine );
- pz += strlen( pz );
-
- if (pFD->fdFlags & FD_MACH_IFNOT) {
- pzIfTrue = zSkip;
- pzIfFalse = zRun;
- } else {
- pzIfTrue = zRun;
- pzIfFalse = zSkip;
- }
-
- for (;;) {
- const char* pzMach = *(papzMachs++);
- if (pzMach == (const char*)NULL)
- break;
- sprintf( pz, "%s %s", pzSep, pzMach );
- pz += strlen( pz );
- pzSep = " | \\\n";
- }
- sprintf( pz, " )\n echo %s ;;\n * )\n echo %s ;;\nesac",
- pzIfTrue, pzIfFalse );
- pz = runShell( zFileNameBuf );
- if (*pz == 's') {
- pFD->fdFlags |= FD_SKIP_TEST;
- continue;
- }
- }
-
- /*
- * FOR every test for the fixup, ...
- */
- while (--tstCt >= 0)
- {
- switch (pTD->type)
- {
- case TT_EGREP:
- case TT_NEGREP:
- if (--reCt < 0)
- {
- fputs ("out of RE's\n", stderr);
- exit (EXIT_FAILURE);
- }
-
- pTD->pTestRegex = pRegex++;
- pzErr = re_compile_pattern (pTD->pzTest,
- strlen (pTD->pzTest),
- pTD->pTestRegex);
- if (pzErr != (char *) NULL)
- {
- fprintf (stderr, zBadComp, "select test", pFD->pzFixName,
- pTD->pzTest, pzErr);
- exit (EXIT_FAILURE);
- }
- }
- pTD++;
- }
- }
- while (pFD++, --fixCt > 0);
-}
-
-
-FILE *
-createFile (pzFile)
- const char *pzFile;
-{
- int fd;
- FILE *pf;
- char fname[MAXPATHLEN];
-
- sprintf (fname, "%s/%s", pzDestDir, pzFile);
- unlink (fname);
-
- fd = open (fname, O_WRONLY | O_CREAT);
-
- if ((fd < 0) && (errno == ENOENT))
- {
- char *pzDir = strchr (fname + 1, '/');
- struct stat stbf;
-
- while (pzDir != (char *) NULL)
- {
- *pzDir = NUL;
- if (stat (fname, &stbf) < 0)
- {
- mkdir (fname, S_IFDIR | S_IRWXU | S_IRGRP | S_IXGRP
- | S_IROTH | S_IXOTH);
- }
-
- *pzDir = '/';
- pzDir = strchr (pzDir + 1, '/');
- }
- fd = open (fname, O_WRONLY | O_CREAT);
- }
- if (fd < 0)
- {
- fprintf (stderr, "Error %d (%s) creating %s\n",
- errno, strerror (errno), fname);
- exit (EXIT_FAILURE);
- }
- fprintf (stderr, "Fixed: %s\n", pzFile);
- pf = fdopen (fd, "w");
-
-#ifdef LATER
- {
- static const char zHdr[] =
- "/*\n"
- " * DO NOT EDIT THIS FILE.\n"
- " *\n"
- " * It has been auto-edited by fixincludes from /usr/include/%s\n"
- " * This had to be done to correct non-standard usages in the\n"
- " * original, manufacturer supplied header file.\n"
- " */\n\n";
-
- fprintf (pf, zHdr, pzFile);
- }
-#endif
- return pf;
-}
-
-tSuccess
-testTest (pTest, pzFile)
- tTestDesc *pTest;
- char* pzFile;
-{
- char *pzRes;
- tSuccess res = FAILURE;
-
- static char zCmdBuf[4096];
- tSCC zCmdFmt[] = "file=%s\nif ( test %s ) > /dev/null 2>&1\n"
- "then echo TRUE\n" "else echo FALSE\n" "fi";
-
- sprintf (zCmdBuf, zCmdFmt, pzFile, pTest->pzTest);
- pzRes = runShell (zCmdBuf);
- if (*pzRes == 'T')
- res = SUCCESS;
- free ((void *) pzRes);
- return res;
-}
-
-
-tSuccess
-egrepTest (pzDta, pTest)
- char *pzDta;
- tTestDesc *pTest;
-{
- regmatch_t match;
-#ifndef NO_BOGOSITY
- if (pTest->pTestRegex == 0)
- fprintf (stderr, "fixincl ERROR RE not compiled: `%s'\n", pTest->pzTest);
-#endif
- if (regexec (pTest->pTestRegex, pzDta, 1, &match, 0) == 0)
- return SUCCESS;
- return FAILURE;
-}
-
-
-
-void
-extractQuotedFiles (pzDta, pzFile, pMatch)
- char *pzDta;
- const char *pzFile;
- regmatch_t *pMatch;
-{
- char *pzDirEnd = strrchr (pzFile, '/');
- char *pzInclQuot = pzDta;
-
- fprintf (stderr, "Quoted includes in %s\n", pzFile);
-
- /*
- * Set "pzFile" to point to the containing subdirectory of the source
- * If there is none, then it is in our current direcory, ".".
- */
- if (pzDirEnd == (char *) NULL)
- pzFile = ".";
- else
- *pzDirEnd = '\0';
-
- for (;;)
- {
- pzInclQuot += pMatch->rm_so;
-
- /*
- * Skip forward to the included file name
- */
- while (isspace (*pzInclQuot))
- pzInclQuot++;
- while (isspace (*++pzInclQuot));
- pzInclQuot += sizeof ("include") - 1;
- while (*pzInclQuot++ != '"');
-
- /*
- * Print the source directory and the subdirectory of the file
- * in question.
- */
- printf ("%s %s/", pzSrcDir, pzFile);
- pzDirEnd = pzInclQuot;
-
- /*
- * Append to the directory the relative path of the desired file
- */
- while (*pzInclQuot != '"')
- putc (*pzInclQuot++, stdout);
-
- /*
- * Now print the destination directory appended with the relative
- * path of the desired file
- */
- printf (" %s/%s/", pzDestDir, pzFile);
- while (*pzDirEnd != '"')
- putc (*pzDirEnd++, stdout);
-
- /*
- * End of entry
- */
- putc ('\n', stdout);
-
- /*
- * Find the next entry
- */
- if (regexec (&inclQuoteRegex, pzInclQuot, 1, pMatch, 0) != 0)
- break;
- }
-}
-
-
-/*
- * Process the potential fixes for a particular include file
- */
-void
-process (pzDta, pzDir, pzFile)
- char *pzDta;
- const char *pzDir;
- const char *pzFile;
-{
- static char zEnvFile[1024] =
- {"file="};
- tFixDesc *pFD = fixDescList;
- int todoCt = FIX_COUNT;
- tFdPair fdp =
- {-1, -1};
-
- /*
- * IF this is the first time through,
- * THEN put the 'file' environment variable into the environment.
- * This is used by some of the subject shell scripts and tests.
- */
- if (zEnvFile[5] == NUL)
- putenv (zEnvFile);
-
- /*
- * Ghastly as it is, this actually updates the value of the variable:
- *
- * putenv(3C) C Library Functions putenv(3C)
- *
- * DESCRIPTION
- * putenv() makes the value of the environment variable name
- * equal to value by altering an existing variable or creating
- * a new one. In either case, the string pointed to by string
- * becomes part of the environment, so altering the string will
- * change the environment. string points to a string of the
- * form ``name=value.'' The space used by string is no longer
- * used once a new string-defining name is passed to putenv().
- */
- strcpy (zEnvFile + 5, pzFile);
- chainHead = NOPROCESS;
-
- /*
- * For every fix in our fix list, ...
- */
- for (; todoCt > 0; pFD++, todoCt--)
- {
- tTestDesc *pTD;
- int tstCt;
- tSuccess egrepRes;
-
- if (pFD->fdFlags & FD_SKIP_TEST)
- continue;
-
- /*
- * IF there is a file name restriction,
- * THEN ensure the current file name matches one in the pattern
- */
- if (pFD->pzFileList != (char *) NULL)
- {
- const char *pzFil = pzFile;
- const char *pzScn = pFD->pzFileList;
- size_t nmLen;
-
- while ((pzFil[0] == '.') && (pzFil[1] == '/'))
- pzFil += 2;
- nmLen = strlen (pzFil);
-
- for (;;)
- {
- pzScn = strstr (pzScn + 1, pzFil);
- if (pzScn == (char *) NULL)
- goto nextFix;
-
- if ((pzScn[-1] == '|') && (pzScn[nmLen] == '|'))
- break;
- }
- }
-
- egrepRes = PROBLEM;
-
- /*
- * IF there are no tests
- * THEN we always run the fixup
- */
- for (pTD = pFD->pTestDesc, tstCt = pFD->testCt;
- tstCt-- > 0;
- pTD++)
- {
- switch (pTD->type)
- {
- case TT_TEST:
- /*
- * IF *any* of the shell tests fail,
- * THEN do not process the fix.
- */
- if (!SUCCESSFUL (testTest (pTD, pzFile)))
- goto nextFix;
- break;
-
- case TT_EGREP:
- /*
- * IF we have not had a successful egrep test
- * *AND* this test does not pass,
- * THEN mark the egrep test as failing. It starts
- * out as a "PROBLEM", meaning that if we do not
- * encounter any egrep tests, then we will let it pass.
- */
- if ((!SUCCESSFUL (egrepRes))
- && (!SUCCESSFUL (egrepTest (pzDta, pTD))))
-
- egrepRes = FAILURE;
-
- break;
-
- case TT_NEGREP:
- /*
- * IF *any* of the negative egrep tests fail,
- * THEN do not process the fix.
- */
- if (SUCCESSFUL (egrepTest (pzDta, pTD)))
- goto nextFix;
- break;
- }
- }
-
- /*
- * IF there were no egrep tests *OR* at least one passed, ...
- */
- if (!FAILED (egrepRes))
- {
- fprintf (stderr, "Applying %-32s to %s\n",
- pFD->pzFixName, pzFile);
-
- if (fdp.readFd == -1)
- {
- fdp.readFd = open (pzFile, O_RDONLY);
- if (fdp.readFd < 0)
- {
- fprintf (stderr, "Error %d (%s) opening %s\n", errno,
- strerror (errno), pzFile);
- exit (EXIT_FAILURE);
- }
- }
-
- for (;;)
- {
- int newFd = chainOpen (fdp.readFd,
- (tpChar *) pFD->papzPatchArgs,
- (chainHead == -1)
- ? &chainHead : (pid_t *) NULL);
- if (newFd != -1)
- {
- fdp.readFd = newFd;
- break;
- }
-
- fprintf (stderr, "Error %d (%s) starting filter process "
- "for %s\n", errno, strerror (errno),
- pFD->pzFixName);
-
- if (errno != EAGAIN)
- exit (EXIT_FAILURE);
- sleep (1);
- }
- }
-
- nextFix:;
- }
-
- /*
- * IF after all the tests we did not start any patch programs,
- * THEN quit now.
- */
- if (fdp.readFd < 0)
- return;
-
- {
- FILE *inFp = fdopen (fdp.readFd, "r");
- FILE *oFp = (FILE *) NULL;
- char *pzCmp = pzDta;
-
- for (;;)
- {
- int ch;
-
- ch = getc (inFp);
- if (ch == EOF)
- break;
-
- if (oFp != (FILE *) NULL)
- putc (ch, oFp);
-
- else if (ch != *pzCmp)
- {
- oFp = createFile (pzFile);
- if (pzCmp != pzDta)
- {
- char c = *pzCmp;
- *pzCmp = NUL;
- fputs (pzDta, oFp);
- *pzCmp = c;
- }
- putc (ch, oFp);
-
- }
- else
- pzCmp++;
- }
-
- if (oFp != (FILE *) NULL)
- {
- regmatch_t match;
-
- fchmod (fileno (oFp), S_IRUSR | S_IRGRP | S_IROTH);
- fclose (oFp);
- if (regexec (&inclQuoteRegex, pzDta, 1, &match, 0) == 0)
- extractQuotedFiles (pzDta, pzFile, &match);
- }
-
- fclose (inFp);
- }
-
- close (fdp.readFd);
-}