Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 #include "libts.h"
00035 #include "HdrUtils.h"
00036 
00037 #define GETNEXT() {      \
00038     cur += 1;            \
00039     if (cur >= end) {    \
00040         goto done;       \
00041     }                    \
00042 }
00043 
00044 void
00045 HdrCsvIter::find_csv()
00046 {
00047 
00048   const char *cur, *end, *last_data, *csv_start;
00049 
00050 RETRY:
00051 
00052   cur = m_csv_start;
00053   end = m_value_start + m_value_len;
00054   last_data = NULL;
00055   csv_start = NULL;
00056 
00057   if (cur >= end) {
00058     goto done;
00059   }
00060 skip_leading_whitespace:
00061   if (ParseRules::is_ws(*cur)) {
00062     GETNEXT();
00063     goto skip_leading_whitespace;
00064   }
00065   csv_start = cur;
00066 parse_value:
00067   
00068   
00069   if (m_separator == ',')
00070     while ((cur<end - 1) && (*cur> ',')) {
00071       last_data = cur;
00072       cur++;
00073     }
00074 
00075   if (*cur == m_separator) {
00076     goto done;
00077   }
00078   if (*cur == '\"') {
00079     
00080     
00081     if (cur == csv_start) {
00082       csv_start++;
00083     }
00084     GETNEXT();
00085     goto parse_value_quote;
00086   }
00087   if (!ParseRules::is_ws(*cur)) {
00088     last_data = cur;
00089   }
00090   GETNEXT();
00091   goto parse_value;
00092 parse_value_quote:
00093   if ((*cur == '\"') && (cur[-1] != '\\')) {
00094     GETNEXT();
00095     goto parse_value;
00096   }
00097   last_data = cur;
00098   GETNEXT();
00099   goto parse_value_quote;
00100 done:
00101   m_csv_end = cur;
00102   m_csv_start = csv_start;
00103 
00104   if (last_data) {
00105     m_csv_len = (int) (last_data - csv_start) + 1;
00106   } else {
00107     
00108     
00109     if (m_cur_field->m_next_dup && m_follow_dups) {
00110       field_init(m_cur_field->m_next_dup);
00111       goto RETRY;
00112     }
00113 
00114     m_csv_len = 0;
00115   }
00116 }
00117 
00118 const char *
00119 HdrCsvIter::get_nth(MIMEField * field, int *len, int n, bool follow_dups)
00120 {
00121   const char *s;
00122   int i, l;
00123 
00124   ink_assert(n >= 0);
00125   i = 0;
00126 
00127   s = get_first(field, &l, follow_dups);        
00128   while (s && (n > i)) {
00129     s = get_next(&l);
00130     i++;
00131   }                             
00132   *len = (s ? l : 0);           
00133   return (s);
00134 }
00135 
00136 
00137 int
00138 HdrCsvIter::count_values(MIMEField * field, bool follow_dups)
00139 {
00140   const char *s;
00141   int count, l;
00142 
00143   count = 0;
00144   s = get_first(field, &l, follow_dups);        
00145   while (s) {
00146     s = get_next(&l);
00147     ++count;
00148   }                             
00149   return (count);
00150 }
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181