Allow INCLUDE/DO/SYSINCLUDE to take a QuotedString argument. This allows for filenames with spaces in them.

This commit is contained in:
Dianne Skoll
2024-12-13 10:38:34 -05:00
parent 4e7cfc20ce
commit b8c4786b33
7 changed files with 36 additions and 10 deletions

View File

@@ -1927,19 +1927,18 @@ commands.
.SH THE DO, INCLUDE AND SYSINCLUDE COMMANDS .SH THE DO, INCLUDE AND SYSINCLUDE COMMANDS
.PP .PP
\fBRemind\fR allows you to include other files in your reminder script, \fBRemind\fR allows you to include other files in your reminder script,
similar to the C preprocessor #include directive. For example, your similar to the C preprocessor #include directive. For example, you
system administrator may maintain a file of holidays or system-wide might organize different reminders into different files like this:
reminders. You can include these in your reminder script as follows:
.PP .PP
.nf .nf
INCLUDE /usr/share/remind/holidays INCLUDE holidays.rem
INCLUDE /usr/share/remind/reminders INCLUDE birthdays.rem
INCLUDE "quote files with spaces.rem"
.fi .fi
.PP .PP
(The actual pathnames vary from system to system - ask your system \fBINCLUDE\fR files can be nested up to a depth of 8. As shown above, if a
administrator.) filename has spaces in it (not recommended!) you can use double-quotes
.PP around the filename.
\fBINCLUDE\fR files can be nested up to a depth of 8.
.PP .PP
If you specify a filename of "-" in the \fBINCLUDE\fR command, \fBRemind\fR If you specify a filename of "-" in the \fBINCLUDE\fR command, \fBRemind\fR
will begin reading from standard input. will begin reading from standard input.

View File

@@ -608,7 +608,7 @@ int DoInclude(ParsePtr p, enum TokTypes tok)
DBufInit(&buf); DBufInit(&buf);
DBufInit(&fullname); DBufInit(&fullname);
DBufInit(&path); DBufInit(&path);
if ( (r=ParseToken(p, &buf)) ) return r; if ( (r=ParseTokenOrQuotedString(p, &buf)) ) return r;
e = VerifyEoln(p); e = VerifyEoln(p);
if (e) Eprint("%s", GetErr(e)); if (e) Eprint("%s", GetErr(e));

View File

@@ -600,6 +600,24 @@ int ParseNonSpaceChar(ParsePtr p, int *err, int peek)
return ch; return ch;
} }
/***************************************************************/
/* */
/* ParseTokenOrQuotedString */
/* */
/* Parse either a token or a double-quote-delimited string. */
/* */
/***************************************************************/
int ParseTokenOrQuotedString(ParsePtr p, DynamicBuffer *dbuf)
{
int c, err;
c = ParseNonSpaceChar(p, &err, 1);
if (err) return err;
if (c != '"') {
return ParseToken(p, dbuf);
}
return ParseQuotedString(p, dbuf);
}
/***************************************************************/ /***************************************************************/
/* */ /* */
/* ParseQuotedString */ /* ParseQuotedString */

View File

@@ -88,6 +88,7 @@ int JulianToGregorianOffset(int y, int m);
int ParseChar (ParsePtr p, int *err, int peek); int ParseChar (ParsePtr p, int *err, int peek);
int ParseToken (ParsePtr p, DynamicBuffer *dbuf); int ParseToken (ParsePtr p, DynamicBuffer *dbuf);
int ParseQuotedString (ParsePtr p, DynamicBuffer *dbuf); int ParseQuotedString (ParsePtr p, DynamicBuffer *dbuf);
int ParseTokenOrQuotedString (ParsePtr p, DynamicBuffer *dbuf);
int ParseIdentifier (ParsePtr p, DynamicBuffer *dbuf); int ParseIdentifier (ParsePtr p, DynamicBuffer *dbuf);
expr_node * ParseExpr(ParsePtr p, int *r); expr_node * ParseExpr(ParsePtr p, int *r);
void print_expr_nodes_stats(void); void print_expr_nodes_stats(void);

View File

@@ -16232,6 +16232,11 @@ IF 1
../tests/test.rem(1435): Can't open file: /non/existent/file/should/not/work/wookie ../tests/test.rem(1435): Can't open file: /non/existent/file/should/not/work/wookie
ENDIF ENDIF
do "with space.rem"
REM MSG D'oh, a file whose name has spaces! [filename()]
D'oh, a file whose name has spaces! ../tests/with space.rem
DEBUG -e DEBUG -e
Var hash: total = 100141; maxlen = 5; avglen = 1.142 Var hash: total = 100141; maxlen = 5; avglen = 1.142
Func hash: total = 100016; maxlen = 5; avglen = 1.140 Func hash: total = 100016; maxlen = 5; avglen = 1.140

View File

@@ -1435,6 +1435,8 @@ IF 1
INCLUDE /non/existent/file/should/not/work/wookie INCLUDE /non/existent/file/should/not/work/wookie
ENDIF ENDIF
do "with space.rem"
DEBUG -e DEBUG -e
# Output expression-node stats # Output expression-node stats

1
tests/with space.rem Normal file
View File

@@ -0,0 +1 @@
REM MSG D'oh, a file whose name has spaces! [filename()]