prototyping-20040623
[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(register char *dp, register unsigned n, register int b)
61 {                               /*putnum */
62     register int s;
63
64     for (s = b; n / s; s *= b)
65         continue;
66     s /= b;
67     while (s > 0) {
68         *dp++ = '0' + (n / s);
69         n %= s;
70         s /= b;
71     }
72
73     return (dp);
74
75 }                               /*putnum */
76
77 static char *
78 putstr(register char *dp, register char *s)
79 {                               /*putstr */
80
81     while (*s)
82         *dp++ = *s++;
83
84     return (dp);
85
86 }                               /*putstr */
87
88 static char *
89 putformat(register char *dp, register char *fp, register va_list ap)
90 {                               /*putformat */
91
92     while (*fp) {
93         if (*fp == '%') {
94             switch (*++fp) {
95             case 'c':
96                 {
97                     char c;
98
99                     c = va_arg(ap, int);
100                     *dp++ = c;
101                     fp++;
102                     break;
103                 }
104             case 'd':
105                 {
106                     int d;
107
108                     d = va_arg(ap, int);
109                     if (d < 0) {
110                         *dp++ = '-';
111                         d = -d;
112                     }
113                     dp = putnum(dp, (unsigned)d, 10);
114                     fp++;
115                     break;
116                 }
117             case 'm':
118                 {
119                     extern int sys_nerr;
120                     extern char *sys_errlist[];
121
122                     if (errno >= 0 && errno < sys_nerr)
123                         dp = putstr(dp, sys_errlist[errno]);
124                     else {
125                         dp = putstr(dp, "Unknown error (errorno =");
126                         dp = putnum(dp, (unsigned)errno, 10);
127                         dp = putstr(dp, ")");
128                     }
129                     fp++;
130                     break;
131                 }
132             case 'o':
133                 {
134                     unsigned o;
135
136                     o = va_arg(ap, int);
137                     dp = putnum(dp, o, 8);
138                     fp++;
139                     break;
140                 }
141             case 's':
142                 {
143                     char *s;
144
145                     s = va_arg(ap, char *);
146                     dp = putstr(dp, s);
147                     fp++;
148                     break;
149                 }
150             case 'u':
151                 {
152                     unsigned u;
153
154                     u = va_arg(ap, int);
155                     dp = putnum(dp, u, 10);
156                     fp++;
157                     break;
158                 }
159             case 'x':
160                 {
161                     unsigned x;
162
163                     x = va_arg(ap, int);
164                     dp = putnum(dp, x, 16);
165                     fp++;
166                     break;
167                 }
168             }
169             continue;
170         }
171         if (*fp == '\\') {
172             switch (*++fp) {
173             case '\\':
174                 *dp++ = '\\';
175                 fp++;
176                 break;
177
178             case 'f':
179                 *dp++ = '\f';
180                 fp++;
181                 break;
182
183             case 'n':
184                 *dp++ = '\n';
185                 fp++;
186                 break;
187
188             case 'r':
189                 *dp++ = '\r';
190                 fp++;
191                 break;
192
193             case 't':
194                 *dp++ = '\t';
195                 fp++;
196                 break;
197
198             }
199             continue;
200         }
201         *dp++ = *fp++;
202     }
203
204     return (dp);
205
206 }                               /*putformat */
207
208 #define maxline 256
209
210 fatal(va_alist)
211      va_dcl
212 {                               /*fatal */
213
214     va_list ap;
215     char *dp, *fp;
216     char line[maxline];
217
218     va_start(ap);
219     fp = va_arg(ap, char *);
220     dp = putformat(line, fp, ap);
221     *dp++ = '\n';
222     (void)write(2, line, dp - line);
223     exit(status_error);
224
225 }                               /*fatal */
226
227 message(va_alist)
228      va_dcl
229 {                               /*message */
230
231     va_list ap;
232     char *dp, *fp;
233     char line[maxline];
234
235     va_start(ap);
236     fp = va_arg(ap, char *);
237     dp = putformat(line, fp, ap);
238     *dp++ = '\n';
239     (void)write(1, line, dp - line);
240
241 }                               /*message */
242
243 loudonly_message(va_alist)
244      va_dcl
245 {                               /*loudonly_message */
246
247     va_list ap;
248     char *dp, *fp;
249     char line[maxline];
250
251     if (!opt_silent) {
252         va_start(ap);
253         fp = va_arg(ap, char *);
254         dp = putformat(line, fp, ap);
255         *dp++ = '\n';
256         (void)write(1, line, dp - line);
257     }
258
259 }                               /*loudonly_message */
260
261 verbose_message(va_alist)
262      va_dcl
263 {                               /*verbose_message */
264
265     va_list ap;
266     char *dp, *fp;
267     char line[maxline];
268
269     if (opt_verbose) {
270         va_start(ap);
271         fp = va_arg(ap, char *);
272         dp = putformat(line, fp, ap);
273         *dp++ = '\n';
274         (void)write(1, line, dp - line);
275     }
276
277 }                               /*verbose_message */
278
279 debug_message(va_alist)
280      va_dcl
281 {                               /*debug_message */
282
283     va_list ap;
284     char *dp, *fp;
285     char line[maxline];
286
287     if (opt_debug) {
288         va_start(ap);
289         fp = va_arg(ap, char *);
290         dp = putformat(line, fp, ap);
291         *dp++ = '\n';
292         (void)write(1, line, dp - line);
293     }
294
295 }                               /*debug_message */
296
297 #endif /* lint */