home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume9 / pc-mail-nfs / percentm.c < prev    next >
C/C++ Source or Header  |  1989-11-26  |  2KB  |  83 lines

  1. /*++
  2. /* NAME
  3. /*    percentm 3
  4. /* SUMMARY
  5. /*    convert %m to system error message
  6. /* PROJECT
  7. /*    pc-mail
  8. /* PACKAGE
  9. /*    nfs
  10. /* SYNOPSIS
  11. /*    #include percentm.h
  12. /*
  13. /*    char *percentm(string, err)
  14. /*    char *string;
  15. /*    int err;
  16. /* DESCRIPTION
  17. /*    percentm() interprets %m format specificiers in \fIstring\fR
  18. /*    In the output, %m will be replaced by the error message that
  19. /*    corresponds with the error value \fIerr\fR (see <errno.h>.
  20. /* BUGS
  21. /*    The result is stored in static memory that is overwritten with
  22. /*    each call.
  23. /* AUTHOR(S)
  24. /*    Wietse Z. Venema
  25. /*    Eindhoven University of Technology
  26. /*    Department of Mathematics and Computer Science
  27. /*    Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands
  28. /* CREATION DATE
  29. /*    Sun Oct 29 15:29:37 MET 1989
  30. /* LAST MODIFICATION
  31. /*    10/29/89 22:30:06
  32. /* VERSION/RELEASE
  33. /*    1.1
  34. /*--*/
  35.  
  36. #ifndef lint
  37. static char sccsid[] = "@(#) percentm.c 1.1 10/29/89 22:30:06";
  38.  
  39. #endif
  40.  
  41. #include <stdio.h>
  42. #include "percentm.h"
  43.  
  44. extern int errno;
  45. extern char *sys_errlist[];
  46. extern int sys_nerr;
  47. extern char *strcpy();
  48.  
  49. /* percentm - replace %m by error message associated with value in err */
  50.  
  51. char   *percentm(str, err)
  52. char   *str;
  53. int     err;
  54. {
  55.     static char buf[BUFSIZ];
  56.     register char *ip = str;
  57.     register char *op = buf;
  58.  
  59.     while (*ip) {
  60.     switch (*ip) {
  61.     case '%':
  62.         switch (ip[1]) {
  63.         case '\0':                /* don't fall off end */
  64.         *op++ = *ip++;
  65.         break;
  66.         case 'm':                /* replace %m */
  67.         (void) strcpy(op,
  68.             sys_errlist[(err < sys_nerr && err > 0) ? err : 0]);
  69.         op += strlen(op);
  70.         ip += 2;
  71.         break;
  72.         default:                /* leave %<any> alone */
  73.         *op++ = *ip++, *op++ = *ip++;
  74.         break;
  75.         }
  76.     default:
  77.         *op++ = *ip++;
  78.     }
  79.     }
  80.     return (buf);
  81. }
  82.  
  83.