!quote, !unquote
[pspp] / src / language / lexer / macro.h
index 8b0a7bb1adeec81fb707d72c70e2982cd918c944..23ae1d9a1869e4f618f62ce0a80874ae666dfa3c 100644 (file)
 
 #include "libpspp/hmap.h"
 #include "libpspp/str.h"
+#include "language/lexer/segment.h"
 #include "language/lexer/token.h"
 
 struct macro_expander;
 
+struct macro_token
+  {
+    struct token token;
+    struct substring representation;
+  };
+
+void macro_token_copy (struct macro_token *, const struct macro_token *);
+void macro_token_uninit (struct macro_token *);
+
+struct macro_tokens
+  {
+    struct macro_token *mts;
+    size_t n;
+    size_t allocated;
+  };
+
+void macro_tokens_copy (struct macro_tokens *, const struct macro_tokens *);
+void macro_tokens_uninit (struct macro_tokens *);
+struct macro_token *macro_tokens_add_uninit (struct macro_tokens *);
+void macro_tokens_add (struct macro_tokens *, const struct macro_token *);
+
+void macro_tokens_from_string (struct macro_tokens *, const struct substring,
+                               enum segmenter_mode);
+
+void macro_tokens_print (const struct macro_tokens *, FILE *);
+
 struct macro_param
   {
-    char *name;                 /* NULL for a positional parameter. */
-    struct tokens def;          /* Default expansion. */
+    bool positional;            /* Is this a positional parameter? */
+    char *name;                 /* "!1" or "!name". */
+    struct macro_tokens def;    /* Default expansion. */
     bool expand_arg;            /* Macro-expand the argument? */
 
     enum
@@ -56,7 +84,7 @@ struct macro
     struct macro_param *params;
     size_t n_params;
 
-    struct substring body;
+    struct macro_tokens body;
   };
 
 void macro_destroy (struct macro *);
@@ -85,8 +113,8 @@ int macro_expander_create (const struct macro_set *,
                            struct macro_expander **);
 void macro_expander_destroy (struct macro_expander *);
 
-int macro_expander_add (struct macro_expander *, const struct token *);
+int macro_expander_add (struct macro_expander *, const struct macro_token *);
 
-void macro_expander_get_expansion (struct macro_expander *, struct tokens *);
+void macro_expander_get_expansion (struct macro_expander *, struct macro_tokens *);
 
 #endif /* macro.h */