hilite_status string comparison
Simplify the string comparison done when checking 'textmatch' rules to decide whether to highlight something. Fix the menu titles when setting up a textmatch via 'O': the title for color referred to attribute and the one for attribute used the default. The two tiles are set up in advance; the one for color was set correctly but then the one for attribute was written into the wrong buffer. When using 'O' to manipulate hilite_status rules, if there are any when you're done and the 'statushilites' option (iflags.hilite_delta) is 0, give a message reminding that it needs to be non-zero for highlighting to be activated.
This commit is contained in:
@@ -24,6 +24,12 @@ config file error handling routines were calling xx_wait_synch early
|
||||
status_finish() in botl.c would unconditionally invoke the window port's
|
||||
win_status_finish() routine which was problematic if the windowport
|
||||
wasn't initialized yet
|
||||
using 'O' to set up a hilite_status rule for string comparison, the menu for
|
||||
color was titled "choose attribute for when <foo> is 'bar'" and the
|
||||
one prompting for attribute used the default "pick an attribute"
|
||||
when finishing using 'O' to examine or set hilite_status rules, if the
|
||||
'statushilites' option is 0 and there is at least one rule, give a
|
||||
reminder about setting it to non-zero to activate highlighting
|
||||
|
||||
|
||||
Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
|
||||
|
||||
70
src/botl.c
70
src/botl.c
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 botl.c $NHDT-Date: 1526955073 2018/05/22 02:11:13 $ $NHDT-Branch: NetHack-3.6.2 $:$NHDT-Revision: 1.98 $ */
|
||||
/* NetHack 3.6 botl.c $NHDT-Date: 1526982122 2018/05/22 09:42:02 $ $NHDT-Branch: NetHack-3.6.2 $:$NHDT-Revision: 1.99 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/*-Copyright (c) Michael Allison, 2006. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
@@ -1363,7 +1363,7 @@ int *colorptr;
|
||||
int bestcolor = NO_COLOR;
|
||||
struct hilite_s *hl;
|
||||
anything *value = (anything *) vp;
|
||||
char *txtstr, *cmpstr;
|
||||
char *txtstr;
|
||||
|
||||
if (!colorptr || fldidx < 0 || fldidx >= MAXBLSTATS)
|
||||
return;
|
||||
@@ -1457,19 +1457,13 @@ int *colorptr;
|
||||
}
|
||||
break;
|
||||
case BL_TH_TEXTMATCH:
|
||||
txtstr = dupstr(blstats[idx][fldidx].val);
|
||||
cmpstr = txtstr;
|
||||
if (fldidx == BL_TITLE) {
|
||||
int len = (int) (strlen(plname) + sizeof (" the"));
|
||||
|
||||
cmpstr += len;
|
||||
}
|
||||
(void) trimspaces(cmpstr);
|
||||
if (hl->rel == TXT_VALUE && hl->textmatch[0] &&
|
||||
!strcmpi(hl->textmatch, cmpstr)) {
|
||||
txtstr = blstats[idx][fldidx].val;
|
||||
if (fldidx == BL_TITLE)
|
||||
txtstr += (strlen(plname) + sizeof " the " - sizeof "");
|
||||
if (hl->rel == TXT_VALUE && hl->textmatch[0]
|
||||
&& fuzzymatch(hl->textmatch, txtstr, " -_", TRUE)) {
|
||||
merge_bestcolor(&bestcolor, hl->coloridx);
|
||||
}
|
||||
free(txtstr);
|
||||
break;
|
||||
case BL_TH_ALWAYS_HILITE:
|
||||
merge_bestcolor(&bestcolor, hl->coloridx);
|
||||
@@ -2337,8 +2331,7 @@ struct _status_hilite_line_str {
|
||||
struct _status_hilite_line_str *next;
|
||||
};
|
||||
|
||||
struct _status_hilite_line_str *status_hilite_str =
|
||||
(struct _status_hilite_line_str *) 0;
|
||||
static struct _status_hilite_line_str *status_hilite_str = 0;
|
||||
static int status_hilite_str_id = 0;
|
||||
|
||||
STATIC_OVL void
|
||||
@@ -2348,22 +2341,20 @@ struct hilite_s *hl;
|
||||
unsigned long mask;
|
||||
const char *str;
|
||||
{
|
||||
struct _status_hilite_line_str *tmp = (struct _status_hilite_line_str *)
|
||||
alloc(sizeof(struct _status_hilite_line_str));
|
||||
struct _status_hilite_line_str *nxt = status_hilite_str;
|
||||
struct _status_hilite_line_str *tmp, *nxt;
|
||||
|
||||
(void) memset(tmp, 0, sizeof(struct _status_hilite_line_str));
|
||||
tmp = (struct _status_hilite_line_str *) alloc(sizeof *tmp);
|
||||
(void) memset(tmp, 0, sizeof *tmp);
|
||||
|
||||
++status_hilite_str_id;
|
||||
tmp->fld = fld;
|
||||
tmp->hl = hl;
|
||||
tmp->mask = mask;
|
||||
(void) stripchars(tmp->str, " ", str);
|
||||
|
||||
tmp->id = status_hilite_str_id;
|
||||
|
||||
if (nxt) {
|
||||
while (nxt && nxt->next)
|
||||
if ((nxt = status_hilite_str) != 0) {
|
||||
while (nxt->next)
|
||||
nxt = nxt->next;
|
||||
nxt->next = tmp;
|
||||
} else {
|
||||
@@ -2375,8 +2366,7 @@ const char *str;
|
||||
STATIC_OVL void
|
||||
status_hilite_linestr_done()
|
||||
{
|
||||
struct _status_hilite_line_str *tmp = status_hilite_str;
|
||||
struct _status_hilite_line_str *nxt;
|
||||
struct _status_hilite_line_str *nxt, *tmp = status_hilite_str;
|
||||
|
||||
while (tmp) {
|
||||
nxt = tmp->next;
|
||||
@@ -2406,6 +2396,7 @@ int
|
||||
count_status_hilites(VOID_ARGS)
|
||||
{
|
||||
int count;
|
||||
|
||||
status_hilite_linestr_gather();
|
||||
count = status_hilite_linestr_countfield(BL_FLUSH);
|
||||
status_hilite_linestr_done();
|
||||
@@ -2421,13 +2412,14 @@ status_hilite_linestr_gather_conditions()
|
||||
unsigned long clratr;
|
||||
} cond_maps[SIZE(valid_conditions)];
|
||||
|
||||
(void)memset(cond_maps, 0,
|
||||
sizeof(struct _cond_map) * SIZE(valid_conditions));
|
||||
(void) memset(cond_maps, 0,
|
||||
SIZE(valid_conditions) * sizeof (struct _cond_map));
|
||||
|
||||
for (i = 0; i < SIZE(valid_conditions); i++) {
|
||||
int clr = NO_COLOR;
|
||||
int atr = HL_NONE;
|
||||
int j;
|
||||
|
||||
for (j = 0; j < CLR_MAX; j++)
|
||||
if (cond_hilites[j] & valid_conditions[i].bitmask)
|
||||
clr = j;
|
||||
@@ -2445,6 +2437,7 @@ status_hilite_linestr_gather_conditions()
|
||||
if (clr != NO_COLOR || atr != HL_NONE) {
|
||||
unsigned long ca = clr | (atr << 8);
|
||||
boolean added_condmap = FALSE;
|
||||
|
||||
for (j = 0; j < SIZE(valid_conditions); j++)
|
||||
if (cond_maps[j].clratr == ca) {
|
||||
cond_maps[j].bm |= valid_conditions[i].bitmask;
|
||||
@@ -2465,12 +2458,14 @@ status_hilite_linestr_gather_conditions()
|
||||
for (i = 0; i < SIZE(valid_conditions); i++)
|
||||
if (cond_maps[i].bm) {
|
||||
int clr = NO_COLOR, atr = HL_NONE;
|
||||
|
||||
split_clridx(cond_maps[i].clratr, &clr, &atr);
|
||||
if (clr != NO_COLOR || atr != HL_NONE) {
|
||||
char clrbuf[BUFSZ];
|
||||
char attrbuf[BUFSZ];
|
||||
char condbuf[BUFSZ];
|
||||
char *tmpattr;
|
||||
|
||||
(void) stripchars(clrbuf, " ", clr2colorname(clr));
|
||||
tmpattr = hlattr2attrname(atr, attrbuf, BUFSZ);
|
||||
if (tmpattr)
|
||||
@@ -3073,7 +3068,7 @@ choose_value:
|
||||
}
|
||||
Sprintf(colorqry, "Choose a color for when %s is '%s':",
|
||||
initblstats[fld].fldname, hilite.textmatch);
|
||||
Sprintf(colorqry, "Choose attribute for when %s is '%s':",
|
||||
Sprintf(attrqry, "Choose attribute for when %s is '%s':",
|
||||
initblstats[fld].fldname, hilite.textmatch);
|
||||
} else if (behavior == BL_TH_ALWAYS_HILITE) {
|
||||
Sprintf(colorqry, "Choose a color to always hilite %s:",
|
||||
@@ -3346,9 +3341,7 @@ shlmenu_redo:
|
||||
start_menu(tmpwin);
|
||||
|
||||
status_hilite_linestr_gather();
|
||||
|
||||
countall = status_hilite_linestr_countfield(BL_FLUSH);
|
||||
|
||||
if (countall) {
|
||||
any = zeroany;
|
||||
any.a_int = -1;
|
||||
@@ -3364,12 +3357,10 @@ shlmenu_redo:
|
||||
char buf[BUFSZ];
|
||||
|
||||
any = zeroany;
|
||||
any.a_int = (i+1);
|
||||
any.a_int = i + 1;
|
||||
Sprintf(buf, "%-18s", initblstats[i].fldname);
|
||||
if (count)
|
||||
Sprintf(buf, "%-18s (%i defined)",
|
||||
initblstats[i].fldname, count);
|
||||
else
|
||||
Sprintf(buf, "%-18s", initblstats[i].fldname);
|
||||
Sprintf(eos(buf), " (%d defined)", count);
|
||||
add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
|
||||
buf, MENU_UNSELECTED);
|
||||
}
|
||||
@@ -3382,17 +3373,24 @@ shlmenu_redo:
|
||||
status_hilites_viewall();
|
||||
else
|
||||
(void) status_hilite_menu_fld(i);
|
||||
free((genericptr_t) picks);
|
||||
free((genericptr_t) picks), picks = (menu_item *) 0;
|
||||
redo = TRUE;
|
||||
}
|
||||
|
||||
picks = (menu_item *) 0;
|
||||
destroy_nhwindow(tmpwin);
|
||||
countall = status_hilite_linestr_countfield(BL_FLUSH);
|
||||
status_hilite_linestr_done();
|
||||
|
||||
if (redo)
|
||||
goto shlmenu_redo;
|
||||
|
||||
/* hilite_delta=='statushilites' does double duty: it is the
|
||||
number of turns for temporary highlights to remain visible
|
||||
and also when non-zero it is the flag to enable highlighting */
|
||||
if (countall > 0 && !iflags.hilite_delta)
|
||||
pline(
|
||||
"To have highlights become active, set 'statushilites' option to non-zero.");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user