hfield.c
changeset 0 068428edee47
equal deleted inserted replaced
-1:000000000000 0:068428edee47
       
     1 #include "hfield.h"
       
     2 
       
     3 static char *(hname[]) = {
       
     4   "unknown-header"
       
     5 , "sender"
       
     6 , "from"
       
     7 , "reply-to"
       
     8 , "to"
       
     9 , "cc"
       
    10 , "bcc"
       
    11 , "date"
       
    12 , "message-id"
       
    13 , "subject"
       
    14 , "resent-sender"
       
    15 , "resent-from"
       
    16 , "resent-reply-to"
       
    17 , "resent-to"
       
    18 , "resent-cc"
       
    19 , "resent-bcc"
       
    20 , "resent-date"
       
    21 , "resent-message-id"
       
    22 , "return-receipt-to"
       
    23 , "errors-to"
       
    24 , "apparently-to"
       
    25 , "received"
       
    26 , "return-path"
       
    27 , "delivered-to"
       
    28 , "content-length"
       
    29 , "content-type"
       
    30 , "content-transfer-encoding"
       
    31 , "notice-requested-upon-delivery-to"
       
    32 , "mail-followup-to"
       
    33 , 0
       
    34 };
       
    35 
       
    36 static int hmatch(s,len,t)
       
    37 char *s;
       
    38 int len;
       
    39 char *t;
       
    40 {
       
    41  int i;
       
    42  char ch;
       
    43 
       
    44  for (i = 0;ch = t[i];++i)
       
    45   {
       
    46    if (i >= len) return 0;
       
    47    if (ch != s[i])
       
    48     {
       
    49      if (ch == '-') return 0;
       
    50      if (ch - 32 != s[i]) return 0;
       
    51     }
       
    52   }
       
    53  for (;;)
       
    54   {
       
    55    if (i >= len) return 0;
       
    56    ch = s[i];
       
    57    if (ch == ':') return 1;
       
    58    if ((ch != ' ') && (ch != '\t')) return 0;
       
    59    ++i;
       
    60   }
       
    61 }
       
    62 
       
    63 int hfield_known(s,len)
       
    64 char *s;
       
    65 int len;
       
    66 {
       
    67  int i;
       
    68  char *t;
       
    69 
       
    70  for (i = 1;t = hname[i];++i)
       
    71    if (hmatch(s,len,t))
       
    72      return i;
       
    73  return 0;
       
    74 }
       
    75 
       
    76 int hfield_valid(s,len)
       
    77 char *s;
       
    78 int len;
       
    79 {
       
    80  int i;
       
    81  int j;
       
    82  char ch;
       
    83 
       
    84  for (j = 0;j < len;++j)
       
    85    if (s[j] == ':')
       
    86      break;
       
    87  if (j >= len) return 0;
       
    88  while (j)
       
    89   {
       
    90    ch = s[j - 1];
       
    91    if ((ch != ' ') && (ch != '\t'))
       
    92      break;
       
    93    --j;
       
    94   }
       
    95  if (!j) return 0;
       
    96 
       
    97  for (i = 0;i < j;++i)
       
    98   {
       
    99    ch = s[i];
       
   100    if (ch <= 32) return 0;
       
   101    if (ch >= 127) return 0;
       
   102   }
       
   103  return 1;
       
   104 }
       
   105 
       
   106 unsigned int hfield_skipname(s,len)
       
   107 char *s;
       
   108 int len;
       
   109 {
       
   110  int i;
       
   111  char ch;
       
   112 
       
   113  for (i = 0;i < len;++i)
       
   114    if (s[i] == ':')
       
   115      break;
       
   116  if (i < len) ++i;
       
   117  while (i < len)
       
   118   {
       
   119    ch = s[i];
       
   120    if ((ch != '\t') && (ch != '\n') && (ch != '\r') && (ch != ' '))
       
   121      break;
       
   122    ++i;
       
   123   }
       
   124  return i;
       
   125 }