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