Complete rewrite. Allow a list of character sources to enable changes
[fwd] / scan.h
diff --git a/scan.h b/scan.h
index f08fe01..eee6f61 100644 (file)
--- a/scan.h
+++ b/scan.h
@@ -1,10 +1,10 @@
 /* -*-c-*-
  *
- * $Id: scan.h,v 1.1 1999/07/01 08:56:23 mdw Exp $
+ * $Id: scan.h,v 1.2 1999/07/26 23:24:33 mdw Exp $
  *
  * Character scanners
  *
- * (c) 1999 Mark Wooding
+ * (c) 1999 Straylight/Edgeware
  */
 
 /*----- Licensing notice --------------------------------------------------* 
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: scan.h,v $
- * Revision 1.1  1999/07/01 08:56:23  mdw
- * Initial revision
+ * Revision 1.2  1999/07/26 23:24:33  mdw
+ * Complete rewrite.  Allow a list of character sources to enable changes
+ * during parsing of syntactic constructs.
+ *
+ * Revision 1.1.1.1  1999/07/01 08:56:23  mdw
+ * Initial revision.
  *
  */
 
 
 /*----- Data structures ---------------------------------------------------*/
 
-/* --- A configuration scanner --- */
+/* --- A low-level scanner source --- */
+
+typedef struct scansrc {
+  struct scansrc *next;                        /* Next one in the list */
+  struct scansrc_ops *ops;             /* Pointer to operations table */
+  char *src;                           /* Name of this source */
+  int line;                            /* Current line number */
+  int pushback;                                /* Pushback character */
+  char *tok;                           /* Token pushback */
+  unsigned t;                          /* Token type pushback */
+} scansrc;
+
+/* --- Scanner source operations --- */
 
-typedef struct scan_ops {
-  int (*scan)(void */*p*/);            /* Character scan function */
-  void (*unscan)(int /*ch*/, void */*p*/); /* Character pushback function */
-} scan_ops;
+typedef struct scansrc_ops {
+  int (*scan)(scansrc */*ss*/);                /* Read another character */
+  void (*destroy)(scansrc */*ss*/);    /* Destroy an unwanted source */
+} scansrc_ops;
+
+/* --- A character scanner --- */
 
 typedef struct scanner {
-  scan_ops *ops;                       /* Pointer to scanner operations */
-  const char *src;                     /* Name of this source */
-  int line;                            /* Current line number */
+  scansrc *head, **tail;               /* Scanner list head and tail */
   int t;                               /* Token type */
   dstr d;                              /* Current token value */
 } scanner;
 
-/*----- Scanners provided -------------------------------------------------*/
+/*----- Particular scanner types ------------------------------------------*/
+
+/* --- @scan_file@ --- *
+ *
+ * Arguments:  @FILE *fp@ = pointer to file descriptor
+ *             @char *name@ = pointer to source file name
+ *             @unsigned f@ = flags
+ *
+ * Returns:    A scanner source.
+ *
+ * Use:                Creates a new scanner source for reading from a file.
+ */
+
+extern scansrc *scan_file(FILE */*fp*/, char */*name*/, unsigned /*f*/);
+
+#define SCF_NOCLOSE 1u
+#define SCF_FREENAME 2u
+
+/* --- @scan_argv@ --- *
+ *
+ * Arguments:  @char **av@ = pointer to argument array (null terminated)
+ *
+ * Returns:    A scanner source.
+ *
+ * Use:                Creates a new scanner source for reading from an @argv@
+ *             array.
+ */
+
+extern scansrc *scan_argv(char **/*av*/);
+
+/*----- General scanner handling ------------------------------------------*/
+
+/* --- @scan@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to main scanner context
+ *
+ * Returns:    Character read, or end-of-file.
+ *
+ * Use:                Scans a character from a source of characters.
+ */
+
+extern int scan(scanner */*sc*/);    
 
-/* --- The @argv@ scanner --- */
+/* --- @unscan@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to main scanner context
+ *             @int ch@ = character to unscan
+ *
+ * Returns:    ---
+ *
+ * Use:                Scans a character from a source of characters.
+ */
 
-typedef struct scan_argvctx {
-  scanner sc;                          /* Scanner base structure */
-  char *p;                             /* Pointer to next character */
-  char **pp;                           /* Pointer to next string */
-  int ch;                              /* Pushback character */
-} scan_argvctx;
+extern void unscan(scanner */*sc*/, int /*ch*/);
 
-extern void scan_argvinit(scan_argvctx */*c*/, char **/*pp*/);
+/* --- @scan_push@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to main scanner context
+ *             @scansrc *ss@ = souorce to push
+ *
+ * Returns:    ---
+ *
+ * Use:                Pushes a scanner source onto the front of the queue.
+ */
 
-/* --- The file scanner --- */
+extern void scan_push(scanner */*sc*/, scansrc */*ss*/);
 
-typedef struct scan_filectx {
-  scanner sc;                          /* Scanner base structure */
-  FILE *fp;                            /* Stream pointer */
-} scan_filectx;
+/* --- @scan_add@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to main scanner context
+ *             @scansrc *ss@ = souorce to push
+ *
+ * Returns:    ---
+ *
+ * Use:                Adds a scanner source onto the end of the queue.
+ */
+
+extern void scan_add(scanner */*sc*/, scansrc */*ss*/);
+
+/* --- @scan_create@ --- *
+ *
+ * Arguments:  @scanner *sc@ = scanner context to initialize
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes a scanner block ready for use.
+ */
+
+extern void scan_create(scanner */*sc*/);
+
+/* --- @scan_destroy@ --- *
+ *
+ * Arguments:  @scanner *sc@ = pointer to scanner context
+ *
+ * Returns:    ---
+ *
+ * Use:                Destroys a scanner and all the sources attached to it.
+ */
 
-extern void scan_fileinit(scan_filectx */*c*/,
-                         FILE */*fp*/, const char */*file*/);
+extern void scan_destroy(scanner */*sc*/);
 
 /*----- That's all, folks -------------------------------------------------*/