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
00035
00036
00037
00043 #include "../comp_defs.h"
00044 #include "parse_hname2.h"
00045 #include "keys.h"
00046 #include "../ut.h"
00047
00048 #define LOWER_BYTE(b) ((b) | 0x20)
00049 #define LOWER_DWORD(d) ((d) | 0x20202020)
00050
00053 static inline char* skip_ws(char* p, unsigned int size)
00054 {
00055 char* end;
00056
00057 end = p + size;
00058 for(; p < end; p++) {
00059 if ((*p != ' ') && (*p != '\t')) return p;
00060 }
00061 return p;
00062 }
00063
00067
00068 #include "case_via.h"
00069 #include "case_from.h"
00070 #include "case_to.h"
00071 #include "case_cseq.h"
00072 #include "case_call.h"
00073 #include "case_cont.h"
00074
00075 #include "case_rout.h"
00076 #include "case_max.h"
00077 #include "case_reco.h"
00078 #include "case_auth.h"
00079 #include "case_expi.h"
00080 #include "case_prox.h"
00081 #include "case_allo.h"
00082 #include "case_unsu.h"
00083 #include "case_even.h"
00084 #include "case_sip.h"
00085 #include "case_acce.h"
00086 #include "case_orga.h"
00087 #include "case_prio.h"
00088 #include "case_subj.h"
00089 #include "case_user.h"
00090 #include "case_serv.h"
00091 #include "case_supp.h"
00092 #include "case_dive.h"
00093 #include "case_remo.h"
00094 #include "case_refe.h"
00095 #include "case_sess.h"
00096 #include "case_reje.h"
00097 #include "case_min.h"
00098 #include "case_subs.h"
00099 #include "case_requ.h"
00100 #include "case_www.h"
00101 #include "case_date.h"
00102 #include "case_iden.h"
00103 #include "case_retr.h"
00104 #include "case_path.h"
00105 #include "case_priv.h"
00106 #include "case_reas.h"
00107 #include "case_p_as.h"
00108 #include "case_p_pr.h"
00109
00112 #define READ(val) \
00113 (*(val + 0) + (*(val + 1) << 8) + (*(val + 2) << 16) + (*(val + 3) << 24))
00114
00115 #define READ3(val) \
00116 (*(val + 0) + (*(val + 1) << 8) + (*(val + 2) << 16))
00117
00118 #define FIRST_QUATERNIONS \
00119 case _via1_: via1_CASE; \
00120 case _from_: from_CASE; \
00121 case _to12_: to12_CASE; \
00122 case _cseq_: cseq_CASE; \
00123 case _call_: call_CASE; \
00124 case _cont_: cont_CASE; \
00125 case _rout_: rout_CASE; \
00126 case _max__: max_CASE; \
00127 case _reco_: reco_CASE; \
00128 case _via2_: via2_CASE; \
00129 case _auth_: auth_CASE; \
00130 case _supp_: supp_CASE; \
00131 case _expi_: expi_CASE; \
00132 case _prox_: prox_CASE; \
00133 case _allo_: allo_CASE; \
00134 case _unsu_: unsu_CASE; \
00135 case _even_: even_CASE; \
00136 case _sip_ : sip_CASE; \
00137 case _acce_: acce_CASE; \
00138 case _orga_: orga_CASE; \
00139 case _prio_: prio_CASE; \
00140 case _subj_: subj_CASE; \
00141 case _subs_: subs_CASE; \
00142 case _user_: user_CASE; \
00143 case _serv_: serv_CASE; \
00144 case _dive_: dive_CASE; \
00145 case _remo_: remo_CASE; \
00146 case _refe_: refe_CASE; \
00147 case _sess_: sess_CASE; \
00148 case _reje_: reje_CASE; \
00149 case _min__: min_CASE; \
00150 case _requ_: requ_CASE; \
00151 case _www__: www_CASE; \
00152 case _date_: date_CASE; \
00153 case _iden_: iden_CASE; \
00154 case _retr_: retr_CASE; \
00155 case _path_: path_CASE; \
00156 case _priv_: priv_CASE; \
00157 case _reas_: reas_CASE; \
00158 case _p_as_: p_as_CASE; \
00159 case _p_pr_: p_pr_CASE;
00160
00161
00162 #define PARSE_COMPACT(id) \
00163 switch(*(p + 1)) { \
00164 case ' ': \
00165 hdr->type = id; \
00166 p += 2; \
00167 goto dc_end; \
00168 \
00169 case ':': \
00170 hdr->type = id; \
00171 hdr->name.len = 1; \
00172 return (p + 2); \
00173 }
00174
00175 #if 0
00176 int hdr_update_type(struct hdr_field* hdr)
00177 {
00178 if(hdr==0 || hdr->name.s==0)
00179 return -1;
00180 switch(hdr->name.len) {
00181 case 19:
00182 if(strncasecmp(hdr->name.s, "P-Asserted-Identity", 19)==0)
00183 hdr->type = HDR_PAI_T;
00184 break;
00185 case 20:
00186 if(strncasecmp(hdr->name.s, "P-Preferred-Identity", 20)==0)
00187 hdr->type = HDR_PPI_T;
00188 break;
00189 }
00190
00191 return 0;
00192 }
00193 #endif
00194
00195 char* parse_hname2(char* begin, char* end, struct hdr_field* hdr)
00196 {
00197 register char* p;
00198 register unsigned int val;
00199
00200 if ((end - begin) < 4) {
00201 hdr->type = HDR_ERROR_T;
00202 return begin;
00203 }
00204
00205 p = begin;
00206
00207 val = LOWER_DWORD(READ(p));
00208 hdr->name.s = begin;
00209
00210 switch(val) {
00211 FIRST_QUATERNIONS;
00212
00213 default:
00214 switch(LOWER_BYTE(*p)) {
00215 case 't':
00216 switch(LOWER_BYTE(*(p + 1))) {
00217 case 'o':
00218 case ' ':
00219 hdr->type = HDR_TO_T;
00220 p += 2;
00221 goto dc_end;
00222
00223 case ':':
00224 hdr->type = HDR_TO_T;
00225 hdr->name.len = 1;
00226 return (p + 2);
00227 }
00228 break;
00229
00230 case 'v': PARSE_COMPACT(HDR_VIA_T); break;
00231 case 'f': PARSE_COMPACT(HDR_FROM_T); break;
00232 case 'i': PARSE_COMPACT(HDR_CALLID_T); break;
00233 case 'm': PARSE_COMPACT(HDR_CONTACT_T); break;
00234 case 'l': PARSE_COMPACT(HDR_CONTENTLENGTH_T); break;
00235 case 'k': PARSE_COMPACT(HDR_SUPPORTED_T); break;
00236 case 'c': PARSE_COMPACT(HDR_CONTENTTYPE_T); break;
00237 case 'o': PARSE_COMPACT(HDR_EVENT_T); break;
00238 case 'x': PARSE_COMPACT(HDR_SESSIONEXPIRES_T);break;
00239 case 'a': PARSE_COMPACT(HDR_ACCEPTCONTACT_T); break;
00240 case 'u': PARSE_COMPACT(HDR_ALLOWEVENTS_T); break;
00241 case 'e': PARSE_COMPACT(HDR_CONTENTENCODING_T); break;
00242 case 'b': PARSE_COMPACT(HDR_REFERREDBY_T); break;
00243 case 'j': PARSE_COMPACT(HDR_REJECTCONTACT_T); break;
00244 case 'd': PARSE_COMPACT(HDR_REQUESTDISPOSITION_T); break;
00245 case 's': PARSE_COMPACT(HDR_SUBJECT_T); break;
00246 case 'r': PARSE_COMPACT(HDR_REFER_TO_T); break;
00247 case 'y': PARSE_COMPACT(HDR_IDENTITY_T); break;
00248 case 'n': PARSE_COMPACT(HDR_IDENTITY_INFO_T); break;
00249 }
00250 goto other;
00251 }
00252
00253
00254 dc_end:
00255 p = skip_ws(p, end - p);
00256 if (*p != ':') {
00257 goto other;
00258 } else {
00259 hdr->name.len = p - hdr->name.s;
00260 return (p + 1);
00261 }
00262
00263
00264 other:
00265 p = q_memchr(p, ':', end - p);
00266 if (!p) {
00267 hdr->type = HDR_ERROR_T;
00268 hdr->name.s = 0;
00269 hdr->name.len = 0;
00270 return 0;
00271 } else {
00272 hdr->type = HDR_OTHER_T;
00273 hdr->name.len = p - hdr->name.s;
00274
00275 return (p + 1);
00276 }
00277 }
00278