Fix parsing of #ifdef in calendar files

There was code to process an #ifndef tokens, but none for #ifdef.
The #ifdef token was mentioned as unsupported in the BUGS section,
but no reason was given and I do not see why it should stay omitted.

Misleading information in The BUGS section of the man-page regarding
the maximum number of #define and #include statements supported has
been removed. These limits might have applied to a prior version of
this program, but do not seem to apply to the current implementation.

I have not tried to test for the existence of the limits, but the
include file processing just recursively calls the parser (without
counting the recursion depth) and the stringlist functions do not
impose a limit on the number of entries.

Reported by:	jhs@berklix.com
MFC after:	3 days
This commit is contained in:
Stefan Eßer 2020-10-28 13:06:39 +00:00
parent 6869aed2cf
commit 2939897921
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=367103
2 changed files with 18 additions and 5 deletions

View File

@ -346,11 +346,9 @@ double-check the start and end time of solar and lunar events.
.Sh BUGS
The
.Nm
internal cpp does not correctly do #ifndef and will discard the rest
of the file if a #ifndef is triggered.
It also has a maximum of 50 include file and/or 100 #defines
and only recognises #include, #define and
#ifndef.
internal cpp does not support nested conditions and will continue
parsing of the input file on the next #endif even in nested contexts.
It does only recognise #include, #define, #ifdef and #ifndef.
.Pp
There is no possibility to properly specify the local position
needed for solar and lunar calculations.

View File

@ -212,6 +212,21 @@ token(char *line, FILE *out, bool *skip)
return (T_OK);
}
if (strncmp(line, "ifdef", 5) == 0) {
walk = line + 6;
trimlr(&walk);
if (*walk == '\0') {
warnx("Expecting arguments after #ifdef");
return (T_ERR);
}
if (definitions == NULL || sl_find(definitions, walk) == NULL)
*skip = true;
return (T_OK);
}
if (strncmp(line, "ifndef", 6) == 0) {
walk = line + 6;
trimlr(&walk);