rh

Hex Artifact Content
Login

Artifact c544e6b4a006969f2e3d51b9ce3000234642db98ffa391b96be1daeabc9dffd9:


0000: 2f 2a 0a 20 2a 20 65 72 72 6d 73 67 2e 63 0a 20  /*. * errmsg.c. 
0010: 2a 0a 20 2a 20 57 72 69 74 74 65 6e 20 62 79 3a  *. * Written by:
0020: 09 52 69 63 6b 20 4f 68 6e 65 6d 75 73 09 28 72  .Rick Ohnemus.(r
0030: 69 63 6b 40 73 74 65 72 6c 69 6e 67 2e 63 6f 6d  ick@sterling.com
0040: 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 66 69 6c  ). *. * This fil
0050: 65 20 63 6f 6e 74 61 69 6e 73 20 66 75 6e 63 74  e contains funct
0060: 69 6f 6e 73 20 74 6f 20 77 72 69 74 65 20 6d 65  ions to write me
0070: 73 73 61 67 65 73 20 74 6f 20 73 74 64 65 72 72  ssages to stderr
0080: 20 77 69 74 68 0a 20 2a 20 70 72 6f 67 72 61 6d   with. * program
0090: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   information and
00a0: 20 65 78 70 61 6e 64 65 64 20 65 72 72 6e 6f 20   expanded errno 
00b0: 6d 65 73 73 61 67 65 73 2e 0a 20 2a 0a 20 2a 20  messages.. *. * 
00c0: 47 6c 6f 62 61 6c 20 46 75 6e 63 74 69 6f 6e 73  Global Functions
00d0: 3a 20 65 72 72 6f 72 2c 20 77 61 72 6e 69 6e 67  : error, warning
00e0: 0a 20 2a 0a 20 2a 20 53 74 61 74 69 63 20 46 75  . *. * Static Fu
00f0: 6e 63 74 69 6f 6e 73 3a 20 70 65 72 63 65 6e 74  nctions: percent
0100: 5f 6d 2c 20 65 72 72 6d 73 67 0a 20 2a 2f 0a 0a  _m, errmsg. */..
0110: 23 69 66 20 21 64 65 66 69 6e 65 64 28 6c 69 6e  #if !defined(lin
0120: 74 29 0a 73 74 61 74 69 63 20 63 68 61 72 20 72  t).static char r
0130: 63 73 69 64 5b 5d 20 3d 20 22 24 49 64 3a 20 65  csid[] = "$Id: e
0140: 72 72 6d 73 67 2e 63 2c 76 20 31 2e 31 20 32 30  rrmsg.c,v 1.1 20
0150: 30 38 2f 31 32 2f 32 37 20 30 30 3a 35 36 3a 30  08/12/27 00:56:0
0160: 33 20 76 61 6e 64 79 73 20 45 78 70 20 76 61 6e  3 vandys Exp van
0170: 64 79 73 20 24 22 3b 0a 23 65 6e 64 69 66 0a 0a  dys $";.#endif..
0180: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
0190: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
01a0: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
01b0: 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c  <stdarg.h>.#incl
01c0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
01d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 09 09 09 50  const char *...P
01e0: 72 6f 67 72 61 6d 5f 6e 61 6d 65 3b 0a 23 69 6e  rogram_name;.#in
01f0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
0200: 0a 2f 2a 0a 20 2a 20 70 65 72 63 65 6e 74 5f 6d  ./*. * percent_m
0210: 3a 0a 20 2a 09 52 65 74 75 72 6e 20 70 6f 69 6e  :. *.Return poin
0220: 74 65 72 20 74 6f 20 27 25 6d 27 20 69 6e 20 61  ter to '%m' in a
0230: 20 73 74 72 69 6e 67 20 6f 72 20 28 63 68 61 72   string or (char
0240: 20 2a 29 20 4e 55 4c 4c 20 69 66 0a 20 2a 09 69   *) NULL if. *.i
0250: 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  t is not found. 
0260: 27 25 27 20 65 73 63 61 70 69 6e 67 20 69 73 20  '%' escaping is 
0270: 63 68 65 63 6b 65 64 2e 20 54 68 69 73 20 6d 65  checked. This me
0280: 61 6e 73 0a 20 2a 09 74 68 61 74 20 22 20 25 25  ans. *.that " %%
0290: 6d 20 22 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  m " does not con
02a0: 74 61 69 6e 20 27 25 6d 27 20 73 69 6e 63 65 20  tain '%m' since 
02b0: 74 68 65 20 27 25 27 20 69 73 0a 20 2a 09 65 73  the '%' is. *.es
02c0: 63 61 70 65 64 2e 0a 20 2a 2f 0a 0a 73 74 61 74  caped.. */..stat
02d0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  ic const char *p
02e0: 65 72 63 65 6e 74 5f 6d 28 63 6f 6e 73 74 20 63  ercent_m(const c
02f0: 68 61 72 20 2a 73 74 72 29 0a 7b 0a 20 20 20 20  har *str).{.    
0300: 77 68 69 6c 65 20 28 2a 73 74 72 20 21 3d 20 27  while (*str != '
0310: 5c 30 27 29 20 7b 0a 09 69 66 20 28 2a 73 74 72  \0') {..if (*str
0320: 20 3d 3d 20 27 25 27 29 20 7b 0a 09 20 20 20 20   == '%') {..    
0330: 69 66 20 28 2a 28 73 74 72 20 2b 20 31 29 20 3d  if (*(str + 1) =
0340: 3d 20 27 6d 27 29 20 7b 0a 09 09 72 65 74 75 72  = 'm') {...retur
0350: 6e 20 73 74 72 3b 0a 09 20 20 20 20 7d 0a 09 20  n str;..    }.. 
0360: 20 20 20 65 6c 73 65 20 69 66 20 28 2a 28 73 74     else if (*(st
0370: 72 20 2b 20 31 29 20 21 3d 20 27 5c 30 27 29 20  r + 1) != '\0') 
0380: 7b 0a 09 09 73 74 72 2b 2b 3b 0a 09 20 20 20 20  {...str++;..    
0390: 7d 0a 09 7d 0a 09 73 74 72 2b 2b 3b 0a 20 20 20  }..}..str++;.   
03a0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 4e   }..    return N
03b0: 55 4c 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 65  ULL;.}.../*. * e
03c0: 72 72 6d 73 67 3a 0a 20 2a 09 57 72 69 74 65 20  rrmsg:. *.Write 
03d0: 61 20 6d 65 73 73 61 67 65 20 74 6f 20 73 74 64  a message to std
03e0: 65 72 72 20 77 69 74 68 20 74 68 65 20 70 72 6f  err with the pro
03f0: 67 72 61 6d 20 6e 61 6d 65 20 61 74 20 74 68 65  gram name at the
0400: 0a 20 2a 09 62 65 67 69 6e 6e 69 6e 67 20 6f 66  . *.beginning of
0410: 20 74 68 65 20 6d 65 73 73 61 67 65 2e 20 49 66   the message. If
0420: 20 27 25 6d 27 20 69 73 20 66 6f 75 6e 64 20 69   '%m' is found i
0430: 6e 20 74 68 65 0a 20 2a 09 6d 65 73 73 61 67 65  n the. *.message
0440: 20 74 68 65 6e 20 72 65 70 6c 61 63 65 20 69 74   then replace it
0450: 20 77 69 74 68 20 74 65 78 74 20 64 65 73 63 72   with text descr
0460: 69 62 69 6e 67 20 74 68 65 20 76 61 6c 75 65 0a  ibing the value.
0470: 20 2a 09 69 6e 20 65 72 72 6e 6f 2e 20 46 69 6e   *.in errno. Fin
0480: 61 6c 6c 79 20 6f 75 74 70 75 74 20 61 20 6c 69  ally output a li
0490: 6e 65 20 66 65 65 64 20 61 74 20 74 68 65 20 65  ne feed at the e
04a0: 6e 64 20 6f 66 20 74 68 65 0a 20 2a 09 6d 65 73  nd of the. *.mes
04b0: 73 61 67 65 20 69 66 20 69 74 20 64 6f 65 73 20  sage if it does 
04c0: 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 61 20 6c  not end with a l
04d0: 69 6e 65 20 66 65 65 64 2e 0a 20 2a 2f 0a 0a 73  ine feed.. */..s
04e0: 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6d 73  tatic void errms
04f0: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f  g(const char *fo
0500: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 72  rmat, va_list ar
0510: 67 73 29 0a 7b 0a 20 20 20 20 63 6f 6e 73 74 20  gs).{.    const 
0520: 63 68 61 72 20 2a 09 6d 5f 70 74 72 3b 0a 20 20  char *.m_ptr;.  
0530: 20 20 63 68 61 72 20 2a 09 09 6e 66 70 3b 0a 20    char *..nfp;. 
0540: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 09     const char *.
0550: 70 3b 0a 20 20 20 20 63 68 61 72 09 09 6e 65 77  p;.    char..new
0560: 5f 66 6f 72 6d 61 74 5b 42 55 46 53 49 5a 20 2a  _format[BUFSIZ *
0570: 20 32 5d 3b 0a 20 20 20 20 69 6e 74 09 09 09 73   2];.    int...s
0580: 61 76 65 5f 65 72 72 6e 6f 20 3d 20 65 72 72 6e  ave_errno = errn
0590: 6f 3b 0a 0a 0a 20 20 20 20 28 76 6f 69 64 29 20  o;...    (void) 
05a0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
05b0: 22 25 73 3a 20 22 2c 20 50 72 6f 67 72 61 6d 5f  "%s: ", Program_
05c0: 6e 61 6d 65 29 3b 0a 20 20 20 20 0a 20 20 20 20  name);.    .    
05d0: 69 66 20 28 28 6d 5f 70 74 72 20 3d 20 70 65 72  if ((m_ptr = per
05e0: 63 65 6e 74 5f 6d 28 66 6f 72 6d 61 74 29 29 20  cent_m(format)) 
05f0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f 69  != NULL) {..(voi
0600: 64 29 20 73 74 72 6e 63 70 79 28 6e 65 77 5f 66  d) strncpy(new_f
0610: 6f 72 6d 61 74 2c 20 66 6f 72 6d 61 74 2c 20 6d  ormat, format, m
0620: 5f 70 74 72 20 2d 20 66 6f 72 6d 61 74 29 3b 0a  _ptr - format);.
0630: 09 6e 66 70 20 3d 20 6e 65 77 5f 66 6f 72 6d 61  .nfp = new_forma
0640: 74 20 2b 20 28 6d 5f 70 74 72 20 2d 20 66 6f 72  t + (m_ptr - for
0650: 6d 61 74 29 3b 0a 09 70 20 3d 20 73 74 72 65 72  mat);..p = strer
0660: 72 6f 72 28 73 61 76 65 5f 65 72 72 6e 6f 29 3b  ror(save_errno);
0670: 0a 09 69 66 20 28 70 29 20 7b 0a 09 20 20 20 20  ..if (p) {..    
0680: 77 68 69 6c 65 20 28 2a 70 29 20 7b 0a 09 09 2a  while (*p) {...*
0690: 6e 66 70 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 09 20  nfp++ = *p++;.. 
06a0: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09     }..} else {..
06b0: 20 20 20 20 28 76 6f 69 64 29 20 73 70 72 69 6e      (void) sprin
06c0: 74 66 28 6e 66 70 2c 20 22 55 6e 6b 6e 6f 77 6e  tf(nfp, "Unknown
06d0: 20 65 72 72 6f 72 20 3a 20 25 64 22 2c 20 73 61   error : %d", sa
06e0: 76 65 5f 65 72 72 6e 6f 29 3b 0a 09 20 20 20 20  ve_errno);..    
06f0: 6e 66 70 20 2b 3d 20 73 74 72 6c 65 6e 28 6e 66  nfp += strlen(nf
0700: 70 29 3b 0a 09 7d 0a 09 28 76 6f 69 64 29 20 73  p);..}..(void) s
0710: 74 72 63 70 79 28 6e 66 70 2c 20 6d 5f 70 74 72  trcpy(nfp, m_ptr
0720: 20 2b 20 32 29 3b 0a 09 66 6f 72 6d 61 74 20 3d   + 2);..format =
0730: 20 6e 65 77 5f 66 6f 72 6d 61 74 3b 0a 20 20 20   new_format;.   
0740: 20 7d 0a 20 20 20 20 0a 20 20 20 20 28 76 6f 69   }.    .    (voi
0750: 64 29 20 76 66 70 72 69 6e 74 66 28 73 74 64 65  d) vfprintf(stde
0760: 72 72 2c 20 66 6f 72 6d 61 74 2c 20 61 72 67 73  rr, format, args
0770: 29 3b 0a 20 20 20 20 0a 20 20 20 20 66 6f 72 20  );.    .    for 
0780: 28 70 20 3d 20 66 6f 72 6d 61 74 3b 20 2a 70 20  (p = format; *p 
0790: 21 3d 20 27 5c 30 27 3b 20 70 2b 2b 29 20 7b 0a  != '\0'; p++) {.
07a0: 09 3b 09 09 2f 2a 20 65 6d 70 74 79 20 6c 6f 6f  .;../* empty loo
07b0: 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 0a  p */.    }.    .
07c0: 20 20 20 20 69 66 20 28 2a 28 70 20 2d 20 31 29      if (*(p - 1)
07d0: 20 21 3d 20 27 5c 6e 27 29 20 7b 0a 09 28 76 6f   != '\n') {..(vo
07e0: 69 64 29 20 70 75 74 63 28 27 5c 6e 27 2c 20 73  id) putc('\n', s
07f0: 74 64 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  tderr);.    }.  
0800: 20 20 0a 20 20 20 20 28 76 6f 69 64 29 20 66 66    .    (void) ff
0810: 6c 75 73 68 28 73 74 64 65 72 72 29 3b 0a 0a 20  lush(stderr);.. 
0820: 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0c 0a 2f     return;.}.../
0830: 2a 0a 20 2a 20 65 72 72 6f 72 3a 0a 20 2a 09 43  *. * error:. *.C
0840: 61 6c 6c 73 20 65 72 72 6d 73 67 28 29 20 61 6e  alls errmsg() an
0850: 64 20 65 78 69 74 73 2e 0a 20 2a 2f 0a 0a 76 6f  d exits.. */..vo
0860: 69 64 20 65 72 72 6f 72 28 63 6f 6e 73 74 20 63  id error(const c
0870: 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e 2e  har *format, ...
0880: 29 0a 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20  ).{.    va_list 
0890: 61 72 67 73 3b 0a 20 20 20 20 0a 20 20 20 20 76  args;.    .    v
08a0: 61 5f 73 74 61 72 74 28 61 72 67 73 2c 20 66 6f  a_start(args, fo
08b0: 72 6d 61 74 29 3b 0a 20 20 20 20 28 76 6f 69 64  rmat);.    (void
08c0: 29 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ) fflush(stdout)
08d0: 3b 0a 20 20 20 20 65 72 72 6d 73 67 28 66 6f 72  ;.    errmsg(for
08e0: 6d 61 74 2c 20 61 72 67 73 29 3b 0a 20 20 20 20  mat, args);.    
08f0: 76 61 5f 65 6e 64 28 61 72 67 73 29 3b 0a 20 20  va_end(args);.  
0900: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 2f    exit(1);.    /
0910: 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 7d 0a  *NOTREACHED*/.}.
0920: 0c 0a 2f 2a 0a 20 2a 20 77 61 72 6e 69 6e 67 3a  ../*. * warning:
0930: 0a 20 2a 09 43 61 6c 6c 73 20 65 72 72 6d 73 67  . *.Calls errmsg
0940: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 2e 0a  () and returns..
0950: 20 2a 2f 0a 0a 76 6f 69 64 20 77 61 72 6e 69 6e   */..void warnin
0960: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f  g(const char *fo
0970: 72 6d 61 74 2c 20 2e 2e 2e 29 0a 7b 0a 20 20 20  rmat, ...).{.   
0980: 20 76 61 5f 6c 69 73 74 20 61 72 67 73 3b 0a 20   va_list args;. 
0990: 20 20 20 0a 20 20 20 20 76 61 5f 73 74 61 72 74     .    va_start
09a0: 28 61 72 67 73 2c 20 66 6f 72 6d 61 74 29 3b 0a  (args, format);.
09b0: 20 20 20 20 28 76 6f 69 64 29 20 66 66 6c 75 73      (void) fflus
09c0: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 65  h(stdout);.    e
09d0: 72 72 6d 73 67 28 66 6f 72 6d 61 74 2c 20 61 72  rrmsg(format, ar
09e0: 67 73 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  gs);.    va_end(
09f0: 61 72 67 73 29 3b 0a 20 20 20 20 72 65 74 75 72  args);.    retur
0a00: 6e 3b 0a 7d 0a                                   n;.}.