X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/e91b672f05f0ad6fd9c5daaf3b2bcd6ecaa81c3c..367d81afe3d72b6bc1519d2ae2187a6535370025:/scan.c diff --git a/scan.c b/scan.c index cd082f5..379951d 100644 --- a/scan.c +++ b/scan.c @@ -1,64 +1,30 @@ /* -*-c-*- * - * $Id: scan.c,v 1.5 2002/01/30 09:29:34 mdw Exp $ - * * Character scanners * * (c) 1999 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * - * This file is part of the `fw' port forwarder. + * This file is part of the `fwd' port forwarder. * - * `fw' is free software; you can redistribute it and/or modify + * `fwd' is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * - * `fw' is distributed in the hope that it will be useful, + * + * `fwd' is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License - * along with `fw'; if not, write to the Free Software Foundation, + * along with `fwd'; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: scan.c,v $ - * 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. - * - * Revision 1.3 2000/08/01 17:58:10 mdw - * Fix subtleties with functions. - * - * 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. - * - */ - -/*----- Header files ------------------------------------------------------*/ - -#include "config.h" - -#include -#include -#include - -#include -#include - -#include "scan.h" +#include "fwd.h" /*----- File scanner source -----------------------------------------------*/ @@ -88,8 +54,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 +65,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 +73,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 +165,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 +181,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 +210,7 @@ int scan(scanner *sc) void unscan(scanner *sc, int ch) { - sc->head->pushback = ch; + DPUTC(&sc->head->pushback, ch); } /* --- @scan_push@ --- * @@ -265,7 +229,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 +249,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 +287,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;