* 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.
*
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)
len += FML_ATOM_BUF;
a = a->next;
}
+ for (i=0; i<FML_ATOM_BUF && a->buf[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;
}
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];
if (fml->debug & 2)
printf ("<<node=%d, atom=%d>>", 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;
+}