X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=fml%2Ffmlmem.c;h=e78fc3c928f6532ef0081e3b73df2157b51d72fb;hb=b9bf72fa7af887225b50f567f91c06ce4353d0c8;hp=5ec4a7b48fc2f0b7285b077284c231b6ba24c440;hpb=2303dccf677f365d57d750bf6b965875257a0ab1;p=egate.git diff --git a/fml/fmlmem.c b/fml/fmlmem.c index 5ec4a7b..e78fc3c 100644 --- a/fml/fmlmem.c +++ b/fml/fmlmem.c @@ -2,7 +2,28 @@ * FML interpreter. Europagate, 1995 * * $Log: fmlmem.c,v $ - * Revision 1.4 1995/02/09 14:33:37 adam + * Revision 1.11 1995/03/02 10:18:48 adam + * Bug fix. + * + * Revision 1.10 1995/03/02 08:06:03 adam + * Fml function strsub implemented. New test files marc[45].fml. + * New test options in fmltest. + * + * Revision 1.9 1995/02/27 09:01:20 adam + * Regular expression support. Argument passing by name option. New FML + * function strlen. + * + * Revision 1.8 1995/02/23 08:32:05 adam + * Changed header. + * + * Revision 1.6 1995/02/10 18:15:52 adam + * FML function 'strcmp' implemented. This function can be used to + * test for existence of MARC fields. + * + * Revision 1.5 1995/02/09 14:37:18 adam + * Removed .depend from cvs. Removed function fml_mk_list. + * + * Revision 1.4 1995/02/09 14:33:37 adam * Split source fml.c and define relevant build-in functions in separate * files. New operators mult, div, not, llen implemented. * @@ -127,24 +148,27 @@ struct fml_atom *fml_atom_alloc (Fml fml, char *str) return a0; } -struct fml_node *fml_mk_list (Fml fml, struct fml_node *fn) +int fml_atom_cmp (Fml fml, struct fml_atom *a1, struct fml_atom *a2) { - if (fn->is_atom) + while (a1 && a2) { - struct fml_node *fn2; - - fn2 = fml_node_alloc (fml); - fn2->is_atom = 1; - fn2->p[0] = fn->p[0]; - return fn2; + int n; + n = strncmp (a1->buf, a2->buf, FML_ATOM_BUF); + if (n) + return n; + a1 = a1->next; + a2 = a2->next; } - else - return fn->p[0]; + if (!a1 && !a2) + return 0; + if (a1) + return 1; + return -1; } int fml_atom_str (struct fml_atom *a, char *str) { - int len = 0; + int i, len = 0; assert (a); while (a->next) @@ -154,9 +178,14 @@ int fml_atom_str (struct fml_atom *a, char *str) len += FML_ATOM_BUF; a = a->next; } + for (i=0; ibuf[i]; i++) + ; if (str) - strcpy (str+len, a->buf); - len += strlen(str+len); + { + memcpy (str+len, a->buf, i); + str[len+i] = 0; + } + len += i; return len; } @@ -175,6 +204,21 @@ void fml_atom_strx (struct fml_atom *a, char *str, int max) str[len+FML_ATOM_BUF-1] = '\0'; } +int fml_atom_len (struct fml_atom *a) +{ + int len = 0; + if (a) + { + while (a->next) + { + len += FML_ATOM_BUF; + a = a->next; + } + len += strlen (a->buf); + } + return len; +} + int fml_atom_val (struct fml_atom *a) { static char arg[256]; @@ -245,3 +289,26 @@ void fml_node_stat (Fml fml) if (fml->debug & 2) printf ("<>", no_nodes, no_atoms); } + +struct fml_atom *fml_atom_strsub (Fml fml, struct fml_atom *a, int o, int l) +{ + static char buf[512]; + char *cp; + struct fml_atom *an; + int ol = fml_atom_len (a); + + if (ol >= 510) + { + cp = malloc (ol + 1); + assert (cp); + } + else + cp = buf; + fml_atom_str (a, buf); + if (o + l < ol) + buf[o+l] = '\0'; + an = fml_atom_alloc (fml, buf+o); + if (ol >= 510) + free (cp); + return an; +}