X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/e82f7154f65062d9ac8b9677862774498b331058..17be1d6b52cc22403bcfec5e8547bf612d214690:/scan.h diff --git a/scan.h b/scan.h index f08fe01..eee6f61 100644 --- 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 --------------------------------------------------* @@ -29,8 +29,12 @@ /*----- 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. * */ @@ -49,43 +53,133 @@ /*----- 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 -------------------------------------------------*/