LCOV - code coverage report
Current view: top level - libreoffice/soltools/mkdepend - main.c (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 196 320 61.2 %
Date: 2012-12-27 Functions: 12 14 85.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /* $XConsortium: main.c,v 1.84 94/11/30 16:10:44 kaleb Exp $ */
       3             : /* $XFree86: xc/config/makedepend/main.c,v 3.4 1995/07/15 14:53:49 dawes Exp $ */
       4             : /*
       5             : 
       6             : Copyright (c) 1993, 1994  X Consortium
       7             : 
       8             : Permission is hereby granted, free of charge, to any person obtaining a copy
       9             : of this software and associated documentation files (the "Software"), to deal
      10             : in the Software without restriction, including without limitation the rights
      11             : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      12             : copies of the Software, and to permit persons to whom the Software is
      13             : furnished to do so, subject to the following conditions:
      14             : 
      15             : The above copyright notice and this permission notice shall be included in
      16             : all copies or substantial portions of the Software.
      17             : 
      18             : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      19             : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      20             : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
      21             : X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
      22             : AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
      23             : CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      24             : 
      25             : Except as contained in this notice, the name of the X Consortium shall not be
      26             : used in advertising or otherwise to promote the sale, use or other dealings
      27             : in this Software without prior written authorization from the X Consortium.
      28             : 
      29             : */
      30             : 
      31             : #if defined(FREEBSD) || defined(MACOSX)
      32             : #include <sys/types.h>
      33             : #include <sys/stat.h>
      34             : #endif
      35             : 
      36             : #ifdef _WIN32
      37             : #include <io.h>
      38             : #endif
      39             : 
      40             : #ifdef _MSC_VER     /* Define ssize_t */
      41             : 
      42             : #if !defined(_W64)
      43             : #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
      44             : #define _W64 __w64
      45             : #else
      46             : #define _W64
      47             : #endif
      48             : #endif
      49             : 
      50             : #ifdef  _WIN64
      51             : typedef __int64    ssize_t;
      52             : #else
      53             : typedef _W64 int   ssize_t;
      54             : #endif
      55             : 
      56             : #endif
      57             : 
      58             : #include "def.h"
      59             : #include <string.h>
      60             : #ifdef hpux
      61             : #define sigvec sigvector
      62             : #endif /* hpux */
      63             : 
      64             : #ifdef X_POSIX_C_SOURCE
      65             : #define _POSIX_C_SOURCE X_POSIX_C_SOURCE
      66             : #include <signal.h>
      67             : #undef _POSIX_C_SOURCE
      68             : #else
      69             : #if defined(X_NOT_POSIX) || defined(_POSIX_SOURCE)
      70             : #include <signal.h>
      71             : #else
      72             : #define _POSIX_SOURCE
      73             : #include <signal.h>
      74             : #undef _POSIX_SOURCE
      75             : #endif
      76             : #endif
      77             : 
      78             : #include <stdarg.h>
      79             : 
      80             : #ifdef MINIX
      81             : #define USE_CHMOD   1
      82             : #endif
      83             : 
      84             : #ifdef DEBUG
      85             : int _debugmask;
      86             : #endif
      87             : 
      88             : char *ProgramName;
      89             : 
      90             : #define OBJSUFFIX ".obj"
      91             : #define INCLUDEDIR "."
      92             : 
      93             : char    *directives[] = {
      94             :     "if",
      95             :     "ifdef",
      96             :     "ifndef",
      97             :     "else",
      98             :     "endif",
      99             :     "define",
     100             :     "undef",
     101             :     "include",
     102             :     "line",
     103             :     "pragma",
     104             :     "error",
     105             :     "ident",
     106             :     "sccs",
     107             :     "elif",
     108             :     "eject",
     109             :     NULL
     110             : };
     111             : 
     112             : #define MAKEDEPEND
     113             : #include "imakemdep.h"  /* from config sources */
     114             : #undef MAKEDEPEND
     115             : 
     116             : /*******   function declarations ********/
     117             : /*******   added by -Wall project *******/
     118             : void redirect(char * line, char * makefile );
     119             : 
     120             : struct  inclist inclist[ MAXFILES ],
     121             :         *inclistp = inclist;
     122             : 
     123             : struct symhash *maininclist = NULL;
     124             : 
     125             : char    *filelist[ MAXFILES ];
     126             : char    *includedirs[ MAXDIRS + 1 ];
     127             : char    *notdotdot[ MAXDIRS ];
     128             : char    *objprefix = "";
     129             : char    *objsuffix = OBJSUFFIX;
     130             : char    *startat = "# DO NOT DELETE";
     131             : int width = 78;
     132             : boolean append = FALSE;
     133             : boolean printed = FALSE;
     134             : boolean verbose = FALSE;
     135             : boolean show_where_not = FALSE;
     136             : boolean warn_multiple = FALSE;  /* Warn on multiple includes of same file */
     137             : 
     138             : static
     139             : #ifdef SIGNALRETURNSINT
     140             : int
     141             : #else
     142             : void
     143             : #endif
     144           0 : catch (int sig)
     145             : {
     146           0 :     fflush (stdout);
     147           0 :     fatalerr ("got signal %d\n", sig);
     148           0 : }
     149             : 
     150             : #if (defined(i386) && defined(SYSV)) || defined(WIN32)
     151             : #define USGISH
     152             : #endif
     153             : 
     154             : #ifndef USGISH
     155             : #ifndef _POSIX_SOURCE
     156             : #define sigaction sigvec
     157             : #define sa_handler sv_handler
     158             : #define sa_mask sv_mask
     159             : #define sa_flags sv_flags
     160             : #endif
     161             : struct sigaction sig_act;
     162             : #endif /* USGISH */
     163             : 
     164             : boolean native_win_slashes = FALSE;
     165             : 
     166           2 : int main(argc, argv)
     167             :     int argc;
     168             :     char    **argv;
     169             : {
     170           2 :     register char   **fp = filelist;
     171           2 :     register char   **incp = includedirs;
     172             :     register char   *p;
     173             :     register struct inclist *ip;
     174           2 :     char    *makefile = NULL;
     175             :     struct filepointer  *filecontent;
     176           2 :     struct pair *psymp = predefs;
     177           2 :     char *endmarker = NULL;
     178           2 :     char *defincdir = NULL;
     179             :     struct IncludesCollection* incCollection;
     180             : 
     181           2 :     ProgramName = argv[0];
     182             : 
     183           8 :     while (psymp->p_name)
     184             :     {
     185           4 :         hash_define(psymp->p_name, psymp->p_value, &maininclist);
     186           4 :         psymp++;
     187             :     }
     188           2 :     if (argc == 2 && argv[1][0] == '@') {
     189             :         struct stat ast;
     190             :         int afd;
     191             :         char *args;
     192             :         char **nargv;
     193             :         int nargc;
     194           2 :         char quotechar = '\0';
     195             : 
     196           2 :         nargc = 1;
     197           2 :         if ((afd = open(argv[1]+1, O_RDONLY)) < 0)
     198           0 :             fatalerr("cannot open \"%s\"\n", argv[1]+1);
     199           2 :         fstat(afd, &ast);
     200           2 :         args = (char *)malloc(ast.st_size + 1);
     201           2 :         if ((ast.st_size = read(afd, args, (size_t) ast.st_size)) < 0)
     202           0 :             fatalerr("failed to read %s\n", argv[1]+1);
     203           2 :         args[ast.st_size] = '\0';
     204           2 :         close(afd);
     205         939 :         for (p = args; *p; p++) {
     206         937 :         if (quotechar) {
     207           0 :             if (quotechar == '\\'
     208           0 :                 || (*p == quotechar && p[-1] != '\\'))
     209           0 :                 quotechar = '\0';
     210           0 :             continue;
     211             :         }
     212         937 :         switch (*p) {
     213             :         case '\\':
     214             :         case '"':
     215             :         case '\'':
     216           0 :             quotechar = *p;
     217           0 :             break;
     218             :         case ' ':
     219             :         case '\n':
     220          75 :             *p = '\0';
     221          75 :             if (p > args && p[-1])
     222          66 :                 nargc++;
     223          75 :             break;
     224             :         }
     225             :         }
     226           2 :         if (p[-1])
     227           0 :             nargc++;
     228           2 :         nargv = (char **)malloc(nargc * sizeof(char *));
     229           2 :         nargv[0] = argv[0];
     230           2 :         argc = 1;
     231          77 :         for (p = args; argc < nargc; p += strlen(p) + 1)
     232          75 :             if (*p) nargv[argc++] = p;
     233           2 :                 argv = nargv;
     234             :     }
     235          66 :     for(argc--, argv++; argc; argc--, argv++) {
     236             :             /* if looking for endmarker then check before parsing */
     237          64 :         if (endmarker && strcmp (endmarker, *argv) == 0) {
     238           0 :             endmarker = NULL;
     239           0 :             continue;
     240             :         }
     241          64 :         if (**argv != '-') {
     242             :             /* treat +thing as an option for C++ */
     243           2 :             if (endmarker && **argv == '+')
     244           0 :                 continue;
     245           2 :             *fp++ = argv[0];
     246           2 :             continue;
     247             :         }
     248          62 :         switch(argv[0][1]) {
     249             :         case '-':
     250           0 :             endmarker = &argv[0][2];
     251           0 :             if (endmarker[0] == '\0') endmarker = "--";
     252           0 :             break;
     253             :         case 'D':
     254          44 :             if (argv[0][2] == '\0') {
     255           0 :                 argv++;
     256           0 :                 argc--;
     257             :             }
     258         432 :             for (p=argv[0] + 2; *p ; p++)
     259         398 :                 if (*p == '=') {
     260          10 :                     *p = ' ';
     261          10 :                     break;
     262             :                 }
     263          44 :             define(argv[0] + 2, &maininclist);
     264          44 :             break;
     265             :         case 'I':
     266          14 :             if (incp >= includedirs + MAXDIRS)
     267           0 :                 fatalerr("Too many -I flags.\n");
     268          14 :             *incp++ = argv[0]+2;
     269          14 :             if (**(incp-1) == '\0') {
     270           0 :                 *(incp-1) = *(++argv);
     271           0 :                 argc--;
     272             :             }
     273          14 :             break;
     274             :         case 'Y':
     275           0 :             defincdir = argv[0]+2;
     276           0 :             break;
     277             :         /* do not use if endmarker processing */
     278             :         case 'a':
     279           0 :             if (endmarker) break;
     280           0 :             append = TRUE;
     281           0 :             break;
     282             :         case 'w':
     283           0 :             if (endmarker) break;
     284           0 :             if (argv[0][2] == '\0') {
     285           0 :                 argv++;
     286           0 :                 argc--;
     287           0 :                 width = atoi(argv[0]);
     288             :             } else
     289           0 :                 width = atoi(argv[0]+2);
     290           0 :             break;
     291             :         case 'n':
     292             :             // Use "-n" switch to generate dependencies with windows-native slash style
     293           0 :             native_win_slashes = TRUE;
     294           0 :             break;
     295             :         case 'o':
     296           0 :             if (endmarker) break;
     297           0 :             if (argv[0][2] == '\0') {
     298           0 :                 argv++;
     299           0 :                 argc--;
     300           0 :                 objsuffix = argv[0];
     301             :             } else
     302           0 :                 objsuffix = argv[0]+2;
     303           0 :             break;
     304             :         case 'p':
     305           2 :             if (endmarker) break;
     306           2 :             if (argv[0][2] == '\0') {
     307           0 :                 argv++;
     308           0 :                 argc--;
     309           0 :                 objprefix = argv[0];
     310             :             } else
     311           2 :                 objprefix = argv[0]+2;
     312           2 :             break;
     313             :         case 'v':
     314           0 :             if (endmarker) break;
     315           0 :             verbose = TRUE;
     316             : #ifdef DEBUG
     317             :             if (argv[0][2])
     318             :                 _debugmask = atoi(argv[0]+2);
     319             : #endif
     320           0 :             break;
     321             :         case 's':
     322           0 :             if (endmarker) break;
     323           0 :             startat = argv[0]+2;
     324           0 :             if (*startat == '\0') {
     325           0 :                 startat = *(++argv);
     326           0 :                 argc--;
     327             :             }
     328           0 :             if (*startat != '#')
     329           0 :                 fatalerr("-s flag's value should start %s\n",
     330             :                     "with '#'.");
     331           0 :             break;
     332             :         case 'f':
     333           2 :             if (endmarker) break;
     334           2 :             makefile = argv[0]+2;
     335           2 :             if (*makefile == '\0') {
     336           2 :                 makefile = *(++argv);
     337           2 :                 argc--;
     338             :             }
     339           2 :             break;
     340             : 
     341             :         case 'm':
     342           0 :             warn_multiple = TRUE;
     343           0 :             break;
     344             : 
     345             :         /* Ignore -O, -g so we can just pass ${CFLAGS} to
     346             :            makedepend
     347             :          */
     348             :         case 'O':
     349             :         case 'g':
     350           0 :             break;
     351             :         default:
     352           0 :             if (endmarker) break;
     353           0 :             warning("ignoring option %s\n", argv[0]);
     354             :         }
     355             :     }
     356             : 
     357           2 :     convert_slashes(objprefix);
     358           2 :     objprefix = append_slash(objprefix);
     359             : 
     360           2 :     if (!defincdir) {
     361             : #ifdef PREINCDIR
     362             :         if (incp >= includedirs + MAXDIRS)
     363             :         fatalerr("Too many -I flags.\n");
     364             :         *incp++ = PREINCDIR;
     365             : #endif
     366           2 :         if (incp >= includedirs + MAXDIRS)
     367           0 :             fatalerr("Too many -I flags.\n");
     368           2 :         *incp++ = INCLUDEDIR;
     369             : #ifdef POSTINCDIR
     370             :         if (incp >= includedirs + MAXDIRS)
     371             :             fatalerr("Too many -I flags.\n");
     372             :         *incp++ = POSTINCDIR;
     373             : #endif
     374           0 :     } else if (*defincdir) {
     375           0 :         if (incp >= includedirs + MAXDIRS)
     376           0 :             fatalerr("Too many -I flags.\n");
     377           0 :         *incp++ = defincdir;
     378             :     }
     379             : 
     380           2 :     redirect(startat, makefile);
     381             : 
     382             :     /*
     383             :      * catch signals.
     384             :      */
     385             : #ifdef USGISH
     386             : /*  should really reset SIGINT to SIG_IGN if it was.  */
     387             : #ifdef SIGHUP
     388             :     signal (SIGHUP, catch);
     389             : #endif
     390             :     signal (SIGINT, catch);
     391             : #ifdef SIGQUIT
     392             :     signal (SIGQUIT, catch);
     393             : #endif
     394             :     signal (SIGILL, catch);
     395             : #ifdef SIGBUS
     396             :     signal (SIGBUS, catch);
     397             : #endif
     398             :     signal (SIGSEGV, catch);
     399             : #ifdef SIGSYS
     400             :     signal (SIGSYS, catch);
     401             : #endif
     402             :     signal (SIGFPE, catch);
     403             : #else
     404           2 :     sig_act.sa_handler = catch;
     405             : #ifdef _POSIX_SOURCE
     406           2 :     sigemptyset(&sig_act.sa_mask);
     407           2 :     sigaddset(&sig_act.sa_mask, SIGINT);
     408           2 :     sigaddset(&sig_act.sa_mask, SIGQUIT);
     409             : #ifdef SIGBUS
     410           2 :     sigaddset(&sig_act.sa_mask, SIGBUS);
     411             : #endif
     412           2 :     sigaddset(&sig_act.sa_mask, SIGILL);
     413           2 :     sigaddset(&sig_act.sa_mask, SIGSEGV);
     414           2 :     sigaddset(&sig_act.sa_mask, SIGHUP);
     415           2 :     sigaddset(&sig_act.sa_mask, SIGPIPE);
     416             : #ifdef SIGSYS
     417           2 :     sigaddset(&sig_act.sa_mask, SIGSYS);
     418             : #endif
     419             : #else
     420             :     sig_act.sa_mask = ((1<<(SIGINT -1))
     421             :                |(1<<(SIGQUIT-1))
     422             : #ifdef SIGBUS
     423             :                |(1<<(SIGBUS-1))
     424             : #endif
     425             :                |(1<<(SIGILL-1))
     426             :                |(1<<(SIGSEGV-1))
     427             :                |(1<<(SIGHUP-1))
     428             :                |(1<<(SIGPIPE-1))
     429             : #ifdef SIGSYS
     430             :                |(1<<(SIGSYS-1))
     431             : #endif
     432             :                );
     433             : #endif /* _POSIX_SOURCE */
     434           2 :     sig_act.sa_flags = 0;
     435           2 :     sigaction(SIGHUP, &sig_act, (struct sigaction *)0);
     436           2 :     sigaction(SIGINT, &sig_act, (struct sigaction *)0);
     437           2 :     sigaction(SIGQUIT, &sig_act, (struct sigaction *)0);
     438           2 :     sigaction(SIGILL, &sig_act, (struct sigaction *)0);
     439             : #ifdef SIGBUS
     440           2 :     sigaction(SIGBUS, &sig_act, (struct sigaction *)0);
     441             : #endif
     442           2 :     sigaction(SIGSEGV, &sig_act, (struct sigaction *)0);
     443             : #ifdef SIGSYS
     444           2 :     sigaction(SIGSYS, &sig_act, (struct sigaction *)0);
     445             : #endif
     446             : #endif /* USGISH */
     447             : 
     448             :     /*
     449             :      * now peruse through the list of files.
     450             :      */
     451           2 :     incCollection = create_IncludesCollection();
     452             : 
     453           4 :     for(fp=filelist; *fp; fp++) {
     454             :         struct symhash *includes;
     455           2 :         filecontent = getfile(*fp);
     456           2 :         ip = newinclude(*fp, (char *)NULL);
     457             : 
     458           2 :         includes = hash_copy( maininclist );
     459           2 :         find_includes(filecontent, ip, ip, 0, FALSE, incCollection, includes);
     460           2 :         hash_free( includes );
     461             : 
     462           2 :         freefile(filecontent);
     463           2 :         recursive_pr_include(ip, ip->i_file, base_name(*fp));
     464           2 :         inc_clean();
     465             :     }
     466           2 :     if (printed)
     467           0 :         printf("\n");
     468             : 
     469           2 :     delete_IncludesCollection(incCollection);
     470             : 
     471           2 :     exit(0);
     472             : }
     473             : 
     474          11 : struct filepointer *getfile(file)
     475             :     char    *file;
     476             : {
     477             :     register int    fd;
     478             :     struct filepointer  *content;
     479             :     struct stat st;
     480             :     off_t       size_backup;
     481             :     ssize_t     bytes_read;
     482             :     size_t      malloc_size;
     483             : 
     484          11 :     content = (struct filepointer *)malloc(sizeof(struct filepointer));
     485          11 :     if ((fd = open(file, O_RDONLY)) < 0) {
     486           0 :         warning("makedepend:  Cannot open file \"%s\"\n", file);
     487           0 :         content->f_p = content->f_base = content->f_end = (char *)malloc(1);
     488           0 :         *content->f_p = '\0';
     489           0 :         return(content);
     490             :     }
     491          11 :     fstat(fd, &st);
     492             : 
     493          11 :     size_backup = st.st_size;
     494          11 :     malloc_size = size_backup;
     495             :     /* Since off_t is larger than size_t, need to test for
     496             :      * truncation.
     497             :      */
     498          11 :     if ( (off_t)malloc_size != size_backup )
     499             :     {
     500           0 :         close( fd );
     501           0 :         warning("makedepend:  File \"%s\" size larger than can fit in size_t.  Cannot allocate memory for contents.\n", file);
     502           0 :         content->f_p = content->f_base = content->f_end = (char *)malloc(1);
     503           0 :         *content->f_p = '\0';
     504           0 :         return(content);
     505             :     }
     506             : 
     507          11 :     content->f_base = (char *)malloc(malloc_size+1);
     508          11 :     if (content->f_base == NULL)
     509           0 :         fatalerr("makedepend:  Cannot allocate memory to process file \"%s\"\n", file);
     510          11 :     if ((bytes_read = read(fd, content->f_base, malloc_size)) < 0)
     511           0 :         if ( st.st_mode & S_IFREG )
     512           0 :             fatalerr("makedepend:  Failed to read file \"%s\"\n", file);
     513             : 
     514          11 :     close(fd);
     515          11 :     content->f_len = bytes_read+1;
     516          11 :     content->f_p = content->f_base;
     517          11 :     content->f_end = content->f_base + bytes_read;
     518          11 :     *content->f_end = '\0';
     519          11 :     content->f_line = 0;
     520          11 :     return(content);
     521             : }
     522             : 
     523          11 : void freefile(fp)
     524             :     struct filepointer  *fp;
     525             : {
     526          11 :     free(fp->f_base);
     527          11 :     free(fp);
     528          11 : }
     529             : 
     530         558 : char *copy(str)
     531             :     register char   *str;
     532             : {
     533         558 :     register char   *p = (char *)malloc(strlen(str) + 1);
     534             : 
     535         558 :     strcpy(p, str);
     536         558 :     return(p);
     537             : }
     538             : 
     539         551 : int match(str, list)
     540             :     register char   *str, **list;
     541             : {
     542             :     register int    i;
     543             : 
     544        3029 :     for (i=0; *list; i++, list++)
     545        3029 :         if (strcmp(str, *list) == 0)
     546         551 :             return(i);
     547           0 :     return(-1);
     548             : }
     549             : 
     550             : /*
     551             :  * Get the next line.  We only return lines beginning with '#' since that
     552             :  * is all this program is ever interested in.
     553             :  */
     554         562 : char *get_line(filep)
     555             :     register struct filepointer *filep;
     556             : {
     557             :     register char   *p, /* walking pointer */
     558             :             *eof,   /* end of file pointer */
     559             :             *bol;   /* beginning of line pointer */
     560             :     register int    lineno; /* line number */
     561             : 
     562         562 :     p = filep->f_p;
     563         562 :     eof = filep->f_end;
     564         562 :     if (p >= eof)
     565           0 :         return((char *)NULL);
     566         562 :     lineno = filep->f_line;
     567             : 
     568       49207 :     for(bol = p--; ++p < eof; ) {
     569       48634 :         if (*p == '/' && *(p+1) == '*') { /* consume comments */
     570         217 :             *p++ = ' ', *p++ = ' ';
     571       65327 :             while (*p) {
     572       65110 :                 if (*p == '*' && *(p+1) == '/') {
     573         217 :                     *p++ = ' ', *p = ' ';
     574         217 :                     break;
     575             :                 }
     576       64893 :                 else if (*p == '\n')
     577        1549 :                     lineno++;
     578       64893 :                 *p++ = ' ';
     579             :             }
     580         217 :             continue;
     581             :         }
     582       48417 :         else if (*p == '/' && *(p+1) == '/') { /* consume comments */
     583          13 :             *p++ = ' ', *p++ = ' ';
     584         792 :             while (*p && *p != '\n')
     585         766 :                 *p++ = ' ';
     586          13 :             if ( *p == '\n' )
     587          13 :                 p--;
     588          13 :             lineno++;
     589          13 :             continue;
     590             :         }
     591       48404 :         else if (*p == '\\') {
     592          26 :             if (*(p+1) == '\n') {
     593           9 :                 *p = ' ';
     594           9 :                 *(p+1) = ' ';
     595           9 :                 lineno++;
     596             :             }
     597             :         }
     598       48378 :         else if (*p == '\n') {
     599        1603 :             lineno++;
     600        1603 :             if (*bol == '#') {
     601             :                 register char *cp;
     602             : 
     603         551 :                 *p++ = '\0';
     604             :                 /* punt lines with just # (yacc generated) */
     605        1425 :                 for (cp = bol+1;
     606        1197 :                      *cp && (*cp == ' ' || *cp == '\t'); cp++);
     607         551 :                 if (*cp) goto done;
     608             :             }
     609        1052 :             bol = p+1;
     610             :         }
     611             :     }
     612          11 :     if (*bol != '#')
     613          11 :         bol = NULL;
     614             : done:
     615         562 :     filep->f_p = p;
     616         562 :     filep->f_line = lineno;
     617         562 :     return(bol);
     618             : }
     619             : 
     620             : /*
     621             :  * Strip the file name down to what we want to see in the Makefile.
     622             :  * It will have objprefix and objsuffix around it.
     623             :  */
     624           2 : char *base_name(file)
     625             :     register char   *file;
     626             : {
     627             :     register char   *p;
     628             : 
     629           2 :     file = copy(file);
     630           2 :     for(p=file+strlen(file); p>file && *p != '.'; p--) ;
     631             : 
     632           2 :     if (*p == '.')
     633           2 :         *p = '\0';
     634             : 
     635          22 :     while (p > file) {
     636          18 :         if ( *p == '/' ||  *p == '\\') {
     637           0 :             file = p + 1;
     638           0 :             break;
     639             :         };
     640          18 :         p--;
     641             :     };
     642           2 :     return(file);
     643             : }
     644             : 
     645             : #if defined(USG) && !defined(CRAY) && !defined(SVR4)
     646             : int rename (from, to)
     647             :     char *from, *to;
     648             : {
     649             :     (void) unlink (to);
     650             :     if (link (from, to) == 0) {
     651             :     unlink (from);
     652             :     return 0;
     653             :     } else {
     654             :     return -1;
     655             :     }
     656             : }
     657             : #endif /* USGISH */
     658             : 
     659           2 : void redirect(line, makefile)
     660             :     char    *line,
     661             :         *makefile;
     662             : {
     663             :     struct stat st;
     664             :     FILE    *fdin, *fdout;
     665             :     char    backup[ BUFSIZ ],
     666             :         buf[ BUFSIZ ];
     667           2 :     boolean found = FALSE;
     668             :     int len;
     669             : 
     670             :     /*
     671             :      * if makefile is "-" then let it pour onto stdout.
     672             :      */
     673           2 :     if (makefile && *makefile == '-' && *(makefile+1) == '\0')
     674           2 :         return;
     675             : 
     676             :     /*
     677             :      * use a default makefile is not specified.
     678             :      */
     679           0 :     if (!makefile) {
     680           0 :         if (stat("Makefile", &st) == 0)
     681           0 :             makefile = "Makefile";
     682           0 :         else if (stat("makefile", &st) == 0)
     683           0 :             makefile = "makefile";
     684             :         else
     685           0 :             fatalerr("[mM]akefile is not present\n");
     686             :     }
     687             :     else
     688           0 :         stat(makefile, &st);
     689           0 :     if ((fdin = fopen(makefile, "r")) == NULL)
     690           0 :         fatalerr("cannot open \"%s\"\n", makefile);
     691           0 :     sprintf(backup, "%s.bak", makefile);
     692           0 :     unlink(backup);
     693             : #if defined(WIN32)
     694             :     fclose(fdin);
     695             : #endif
     696           0 :     if (rename(makefile, backup) < 0)
     697           0 :         fatalerr("cannot rename %s to %s\n", makefile, backup);
     698             : #if defined(WIN32)
     699             :     if ((fdin = fopen(backup, "r")) == NULL)
     700             :         fatalerr("cannot open \"%s\"\n", backup);
     701             : #endif
     702           0 :     if ((fdout = freopen(makefile, "w", stdout)) == NULL)
     703           0 :         fatalerr("cannot open \"%s\"\n", backup);
     704           0 :     len = strlen(line);
     705           0 :     while (!found && fgets(buf, BUFSIZ, fdin)) {
     706           0 :         if (*buf == '#' && strncmp(line, buf, len) == 0)
     707           0 :             found = TRUE;
     708           0 :         fputs(buf, fdout);
     709             :     }
     710           0 :     if (!found) {
     711           0 :         if (verbose)
     712           0 :             warning("Adding new delimiting line \"%s\" and dependencies...\n",
     713             :                 line);
     714           0 :         puts(line); /* same as fputs(fdout); but with newline */
     715           0 :     } else if (append) {
     716           0 :         while (fgets(buf, BUFSIZ, fdin)) {
     717           0 :         fputs(buf, fdout);
     718             :         }
     719             :     }
     720           0 :     fflush(fdout);
     721             : #if defined(USGISH) || defined(USE_CHMOD)
     722             :     chmod(makefile, st.st_mode);
     723             : #else
     724           0 :     fchmod(fileno(fdout), st.st_mode);
     725             : #endif /* USGISH */
     726           0 :     fclose(fdin);
     727             : }
     728             : 
     729           0 : void fatalerr(char *msg, ...)
     730             : {
     731             :     va_list args;
     732           0 :     fprintf(stderr, "%s: error:  ", ProgramName);
     733           0 :     va_start(args, msg);
     734           0 :     vfprintf(stderr, msg, args);
     735           0 :     va_end(args);
     736           0 :     exit (1);
     737             : }
     738             : 
     739          13 : void warning(char *msg, ...)
     740             : {
     741             : #ifdef DEBUG_MKDEPEND
     742             :     va_list args;
     743             :     fprintf(stderr, "%s: warning:  ", ProgramName);
     744             :     va_start(args, msg);
     745             :     vfprintf(stderr, msg, args);
     746             :     va_end(args);
     747             : #else
     748             :     (void)msg;
     749             : #endif /* DEBUG_MKDEPEND */
     750          13 : }
     751             : 
     752         130 : void warning1(char *msg, ...)
     753             : {
     754             : #ifdef DEBUG_MKDEPEND
     755             :     va_list args;
     756             :     va_start(args, msg);
     757             :     vfprintf(stderr, msg, args);
     758             :     va_end(args);
     759             : #else
     760             :     (void)msg;
     761             : #endif /* DEBUG_MKDEPEND */
     762         130 : }
     763             : 
     764         299 : void convert_slashes(path)
     765             :     char* path;
     766             : {
     767             : #if defined (WNT)
     768             :     /*
     769             :      * Convert backslashes to slashes
     770             :      */
     771             :     char *ptr;
     772             :     if (native_win_slashes) {
     773             :         for (ptr = (char*)path; *ptr; ++ptr)
     774             :             if (*ptr == '/')
     775             :                 *ptr = '\\';
     776             :     } else {
     777             :         for (ptr = (char*)path; *ptr; ++ptr)
     778             :             if (*ptr == '\\')
     779             :                 *ptr = '/';
     780             :     };
     781             : #else
     782             :     (void)path;
     783             : #endif
     784         299 : }
     785             : 
     786           2 : char* append_slash(path)
     787             :     char* path;
     788             : {
     789             :     char *new_string;
     790           2 :     if ((path[strlen(path) - 1] == '/') || (path[strlen(path) - 1] == '\\')) {
     791           0 :         new_string = path;
     792             :     } else {
     793           2 :         new_string = (char*)malloc(sizeof(char) * (strlen(path) + 2));
     794           2 :         strcpy(new_string, path);
     795           2 :         if (native_win_slashes)
     796           0 :             strcat(new_string, "\\");
     797             :         else
     798           2 :             strcat(new_string, "/");
     799             :     };
     800           2 :     return new_string;
     801             : }
     802             : 
     803             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10