X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/372a98e2893234a482e59ca32313db1bb86146d7..00e3c0f1bbe99682debd4e34d3d3bd950f8c30cb:/scan.c diff --git a/scan.c b/scan.c index 84260ed..0bc5cda 100644 --- a/scan.c +++ b/scan.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: scan.c,v 1.4 2001/02/03 20:30:03 mdw Exp $ + * $Id: scan.c,v 1.6 2002/02/22 23:44:16 mdw Exp $ * * Character scanners * @@ -29,6 +29,13 @@ /*----- 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. + * * Revision 1.4 2001/02/03 20:30:03 mdw * Support re-reading config files on SIGHUP. * @@ -46,8 +53,6 @@ /*----- Header files ------------------------------------------------------*/ -#include "config.h" - #include #include #include @@ -85,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); } @@ -97,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. @@ -105,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; @@ -197,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 ------------------------------------------*/ @@ -213,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; @@ -243,7 +246,7 @@ int scan(scanner *sc) void unscan(scanner *sc, int ch) { - sc->head->pushback = ch; + DPUTC(&sc->head->pushback, ch); } /* --- @scan_push@ --- * @@ -262,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; } @@ -282,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; } @@ -301,6 +304,7 @@ void scan_create(scanner *sc) sc->head = &scan_eof; sc->tail = &sc->head; dstr_create(&sc->d); + sc->wbegin = sc->wcont = 0; } /* --- @scan_destroy@ --- * @@ -319,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;