void handle_tag(pTHX_ const TagTypeInfo *ptti, CtTagList *ptl, SV *name, SV *val, SV **rv) { const struct tag_tbl_ent *etbl; const char *tagstr; CtTagType tagid; CtTag *tag; assert(ptl); assert(name); if (SvROK(name)) Perl_croak(aTHX_ "Tag name must be a string, not a reference"); tagstr = SvPV_nolen(name); tagid = get_tag_id(tagstr); if (tagid == CBC_INVALID_TAG) Perl_croak(aTHX_ "Invalid tag name '%s'", tagstr); if (tagid > NUM_TAGIDS) fatal("Unknown tag type (%d) in handle_tag()", (int) tagid); etbl = &gs_TagTbl[tagid]; tag = find_tag(*ptl, tagid); if (etbl->verify) etbl->verify(aTHX_ ptti, tag, val); if (val) { TagSetRV rv; if (tag == NULL) { dTHR; dXCPT; tag = tag_new(tagid, etbl->vtbl); XCPT_TRY_START { rv = etbl->set(aTHX_ ptti, tag, val); } XCPT_TRY_END XCPT_CATCH { tag_delete(tag); XCPT_RETHROW; } insert_tag(ptl, tag); } else
static int skip_to_next_tag() { unsigned int start; int end_of_tag; int found_tag = 0; int tag_id; int len; tagname[0] = 0; while ((file_pointer < file_size) && (!found_tag)) { if (file_buffer[file_pointer] == '@') { file_pointer++; start = file_pointer; end_of_tag = 0; while ((file_pointer < file_size) && (!end_of_tag)) { end_of_tag = is_end_of_tag(file_buffer[file_pointer]); file_pointer++; } len = file_pointer > start ? file_pointer - start - 1 : 0; strncpy(tagname, &file_buffer[start], len); tagname[len] = 0; tag_id = get_tag_id(tagname); if (tag_id != TAG_UNKNOWN) { return tag_id; } } file_pointer++; } return TAG_UNKNOWN; }