Fml function strsub implemented. New test files marc[45].fml.
[egate.git] / fml / fmltoken.c
index 77f9139..16a0cd5 100644 (file)
@@ -2,7 +2,19 @@
  * FML interpreter. Europagate, 1995
  *
  * $Log: fmltoken.c,v $
- * Revision 1.2  1995/02/07 16:09:24  adam
+ * Revision 1.6  1995/02/23 08:32:07  adam
+ * Changed header.
+ *
+ * Revision 1.4  1995/02/10  18:15:53  adam
+ * FML function 'strcmp' implemented. This function can be used to
+ * test for existence of MARC fields.
+ *
+ * Revision 1.3  1995/02/10  15:50:57  adam
+ * MARC interface implemented. Minor bugs fixed. fmltest can
+ * be used to format single MARC records. New function '\list'
+ * implemented.
+ *
+ * Revision 1.2  1995/02/07  16:09:24  adam
  * The \ character is no longer INCLUDED when terminating a token.
  * Major changes in tokenization routines. Bug fixes in expressions
  * with lists (fml_sub0).
@@ -37,6 +49,11 @@ struct fml_node *fml_tokenize (Fml fml)
         fml_pr_list (p);
         printf ("\n");
     }
+    if (look_char != fml->eof_mark)
+    {
+        fprintf (stderr, "Ill formed parantheses");
+        exit (1);
+    }
     return p;
 }
 
@@ -86,7 +103,6 @@ struct fml_node *fml_group (Fml fml)
             struct fml_node *sptr = fml_group (fml);
             if (sptr)
             {
-#if 1
                 ptr2 = fml_node_alloc (fml);
                 if (!ptr0)
                     ptr0 = ptr2;
@@ -94,28 +110,6 @@ struct fml_node *fml_group (Fml fml)
                         ptr1->p[1] = ptr2;
                 ptr2->p[0] = sptr;
                 ptr2->is_atom = 0;
-
-#else
-/* make group of one become an element ... */
-                if (sptr->p[1])
-                {
-                    ptr2 = fml_node_alloc (fml);
-                    if (!ptr0)
-                        ptr0 = ptr2;
-                    else
-                        ptr1->p[1] = ptr2;
-                    ptr2->p[0] = sptr;
-                    ptr2->is_atom = 0;
-                }  
-                else
-                {
-                    ptr2 = sptr;
-                    if (!ptr0)
-                        ptr0 = ptr2;
-                    else
-                        ptr1->p[1] = ptr2;
-                }
-#endif
             }
             else
             {
@@ -168,6 +162,38 @@ static void lexer (Fml fml)
         look_type = '}';
         look_char = (*fml->read_func)();
     }        
+    else if (look_char == '\'')
+    {
+        off = 0;
+        look_char = (*fml->read_func)();
+        while (look_char != fml->eof_mark && look_char != '\'')
+        {
+            lex_buf[off++] = look_char;
+            if (look_char == '\\')
+            {
+                look_char = (*fml->read_func)();
+                switch (look_char)
+                {
+                case 'n':
+                    lex_buf[off-1] = '\n';
+                    break;
+                case 't':
+                    lex_buf[off-1] = '\n';
+                    break;
+                case '\'':
+                    lex_buf[off-1] = '\''; 
+                    break;
+                default:
+                    lex_buf[off-1] = look_char;
+                }
+            }
+            look_char = (*fml->read_func)();
+        } 
+        lex_buf[off] = '\0';
+        look_type = 'a';
+        if (look_char == '\'')
+            look_char = (*fml->read_func)();
+    }
     else
     {
         off = 0;