ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libukcprog/src/errf.c
Revision: 1.1
Committed: Sat Mar 29 16:30:33 2003 UTC (21 years, 1 month ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: LIBUKCPROG_1_0_2, LIBUKCPROG_1_0_1, LIBUKCPROG_1_0, HEAD
Log Message:
libukcprog is now a seperate package. I doubt this will be much use to
anyone other than us, but I see no reason why we can't package it up
and distribute it. Obviously we can't attach the GPL to this, as we
don't own it.

File Contents

# Content
1 /* errf.c -- formatted error messages */
2
3 /* Copyright 1992 Godfrey Paul, University of Kent at Canterbury.
4 *
5 * You can do what you like with this source code as long as
6 * you don't try to make money out of it and you include an
7 * unaltered copy of this message (including the copyright).
8 */
9
10 char ukcprog_errf_sccsid[] = "$Id: errf.c,v 1.16 1995/11/26 16:05:56 mtr Exp $ UKC";
11
12 #ifdef __STDC__
13 #include <stdarg.h>
14 #else
15 #include <varargs.h>
16 #endif
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21
22 #include "ukcprog.h"
23
24 static const char *munge_progname PROTO((const char *));
25 static void default_ofunc PROTO((const char *str));
26
27 static errf_ofunc_t User_errf_ofunc = default_ofunc;
28 static const char *Output_prefix = "";
29 static char *Progname = NULL;
30
31 static void
32 default_ofunc(str)
33 const char *str;
34 {
35 fprintf(stderr, "%s%s\n", Output_prefix, str);
36 fflush(stderr);
37 }
38
39 errf_ofunc_t
40 errf_set_ofunc(func)
41 errf_ofunc_t func;
42 {
43 errf_ofunc_t old;
44
45 if (func == NULL)
46 func = default_ofunc;
47
48 old = User_errf_ofunc;
49 User_errf_ofunc = func;
50
51 return old;
52 }
53
54
55 /* errf_set_prefix()
56 * Sets the string that errf() prefixes to messages.
57 * Returns the old one.
58 */
59 const char *
60 errf_set_prefix(prefix)
61 const char *prefix;
62 {
63 const char *old;
64
65 old = Output_prefix;
66 Output_prefix = prefix;
67
68 return old;
69 }
70
71
72 /* errf_get_prefix()
73 * Return the current prefix.
74 */
75 const char *
76 errf_get_prefix()
77 {
78 return Output_prefix;
79 }
80
81
82 static const char *
83 munge_progname(progname)
84 const char *progname;
85 {
86 #ifdef VMS
87 const char *name, *dot;
88 char *s;
89 int i;
90
91 if ((name = strrchr(progname, ']')) == NULL)
92 name = progname;
93 else
94 ++name;
95
96 if ((dot = strchr(name, '.')) == NULL)
97 dot = name + strlen(name);
98
99 s = strf("%.*s", dot - name, name);
100
101 for (i = 0; i < dot - name; ++i)
102 s[i] = toupper(s[i]);
103
104 if (Progname != NULL)
105 free(Progname);
106
107 Progname = s;
108
109 return "%%%s, ";
110 #else
111 #ifdef MSDOS
112 const char *name;
113
114 if ((name = strrchr(progname, '\\')) == NULL)
115 name = progname;
116
117 else
118 ++name;
119
120 if (Progname != NULL)
121 free(Progname);
122
123 Progname = strsave(name);
124
125 return "%s: ";
126 #else
127 /* Everything is assumed to be some variant of Unix.
128 */
129 const char *name;
130
131 if ((name = strrchr(progname, '/')) == NULL)
132 name = progname;
133
134 else
135 ++name;
136
137 if (Progname != NULL)
138 free(Progname);
139
140 Progname = strsave(name);
141
142 return "%s: ";
143 #endif /* !MSDOS */
144 #endif /* !VMS */
145 }
146
147
148 /* errf_set_progname()
149 * Convenience routine to set the errf prefix to include the progname.
150 */
151 void
152 errf_set_progname(name)
153 const char *name;
154 {
155 const char *fmt;
156
157 fmt = munge_progname(name);
158 errf_set_prefix(strf(fmt, Progname));
159 }
160
161
162 /* errf_get_progname()
163 */
164 const char *
165 errf_get_progname()
166 {
167 return Progname;
168 }
169
170
171 #ifdef __STDC__
172 void
173 errf(const char *fmt, ...)
174 {
175
176 #else /* !__STDC__ */
177 void
178 errf(va_alist)
179 va_dcl
180 {
181 char *fmt;
182 #endif /* !__STDC__ */
183 va_list args;
184 char buffer[100];
185 char *s;
186
187 #ifdef __STDC__
188 va_start(args, fmt);
189 #else
190 va_start(args);
191 fmt = va_arg(args, char *);
192 #endif
193
194 s = formf(buffer, sizeof(buffer), fmt, args);
195
196 va_end(args);
197
198 (*User_errf_ofunc)(s);
199
200 if (s != buffer) /* must have been obtained from malloc */
201 free(s);
202 }
203
204
205 /* errf_usage()
206 * Output a usage string prefixed by the program name and exit(1).
207 */
208 void
209 errf_usage(usage)
210 const char *usage;
211 {
212 if (User_errf_ofunc != default_ofunc)
213 (*User_errf_ofunc)(strf("Usage: %s %s", Progname, usage));
214 else
215 fprintf(stderr, "Usage: %s %s\n", Progname, usage);
216 exit(1);
217 }