~ubuntu-branches/ubuntu/quantal/enigmail/quantal-security

« back to all changes in this revision

Viewing changes to mozilla/config/mkdepend/main.c

  • Committer: Package Import Robot
  • Author(s): Chris Coulson
  • Date: 2013-09-13 16:02:15 UTC
  • mfrom: (0.12.16)
  • Revision ID: package-import@ubuntu.com-20130913160215-u3g8nmwa0pdwagwc
Tags: 2:1.5.2-0ubuntu0.12.10.1
* New upstream release v1.5.2 for Thunderbird 24

* Build enigmail using a stripped down Thunderbird 17 build system, as it's
  now quite difficult to build the way we were doing previously, with the
  latest Firefox build system
* Add debian/patches/no_libxpcom.patch - Don't link against libxpcom, as it
  doesn't exist anymore (but exists in the build system)
* Add debian/patches/use_sdk.patch - Use the SDK version of xpt.py and
  friends
* Drop debian/patches/ipc-pipe_rename.diff (not needed anymore)
* Drop debian/patches/makefile_depth.diff (not needed anymore)

Show diffs side-by-side

added added

removed removed

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