|
|
1.1 root 1: /* errstr.c
2: Return a string for a uuconf error.
3:
4: Copyright (C) 1992 Ian Lance Taylor
5:
6: This file is part of the Taylor UUCP uuconf library.
7:
8: This library is free software; you can redistribute it and/or
9: modify it under the terms of the GNU Library General Public License
10: as published by the Free Software Foundation; either version 2 of
11: the License, or (at your option) any later version.
12:
13: This library is distributed in the hope that it will be useful, but
14: WITHOUT ANY WARRANTY; without even the implied warranty of
15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16: Library General Public License for more details.
17:
18: You should have received a copy of the GNU Library General Public
19: License along with this library; if not, write to the Free Software
20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21:
22: The author of the program may be contacted at [email protected] or
23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
24: */
25:
26: #include "uucnfi.h"
27:
28: #if USE_RCS_ID
29: const char _uuconf_errstr_rcsid[] = "$Id: errstr.c,v 1.1 93/07/30 08:07:09 bin Exp Locker: bin $";
30: #endif
31:
32: static char *zeprint_num P((char *zbuf, size_t cbuf, int ival));
33:
34: /* Return an error string for a uuconf error. This does not return a
35: uuconf error code, but instead returns the total buffer length. */
36:
37: int
38: uuconf_error_string (pglobal, ierr, zbuf, cbuf)
39: pointer pglobal;
40: int ierr;
41: char *zbuf;
42: size_t cbuf;
43: {
44: struct sglobal *qglobal = (struct sglobal *) pglobal;
45: const char *zfile;
46: size_t cfile;
47: const char *zlineno;
48: char ablineno[100];
49: size_t clineno;
50: const char *zmsg;
51: char abmsg[100];
52: size_t cmsg;
53: const char *zerrno;
54: size_t cerrno;
55: size_t cret;
56: size_t ccopy;
57:
58: /* The format of the message is
59:
60: filename:lineno: message: errno
61:
62: If there is no filename, the trailing colon is not output. If
63: there is no linenumber, the trailing colon is not output. If
64: there is no filename, the linenumber is not output, and neither
65: is the space before message. If there is no errno, the
66: preceeding colon and space are not output. */
67:
68: /* Get the filename to put in the error message, if any. */
69: if ((ierr & UUCONF_ERROR_FILENAME) == 0
70: || qglobal == NULL
71: || qglobal->zfilename == NULL)
72: {
73: zfile = "";
74: cfile = 0;
75: }
76: else
77: {
78: zfile = qglobal->zfilename;
79: cfile = strlen (zfile) + 1;
80: }
81:
82: /* Get the line number to put in the error message, if any. */
83: if (cfile == 0
84: || (ierr & UUCONF_ERROR_LINENO) == 0
85: || qglobal == NULL
86: || qglobal->ilineno <= 0)
87: {
88: zlineno = "";
89: clineno = 0;
90: }
91: else
92: {
93: zlineno = zeprint_num (ablineno, sizeof ablineno, qglobal->ilineno);
94: clineno = strlen (zlineno) + 1;
95: }
96:
97: /* Get the main message. */
98: switch (UUCONF_ERROR_VALUE (ierr))
99: {
100: case UUCONF_SUCCESS:
101: zmsg = "no error";
102: break;
103: case UUCONF_NOT_FOUND:
104: zmsg = "not found";
105: break;
106: case UUCONF_FOPEN_FAILED:
107: zmsg = "fopen";
108: break;
109: case UUCONF_FSEEK_FAILED:
110: zmsg = "fseek";
111: break;
112: case UUCONF_MALLOC_FAILED:
113: zmsg = "malloc";
114: break;
115: case UUCONF_SYNTAX_ERROR:
116: zmsg = "syntax error";
117: break;
118: default:
119: zmsg = zeprint_num (abmsg, sizeof abmsg, UUCONF_ERROR_VALUE (ierr));
120: zmsg -= sizeof "error " - 1;
121: memcpy ((pointer) zmsg, (pointer) "error ", sizeof "error " - 1);
122: break;
123: }
124:
125: cmsg = strlen (zmsg);
126: if (cfile > 0)
127: ++cmsg;
128:
129: /* Get the errno string. Note that strerror is not necessarily
130: reentrant. */
131: if ((ierr & UUCONF_ERROR_ERRNO) == 0
132: || qglobal == NULL)
133: {
134: zerrno = "";
135: cerrno = 0;
136: }
137: else
138: {
139: zerrno = strerror (qglobal->ierrno);
140: cerrno = strlen (zerrno) + 2;
141: }
142:
143: cret = cfile + clineno + cmsg + cerrno + 1;
144:
145: if (cbuf == 0)
146: return cret;
147:
148: /* Leave room for the null byte. */
149: --cbuf;
150:
151: if (cfile > 0)
152: {
153: ccopy = cfile - 1;
154: if (ccopy > cbuf)
155: ccopy = cbuf;
156: memcpy ((pointer) zbuf, (pointer) zfile, ccopy);
157: zbuf += ccopy;
158: cbuf -= ccopy;
159: if (cbuf > 0)
160: {
161: *zbuf++ = ':';
162: --cbuf;
163: }
164: }
165:
166: if (clineno > 0)
167: {
168: ccopy = clineno - 1;
169: if (ccopy > cbuf)
170: ccopy = cbuf;
171: memcpy ((pointer) zbuf, (pointer) zlineno, ccopy);
172: zbuf += ccopy;
173: cbuf -= ccopy;
174: if (cbuf > 0)
175: {
176: *zbuf++ = ':';
177: --cbuf;
178: }
179: }
180:
181: if (cbuf > 0 && cfile > 0)
182: {
183: *zbuf++ = ' ';
184: --cbuf;
185: --cmsg;
186: }
187: ccopy = cmsg;
188: if (ccopy > cbuf)
189: ccopy = cbuf;
190: memcpy ((pointer) zbuf, (pointer) zmsg, ccopy);
191: zbuf += ccopy;
192: cbuf -= ccopy;
193:
194: if (cerrno > 0)
195: {
196: if (cbuf > 0)
197: {
198: *zbuf++ = ':';
199: --cbuf;
200: }
201: if (cbuf > 0)
202: {
203: *zbuf++ = ' ';
204: --cbuf;
205: }
206: ccopy = cerrno - 2;
207: if (ccopy > cbuf)
208: ccopy = cbuf;
209: memcpy ((pointer) zbuf, (pointer) zerrno, ccopy);
210: zbuf += ccopy;
211: cbuf -= ccopy;
212: }
213:
214: *zbuf = '\0';
215:
216: return cret;
217: }
218:
219: /* Turn a number into a string. This should really call sprintf, but
220: since nothing else in the uuconf library calls any print routine,
221: it's more interesting to not call it here either. */
222:
223: static char *
224: zeprint_num (ab, c, i)
225: char *ab;
226: size_t c;
227: register int i;
228: {
229: register char *z;
230:
231: z = ab + c;
232: *--z = '\0';
233: do
234: {
235: *--z = i % 10 + '0';
236: i /= 10;
237: }
238: while (i != 0);
239:
240: return z;
241: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.