MCPcopy Create free account
hub / github.com/OpenSIPS/opensips / encode_lang_attr

Function encode_lang_attr

modules/cpl_c/cpl_parser.c:405–462  ·  view source on GitHub ↗

Attr. encoding for LANGUAGE node: * | attr_t(2) attr_len(2) attr_val(2*x) | MATCHES attr (NNT) */

Source from the content-addressed store, hash-verified

403 * | attr_t(2) attr_len(2) attr_val(2*x) | MATCHES attr (NNT)
404 */
405static inline int encode_lang_attr(xmlNodePtr node, char *node_ptr, char *buf_end)
406
407{
408 xmlAttrPtr attr;
409 char *p, *p_orig;
410 unsigned char *nr_attr;
411 char *end;
412 char *val_bk;
413 str val;
414
415 nr_attr = &(NR_OF_ATTR(node_ptr));
416 *nr_attr = 0;
417 p = p_orig = ATTR_PTR(node_ptr);
418
419 FOR_ALL_ATTR(node,attr) {
420 /* there is only one attribute -> MATCHES */
421 if (attr->name[0]!='M' && attr->name[0]!='m') {
422 LM_ERR("unknown attribute "
423 "<%s>\n",attr->name);
424 goto error;
425 }
426 val.s = val_bk = (char*)xmlGetProp(node,attr->name);
427 /* parse the language-tag */
428 for(end=val.s,val.len=0;;end++) {
429 /* trim all spaces from the beginning of the tag */
430 if (!val.len && (*end==' ' || *end=='\t')) continue;
431 /* we cannot have more than 2 attrs - LANG_TAG and LANG_SUBTAG */
432 if ((*nr_attr)>=2) goto lang_error;
433 if (((*end)|0x20)>='a' && ((*end)|0x20)<='z') {
434 val.len++; continue;
435 } else if (*end=='*' && val.len==0 && (*nr_attr)==0 &&
436 (*end==' '|| *end=='\t' || *end==0)) {
437 val.len++;
438 set_attr_type(p, MATCHES_TAG_ATTR, buf_end, error);
439 } else if (val.len && (*nr_attr)==0 && *end=='-' ) {
440 set_attr_type(p, MATCHES_TAG_ATTR, buf_end, error);
441 } else if (val.len && ((*nr_attr)==0 || (*nr_attr)==1) &&
442 (*end==' '|| *end=='\t' || *end==0)) {
443 set_attr_type(p,
444 (!(*nr_attr))?MATCHES_TAG_ATTR:MATCHES_SUBTAG_ATTR,
445 buf_end, error );
446 } else goto lang_error;
447 (*nr_attr)++;
448 /*LM_DBG("----> language tag=%d; %d [%.*s]\n",*(p-1),
449 val.len,val.len,end-val.len);*/
450 val.s = end-val.len;
451 append_str_attr(p, val, buf_end, error);
452 val.len = 0;
453 if (*end==0) break;
454 }
455 }
456
457 return p-p_orig;
458lang_error:
459 LM_ERR("bad value for language_tag <%s>\n",val_bk);
460error:
461 return -1;
462}

Callers 1

encode_nodeFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected