[BACK]Return to error.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / make

Annotation of src/usr.bin/make/error.c, Revision 1.15

1.6       espie       1: /*     $OpenPackages$ */
1.14      espie       2: /*     $OpenBSD$ */
1.1       espie       3:
                      4: /*
1.6       espie       5:  * Copyright (c) 2001 Marc Espie.
1.1       espie       6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
1.6       espie      15:  *
                     16:  * THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
                     17:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                     18:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
                     19:  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OPENBSD
                     20:  * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
                     21:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
                     22:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     23:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     24:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     25:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
                     26:  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     27:  */
                     28:
1.1       espie      29: #include <stdio.h>
1.7       espie      30: #include <stdlib.h>
1.10      millert    31: #include <stdarg.h>
1.14      espie      32: #include <sys/types.h>
                     33: #include <unistd.h>
1.6       espie      34:
                     35: #include "config.h"
                     36: #include "defines.h"
1.1       espie      37: #include "error.h"
1.6       espie      38: #include "job.h"
                     39: #include "targ.h"
1.14      espie      40: #include "var.h"
1.6       espie      41:
                     42: #include "lowparse.h"
1.1       espie      43:
1.15    ! espie      44: int fatal_errors = 0;
        !            45: bool supervise_jobs = false;
        !            46:
1.6       espie      47: static void ParseVErrorInternal(const char *, unsigned long, int, const char *, va_list);
                     48: /*-
                     49:  * Error --
                     50:  *     Print an error message given its format.
                     51:  */
                     52: /* VARARGS */
                     53: void
                     54: Error(char *fmt, ...)
                     55: {
                     56:        va_list ap;
1.10      millert    57:
1.6       espie      58:        va_start(ap, fmt);
                     59:        (void)vfprintf(stderr, fmt, ap);
                     60:        va_end(ap);
                     61:        (void)fprintf(stderr, "\n");
1.1       espie      62: }
                     63:
1.6       espie      64: /*-
                     65:  * Fatal --
                     66:  *     Produce a Fatal error message. If jobs are running, waits for them
                     67:  *     to finish.
                     68:  *
                     69:  * Side Effects:
                     70:  *     The program exits
1.1       espie      71:  */
1.6       espie      72: /* VARARGS */
                     73: void
                     74: Fatal(char *fmt, ...)
1.1       espie      75: {
1.6       espie      76:        va_list ap;
1.10      millert    77:
1.15    ! espie      78:        if (supervise_jobs)
        !            79:                Job_Wait();
        !            80:
1.6       espie      81:        va_start(ap, fmt);
                     82:        (void)vfprintf(stderr, fmt, ap);
                     83:        va_end(ap);
                     84:        (void)fprintf(stderr, "\n");
1.1       espie      85:
1.6       espie      86:        if (DEBUG(GRAPH2))
                     87:                Targ_PrintGraph(2);
                     88:        exit(2);                /* Not 1 so -q can distinguish error */
1.1       espie      89: }
                     90:
                     91: /*
1.6       espie      92:  * Punt --
                     93:  *     Major exception once jobs are being created. Kills all jobs, prints
                     94:  *     a message and exits.
                     95:  *
                     96:  * Side Effects:
                     97:  *     All children are killed indiscriminately and the program Lib_Exits
1.1       espie      98:  */
1.6       espie      99: /* VARARGS */
                    100: void
                    101: Punt(char *fmt, ...)
1.1       espie     102: {
1.6       espie     103:        va_list ap;
1.10      millert   104:
1.6       espie     105:        va_start(ap, fmt);
                    106:        (void)fprintf(stderr, "make: ");
                    107:        (void)vfprintf(stderr, fmt, ap);
                    108:        va_end(ap);
                    109:        (void)fprintf(stderr, "\n");
1.1       espie     110:
1.6       espie     111:        DieHorribly();
1.3       espie     112: }
                    113:
1.6       espie     114: /*-
                    115:  * DieHorribly --
                    116:  *     Exit without giving a message.
                    117:  *
                    118:  * Side Effects:
                    119:  *     A big one...
                    120:  */
1.3       espie     121: void
1.12      espie     122: DieHorribly(void)
1.3       espie     123: {
1.6       espie     124:        Job_AbortAll();
                    125:        if (DEBUG(GRAPH2))
                    126:                Targ_PrintGraph(2);
                    127:        exit(2);                /* Not 1, so -q can distinguish error */
1.3       espie     128: }
                    129:
1.6       espie     130: /*
                    131:  * Finish --
                    132:  *     Called when aborting due to errors in child shell to signal
                    133:  *     abnormal exit.
                    134:  *
                    135:  * Side Effects:
                    136:  *     The program exits
                    137:  */
                    138: void
1.12      espie     139: Finish(int errors) /* number of errors encountered in Make_Make */
1.3       espie     140: {
1.14      espie     141:        Job_Wait();
                    142:        if (errors != 0) {
                    143:                Error("make pid #%ld: %d error%s in directory %s:", (long)getpid(),
                    144:                    errors, errors == 1 ? "" : "s",
                    145:                    Var_Value(".CURDIR"));
                    146:        }
                    147:        print_errors();
                    148:        if (DEBUG(GRAPH2))
                    149:                Targ_PrintGraph(2);
                    150:        exit(2);                /* Not 1 so -q can distinguish error */
1.3       espie     151: }
1.5       espie     152:
                    153:
1.6       espie     154: /*-
                    155:  * ParseVErrorInternal --
                    156:  *     Error message abort function for parsing. Prints out the context
                    157:  *     of the error (line number and file) as well as the message with
                    158:  *     two optional arguments.
                    159:  *
                    160:  * Side Effects:
                    161:  *     "fatals" is incremented if the level is PARSE_FATAL.
1.1       espie     162:  */
1.6       espie     163: /* VARARGS */
                    164: static void
1.13      espie     165: ParseVErrorInternal(const char *cfname, unsigned long clineno, int type,
1.6       espie     166:        const char *fmt, va_list ap)
1.1       espie     167: {
1.8       espie     168:        if (cfname)
                    169:            (void)fprintf(stderr, "\"%s\", line %lu: ", cfname, clineno);
1.6       espie     170:        if (type == PARSE_WARNING)
                    171:                (void)fprintf(stderr, "warning: ");
                    172:        (void)vfprintf(stderr, fmt, ap);
                    173:        va_end(ap);
                    174:        (void)fprintf(stderr, "\n");
                    175:        if (type == PARSE_FATAL)
                    176:                fatal_errors ++;
                    177: }
                    178:
                    179: /*-
                    180:  * Parse_Error --
                    181:  *     External interface to ParseVErrorInternal; uses the default filename
                    182:  *     Line number.
1.4       espie     183:  */
1.6       espie     184: /* VARARGS */
1.4       espie     185: void
1.6       espie     186: Parse_Error(int type, const char *fmt, ...)
1.4       espie     187: {
1.6       espie     188:        va_list ap;
1.10      millert   189:
1.6       espie     190:        va_start(ap, fmt);
1.13      espie     191:        ParseVErrorInternal(Parse_Getfilename(), Parse_Getlineno(), type,
1.12      espie     192:            fmt, ap);
1.11      espie     193:        va_end(ap);
1.1       espie     194: }
1.5       espie     195: