home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum7.lzh / RICO / C / LIBSOURCE / ARGPROC / lose.c < prev    next >
Text File  |  2009-11-06  |  5KB  |  200 lines

  1. /*--------------------------------------------------------------------------
  2.  Routines to build and print error messages.
  3.  Includes:  ErrStr, ProgTitle, lose_title(), lose(), warn(), and PrintErr().
  4. --------------------------------------------------------------------------*/
  5.  
  6. #include <varargs.h>
  7.  
  8. #ifdef os9
  9. #define    void    int
  10.  
  11. /*    vsprintf(buf,ctrl,va) - sprintf using va arguments    */
  12. int vsprintf(buf,ctrl,va)
  13. char *buf,*ctrl;
  14. va_list *va;
  15. {
  16.     register int i;
  17.     int a[10];
  18.  
  19.     for(i=0; i < 10; i++)
  20.         a[i] = va_arg(va,int);
  21.     return sprintf(buf,ctrl,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
  22. }
  23. #endif
  24.  
  25. #include <stdio.h>
  26. #include <strings.h>
  27.  
  28. #include <errno.h>
  29. #include <lose.h>
  30.  
  31. #ifndef os9
  32. /*LINTLIBRARY*/
  33. #ifndef lint
  34. static char Sccs_id[] = "@(#)lose.c    from 1.16 5/31/87 (C) SRS";
  35. #endif
  36. #endif
  37.  
  38. #define MAX_STR_LEN 200
  39. #define MAX_ERR_STR_LEN 1000
  40.  
  41. /* Private variables */
  42. static char title[MAX_STR_LEN] = "program_name";
  43. static char errorString[MAX_ERR_STR_LEN] = "";
  44.  
  45. /* Public variables */
  46. char *ProgTitle = title;
  47. char *ErrStr = errorString;
  48.  
  49. /*--------------------------------------------------------------------------
  50.  Store the title of the program, initialize errno to zero.
  51. --------------------------------------------------------------------------*/
  52. void
  53. lose_title(name)
  54.     char *name;
  55. {
  56.     errno = 0;
  57.     ProgTitle[MAX_STR_LEN-1] = '\0';
  58.     (void) strncpy(ProgTitle, name, MAX_STR_LEN-1);
  59. }
  60.  
  61.  
  62. /*--------------------------------------------------------------------------
  63.  Build an error message, then maybe print it to stderr and maybe exit,
  64.  as indicated by errMode.
  65. --------------------------------------------------------------------------*/
  66.  
  67. static void
  68. _print_error(errMode, format, ap)
  69.     int errMode;
  70.     char *format;
  71.     va_list *ap;
  72. {
  73. #ifndef os9
  74.     extern int sys_nerr;
  75.     extern char *sys_errlist[];
  76. #endif
  77.  
  78.     /* Print the program name to the buffer */
  79.     (void) sprintf(ErrStr, "%s: ", ProgTitle);
  80.  
  81.     /* Append the message to the buffer */
  82.     vsprintf(ErrStr + strlen(ErrStr), format, ap);
  83.  
  84. #ifndef os9
  85.     /* Append the system error message, if any */
  86.     if (errno > 0 && errno < sys_nerr) {
  87.     (void) strcat(ErrStr, "-- ");
  88.     (void) strcat(ErrStr, sys_errlist[errno]);
  89.     }
  90. #endif
  91.  
  92.     /* Print the message to the console and/or exit, as indicated by errMode */
  93.     switch(errMode) {
  94.     case ERR_FATAL: 
  95.     (void) fprintf(stderr, "%s\n", ErrStr);
  96.     exit(1);
  97.     break;
  98.     case ERR_WARN: 
  99.     (void) fprintf(stderr, "%s\n", ErrStr);
  100.     break;
  101.     case ERR_NOTE: 
  102.     break;
  103.     default:
  104.     (void) fprintf(stderr, "%s\n", ErrStr);
  105.     lose("illegal call to PrintErr with error mode %d\n", errMode);
  106.     break;
  107.     }
  108. }
  109.  
  110. /*--------------------------------------------------------------------------
  111.  Lint definitions to make lint shut up...
  112.  you may safely omit this section if you don't use lint.
  113. --------------------------------------------------------------------------*/
  114. #ifdef lint
  115.     /*ARGSUSED*/
  116.     /*VARARGS1*/            /* Only check first argument */
  117.     void warn(message) char *message;    /* First arg must be char *  */
  118.     { message[0]=0; }            /* Dummy function body       */
  119.  
  120.     /*ARGSUSED*/
  121.     /*VARARGS1*/            /* Only check first argument */
  122.     void lose(message) char *message;    /* First arg must be char *  */
  123.     { message[0]=0; }            /* Dummy function body       */
  124.  
  125.     /*ARGSUSED*/
  126.     /*VARARGS1*/            /* Only check first argument */
  127.     void Epitaph(message) char *message;/* First arg must be char *  */
  128.     { message[0]=0; }            /* Dummy function body       */
  129.  
  130.     /*ARGSUSED*/
  131.     /*VARARGS2*/            /* Check first 2 arguments   */
  132.     void PrintErr(errMode, message)
  133.     int errMode;            /* First arg must be int     */
  134.     char *message;            /* Second arg must be char * */
  135.     { message[0]=(char)errMode; }    /* Dummy function body       */
  136. #else
  137.  
  138. /*--------------------------------------------------------------------------
  139.  Various methods of calling _print_error():
  140.  
  141.  For nonfatal errors:
  142.     warn(format, ...)    -> _print_error(ERR_WARN,  format, ...)
  143.  
  144.  For fatal I/O errors (this one is the most useful):
  145.     lose(format, ...)    -> _print_error(ERR_FATAL, format, ...)
  146.  
  147.  For fatal non-I/O errors:
  148.     Epitaph(format, ...) -> errno=0, _print_error(ERR_FATAL, format, ...)
  149.  
  150.  For nonfatal errors when you don't want message printed to stderr:
  151.     PrintErr(errMode, format, ...) -> _print_error(errMode, format, ...)
  152. --------------------------------------------------------------------------*/
  153. /*VARARGS2*/
  154. void
  155. PrintErr(errMode, format, va_alist)
  156.     int errMode;
  157.     char *format;
  158.     va_dcl
  159. {
  160.     va_list ap;
  161.     va_start(&ap);
  162.     _print_error(errMode, format, &ap);
  163. }
  164.  
  165. /*VARARGS1*/
  166. void
  167. warn(format, va_alist)
  168.     char *format;
  169.     va_dcl
  170. {
  171.     va_list ap;
  172.     va_start(&ap);
  173.     _print_error(ERR_WARN, format, &ap);
  174. }
  175.  
  176. /*VARARGS1*/
  177. void
  178. lose(format, va_alist)
  179.     char *format;
  180.     va_dcl
  181. {
  182.     va_list ap;
  183.     va_start(&ap);
  184.     _print_error(ERR_FATAL, format, &ap);
  185. }
  186.  
  187. /*VARARGS1*/
  188. void
  189. Epitaph(format, va_alist)
  190.     char *format;
  191.     va_dcl
  192. {
  193.     va_list ap;
  194.     va_start(&ap);
  195.     errno = 0;
  196.     _print_error(ERR_FATAL, format, &ap);
  197. }
  198.  
  199. #endif
  200.