X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Finline.c;h=be1a1de885c0e510def88ed5288cabe4ae143cf1;hb=6dfee19bc1cec29ff5ec5e9cd8021d1354a6126e;hp=08d5ee652901e1014022a67953fa7a5e16db1f75;hpb=0a5aa3b65fe14789bcada545a0e399545725d1ff;p=idzebra-moved-to-github.git diff --git a/recctrl/inline.c b/recctrl/inline.c index 08d5ee6..be1a1de 100644 --- a/recctrl/inline.c +++ b/recctrl/inline.c @@ -1,3 +1,6 @@ +/* + $Id: inline.c,v 1.5 2004-12-13 20:51:32 adam Exp $ +*/ #include #include #include @@ -6,7 +9,7 @@ static void inline_destroy_subfield_recursive(inline_subfield *p); -static inline_field *inline_mk_field(void) +inline_field *inline_mk_field(void) { inline_field *p = (inline_field *) xmalloc(sizeof(*p)); @@ -47,6 +50,8 @@ static inline_subfield *inline_mk_subfield(inline_subfield *parent) } return p; } + +#if 0 static void inline_destroy_subfield(inline_subfield *p) { if (p) @@ -57,6 +62,8 @@ static void inline_destroy_subfield(inline_subfield *p) xfree(p); } } +#endif + static void inline_destroy_subfield_recursive(inline_subfield *p) { if (p) @@ -69,59 +76,50 @@ static void inline_destroy_subfield_recursive(inline_subfield *p) xfree(p); } } -inline_field *inline_parse(const char *s) +int inline_parse(inline_field *pif, const char *tag, const char *s) { - inline_field *pf = inline_mk_field(); + inline_field *pf = pif; char *p = (char *)s; if (!pf) - return 0; - - if ((sscanf(p, "%3s", pf->name)) != 1) - return 0; + return -1; + + if (pf->name[0] == '\0') + { + if ((sscanf(p, "%3s", pf->name)) != 1) + return -2; - p += SZ_FNAME; + p += SZ_FNAME; - if (!memcmp(pf->name, "00", 2)) - { - pf->list = inline_mk_subfield(0); - pf->list->data = xstrdup(p); + if (!memcmp(pf->name, "00", 2)) + { + pf->list = inline_mk_subfield(0); + pf->list->data = xstrdup(p); + } + else + { + if ((sscanf(p, "%c%c", pf->ind1, pf->ind2)) != 2) + return -3; + } } else { - if ((sscanf(p, "%c%c", pf->ind1, pf->ind2)) == 2) + inline_subfield *psf = inline_mk_subfield(0); + + sscanf(tag, "%1s", psf->name); + psf->data = xstrdup(p); + + if (!pf->list) { - char *pdup; - inline_subfield *parent = 0; - - p += 2*SZ_IND; - - if (!strlen(p) || *p != '$') - { - return pf; - } - - pdup = p = xstrdup(p); - - for (p=strtok(p, "$"); p; p = strtok(NULL, "$")) - { - inline_subfield *psf = inline_mk_subfield(parent); - - if (!psf) - break; - - if (!parent) - pf->list = psf; - else - parent->next = psf; - parent = psf; - sscanf(p, "%1s", psf->name); - p += SZ_SFNAME; - psf->data = (char *) xstrdup(p); - } - - xfree(pdup); + pf->list = psf; + } + else + { + inline_subfield *last = pf->list; + while (last->next) + last = last->next; + last->next = psf; } } - return pf; + return 0; }