segment: Distinguish snippets from full files.
[pspp] / src / language / lexer / segment.h
index 686b471e18d4bc7e3536c33ed3dcbb6c7bf9a937..5d550f531fc27c15fe71527fb01807cc41e3a6f4 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -78,6 +78,9 @@ enum segmenter_mode
     SEG_TYPE(DO_REPEAT_COMMAND)                 \
     SEG_TYPE(INLINE_DATA)                       \
                                                 \
+    SEG_TYPE(MACRO_ID)                          \
+    SEG_TYPE(MACRO_BODY)                        \
+                                                \
     SEG_TYPE(START_DOCUMENT)                    \
     SEG_TYPE(DOCUMENT)                          \
                                                 \
@@ -88,7 +91,6 @@ enum segmenter_mode
                                                 \
     SEG_TYPE(EXPECTED_QUOTE)                    \
     SEG_TYPE(EXPECTED_EXPONENT)                 \
-    SEG_TYPE(UNEXPECTED_DOT)                    \
     SEG_TYPE(UNEXPECTED_CHAR)
 
 /* Types of segments. */
@@ -97,9 +99,13 @@ enum segment_type
 #define SEG_TYPE(NAME) SEG_##NAME,
     SEG_TYPES
 #undef SEG_TYPE
-    SEG_N_TYPES
   };
 
+/* Number of segment types. */
+#define SEG_TYPE(NAME) + 1
+enum { SEG_N_TYPES = SEG_TYPES };
+#undef SEG_TYPE
+
 const char *segment_type_to_string (enum segment_type);
 
 /* A segmenter.  Opaque. */
@@ -107,14 +113,15 @@ struct segmenter
   {
     unsigned char state;
     unsigned char substate;
+    unsigned char nest;
     unsigned char mode;
   };
 
-void segmenter_init (struct segmenter *, enum segmenter_mode);
+struct segmenter segmenter_init (enum segmenter_mode, bool is_snippet);
 
 enum segmenter_mode segmenter_get_mode (const struct segmenter *);
 
-int segmenter_push (struct segmenter *, const char *input, size_t n,
+int segmenter_push (struct segmenter *, const char *input, size_t n, bool eof,
                     enum segment_type *);
 
 enum prompt_style segmenter_get_prompt (const struct segmenter *);