home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Internet / News / Alexandra.0.82 / Source / parse-header.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-30  |  2.6 KB  |  88 lines

  1. #import "parse-header.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <strings.h>
  5. #import <objc/hashtable.h>
  6.  
  7. int parse_header(char *header,
  8.                  int header_len,
  9.                  char **fieldbody,
  10.                  char **pattern,
  11.                  int field_count,
  12.                  BOOL unfold)
  13. {
  14.    char *header_buffer;
  15.    int b,i,f_len;
  16.    char *aLine;
  17.    char fieldname[120];
  18.    char *other_buffer;
  19.    char *f_fieldbody;
  20.    BOOL found;
  21.    
  22.    aLine=(char *)malloc((header_len+2)*sizeof(char));
  23.    header_buffer=header;
  24.  
  25.    while(header_len>0){
  26.       //get one line
  27.       sscanf(header_buffer, "%[^\n]\n",aLine);
  28.       b=strlen(aLine); b++; 
  29.       header_len-=b; header_buffer+=b;
  30.      
  31.       //get header field name
  32.       sscanf(aLine,"%118[^: \t]:",fieldname);
  33.       if(aLine[strlen(fieldname)]!=':')
  34.          continue; //wrong header field
  35.  
  36.       //lookup starting point of field body and copy it
  37.       other_buffer=aLine;
  38.       other_buffer+=strlen(fieldname)+1;
  39.       while((*other_buffer==(char)32)||(*other_buffer==(char)9))
  40.          other_buffer++;
  41.       f_fieldbody=NXCopyStringBuffer(other_buffer);
  42.       f_len=strlen(f_fieldbody);
  43.  
  44.       //delete all space between fieldname and ":"
  45.       for(i=strlen(fieldname)-1;i>=0;i--)
  46.          if((fieldname[i]==(char)32)||(fieldname[i]==(char)9))
  47.             fieldname[i]='\0';
  48.          else
  49.             break;
  50.  
  51.       //lookup field name
  52.       found=NO;
  53.       for(i=0;i<field_count;i++){
  54.          if((fieldbody[i]==(char *)0) && (strcmp(pattern[i],fieldname)==0)){
  55.             //Found! Now get, unfold & copy field body
  56.             char *temp_buffer;
  57.             found=YES;
  58.             while((*header_buffer!='\0') &&
  59.                   ((*header_buffer==(char)32) || (*header_buffer==(char)9))){
  60.                sscanf(header_buffer, "%1024[^\n]\n",aLine);
  61.                b=strlen(aLine); b++; header_len-=b; header_buffer+=b;
  62.  
  63.                temp_buffer=aLine;
  64.                //forget white-space stuff
  65.                if(unfold)
  66.                   while((*temp_buffer!='\0') &&
  67.                         ((*temp_buffer==(char)32) || (*temp_buffer==(char)9)))
  68.                      temp_buffer++;
  69.                f_fieldbody=(char *)realloc(f_fieldbody, 
  70.                       (f_len+ strlen(temp_buffer)+ 2)*sizeof(char));
  71.                if(unfold)
  72.                   strcat(f_fieldbody," ");
  73.                else
  74.                   strcat(f_fieldbody,"\n");
  75.                strcat(f_fieldbody,temp_buffer);
  76.                f_len=strlen(f_fieldbody);
  77.             }
  78.             fieldbody[i]=f_fieldbody;
  79.             break; 
  80.          }
  81.       }
  82.       if(found==NO)
  83.          free(f_fieldbody);
  84.    }
  85.    free(aLine);
  86.    return 0;
  87. }
  88.