ftp.nice.ch/pub/next/connectivity/news/Alexandra.0.82.s.tar.gz#/alex8/parse-header.c

This is parse-header.c in view mode; [Download] [Up]

#import "parse-header.h"
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#import <objc/hashtable.h>

int parse_header(char *header,
                 int header_len,
                 char **fieldbody,
                 char **pattern,
                 int field_count,
                 BOOL unfold)
{
   char *header_buffer;
   int b,i,f_len;
   char *aLine;
   char fieldname[120];
   char *other_buffer;
   char *f_fieldbody;
   BOOL found;
   
   aLine=(char *)malloc((header_len+2)*sizeof(char));
   header_buffer=header;

   while(header_len>0){
      //get one line
      sscanf(header_buffer, "%[^\n]\n",aLine);
      b=strlen(aLine); b++; 
      header_len-=b; header_buffer+=b;
     
      //get header field name
      sscanf(aLine,"%118[^: \t]:",fieldname);
      if(aLine[strlen(fieldname)]!=':')
         continue; //wrong header field

      //lookup starting point of field body and copy it
      other_buffer=aLine;
      other_buffer+=strlen(fieldname)+1;
      while((*other_buffer==(char)32)||(*other_buffer==(char)9))
         other_buffer++;
      f_fieldbody=NXCopyStringBuffer(other_buffer);
      f_len=strlen(f_fieldbody);

      //delete all space between fieldname and ":"
      for(i=strlen(fieldname)-1;i>=0;i--)
         if((fieldname[i]==(char)32)||(fieldname[i]==(char)9))
            fieldname[i]='\0';
         else
            break;

      //lookup field name
      found=NO;
      for(i=0;i<field_count;i++){
         if((fieldbody[i]==(char *)0) && (strcmp(pattern[i],fieldname)==0)){
            //Found! Now get, unfold & copy field body
            char *temp_buffer;
            found=YES;
            while((*header_buffer!='\0') &&
                  ((*header_buffer==(char)32) || (*header_buffer==(char)9))){
               sscanf(header_buffer, "%1024[^\n]\n",aLine);
               b=strlen(aLine); b++; header_len-=b; header_buffer+=b;

               temp_buffer=aLine;
               //forget white-space stuff
               if(unfold)
                  while((*temp_buffer!='\0') &&
                        ((*temp_buffer==(char)32) || (*temp_buffer==(char)9)))
                     temp_buffer++;
               f_fieldbody=(char *)realloc(f_fieldbody, 
                      (f_len+ strlen(temp_buffer)+ 2)*sizeof(char));
               if(unfold)
                  strcat(f_fieldbody," ");
               else
                  strcat(f_fieldbody,"\n");
               strcat(f_fieldbody,temp_buffer);
               f_len=strlen(f_fieldbody);
            }
            fieldbody[i]=f_fieldbody;
            break; 
         }
      }
      if(found==NO)
         free(f_fieldbody);
   }
   free(aLine);
   return 0;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.