home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume24 / newsgate / part03 / misc.c < prev    next >
C/C++ Source or Header  |  1991-10-09  |  3KB  |  162 lines

  1. /*
  2. **  Miscellaneous routines.
  3. */
  4. #include "gate.h"
  5. #ifdef    RCSID
  6. static char RCS[] =
  7.     "$Header: /nfs/papaya/u2/rsalz/src/newsgate/src/RCS/misc.c,v 1.7 91/02/12 14:47:53 rsalz Exp $";
  8. #endif    /* RCSID */
  9.  
  10.  
  11. /*
  12. **  Allocate memory.
  13. */
  14. align_t
  15. MyAlloc(i)
  16.     int            i;
  17. {
  18.     align_t        p;
  19.  
  20.     if ((p = (align_t)malloc((unsigned int)i)) == NULL) {
  21.     Fprintf(stderr, "%s:  Could not allocate %d bytes: %s\n",
  22.         Pname, i, strerror(errno));
  23.     exit(EX_OSERR);
  24.     }
  25.     return p;
  26. }
  27.  
  28.  
  29. #ifndef    HAVE_STRERROR
  30. /*
  31. **  Return a printable representation of errno.
  32. */
  33. char *
  34. strerror(x)
  35.     int            x;
  36. {
  37.     static char        buff[20];
  38.  
  39.     if (x >= 0 && x < sys_nerr)
  40.     return sys_errlist[x];
  41.     Sprintf(buff, "Error code %d", x);
  42.     return buff;
  43. }
  44. #endif    /* HAVE_STRERROR */
  45.  
  46.  
  47. /*
  48. **  Free up something that Split() made.
  49. */
  50. void
  51. SplitFree(p)
  52.     char    ***p;
  53. {
  54.     if (p && *p) {
  55.     free((*p)[0]);
  56.     free((char *)*p);
  57.     *p = NULL;
  58.     }
  59. }
  60.  
  61.  
  62. /*
  63. **  This is an AWK-style split routine.  If the split character is NULL,
  64. **  we split on space or tab and eat long stretches of same (that is, no
  65. **  null fields will result).  Returns number of fields made.
  66. */
  67. int
  68. Split(s, p, c)
  69.     register char    *s;
  70.     char        ***p;
  71.     register char    c;
  72. {
  73.     register char    *cp;
  74.     register int    blank;
  75.     register int    n;
  76.     register int    i;
  77.  
  78.     if (s == NULL || *s == '\0') {
  79.     Fprintf(stderr, "%s:  Someone was a pinhead!\n", Pname);
  80.     abort();
  81.     }
  82.  
  83.     i = strlen(s) + 1;
  84.     cp = NEW(char, i);
  85.     /* This is too much -- we'll realloc what we really need later. */
  86.     *p = NEW(char*, i);
  87.  
  88.     if (c == '\0') {
  89.     /* Eat multiple whitespace characters. */
  90.     for (blank = TRUE, n = 0; *s; s++)
  91.         if (WHITE(*s)) {
  92.         if (!blank)
  93.             *cp++ = '\0';
  94.         blank = TRUE;
  95.         }
  96.         else {
  97.         if (blank)
  98.             (*p)[n++] = cp;
  99.         *cp++ = *s;
  100.         blank = FALSE;
  101.         }
  102.  
  103.     if (n == 0) {
  104.         (*p)[0] = cp;
  105.         SplitFree(p);
  106.         return 0;
  107.     }
  108.     }
  109.     else
  110.     /* Normal case: find all occurrences of "c" and null them as field
  111.      * terminators; add new string starts to the array of pointers to
  112.      * strings. */
  113.     for ((*p)[0] = cp, n = 1; *s; s++)
  114.         if (*s == c) {
  115.         *cp++ = '\0';
  116.         (*p)[n++] = cp;
  117.         }
  118.         else
  119.         *cp++ = *s;
  120.  
  121.     /* Free up the excess space. */
  122.     *p = (char **)REALLOC(*p, (n + 1) * sizeof (char *));
  123.     (*p)[n] = NULL;
  124.     return n;
  125. }
  126.  
  127.  
  128.  
  129. /*
  130. **  Read in a file of lines, dump it into an array of strings.
  131. */
  132. char **
  133. ReadFile(Name)
  134.     char        *Name;
  135. {
  136.     register FILE    *F;
  137.     register char    **v;
  138.     register char    *p;
  139.     register int    i;
  140.     char        **value;
  141.     char        buff[SM_SIZE];
  142.  
  143.     /* Open file, count number of lines therein. */
  144.     if ((F = fopen(Name, "r")) == NULL) {
  145.     perror(Name);
  146.     exit(EX_OSFILE);
  147.     }
  148.     for (i = 1; fgets(buff, sizeof buff, F); i++)
  149.     ;
  150.  
  151.     rewind(F);
  152.     for (v = value = NEW(char*, i); fgets(buff, sizeof buff, F); ) {
  153.     if (p = IDX(buff, '\n'))
  154.         *p = '\0';
  155.     if (buff[0] && buff[0] != '#')
  156.         *v++ = COPY(buff);
  157.     }
  158.  
  159.     *v = NULL;
  160.     return value;
  161. }
  162.