From: mdw Date: Fri, 22 Feb 2002 23:44:16 +0000 (+0000) Subject: Miscellaneous tidying up, to make this code independent of `fw'. It X-Git-Tag: 1.2.6~10 X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/commitdiff_plain/7bb7c50bf3ab003b0fc3c6b58f926e291fbd3e06 Miscellaneous tidying up, to make this code independent of `fw'. It might end up in a library somewhere. --- diff --git a/scan.c b/scan.c index cd082f5..0bc5cda 100644 --- a/scan.c +++ b/scan.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: scan.c,v 1.5 2002/01/30 09:29:34 mdw Exp $ + * $Id: scan.c,v 1.6 2002/02/22 23:44:16 mdw Exp $ * * Character scanners * @@ -29,6 +29,10 @@ /*----- Revision history --------------------------------------------------* * * $Log: scan.c,v $ + * Revision 1.6 2002/02/22 23:44:16 mdw + * Miscellaneous tidying up, to make this code independent of `fw'. It + * might end up in a library somewhere. + * * Revision 1.5 2002/01/30 09:29:34 mdw * Initialize scanner properly. * @@ -49,8 +53,6 @@ /*----- Header files ------------------------------------------------------*/ -#include "config.h" - #include #include #include @@ -88,8 +90,7 @@ static void fscan_destroy(scansrc *ss) fscan *fs = (fscan *)ss; if (!(fs->f & SCF_NOCLOSE)) fclose(fs->fp); - if (fs->f & SCF_FREENAME) - free(fs->ss.src); + xfree(fs->ss.src); DESTROY(fs); } @@ -100,7 +101,7 @@ static scansrc_ops fscan_ops = { fscan_scan, fscan_destroy }; /* --- @scan_file@ --- * * * Arguments: @FILE *fp@ = pointer to file descriptor - * @char *name@ = pointer to source file name + * @const char *name@ = pointer to source file name * @unsigned f@ = flags * * Returns: A scanner source. @@ -108,11 +109,11 @@ static scansrc_ops fscan_ops = { fscan_scan, fscan_destroy }; * Use: Creates a new scanner source for reading from a file. */ -scansrc *scan_file(FILE *fp, char *name, unsigned f) +scansrc *scan_file(FILE *fp, const char *name, unsigned f) { fscan *fs = CREATE(fscan); fs->ss.ops = &fscan_ops; - fs->ss.src = name; + fs->ss.src = xstrdup(name); fs->ss.line = 1; fs->fp = fp; fs->f = f; @@ -200,7 +201,7 @@ static scansrc_ops eof_ops = { eof_scan, eof_destroy }; /* --- The end of file marker --- */ -static scansrc scan_eof = { &scan_eof, &eof_ops, "", 0, EOF }; +static scansrc scan_eof = { &scan_eof, &eof_ops, "", 0, DSTR_INIT }; /*----- General scanner handling ------------------------------------------*/ @@ -216,10 +217,9 @@ static scansrc scan_eof = { &scan_eof, &eof_ops, "", 0, EOF }; int scan(scanner *sc) { int ch; - if (sc->head->pushback != EOF) { - ch = sc->head->pushback; - sc->head->pushback = EOF; - } else { + if (sc->head->pushback.len) + ch = sc->head->pushback.buf[--sc->head->pushback.len]; + else { scansrc *ss = sc->head; if (ss == &scan_eof) ch = EOF; @@ -246,7 +246,7 @@ int scan(scanner *sc) void unscan(scanner *sc, int ch) { - sc->head->pushback = ch; + DPUTC(&sc->head->pushback, ch); } /* --- @scan_push@ --- * @@ -265,7 +265,7 @@ void scan_push(scanner *sc, scansrc *ss) if (sc->head == &scan_eof) sc->tail = &ss->next; sc->head = ss; - ss->pushback = EOF; + dstr_create(&ss->pushback); ss->tok = 0; ss->t = 0; } @@ -285,7 +285,7 @@ void scan_add(scanner *sc, scansrc *ss) ss->next = &scan_eof; *sc->tail = ss; sc->tail = &ss->next; - ss->pushback = EOF; + dstr_create(&ss->pushback); ss->tok = 0; ss->t = 0; } @@ -323,12 +323,13 @@ void scan_destroy(scanner *sc) scansrc *sss = ss; ss = ss->next; if (sss->tok) - free(sss->tok); + xfree(sss->tok); + dstr_destroy(&sss->pushback); sss->ops->destroy(sss); } dstr_destroy(&sc->d); if (scan_eof.tok) - free(scan_eof.tok); + xfree(scan_eof.tok); scan_eof.tok = 0; sc->head = &scan_eof; sc->tail = &sc->head; diff --git a/scan.h b/scan.h index 07300d5..756029b 100644 --- a/scan.h +++ b/scan.h @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: scan.h,v 1.3 2002/01/13 14:50:07 mdw Exp $ + * $Id: scan.h,v 1.4 2002/02/22 23:44:16 mdw Exp $ * * Character scanners * @@ -29,6 +29,10 @@ /*----- Revision history --------------------------------------------------* * * $Log: scan.h,v $ + * Revision 1.4 2002/02/22 23:44:16 mdw + * Miscellaneous tidying up, to make this code independent of `fw'. It + * might end up in a library somewhere. + * * Revision 1.3 2002/01/13 14:50:07 mdw * Make delimiters be a property of a scanner. * @@ -63,7 +67,7 @@ typedef struct scansrc { struct scansrc_ops *ops; /* Pointer to operations table */ char *src; /* Name of this source */ int line; /* Current line number */ - int pushback; /* Pushback character */ + dstr pushback; /* Pushback characters */ char *tok; /* Token pushback */ unsigned t; /* Token type pushback */ } scansrc; @@ -89,7 +93,7 @@ typedef struct scanner { /* --- @scan_file@ --- * * * Arguments: @FILE *fp@ = pointer to file descriptor - * @char *name@ = pointer to source file name + * @const char *name@ = pointer to source file name * @unsigned f@ = flags * * Returns: A scanner source. @@ -97,10 +101,10 @@ typedef struct scanner { * 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 /* Don't close @fp@ when finished */ -#define SCF_NOCLOSE 1u -#define SCF_FREENAME 2u +extern scansrc *scan_file(FILE */*fp*/, const char */*name*/, + unsigned /*f*/); /* --- @scan_argv@ --- * *