Annotation of coherent/g/usr/lib/uucp/tay104/uuconf/errstr.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.