summaryrefslogtreecommitdiff
path: root/usr.sbin/hoststated/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/hoststated/parse.y')
-rw-r--r--usr.sbin/hoststated/parse.y57
1 files changed, 28 insertions, 29 deletions
diff --git a/usr.sbin/hoststated/parse.y b/usr.sbin/hoststated/parse.y
index 2b66240b3dc..6135aa6cbce 100644
--- a/usr.sbin/hoststated/parse.y
+++ b/usr.sbin/hoststated/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.58 2007/10/02 07:21:04 pyr Exp $ */
+/* $OpenBSD: parse.y,v 1.59 2007/10/02 21:04:13 pyr Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -67,7 +67,7 @@ int yyerror(const char *, ...);
int yyparse(void);
int kw_cmp(const void *, const void *);
int lookup(char *);
-int lgetc(FILE *, int *);
+int lgetc(FILE *, int);
int lungetc(int);
int findeol(void);
int yylex(void);
@@ -517,6 +517,7 @@ tableoptsl : host {
free($5);
YYERROR;
}
+ translate_string(table->conf.exbuf);
free($5);
}
| CHECK SCRIPT STRING {
@@ -1257,11 +1258,10 @@ char pushback_buffer[MAXPUSHBACK];
int pushback_index = 0;
int
-lgetc(FILE *f, int *keep)
+lgetc(FILE *f, int inquot)
{
int c, next;
- *keep = 0;
if (parsebuf) {
/* Read character from the parsebuffer instead of input. */
if (parseindex >= 0) {
@@ -1276,17 +1276,14 @@ lgetc(FILE *f, int *keep)
if (pushback_index)
return (pushback_buffer[--pushback_index]);
+ if (inquot) {
+ c = getc(f);
+ return (c);
+ }
+
while ((c = getc(f)) == '\\') {
next = getc(f);
- if (next == 'n') {
- *keep = 1;
- c = '\n';
- break;
- } else if (next == 'r') {
- *keep = 1;
- c = '\r';
- break;
- } else if (next != '\n') {
+ if (next != '\n') {
c = next;
break;
}
@@ -1325,15 +1322,14 @@ int
findeol(void)
{
int c;
- int k;
parsebuf = NULL;
pushback_index = 0;
/* skip to either EOF or the first real EOL */
while (1) {
- c = lgetc(fin, &k);
- if (c == '\n' && k == 0) {
+ c = lgetc(fin, 0);
+ if (c == '\n') {
lineno++;
break;
}
@@ -1348,24 +1344,21 @@ yylex(void)
{
char buf[8096];
char *p, *val;
- int endc, c;
+ int endc, next, c;
int token;
- int keep;
top:
p = buf;
- while ((c = lgetc(fin, &keep)) == ' ')
+ while ((c = lgetc(fin, 0)) == ' ')
; /* nothing */
yylval.lineno = lineno;
if (c == '#')
- do {
- while ((c = lgetc(fin, &keep)) != '\n' && c != EOF)
- ; /* nothing */
- } while (keep == 1);
+ while ((c = lgetc(fin, 0)) != '\n' && c != EOF)
+ ; /* nothing */
if (c == '$' && parsebuf == NULL) {
while (1) {
- if ((c = lgetc(fin, &keep)) == EOF)
+ if ((c = lgetc(fin, 0)) == EOF)
return (0);
if (p + 1 >= buf + sizeof(buf) - 1) {
@@ -1395,13 +1388,19 @@ top:
case '"':
endc = c;
while (1) {
- if ((c = lgetc(fin, &keep)) == EOF)
+ if ((c = lgetc(fin, 1)) == EOF)
return (0);
- if (c == endc) {
+ if (c == '\\') {
+ next = lgetc(fin, 1);
+ if (next == endc)
+ c = next;
+ else
+ lungetc(next);
+ } else if (c == endc) {
*p = '\0';
break;
}
- if (c == '\n' && keep == 0) {
+ if (c == '\n') {
lineno++;
continue;
}
@@ -1427,7 +1426,7 @@ top:
yyerror("string too long");
return (findeol());
}
- } while ((c = lgetc(fin, &keep)) != EOF && isdigit(c));
+ } while ((c = lgetc(fin, 0)) != EOF && isdigit(c));
lungetc(c);
if (p == buf + 1 && buf[0] == '-')
goto nodigits;
@@ -1466,7 +1465,7 @@ nodigits:
yyerror("string too long");
return (findeol());
}
- } while ((c = lgetc(fin, &keep)) != EOF &&
+ } while ((c = lgetc(fin, 0)) != EOF &&
(allowed_in_string(c)));
lungetc(c);
*p = '\0';