summaryrefslogtreecommitdiff
path: root/usr.bin/make/error.c
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>2001-05-23 12:34:58 +0000
committerMarc Espie <espie@cvs.openbsd.org>2001-05-23 12:34:58 +0000
commitdb8e89b77998123612f763908cdd1c46cc7ea24f (patch)
treeaf42f9f2b44b6bae3a6ca23660ff612c49709e27 /usr.bin/make/error.c
parentd0640eab6718b3ff0eeb66e78aa4d5d8a8ed3c24 (diff)
Mostly clean-up:
- cut up those huge include files into separate interfaces for all modules. Put the interface documentation there, and not with the implementation. - light-weight includes for needed concrete types (lst_t.h, timestamp_t.h). - cut out some more logically separate parts: cmd_exec, varname, parsevar, timestamp. - put all error handling functions together, so that we will be able to clean them up. - more systematic naming: functioni to handle interval, function to handle string. - put the init/end code apart to minimize coupling. - kill weird types like ReturnStatus and Boolean. Use standard bool (with a fallback for non-iso systems) - better interface documentation for lots of subsystems. As a result, make compilation goes somewhat faster (5%, even considering the largish BSD copyrights to read). The corresponding preprocessed source goes down from 1,5M to 1M. A few minor code changes as well: Parse_DoVar is no longer destructive. Parse_IsVar functionality is folded into Parse_DoVar (as it knows what an assignment is), a few more interval handling functions. Avoid calling XXX_End when they do nothing, just #define XXX_End to nothing. Parse_DoVar is slightly more general: it will handle compound assignments as long as they make sense, e.g., VAR +!= cmd will work. As a side effect, VAR++=value now triggers an error (two + in assignment). - this stuff doesn't occur in portable Makefiles. - writing VAR++ = value or VAR+ +=value disambiguates it. - this is a good thing, it uncovered a bug in bsd.port.mk. Tested by naddy@. Okayed millert@. I'll handle the fallback if there is any. This went through a full make build anyways, including isakmpd (without mickey's custom binutils, as he didn't see fit to share it with me).
Diffstat (limited to 'usr.bin/make/error.c')
-rw-r--r--usr.bin/make/error.c314
1 files changed, 177 insertions, 137 deletions
diff --git a/usr.bin/make/error.c b/usr.bin/make/error.c
index 595f639eaa9..b4fd3805249 100644
--- a/usr.bin/make/error.c
+++ b/usr.bin/make/error.c
@@ -1,14 +1,8 @@
-/* $OpenPackages$ */
-/* $OpenBSD: error.c,v 1.5 2001/05/03 13:41:04 espie Exp $ */
+/* $OpenPackages$ */
+/* $OpenBSD: error.c,v 1.6 2001/05/23 12:34:42 espie Exp $ */
/*
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
+ * Copyright (c) 2001 Marc Espie.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -18,177 +12,223 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD
+ * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "error.h"
-#ifdef __GNUC__
-#define UNUSED __attribute__((unused))
-#else
-#define UNUSED
-#endif
+#include "config.h"
+#include "defines.h"
+#include "error.h"
+#include "job.h"
+#include "targ.h"
-static void enomem(size_t);
+#include "lowparse.h"
-/*
- * emalloc --
- * malloc, but die on error.
+int fatal_errors = 0;
+static void ParseVErrorInternal(const char *, unsigned long, int, const char *, va_list);
+/*-
+ * Error --
+ * Print an error message given its format.
*/
-void *
-emalloc(len)
- size_t len;
+/* VARARGS */
+void
+#ifdef __STDC__
+Error(char *fmt, ...)
+#else
+Error(va_alist)
+ va_dcl
+#endif
{
- void *p;
+ va_list ap;
+#ifdef __STDC__
+ va_start(ap, fmt);
+#else
+ char *fmt;
- if ((p = malloc(len)) == NULL)
- enomem(len);
- return p;
+ va_start(ap);
+ fmt = va_arg(ap, char *);
+#endif
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ (void)fprintf(stderr, "\n");
}
-/*
- * estrdup --
- * strdup, but die on error.
+/*-
+ * Fatal --
+ * Produce a Fatal error message. If jobs are running, waits for them
+ * to finish.
+ *
+ * Side Effects:
+ * The program exits
*/
-char *
-estrdup(str)
- const char *str;
+/* VARARGS */
+void
+#ifdef __STDC__
+Fatal(char *fmt, ...)
+#else
+Fatal(va_alist)
+ va_dcl
+#endif
{
- char *p;
- size_t size;
+ va_list ap;
+#ifdef __STDC__
+ va_start(ap, fmt);
+#else
+ char *fmt;
+
+ va_start(ap);
+ fmt = va_arg(ap, char *);
+#endif
+ Job_Wait();
- size = strlen(str) + 1;
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ (void)fprintf(stderr, "\n");
- p = emalloc(size);
- memcpy(p, str, size);
- return p;
+ if (DEBUG(GRAPH2))
+ Targ_PrintGraph(2);
+ exit(2); /* Not 1 so -q can distinguish error */
}
/*
- * erealloc --
- * realloc, but die on error.
+ * Punt --
+ * Major exception once jobs are being created. Kills all jobs, prints
+ * a message and exits.
+ *
+ * Side Effects:
+ * All children are killed indiscriminately and the program Lib_Exits
*/
-void *
-erealloc(ptr, size)
- void *ptr;
- size_t size;
+/* VARARGS */
+void
+#ifdef __STDC__
+Punt(char *fmt, ...)
+#else
+Punt(va_alist)
+ va_dcl
+#endif
{
- if ((ptr = realloc(ptr, size)) == NULL)
- enomem(size);
- return ptr;
-}
+ va_list ap;
+#ifdef __STDC__
+ va_start(ap, fmt);
+#else
+ char *fmt;
-void *
-ecalloc(s1, s2)
- size_t s1;
- size_t s2;
-{
- void *p;
+ va_start(ap);
+ fmt = va_arg(ap, char *);
+#endif
- if ((p = calloc(s1, s2)) == NULL)
- enomem(s1 * s2);
- return p;
-}
+ (void)fprintf(stderr, "make: ");
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ (void)fprintf(stderr, "\n");
-/* Support routines for hash tables. */
-void *
-hash_alloc(s, u)
- size_t s;
- void *u UNUSED;
-{
- return ecalloc(s, 1);
+ DieHorribly();
}
+/*-
+ * DieHorribly --
+ * Exit without giving a message.
+ *
+ * Side Effects:
+ * A big one...
+ */
void
-hash_free(p, s, u)
- void *p;
- size_t s UNUSED;
- void *u UNUSED;
+DieHorribly()
{
- free(p);
+ Job_AbortAll();
+ if (DEBUG(GRAPH2))
+ Targ_PrintGraph(2);
+ exit(2); /* Not 1, so -q can distinguish error */
}
-void *
-element_alloc(s, u)
- size_t s;
- void *u UNUSED;
-{
- return emalloc(s);
-}
-
-
-
/*
- * enomem --
- * die when out of memory.
+ * Finish --
+ * Called when aborting due to errors in child shell to signal
+ * abnormal exit.
+ *
+ * Side Effects:
+ * The program exits
*/
void
-enomem(size)
- size_t size;
+Finish(errors)
+ int errors; /* number of errors encountered in Make_Make */
{
- fprintf(stderr, "make: %s (%lu)\n", strerror(errno), (u_long)size);
- exit(2);
+ Fatal("%d error%s", errors, errors == 1 ? "" : "s");
}
-/*
- * esetenv --
- * change environment, die on error.
+
+/*-
+ * ParseVErrorInternal --
+ * Error message abort function for parsing. Prints out the context
+ * of the error (line number and file) as well as the message with
+ * two optional arguments.
+ *
+ * Side Effects:
+ * "fatals" is incremented if the level is PARSE_FATAL.
*/
-void
-esetenv(name, value)
- const char *name;
- const char *value;
+/* VARARGS */
+static void
+#ifdef __STDC__
+ParseVErrorInternal(const char *cfname, unsigned long clineno, int type,
+ const char *fmt, va_list ap)
+#else
+ParseVErrorInternal(va_alist)
+ va_dcl
+#endif
{
- if (setenv(name, value, 1) == 0)
- return;
-
- fprintf(stderr, "make: setenv failed (%s)\n", strerror(errno));
- exit(2);
+ (void)fprintf(stderr, "\"%s\", line %lu: ", cfname, clineno);
+ if (type == PARSE_WARNING)
+ (void)fprintf(stderr, "warning: ");
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ (void)fprintf(stderr, "\n");
+ if (type == PARSE_FATAL)
+ fatal_errors ++;
}
-
-/*
- * enunlink --
- * Remove a file carefully, avoiding directories.
+/*-
+ * Parse_Error --
+ * External interface to ParseVErrorInternal; uses the default filename
+ * Line number.
*/
-int
-eunlink(file)
- const char *file;
+/* VARARGS */
+void
+#ifdef __STDC__
+Parse_Error(int type, const char *fmt, ...)
+#else
+Parse_Error(va_alist)
+ va_dcl
+#endif
{
- struct stat st;
+ va_list ap;
+#ifdef __STDC__
+ va_start(ap, fmt);
+#else
+ int type; /* Error type (PARSE_WARNING, PARSE_FATAL) */
+ char *fmt;
- if (lstat(file, &st) == -1)
- return -1;
+ va_start(ap);
+ type = va_arg(ap, int);
+ fmt = va_arg(ap, char *);
+#endif
- if (S_ISDIR(st.st_mode)) {
- errno = EISDIR;
- return -1;
- }
- return unlink(file);
+ ParseVErrorInternal(Parse_Getfilename(), Parse_Getlineno(), type, fmt, ap);
}