1 /*\
2 * COPYRIGHT 1990
3 * DIGITAL EQUIPMENT CORPORATION
4 * MAYNARD, MASSACHUSETTS
5 * ALL RIGHTS RESERVED.
6 *
7 * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
8 * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
9 * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE
10 * FOR ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED
11 * WARRANTY.
12 *
13 * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
14 * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
15 * ADDITION TO THAT SET FORTH ABOVE.
16 *
17 * Permission to use, copy, modify, and distribute this software and its
18 * documentation for any purpose and without fee is hereby granted, provided
19 * that the above copyright notice appear in all copies and that both that
20 * copyright notice and this permission notice appear in supporting
21 * documentation, and that the name of Digital Equipment Corporation not be
22 * used in advertising or publicity pertaining to distribution of the
23 * software without specific, written prior permission.
24 \*/
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include "utils.h"
31 #include <ctype.h>
32 #include <stdlib.h>
33
34 unsigned int debugFlags;
35
36
37 /***====================================================================***/
38
39 static FILE *errorFile = NULL;
40
41 Boolean
uSetErrorFile(const char * name)42 uSetErrorFile(const char *name)
43 {
44 if ((errorFile != NULL) && (errorFile != stderr)) {
45 fprintf(errorFile, "switching to %s\n", name ? name : "stderr");
46 fclose(errorFile);
47 }
48 if (name != NullString)
49 errorFile = fopen(name, "w");
50 else
51 errorFile = stderr;
52 if (errorFile == NULL) {
53 errorFile = stderr;
54 return (False);
55 }
56 return (True);
57 }
58
59 void
uInformation(const char * s,...)60 uInformation(const char *s, ...)
61 {
62 va_list ap;
63
64 va_start(ap, s);
65 vfprintf(errorFile, s, ap);
66 fflush(errorFile);
67 va_end(ap);
68 return;
69 }
70
71 /***====================================================================***/
72
73 void
uAction(const char * s,...)74 uAction(const char *s, ...)
75 {
76 va_list ap;
77
78 va_start(ap, s);
79 fprintf(errorFile, " ");
80 vfprintf(errorFile, s, ap);
81 fflush(errorFile);
82 va_end(ap);
83 return;
84 }
85
86 /***====================================================================***/
87
88 void
uWarning(const char * s,...)89 uWarning(const char *s, ...)
90 {
91 va_list ap;
92
93 va_start(ap, s);
94 fprintf(errorFile, "Warning: ");
95 vfprintf(errorFile, s, ap);
96 fflush(errorFile);
97 va_end(ap);
98 return;
99 }
100
101 /***====================================================================***/
102
103 void
uError(const char * s,...)104 uError(const char *s, ...)
105 {
106 va_list ap;
107
108 va_start(ap, s);
109 fprintf(errorFile, "Error: ");
110 vfprintf(errorFile, s, ap);
111 fflush(errorFile);
112 va_end(ap);
113 return;
114 }
115
116 /***====================================================================***/
117
118 void
uFatalError(const char * s,...)119 uFatalError(const char *s, ...)
120 {
121 va_list ap;
122
123 va_start(ap, s);
124 fprintf(errorFile, "Fatal Error: ");
125 vfprintf(errorFile, s, ap);
126 fprintf(errorFile, " Exiting\n");
127 fflush(errorFile);
128 va_end(ap);
129 exit(1);
130 /* NOTREACHED */
131 }
132
133 /***====================================================================***/
134
135 void
uInternalError(const char * s,...)136 uInternalError(const char *s, ...)
137 {
138 va_list ap;
139
140 va_start(ap, s);
141 fprintf(errorFile, "Internal error: ");
142 vfprintf(errorFile, s, ap);
143 fflush(errorFile);
144 va_end(ap);
145 return;
146 }
147
148 /***====================================================================***/
149
150 #ifndef HAVE_ASPRINTF
151 int
uAsprintf(char ** ret,const char * format,...)152 uAsprintf(char ** ret, const char *format, ...)
153 {
154 char buf[256];
155 int len;
156 va_list ap;
157
158 va_start(ap, format);
159 len = vsnprintf(buf, sizeof(buf), format, ap);
160 va_end(ap);
161
162 if (len < 0)
163 return -1;
164
165 if (len < sizeof(buf))
166 {
167 *ret = strdup(buf);
168 }
169 else
170 {
171 *ret = malloc(len + 1); /* snprintf doesn't count trailing '\0' */
172 if (*ret != NULL)
173 {
174 va_start(ap, format);
175 len = vsnprintf(*ret, len + 1, format, ap);
176 va_end(ap);
177 if (len < 0) {
178 free(*ret);
179 *ret = NULL;
180 }
181 }
182 }
183
184 if (*ret == NULL)
185 return -1;
186
187 return len;
188 }
189 #endif /* HAVE_ASPRINTF */
190