make the handling recognition use an int instead of string.
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
#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 */
* 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
}
}
+/*
+ * 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"},
#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;
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:
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*/
#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
UINT mswin_charset()
{
CHARSETINFO cis;
- if( SYMHANDLING("IBM") )
+ if( SYMHANDLING(H_IBM) )
if( TranslateCharsetInfo((DWORD*)GetOEMCP(), &cis, TCI_SRCCODEPAGE) )
return cis.ciCharset;
else
* 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
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
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) {
UINT mswin_charset()
{
CHARSETINFO cis;
- if( SYMHANDLING("IBM") )
+ if( SYMHANDLING(H_IBM) )
if( TranslateCharsetInfo((DWORD*)GetOEMCP(), &cis, TCI_SRCCODEPAGE) )
return cis.ciCharset;
else