home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / networking / uucp / amigauucpsrc / lib / header.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-29  |  2.6 KB  |  150 lines

  1.  
  2. /*
  3.  *  HEADER SCANNING ROUTINES
  4.  *
  5.  *  given a memory buffer terminated with \0 (that might be a file image),
  6.  *  do various header handling operations
  7.  */
  8.  
  9. #include <string.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include "config.h"
  13.  
  14. Prototype int ScanHeader(const char *, const char *);
  15. Prototype char *GetHeader(const char *, const char *);
  16. Prototype char *DupHeader(const char *, const char *);
  17. Prototype char *ScanNext(void);
  18.  
  19. /*
  20.  *  scan a header, elements in the header (comma separated).  Blank line
  21.  *  ends header scan
  22.  */
  23.  
  24. static char *SHBase;
  25.  
  26. int
  27. ScanHeader(buf, hdr)
  28. const char *buf;
  29. const char *hdr;
  30. {
  31.     int len = strlen(hdr);
  32.     while (*buf && *buf != '\n') {
  33.     if (strncmp(buf, hdr, len) == 0)
  34.         break;
  35.     while (*buf && *buf != '\n')
  36.         ++buf;
  37.     if (*buf == '\n')
  38.         ++buf;
  39.     }
  40.     if (*buf && *buf != '\n') {     /*  header found    */
  41.     SHBase = buf;
  42.     ScanNext();                 /*  skip header     */
  43.     return(0);
  44.     } else {
  45.     SHBase = NULL;
  46.     return(-1);
  47.     }
  48. }
  49.  
  50. char *
  51. ScanNext(void)
  52. {
  53.     char *ptr;
  54.     char *p2;
  55.     static char *Last;
  56.  
  57.     if (ptr = SHBase) {
  58.     while (*ptr == ' ' || *ptr == 9 || *ptr == ',' || *ptr == '\n') {
  59.         if (ptr[0] == '\n') {
  60.         if (ptr[1] != ' ' && ptr[1] != '\t')
  61.             ptr = "\0";
  62.         }
  63.         ++ptr;
  64.     }
  65.     if (*ptr == 0) {
  66.         SHBase = NULL;
  67.         return(NULL);
  68.     }
  69.     for (p2 = ptr; *p2 && *p2 != ' ' && *p2 != '\t' && *p2 != ',' && *p2 != '\n'; ++p2);
  70.  
  71.     SHBase = p2;
  72.     {
  73.         short i = p2 - ptr;
  74.  
  75.         if (Last)
  76.         free(Last);
  77.         if (Last = malloc(i + 1)) {
  78.         movmem(ptr, Last, i);
  79.         Last[i] = 0;
  80.         }
  81.     }
  82.     } else {
  83.     if (Last)
  84.         free(Last);
  85.     Last = NULL;
  86.     }
  87.     return(Last);
  88. }
  89.  
  90. /*
  91.  *  return *temporary* buffer containing specified header, or NULL.
  92.  *  returned pointer includes the header itself.
  93.  */
  94.  
  95. char *
  96. GetHeader(buf, hdr)
  97. const char *buf;
  98. const char *hdr;
  99. {
  100.     int len = strlen(hdr);
  101.     static char *Last;
  102.  
  103.     while (*buf && *buf != '\n') {
  104.     if (strncmp(buf, hdr, len) == 0)
  105.         break;
  106.     while (*buf && *buf != '\n')
  107.         ++buf;
  108.     if (*buf == '\n')
  109.         ++buf;
  110.     }
  111.     if (Last) {
  112.     free(Last);
  113.     Last = NULL;
  114.     }
  115.  
  116.     if (*buf == 0 || *buf == '\n')
  117.     return(NULL);
  118.  
  119.     /*
  120.      *    if header is found, determine end of header.
  121.      */
  122.  
  123.     {
  124.     char *ptr;
  125.     long len;
  126.  
  127.     for (ptr = buf; *ptr && !(ptr[0] == '\n' && ptr[1] != ' ' && ptr[1] != '\t'); ++ptr);
  128.     len = ptr - buf;
  129.  
  130.     if (Last = malloc(len + 1)) {
  131.         movmem(buf, Last, len);
  132.         Last[len] = 0;
  133.     }
  134.     }
  135.     return(Last);
  136. }
  137.  
  138. char *
  139. DupHeader(buf, hdr)
  140. const char *buf;
  141. const char *hdr;
  142. {
  143.     char *ptr;
  144.  
  145.     if (ptr = GetHeader(buf, hdr))
  146.     ptr = strdup(ptr);
  147.     return(ptr);
  148. }
  149.  
  150.