]> granicus.if.org Git - nethack/commitdiff
goodbye END-CHOOSE
authorPatR <rankin@nethack.org>
Fri, 7 Aug 2020 07:29:28 +0000 (00:29 -0700)
committerPatR <rankin@nethack.org>
Fri, 7 Aug 2020 07:29:28 +0000 (00:29 -0700)
Instead of an additional options file directive to end the last
section of a CHOOSE directive, simplify by using an empty-name
section, [], instead.  So
...
CHOOSE one,two
[one]
...
[two]
...
[]
...

As with the short-lived END-CHOOSE directive, if no [] is present
then the rest of the file is part of the last choice.

doc/Guidebook.mn
doc/Guidebook.tex
doc/fixes37.0
src/files.c

index dfa15732b4bbc599f96708b1a41cc82b96c8544e..a73b5dc8e501321f1f351e66330307a44d1fa4d1 100644 (file)
@@ -1,4 +1,4 @@
-.\" $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.394 $ $NHDT-Date: 1596754607 2020/08/06 22:56:47 $
+.\" $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.395 $ $NHDT-Date: 1596785362 2020/08/07 07:29:22 $
 .\"
 .\" This is an excerpt from the 'roff' man page from the 'groff' package.
 .\" Guidebook.mn currently does *not* fully adhere to these guidelines.
@@ -3130,16 +3130,20 @@ the configuration file for you using the default template file.
 .pg
 On MS-DOS, it is \(lqdefaults.nh\(rq in the same folder as nethack.exe.
 .pg
-Any line in the configuration file starting with \(oq#\(cq is treated
-as a comment.
+Any line in the configuration file starting with \(oq\f(CR#\fP\(cq is treated
+as a comment and ignored.
 Empty lines are ignored.
 .pg
-Any line beginning with \(oq[\(cq and ending in \(oq]\(cq is considered
-a section marker.
+Any line beginning with \(oq\f(CR[\fP\(cq and ending in \(oq\f(CR]\fP\(cq
+is a section marker (the closing \(oq\f(CR]\fP\(cq can be followed
+by whitespace and then an arbitrary comment beginning with \(oq\f(CR#\fP\(cq).
 The text between the square brackets is the section name.
-Lines after a section marker belong to that section, and are
-ignored unless a CHOOSE directive was used to select that section.
-Section names are case insensitive.
+Section markers are only valid after a CHOOSE directive and their names
+are case insensitive.
+Lines after a section marker belong to that section up until another
+section starts or a marker without a name is encountered or the file ends.
+Lines within sections are ignored unless a CHOOSE directive has selected
+that section.
 .pg
 You can use different configuration directives in the file, some
 of which can be used multiple times.
@@ -3232,17 +3236,13 @@ CHOOSE=char A,char B
 OPTIONS=role:arc,race:dwa,align:law,gender:fem
 [char B]
 OPTIONS=role:wiz,race:elf,align:cha,gender:mal
-END-CHOOSE
+[] #end of CHOOSE
 OPTIONS=!rest_on_space
 .ft \" revert to previous font
 .ed
-.lp END-CHOOSE
-An optional way to terminate CHOOSE.
-.\" use of the \% prefix prevents END-CHOOSE from being hyphenated across
-.\" line boundary despite its hyphen; needed for the plain text output to
-.\" avoid splitting the directive name
-You can place an \%END-CHOOSE directive after the last CHOOSE section in
-order to follow that with other options which are common to all sections.
+.lp ""
+If \f(CR[]\fP is present, the preceding section is closed and no new
+section begins; whatever follows will be common to all sections.
 Otherwise the last section extends to the end of the options file.
 .lp MENUCOLOR
 Highlight menu lines with different colors.
index 14c3cd84349ddcf3bdd52d803a8e8475e4de33cb..16b6628846101fe8db327e481dc8bb89687a3ef2 100644 (file)
@@ -3355,12 +3355,20 @@ On MS-DOS it is \mbox{``defaults.nh''} in the same folder as
 \mbox{{\it nethack.exe\/}}.\\
 
 %.lp ""
-Any line in the configuration file starting with `{\tt \#}' is treated as a comment.
-Empty lines are ignored. Any line beginning with `{\tt [}' and ending in `{\tt ]}' is considered a section
-marker. The text between the square brackets is the section name.
-Lines after a section marker belong to that section, and are
-ignored unless a CHOOSE -directive was used to select that section.
-Section names are case insensitive.
+Any line in the configuration file starting with `{\tt \#}' is treated
+as a comment and ignored.
+Empty lines are ignored.
+
+Any line beginning with `{\tt [}' and ending in `{\tt ]}'
+is a section marker (the closing `{\tt ]}' can be followed
+by whitespace and then an arbitrary comment beginning with `{\tt #}').
+The text between the square brackets is the section name.
+Section markers are only valid after a CHOOSE directive and their names
+are case insensitive.
+Lines after a section marker belong to that section up until another
+section starts or a marker without a name is encountered or the file ends.
+Lines within sections are ignored unless a CHOOSE directive has selected
+that section.
 
 %.pg
 You can use different configuration directives in the file, some
@@ -3474,16 +3482,14 @@ Example:
    OPTIONS=role:arc,race:dwa,align:law,gender:fem
    [char B]
    OPTIONS=role:wiz,race:elf,align:cha,gender:mal
-   END-CHOOSE
+   [] #end of CHOOSE
    OPTIONS=!rest_on_space
 \end{verbatim}
 %.ed
 
-%.lp
-\item[\bb{END-CHOOSE}]
-An optional way to terminate CHOOSE.
-You can place an END-CHOOSE directive after the last CHOOSE section in
-order to follow that with other options which are common to all sections.
+%.lp ""
+If {\tt []} is present, the preceding section is closed and no new
+section begins; whatever follows will be common to all sections.
 Otherwise the last section extends to the end of the options file.
 
 %.lp
index 35fb1fec0af35257e8def124a3c0a2502e4a3a21..857c26fcec0612c209e70e71f97d860a8371414b 100644 (file)
@@ -1,4 +1,4 @@
-NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.275 $ $NHDT-Date: 1596754606 2020/08/06 22:56:46 $
+NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.276 $ $NHDT-Date: 1596785361 2020/08/07 07:29:21 $
 
 General Fixes and Modified Features
 -----------------------------------
@@ -459,11 +459,11 @@ add 'Sokoban' conduct, tracking the number of times the special Sokoban rules
 reduce verbosity when a mind flayer attacks a headless monster; when a
        tentacle-to-head attack hits but fails to accomplish anything skip
        remaining attacks (mind flayer has 3, master mind flayer has 5)
-add END-CHOOSE directive for run-time config file; CHOOSE section1,section2
+add section marker [] support to run-time config file; CHOOSE section1,section2
        followed by [section1] ... [section2] ... forced all the rest of the
-       file to be part of the last section; that still works the same but
-       END-CHOOSE can be used to terminate the last section and revert to
-       common options for the remainder of the file
+       file to be part of the last section; that still works the same, but []
+       can be used to terminate the last section and revert to common options
+       for the remainder of the file
 
 
 Platform- and/or Interface-Specific New Features
index b79c2a913d400b263b2a0d3dde899625ba27c48b..f3c171111f850edd1c29e45298a5e0ea7f388623 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.7 files.c $NHDT-Date: 1596754598 2020/08/06 22:56:38 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.317 $ */
+/* NetHack 3.7 files.c $NHDT-Date: 1596785343 2020/08/07 07:29:03 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.318 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Derek S. Ray, 2015. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -164,7 +164,6 @@ static boolean FDECL(config_error_nextline, (const char *));
 static void NDECL(free_config_sections);
 static char *FDECL(choose_random_part, (char *, CHAR_P));
 static char *FDECL(is_config_section, (char *));
-static boolean FDECL(is_end_of_sections, (const char *));
 static boolean FDECL(handle_config_section, (char *));
 static char *FDECL(find_optparam, (const char *));
 static void FDECL(parseformat, (int *, char *));
@@ -2328,7 +2327,7 @@ char *str; /* trailing spaces will be stripped, ']' too iff result is good */
         return (char *) 0;
     /* last character should be close bracket, ignoring any comment */
     z = index(a, ']');
-    if (!z || z == a)
+    if (!z)
         return (char *) 0;
     for (c = z + 1; *c && *c != '#'; ++c)
         continue;
@@ -2342,46 +2341,27 @@ char *str; /* trailing spaces will be stripped, ']' too iff result is good */
     return trimspaces(a);
 }
 
-static boolean
-is_end_of_sections(buf)
-const char *buf;
-{
-    /* "END-CHOOSE"; bypass match_optname()/match_varname();
-       accepts "ENDCHOOSE", "END CHOOSE", "END-CHOOSE", "END_CHOOSE" */
-    if (!strncmpi(buf, "END", 3) && buf[3]) {
-        boolean sep = index(" -_", buf[3]) != 0;
-
-        if (!strcmpi(&buf[sep ? 4 : 3], "CHOOSE")) {
-            if (!g.config_section_current)
-                config_error_add("END-CHOOSE when not in a CHOOSE section");
-            return TRUE;
-        }
-    }
-    return FALSE;
-}
-
 static boolean
 handle_config_section(buf)
 char *buf;
 {
-    boolean was_in_section = (g.config_section_current != 0);
     char *sect = is_config_section(buf);
 
     if (sect) {
         if (g.config_section_current)
-            free(g.config_section_current);
+            free(g.config_section_current), g.config_section_current = 0;
         /* is_config_section() removed brackets from 'sect' */
         if (!g.config_section_chosen) {
             config_error_add("Section \"[%s]\" without CHOOSE", sect);
             return TRUE;
         }
-        g.config_section_current = dupstr(sect);
-        debugpline1("set config section: '%s'", g.config_section_current);
-        return TRUE;
-    } else if (is_end_of_sections(buf)) {
-        if (was_in_section)
+        if (*sect) { /* got a section name */
+            g.config_section_current = dupstr(sect);
+            debugpline1("set config section: '%s'", g.config_section_current);
+        } else { /* empty section name => end of sections */
+            free_config_sections();
             debugpline0("unset config section");
-        free_config_sections();
+        }
         return TRUE;
     }
 
@@ -2436,12 +2416,6 @@ char *origbuf;
        but spaces, one of them will be kept even though it leads/trails) */
     mungspaces(buf);
 
-    /* "END-CHOOSE" doesn't have a value so we need to check for it
-       before checking for that; if found here, is_end_of_sections()
-       will report a config_error */
-    if (is_end_of_sections(buf))
-        return FALSE;
-
     /* find the '=' or ':' */
     bufp = find_optparam(buf);
     if (!bufp) {