From: nethack.allison Date: Thu, 21 Sep 2006 05:53:08 +0000 (+0000) Subject: more followup (trunk only) X-Git-Tag: MOVE2GIT~897 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=72011cb75f2790fca7add3f2cd5ce2752df16d79;p=nethack more followup (trunk only) make the handling recognition use an int instead of string. --- diff --git a/include/rm.h b/include/rm.h index 0ad57f927..c62fc02ba 100644 --- a/include/rm.h +++ b/include/rm.h @@ -241,21 +241,28 @@ struct textlist { struct textlist *next; /* next in list */ }; +/* + * special symbol set handling types (callbacks, etc.) + * Must match the order of the known_handlers strings + * in drawing.c + */ +#define H_UNK 0 +#define H_IBM 1 +#define H_DEC 2 + #ifdef REINCARNATION -#define ROGUEHANDLING(H) ((Is_rogue_level(&u.uz) && roguehandling && \ - !strcmpi(roguehandling,H))) -#define SYMHANDLING(H) (ROGUEHANDLING(H) || \ - (!Is_rogue_level(&u.uz) && symhandling && \ - !strcmpi(symhandling,H))) +#define ROGUEHANDLING(ht) (Is_rogue_level(&u.uz) && roguehandling == (ht)) +#define SYMHANDLING(ht) (ROGUEHANDLING(ht) || \ + (!Is_rogue_level(&u.uz) && symhandling == (ht))) #else -#define SYMHANDLING(H) (symhandling && !strcmpi(symhandling,H)) +#define SYMHANDLING(ht) (symhandling == (ht)) #endif extern const struct symdef defsyms[MAXPCHARS]; /* defaults */ extern uchar showsyms[MAXPCHARS]; extern const struct symdef def_warnsyms[WARNCOUNT]; -extern char *symset, *symhandling; /* from drawing.c */ -extern char *roguesymset, *roguehandling; /* from drawing.c */ +extern char *symset, *roguesymset; /* from drawing.c */ +extern int symhandling, roguehandling; /* from drawing.c */ /* * Graphics sets for display symbols diff --git a/src/drawing.c b/src/drawing.c index a9ece3817..772abc62e 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -17,8 +17,8 @@ #define C(n) #endif -char *symset = 0, *symhandling = 0; /* from drawing.c */ -char *roguesymset = 0, *roguehandling = 0; /* from drawing.c */ +char *symset = 0, *roguesymset = 0; +int symhandling = 0, roguehandling = 0; uchar oc_syms[MAXOCLASSES] = DUMMY; /* the current object display symbols */ uchar showsyms[MAXPCHARS] = DUMMY; /* the current feature display symbols */ @@ -380,14 +380,14 @@ int nondefault; * the Is_Roguelevel checks in those macros. */ #ifdef PC9800 - if (symhandling && !strcmpi(symhandling,"IBM") + if (symhandling == H_IBM && ibmgraphics_mode_callback) (*ibmgraphics_mode_callback)(); else if (!symset && ascgraphics_mode_callback) (*ascgraphics_mode_callback)(); #endif #ifdef TERMLIB - if (symhandling && !strcmp(symhandling,"DEC") + if (symhandling == H_DEC && decgraphics_mode_callback) (*decgraphics_mode_callback)(); #endif @@ -538,6 +538,20 @@ int val; } } +/* + * If you are adding code somewhere to be able to recognize + * particular types of symset "handling", define a + * H_XXX macro in include/rm.h and add the name + * to this array at the matching offset. + */ +const char *known_handling[] = { + "UNKNOWN", /* H_UNK */ + "IBM", /* H_IBM */ + "DEC", /* H_DEC */ + (const char *)0, +}; + + struct symparse loadsyms[] = { {SYM_CONTROL, 0, "start"}, {SYM_CONTROL, 0, "begin"}, diff --git a/src/files.c b/src/files.c index 16ed83825..29e10c6b7 100644 --- a/src/files.c +++ b/src/files.c @@ -2422,8 +2422,9 @@ read_wizkit() #endif /*WIZARD*/ #ifdef ASCIIGRAPH -extern struct symparse loadsyms[]; /* drawing.c */ extern struct textlist *symset_list; /* options.c */ +extern struct symparse loadsyms[]; /* drawing.c */ +extern const char *known_handling[]; /* drawing.c */ static int symset_count = 0; /* for pick-list building only */ static boolean chosen_symset_start = FALSE, chosen_symset_end = FALSE; @@ -2560,12 +2561,15 @@ boolean rogueflag; if (!strcmpi(bufp, symsetname)) { /* desired one? */ chosen_symset_start = TRUE; #ifdef REINCARNATION - if (rogueflag) + if (rogueflag) { init_r_symbols(); - else + roguehandling = H_UNK; + } #endif + if (!rogueflag) { init_l_symbols(); - free_symhandling(rogueflag); + symhandling = H_UNK; + } } break; case 1: @@ -2594,42 +2598,32 @@ boolean rogueflag; return 1; } -STATIC_OVL void -free_symhandling(rogueflag) -boolean rogueflag; -{ - if (rogueflag) { -#ifdef REINCARNATION - if (roguehandling) { - free((genericptr_t)roguehandling); - roguehandling = (char *)0; - } -#endif - } else { - if (symhandling) { - free((genericptr_t)symhandling); - symhandling = (char *)0; - } - } -} - STATIC_OVL void set_symhandling(handling, rogueflag) char *handling; boolean rogueflag; { - char *new_handling; + int i = 0; - free_symhandling(rogueflag); - if (!handling) return; - new_handling = (char *)alloc(strlen(handling)+1); - Strcpy(new_handling, handling); #ifdef REINCARNATION - if (rogueflag) - roguehandling = new_handling; + if (rogueflag) roguehandling = H_UNK; +#endif + if (!rogueflag) symhandling = H_UNK; + while (known_handling[i]) { + if (!strcmpi(known_handling[i], handling)) { +#ifdef REINCARNATION + if (rogueflag) { + roguehandling = i; + return; + } #endif - if (!rogueflag) - symhandling = new_handling; + if (!rogueflag) { + symhandling = i; + return; + } + } + i++; + } } #endif /*ASCIIGRAPH*/ diff --git a/src/mapglyph.c b/src/mapglyph.c index cb24ca5db..186e22f95 100644 --- a/src/mapglyph.c +++ b/src/mapglyph.c @@ -50,9 +50,9 @@ int explcolors[] = { #ifdef ROGUE_COLOR # if defined(USE_TILES) && defined(MSDOS) -#define HAS_ROGUE_IBM_GRAPHICS (ROGUEHANDLING("IBM") && !iflags.grmode) +#define HAS_ROGUE_IBM_GRAPHICS (ROGUEHANDLING(H_IBM) && !iflags.grmode) # else -#define HAS_ROGUE_IBM_GRAPHICS (ROGUEHANDLING("IBM")) +#define HAS_ROGUE_IBM_GRAPHICS (ROGUEHANDLING(H_IBM)) # endif #endif diff --git a/sys/wince/mhfont.c b/sys/wince/mhfont.c index 1f40aea1d..4599cc621 100644 --- a/sys/wince/mhfont.c +++ b/sys/wince/mhfont.c @@ -155,7 +155,7 @@ HGDIOBJ mswin_get_font(int win_type, int attr, HDC hdc, BOOL replace) UINT mswin_charset() { CHARSETINFO cis; - if( SYMHANDLING("IBM") ) + if( SYMHANDLING(H_IBM) ) if( TranslateCharsetInfo((DWORD*)GetOEMCP(), &cis, TCI_SRCCODEPAGE) ) return cis.ciCharset; else diff --git a/win/tty/termcap.c b/win/tty/termcap.c index f6312f2d6..fd98cd572 100644 --- a/win/tty/termcap.c +++ b/win/tty/termcap.c @@ -386,7 +386,7 @@ tty_decgraphics_termcap_fixup() * Do not select NA ASCII as the primary font since people may * reasonably be using the UK character set. */ - if (SYMHANDLING("DEC")) xputs("\033)0"); + if (SYMHANDLING(H_DEC)) xputs("\033)0"); #ifdef PC9800 init_hilite(); #endif @@ -449,19 +449,19 @@ tty_start_screen() xputs(TI); xputs(VS); #ifdef PC9800 - if (!SYMHANDLING("IBM")) + if (!SYMHANDLING(H_IBM)) tty_ascgraphics_hilite_fixup(); /* set up callback in case option is not set yet but toggled later */ ascgraphics_mode_callback = tty_ascgraphics_hilite_fixup; # ifdef ASCIIGRAPH - if (SYMHANDLING("IBM")) init_hilite(); + if (SYMHANDLING(H_IBM)) init_hilite(); /* set up callback in case option is not set yet but toggled later */ ibmgraphics_mode_callback = init_hilite; # endif #endif /* PC9800 */ #ifdef TERMLIB - if (SYMHANDLING("DEC")) tty_decgraphics_termcap_fixup(); + if (SYMHANDLING(H_DEC)) tty_decgraphics_termcap_fixup(); /* set up callback in case option is not set yet but toggled later */ decgraphics_mode_callback = tty_decgraphics_termcap_fixup; #endif diff --git a/win/tty/wintty.c b/win/tty/wintty.c index 6907cad47..693b5b772 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -2402,7 +2402,7 @@ int in_ch; register char ch = (char)in_ch; # if defined(ASCIIGRAPH) && !defined(NO_TERMS) - if (SYMHANDLING("IBM") || iflags.eight_bit_tty) { + if (SYMHANDLING(H_IBM) || iflags.eight_bit_tty) { /* IBM-compatible displays don't need other stuff */ (void) putchar(ch); } else if (ch & 0x80) { diff --git a/win/win32/mhfont.c b/win/win32/mhfont.c index 2e3554f49..71490010c 100644 --- a/win/win32/mhfont.c +++ b/win/win32/mhfont.c @@ -183,7 +183,7 @@ HGDIOBJ mswin_get_font(int win_type, int attr, HDC hdc, BOOL replace) UINT mswin_charset() { CHARSETINFO cis; - if( SYMHANDLING("IBM") ) + if( SYMHANDLING(H_IBM) ) if( TranslateCharsetInfo((DWORD*)GetOEMCP(), &cis, TCI_SRCCODEPAGE) ) return cis.ciCharset; else