5d018ccc98778040998ae46ff59fb9f2e846be3b
[openafs.git] / src / package / messages.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*------------------------------------------------------------------------
11  * messages.c
12  *
13  * Description:
14  *      Getting messages printed to the outside world.
15  *
16  *------------------------------------------------------------------------*/
17
18 #ifdef  lint
19 /* VARARGS1 */ fatal(cp)
20      char *
21          cp;
22  /*ARGSUSED*/
23 {
24 }
25
26 /* VARARGS1 */ message(cp)
27      char *
28          cp;
29  /*ARGSUSED*/
30 {
31 }
32
33 /* VARARGS1 */ loudonly_message(cp)
34      char *
35          cp;
36  /*ARGSUSED*/
37 {
38 }
39
40 /* VARARGS1 */ verbose_message(cp)
41      char *
42          cp;
43  /*ARGSUSED*/
44 {
45 }
46 #else /* lint */
47
48 #include <afs/param.h>
49 #include <sys/types.h>
50 #ifdef  AFS_SUN5_ENV
51 /* XXX Hack for the va_arg decl below XXX */
52 #define lint
53 #endif
54 #include <varargs.h>
55 #include "package.h"
56 #include <errno.h>
57
58
59 static char *
60 putnum(dp, n, b)
61      register char *dp;
62      register unsigned n;
63      register int b;
64
65 {                               /*putnum */
66     register int s;
67
68     for (s = b; n / s; s *= b)
69         continue;
70     s /= b;
71     while (s > 0) {
72         *dp++ = '0' + (n / s);
73         n %= s;
74         s /= b;
75     }
76
77     return (dp);
78
79 }                               /*putnum */
80
81 static char *
82 putstr(dp, s)
83      register char *dp;
84      register char *s;
85
86 {                               /*putstr */
87
88     while (*s)
89         *dp++ = *s++;
90
91     return (dp);
92
93 }                               /*putstr */
94
95 static char *
96 putformat(dp, fp, ap)
97      register char *dp;
98      register char *fp;
99      register va_list ap;
100
101 {                               /*putformat */
102
103     while (*fp) {
104         if (*fp == '%') {
105             switch (*++fp) {
106             case 'c':
107                 {
108                     char c;
109
110                     c = va_arg(ap, int);
111                     *dp++ = c;
112                     fp++;
113                     break;
114                 }
115             case 'd':
116                 {
117                     int d;
118
119                     d = va_arg(ap, int);
120                     if (d < 0) {
121                         *dp++ = '-';
122                         d = -d;
123                     }
124                     dp = putnum(dp, (unsigned)d, 10);
125                     fp++;
126                     break;
127                 }
128             case 'm':
129                 {
130                     extern int sys_nerr;
131                     extern char *sys_errlist[];
132
133                     if (errno >= 0 && errno < sys_nerr)
134                         dp = putstr(dp, sys_errlist[errno]);
135                     else {
136                         dp = putstr(dp, "Unknown error (errorno =");
137                         dp = putnum(dp, (unsigned)errno, 10);
138                         dp = putstr(dp, ")");
139                     }
140                     fp++;
141                     break;
142                 }
143             case 'o':
144                 {
145                     unsigned o;
146
147                     o = va_arg(ap, int);
148                     dp = putnum(dp, o, 8);
149                     fp++;
150                     break;
151                 }
152             case 's':
153                 {
154                     char *s;
155
156                     s = va_arg(ap, char *);
157                     dp = putstr(dp, s);
158                     fp++;
159                     break;
160                 }
161             case 'u':
162                 {
163                     unsigned u;
164
165                     u = va_arg(ap, int);
166                     dp = putnum(dp, u, 10);
167                     fp++;
168                     break;
169                 }
170             case 'x':
171                 {
172                     unsigned x;
173
174                     x = va_arg(ap, int);
175                     dp = putnum(dp, x, 16);
176                     fp++;
177                     break;
178                 }
179             }
180             continue;
181         }
182         if (*fp == '\\') {
183             switch (*++fp) {
184             case '\\':
185                 *dp++ = '\\';
186                 fp++;
187                 break;
188
189             case 'f':
190                 *dp++ = '\f';
191                 fp++;
192                 break;
193
194             case 'n':
195                 *dp++ = '\n';
196                 fp++;
197                 break;
198
199             case 'r':
200                 *dp++ = '\r';
201                 fp++;
202                 break;
203
204             case 't':
205                 *dp++ = '\t';
206                 fp++;
207                 break;
208
209             }
210             continue;
211         }
212         *dp++ = *fp++;
213     }
214
215     return (dp);
216
217 }                               /*putformat */
218
219 #define maxline 256
220
221 fatal(va_alist)
222      va_dcl
223 {                               /*fatal */
224
225     va_list ap;
226     char *dp, *fp;
227     char line[maxline];
228
229     va_start(ap);
230     fp = va_arg(ap, char *);
231     dp = putformat(line, fp, ap);
232     *dp++ = '\n';
233     (void)write(2, line, dp - line);
234     exit(status_error);
235
236 }                               /*fatal */
237
238 message(va_alist)
239      va_dcl
240 {                               /*message */
241
242     va_list ap;
243     char *dp, *fp;
244     char line[maxline];
245
246     va_start(ap);
247     fp = va_arg(ap, char *);
248     dp = putformat(line, fp, ap);
249     *dp++ = '\n';
250     (void)write(1, line, dp - line);
251
252 }                               /*message */
253
254 loudonly_message(va_alist)
255      va_dcl
256 {                               /*loudonly_message */
257
258     va_list ap;
259     char *dp, *fp;
260     char line[maxline];
261
262     if (!opt_silent) {
263         va_start(ap);
264         fp = va_arg(ap, char *);
265         dp = putformat(line, fp, ap);
266         *dp++ = '\n';
267         (void)write(1, line, dp - line);
268     }
269
270 }                               /*loudonly_message */
271
272 verbose_message(va_alist)
273      va_dcl
274 {                               /*verbose_message */
275
276     va_list ap;
277     char *dp, *fp;
278     char line[maxline];
279
280     if (opt_verbose) {
281         va_start(ap);
282         fp = va_arg(ap, char *);
283         dp = putformat(line, fp, ap);
284         *dp++ = '\n';
285         (void)write(1, line, dp - line);
286     }
287
288 }                               /*verbose_message */
289
290 debug_message(va_alist)
291      va_dcl
292 {                               /*debug_message */
293
294     va_list ap;
295     char *dp, *fp;
296     char line[maxline];
297
298     if (opt_debug) {
299         va_start(ap);
300         fp = va_arg(ap, char *);
301         dp = putformat(line, fp, ap);
302         *dp++ = '\n';
303         (void)write(1, line, dp - line);
304     }
305
306 }                               /*debug_message */
307
308 #endif /* lint */