Remove experimental Unicode support.

This reverts commit 7f0f43e6f9 and some related
subsequent commits.

This compiles, but I have not done extensive testing.

Conflicts:
	include/config.h
	include/decl.h
	include/extern.h
	include/global.h
	include/tradstdc.h
	include/wintty.h
	src/drawing.c
	src/files.c
	src/hacklib.c
	src/mapglyph.c
	src/options.c
	sys/winnt/nttty.c
	win/tty/getline.c
	win/tty/topl.c
	win/tty/wintty.c
This commit is contained in:
Sean Hunt
2015-02-14 15:02:50 -05:00
committed by Pasi Kallinen
parent fb46fed99d
commit 5fb3fea9c6
22 changed files with 189 additions and 1060 deletions

View File

@@ -201,10 +201,6 @@ start: RogueEpyx
S_food: \x05 # club (as in cards)
S_potion: \xad # upside down '!'
S_scroll: \x0e # musical note
# S_armor: \x5b
# S_ring: \x3d
# S_amulet: \x0c
# S_tool: \x28
S_wand: \xe7 # greek tau
S_coin: \x0f # yes it's the same as gems
S_gem: \x0f # fancy '*'
@@ -397,131 +393,3 @@ start: NHAccess
S_explode9: \047
finish
start: Unicode_US
Description: Unicode symbols similar to code page 437
Restrictions: Unicode
S_vwall: U+2502 # box drawings light vertical
S_hwall: U+2500 # box drawings light horizontal
S_tlcorn: U+250C # box drawings light down and right
S_trcorn: U+2510 # box drawings light down and left
S_blcorn: U+2514 # box drawings light up and right
S_brcorn: U+2518 # box drawings light up and left
S_crwall: U+253C # box drawings light up and left
S_tuwall: U+2534 # box drawings light up and horizontal
S_tdwall: U+252C # box drawings light down and horizontal
S_tlwall: U+2524 # box drawings light vertical and left
S_trwall: U+251C # box drawings light vertical and right
S_ndoor: U+2556 # box drawings down double and left single
S_vodoor: U+25A0 # black square
S_hodoor: U+25A0 # black square
S_bars: U+2261 # identical to
S_tree: U+00B1 # plus-minus sign
S_room: U+00B7 # middle dot
S_corr: U+2591 # light shade
S_litcorr: U+2592 # medium shade
S_fountain: U+2320 # top half integral
S_pool: U+2248 # almost equal to
S_ice: U+00B7 # middle dot
S_lava: U+2248 # almost equal to
S_vodbridge: U+00B7 # middle dot
S_hodbridge: U+00B7 # middle dot
S_water: U+2248 # almost equal to
S_vbeam: U+2502 # box drawings light vertical
S_hbeam: U+2500 # box drawings light horizontal
S_sw_ml: U+2502 # box drawings light vertical
S_sw_mr: U+2502 # box drawings light vertical
S_explode4: U+2502 # box drawings light vertical
S_explode6: U+2502 # box drawings light vertical
finish
start: Unicode_non_US
Description: If default OEM CP for non-Unicode programs is not 437 or 850
Restrictions: Unicode
S_vwall: U+2502 # box drawings light vertical
S_hwall: U+2500 # box drawings light horizontal
S_tlcorn: U+250C # box drawings light down and right
S_trcorn: U+2510 # box drawings light down and left
S_blcorn: U+2514 # box drawings light up and right
S_brcorn: U+2518 # box drawings light up and left
S_crwall: U+253C # box drawings light up and left
S_tuwall: U+2534 # box drawings light up and horizontal
S_tdwall: U+252C # box drawings light down and horizontal
S_tlwall: U+2524 # box drawings light vertical and left
S_trwall: U+251C # box drawings light vertical and right
S_vodoor: U+25A0 # black square
S_hodoor: U+25A0 # black square
S_corr: U+2591 # light shade
S_litcorr: U+2592 # medium shade
S_vbeam: U+2502 # box drawings light vertical
S_hbeam: U+2500 # box drawings light horizontal
S_sw_ml: U+2502 # box drawings light vertical
S_sw_mr: U+2502 # box drawings light vertical
S_explode4: U+2502 # box drawings light vertical
S_explode6: U+2502 # box drawings light vertical
S_coin: U+20AC # euro
finish
start: UnicodeRogueEpyx
Description: Unicode Rogue level symbols
Restrictions: Unicode
Restrictions: Rogue
Color: Yes
S_weapon: U+2191 # up arrow
S_armor: U+25d9 # Vert rect with o
S_ring: U+2642 # circle with arrow
S_amulet: U+2640 # "female" symbol
S_food: U+2663 # club (as in cards)
S_potion: U+00a1 # upside down '!'
S_scroll: U+266a # musical note
S_wand: U+03c4 # greek tau
S_coin: U+263c # yes it's the same as gems
S_gem: U+263c # fancy '*'
S_rock: U+0060 # grave accent
S_ball: U+0030 # digit 0
S_chain: U+005f # low line
S_venom: U+002e # full stop
S_book: U+002b # + sign
S_vwall: U+2551 # all walls now use
S_hwall: U+2550 # double line graphics
S_tlcorn: U+2554 # box drawing double down and right
S_trcorn: U+2557 # box drawing double down and left
S_blcorn: U+255a # box drawing double up and right
S_brcorn: U+255d # box drawing double up and left
S_crwall: U+256c # box drawing double vertical and horizontal
S_tuwall: U+2569 # box drawing double up and horizontal
S_tdwall: U+2566 # box drawing double down and horizontal
S_tlwall: U+2563 # box drawing double vertical and left
S_trwall: U+2560 # box drawing double vertical and right
S_ndoor: U+256c # box drawing double vertical and horizontal
S_vodoor: U+256c # box drawing double vertical and horizontal
S_hodoor: U+256c # box drawing double vertical and horizontal
S_room: U+00b7 # centered dot
S_corr: U+2592 # medium shade
S_litcorr: U+2593 # dark shade
S_upstair: U+001e # Greek Xi
S_dnstair: U+001f
S_arrow_trap: U+2666 # diamond (cards)
S_dart_trap: U+2666
S_falling_rock_trap: U+2666
S_squeaky_board: U+2666
S_bear_trap: U+2666
S_land_mine: U+2666
S_rolling_boulder_trap: U+2666
S_sleeping_gas_trap: U+2666
S_rust_trap: U+2666
S_fire_trap: U+2666
S_pit: U+2666
S_spiked_pit: U+2666
S_hole: U+2666
S_trap_door: U+2666
S_teleportation_trap: U+2666
S_level_teleporter: U+2666
S_magic_portal: U+2666
S_web: U+2666
S_statue_trap: U+2666
S_magic_trap: U+2666
S_anti_magic_trap: U+2666
S_polymorph_trap: U+2666
S_human: U+263a # face
finish

View File

@@ -315,10 +315,6 @@
*/
#endif /* CHDIR */
/*
* Enable some UNICODE support.
*/
/*#define UNICODE_SUPPORT */ /* master on/off for any unicode support */
/*

View File

@@ -320,7 +320,6 @@ E NEARDATA winid WIN_MESSAGE;
E NEARDATA winid WIN_STATUS;
#endif
E NEARDATA winid WIN_MAP, WIN_INVEN;
E nhwchar toplines[];
/* pline (et al) for a single string argument (suppress compiler warning) */
#define pline1(cstr) pline("%s", cstr)
@@ -331,6 +330,7 @@ E nhwchar toplines[];
#define Sprintf1(buf, cstr) Sprintf(buf, "%s", cstr)
#define panic1(cstr) panic("%s", cstr)
E char toplines[];
#ifndef TCAP_H
E struct tc_gbl_data { /* also declared in tcap.h */
char *tc_AS, *tc_AE; /* graphics start and end (tty font swapping) */

View File

@@ -731,7 +731,6 @@ E void FDECL(check_recordfile, (const char *));
E void NDECL(read_wizkit);
E int FDECL(read_sym_file, (int));
E int FDECL(parse_sym_line, (char *,int));
E int FDECL(sym_val, (const char *));
E void FDECL(paniclog, (const char *, const char *));
E int FDECL(validate_prefix_locations, (char *));
#ifdef SELECTSAVED
@@ -846,20 +845,6 @@ E int NDECL(phase_of_the_moon);
E boolean NDECL(friday_13th);
E int NDECL(night);
E int NDECL(midnight);
#ifdef UNICODE_WIDEWINPORT
E nhwchar *FDECL(nhwstrncpy, (nhwchar *,const char *,size_t));
E nhwchar *FDECL(nhwncpy, (nhwchar *,const nhwchar *,size_t));
E nhwchar *FDECL(nhwcpy, (nhwchar *,const nhwchar *));
E nhwchar *FDECL(nhwstrcpy, (nhwchar *,const char *));
E char *FDECL(strnhwcpy, (char *,const nhwchar *));
E nhwchar *FDECL(nhwstrcat, (nhwchar *,const char *));
E nhwchar *FDECL(nhwcat, (nhwchar *,const nhwchar *));
E nhwchar *FDECL(nhwindex, (const nhwchar *,int));
E size_t FDECL(nhwlen, (const nhwchar *));
E int FDECL(nhwcmp, (const nhwchar *,const nhwchar *));
E int FDECL(nhwncmp, (const nhwchar *,const nhwchar *,int));
E int FDECL(nhwstrcmp, (const nhwchar *,const char *));
#endif
/* ### invent.c ### */
@@ -1587,6 +1572,7 @@ E int FDECL(load_symset, (const char *,int));
E void FDECL(parsesymbols, (char *));
E struct symparse *FDECL(match_sym, (char *));
E void NDECL(set_playmode);
E int FDECL(sym_val, (char *));
/* ### pager.c ### */

View File

@@ -198,8 +198,6 @@ struct instance_flags {
boolean rlecomp; /* run-length comp of levels when writing savefile */
uchar num_pad_mode;
boolean echo; /* 1 to echo characters */
boolean unicodecapable; /* unicode support is possible on platform */
boolean unicodedisp; /* unicode support is turned on */
#if 0
boolean DECgraphics; /* use DEC VT-xxx extended character set */
boolean IBMgraphics; /* use IBM extended character set */

View File

@@ -65,41 +65,10 @@ typedef xchar boolean; /* 0 or 1 */
#endif
/*
* UNICODE_SUPPORT
* Unicode/wide character related support.
* type nhsym: loadable symbols go into this type
*/
#ifdef UNICODE_SUPPORT
# define UNICODE_DRAWING /* store drawing symbols in wchar_t data type */
# define UNICODE_WIDEWINPORT /* store and render wide chars in window port */
/*# define UNICODE_PLAYERTEXT*/ /* not implemented - player input in wide chars */
#include <limits.h>
#include <wchar.h>
#else
# undef UNICODE_DRAWING
# undef UNICODE_WIDEWINPORT
# undef UNICODE_PLAYERTEXT
#endif
#if defined(UNICODE_DRAWING)
typedef wchar_t nhsym; /* nhsym is wide char */
#else
typedef uchar nhsym;
#endif
#if defined(UNICODE_WIDEWINPORT)
typedef wchar_t nhwchar; /* nhwchar (window port char) is wide char */
#else
typedef char nhwchar;
#endif
#if 0
/* Not Implemented presently */
#if defined(UNICODE_PLAYERTEXT)
typedef wchar_t nhptext; /* player input is wide char */
#else
typedef char nhptext;
#endif
#endif
#ifndef STRNCMPI
# ifndef __SASC_60 /* SAS/C already shifts to stricmp */

View File

@@ -193,11 +193,6 @@ extern void NDECL(toggle_mouse_support);
extern void FDECL(map_subkeyvalue, (char *));
extern void NDECL(load_keyboard_handler);
extern void NDECL(raw_clear_screen);
# ifdef UNICODE_WIDEWINPORT
extern void FDECL(xputc, (NHWCHAR_P));
# else
extern void FDECL(xputc, (int));
# endif
#endif
#include <fcntl.h>

View File

@@ -227,13 +227,6 @@ struct symdef {
#endif
};
/*
* Graphics sets for display symbols
*/
#define PRIMARY 0 /* primary graphics */
#define ROGUESET 1 /* rogue graphics */
#define NUM_GRAPHICS 2
struct symparse {
unsigned range;
#define SYM_CONTROL 1 /* start/finish markers */
@@ -260,18 +253,25 @@ struct symsetentry {
Bitfield(nocolor,1); /* don't use color if set */
Bitfield(primary,1); /* restricted for use as primary set */
Bitfield(rogue,1); /* restricted for use as rogue lev set */
Bitfield(unicode,1); /* restricted for use as a unicode set */
/* 5 free bits */
};
/*
* Graphics sets for display symbols
*/
#define DEFAULT_GRAPHICS 0 /* regular characters: '-', '+', &c */
#define PRIMARY 0 /* primary graphics set */
#define ROGUESET 1 /* rogue graphics set */
#define NUM_GRAPHICS 2
/*
* special symbol set handling types ( for invoking 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
#define H_UNK 0
#define H_IBM 1
#define H_DEC 2
extern const struct symdef defsyms[MAXPCHARS]; /* defaults */
extern const struct symdef def_warnsyms[WARNCOUNT];

View File

@@ -257,7 +257,6 @@ typedef genericptr genericptr_t; /* (void *) or (char *) */
# define BOOLEAN_P boolean
# endif
# define ALIGNTYP_P aligntyp
# define NHWCHAR_P nhwchar
#else
# ifdef WIDENED_PROTOTYPES
# define CHAR_P int
@@ -267,14 +266,6 @@ typedef genericptr genericptr_t; /* (void *) or (char *) */
# define SHORT_P int
# define BOOLEAN_P int
# define ALIGNTYP_P int
# if defined(UNICODE_WIDEWINPORT) && defined(WCHAR_MAX)
# if WCHAR_MAX >= INT_MAX
# define NHWCHAR_P nhwchar
# endif
# endif
# ifndef NHWCHAR_P
# define NHWCHAR_P int
# endif
# else
/* Neither widened nor unwidened prototypes. Argument list expansion
* by FDECL/VDECL always empty; all xxx_P vanish so defs aren't needed. */

View File

@@ -35,8 +35,8 @@ struct WinDesc {
/* maxcol is also used by WIN_MESSAGE for */
/* tracking the ^P command */
short *datlen; /* allocation size for *data */
nhwchar **data; /* window data [row][column] */
nhwchar *morestr; /* string to display instead of default */
char **data; /* window data [row][column] */
char *morestr; /* string to display instead of default */
tty_menu_item *mlist; /* menu information (MENU) */
tty_menu_item **plist; /* menu page pointers (MENU) */
short plist_size; /* size of allocated plist (MENU) */
@@ -88,7 +88,7 @@ extern struct WinDesc *wins[MAXWIN];
extern struct DisplayDesc *ttyDisplay; /* the tty display descriptor */
extern char morc; /* last character typed to xwaitforspace */
extern nhwchar defmorestr[]; /* default --more-- prompt */
extern char defmorestr[]; /* default --more-- prompt */
/* port specific external function references */
@@ -109,9 +109,7 @@ E void NDECL(tty_shutdown);
* actually would be expanded. So here, we have to make an exception. */
E void FDECL(xputc, (int));
#else
# ifndef WIN32CON
E void FDECL(xputc, (CHAR_P));
# endif
#endif
E void FDECL(xputs, (const char *));
#if defined(SCREEN_VGA) || defined(SCREEN_8514)
@@ -154,10 +152,10 @@ E int FDECL(has_color,(int color));
/* ### topl.c ### */
E void FDECL(addtopl, (const nhwchar *));
E void FDECL(addtopl, (const char *));
E void NDECL(more);
E void FDECL(update_topl, (const nhwchar *));
E void FDECL(putsyms, (const nhwchar *));
E void FDECL(update_topl, (const char *));
E void FDECL(putsyms, (const char*));
/* ### wintty.c ### */
#ifdef CLIPPING
@@ -167,9 +165,6 @@ E void FDECL(docorner, (int, int));
E void NDECL(end_glyphout);
E void FDECL(g_putch, (int));
E void FDECL(win_tty_init, (int));
#ifdef UNICODE_WIDEWINPORT
E void FDECL(u_putch, (nhwchar));
#endif
/* external declarations */
E void FDECL(tty_init_nhwindows, (int *, char **));

View File

@@ -262,8 +262,7 @@ NEARDATA winid WIN_MESSAGE = WIN_ERR;
NEARDATA winid WIN_STATUS = WIN_ERR;
#endif
NEARDATA winid WIN_MAP = WIN_ERR, WIN_INVEN = WIN_ERR;
nhwchar toplines[TBUFSZ];
char toplines[TBUFSZ];
/* Windowing stuff that's really tty oriented, but present for all ports */
struct tc_gbl_data tc_gbl_data = { 0,0, 0,0 }; /* AS,AE, LI,CO */

View File

@@ -24,8 +24,8 @@ struct symsetentry symset[NUM_GRAPHICS];
int currentgraphics = 0;
nhsym showsyms[SYM_MAX] = DUMMY; /* symbols to be displayed */
nhsym l_syms[SYM_MAX] = DUMMY; /* loaded symbols */
nhsym r_syms[SYM_MAX] = DUMMY; /* rogue symbols */
nhsym l_syms[SYM_MAX] = DUMMY; /* loaded symbols */
nhsym r_syms[SYM_MAX] = DUMMY; /* rogue symbols */
nhsym warnsyms[WARNCOUNT] = DUMMY; /* the current warning display symbols */
const char invisexplain[] = "remembered, unseen, creature";
@@ -525,7 +525,6 @@ boolean name_too;
/* initialize restriction bits */
symset[which_set].primary = 0;
symset[which_set].rogue = 0;
symset[which_set].unicode = 0;
if (name_too) {
if (symset[which_set].name)
@@ -563,7 +562,6 @@ const char *known_handling[] = {
const char *known_restrictions[] = {
"primary",
"rogue",
"unicode",
(const char *)0,
};

View File

@@ -2607,7 +2607,7 @@ parse_sym_line(buf, which_set)
char *buf;
int which_set;
{
int val;
int val, i;
struct symparse *symp = (struct symparse *)0;
char *bufp, *commentp, *altp;
@@ -2657,7 +2657,6 @@ int which_set;
return 0;
if (!symset[which_set].name) {
int i;
/* A null symset name indicates that we're just
building a pick-list of possible symset
values from the file, so only do that */
@@ -2682,7 +2681,6 @@ int which_set;
/* initialize restriction bits */
tmpsp->primary = 0;
tmpsp->rogue = 0;
tmpsp->unicode = 0;
break;
case 2:
/* handler type identified */
@@ -2705,17 +2703,14 @@ int which_set;
case 5:
/* restrictions: xxxx*/
tmpsp = symset_list; /* most recent symset */
i = 0;
while (known_restrictions[i]) {
for (i = 0; known_restrictions[i]; ++i) {
if (!strcmpi(known_restrictions[i], bufp)) {
switch(i) {
case 0: tmpsp->primary = 1; break;
case 1: tmpsp->rogue = 1; break;
case 2: tmpsp->unicode = 1; break;
}
break; /* while loop */
}
i++;
}
break;
}
@@ -2732,7 +2727,7 @@ int which_set;
chosen_symset_start = TRUE;
/* these init_*() functions clear symset fields too */
if (which_set == ROGUESET) init_r_symbols();
else if (which_set == PRIMARY) init_l_symbols();
else if (which_set == PRIMARY) init_l_symbols();
}
break;
case 1:
@@ -2771,23 +2766,12 @@ int which_set;
break;
case 1: symset[which_set].rogue = 1;
break;
case 2: symset[which_set].unicode = 1;
break;
}
break; /* while loop */
}
n++;
}
/* Don't allow unicode set if code can't handle it */
if (symset[which_set].unicode &&
!iflags.unicodedisp) {
if (chosen_symset_start)
chosen_symset_end = FALSE;
chosen_symset_start = FALSE;
if (which_set == ROGUESET) init_r_symbols();
else if (which_set == PRIMARY) init_l_symbols();
}
}
}
break;
}
} else { /* !SYM_CONTROL */
@@ -2821,72 +2805,6 @@ int which_set;
}
}
/*
* Produces a single integer value.
*/
int
sym_val(cp)
const char *cp;
{
unsigned int cval = 0;
int meta = 0, dcount = 0;
const char *dp, *hex = "00112233445566778899aAbBcCdDeEfF";
while (*cp)
{
if (*cp == '\\' && index("mM", cp[1])) {
meta = 1;
cp += 2;
}
if ((*cp == 'U' || *cp == 'u') && cp[1] == '+' && index(hex, cp[2]))
{
dcount = 0;
cp++;
for (++cp; *cp && (dp = index(hex, *cp)) && (dcount++ < 4); cp++)
cval = (unsigned int)((cval * 16) +
((unsigned int)(dp - hex) / 2));
}
else if (*cp == '\\' && index("0123456789xXoO", cp[1]))
{
dcount = 0;
cp++;
if (*cp == 'x' || *cp == 'X')
for (++cp; *cp && (dp = index(hex, *cp)) && (dcount++ < 4); cp++)
cval = (unsigned int)((cval * 16) +
((unsigned int)(dp - hex) / 2));
else if (*cp == 'o' || *cp == 'O')
for (++cp; *cp && (index("01234567",*cp)) && (dcount++ < 5); cp++)
cval = (cval * 8) + (unsigned int)(*cp - '0');
else
for (; *cp && (index("0123456789",*cp)) && (dcount++ < 5); cp++)
cval = (cval * 10) + (unsigned int)(*cp - '0');
}
else if (*cp == '\\') /* C-style character escapes */
{
switch (*++cp)
{
case '\\': cval = '\\'; break;
case 'n': cval = '\n'; break;
case 't': cval = '\t'; break;
case 'b': cval = '\b'; break;
case 'r': cval = '\r'; break;
default: cval = (unsigned int)*cp;
}
cp++;
}
else if (*cp == '^') /* expand control-character syntax */
{
cval = (unsigned int)(*++cp & 0x1f);
cp++;
}
else
cval = (unsigned int)*cp++;
if (meta)
cval |= 0x80;
}
return cval;
}
/* ---------- END CONFIG FILE HANDLING ----------- */
/* ---------- BEGIN SCOREBOARD CREATION ----------- */

View File

@@ -768,192 +768,4 @@ midnight()
return(getlt()->tm_hour == 0);
}
#ifdef UNICODE_WIDEWINPORT
nhwchar *
nhwstrncpy(dest, strSource, cnt)
nhwchar *dest;
const char *strSource;
size_t cnt;
{
nhwchar *d = dest;
const char *s = strSource;
size_t dcnt = 0;
while(*s && dcnt < cnt) {
*d++ = (nhwchar)*s++;
dcnt++;
}
if (dcnt < cnt) *d = 0;
return dest;
}
nhwchar *
nhwncpy(dest, src, cnt)
nhwchar *dest;
const nhwchar *src;
size_t cnt;
{
nhwchar *d = dest;
const nhwchar *s = src;
size_t dcnt = 0;
while(*s && dcnt < cnt) {
*d++ = *s++;
dcnt++;
}
if (dcnt < cnt) *d = 0;
return dest;
}
nhwchar *
nhwcpy(dest, src)
nhwchar *dest;
const nhwchar *src;
{
nhwchar *d = dest;
const nhwchar *s = src;
while(*s) {
*d++ = *s++;
}
*d = 0;
return dest;
}
nhwchar *
nhwstrcpy(dest, strSource)
nhwchar *dest;
const char *strSource;
{
nhwchar *d = dest;
const char *s = strSource;
while(*s) {
*d++ = *s++;
}
*d = 0;
return dest;
}
char *
strnhwcpy(strDest, src)
char *strDest;
const nhwchar *src;
{
char *d = strDest;
const nhwchar *s = src;
while(*s) {
*d++ = (char)*s++;
}
*d = 0;
return strDest;
}
nhwchar *
nhwstrcat(dest, strSource)
nhwchar *dest;
const char *strSource;
{
nhwchar *d = dest;
const char *s = strSource;
while(*d) d++;
while(*s) {
*d++ = *s++;
}
*d = 0;
return dest;
}
nhwchar *
nhwcat(dest, src)
nhwchar *dest;
const nhwchar *src;
{
nhwchar *d = dest;
const nhwchar *s = src;
while(*d) d++;
while(*s) {
*d++ = *s++;
}
*d = 0;
return dest;
}
nhwchar *
nhwindex(ss, c)
const nhwchar *ss;
int c;
{
const nhwchar *s = ss;
while (*s) {
if (*s == c) return (nhwchar *)s;
s++;
}
if (*s == c) return (nhwchar *)s;
return (nhwchar *)0;
}
size_t nhwlen(src)
const nhwchar *src;
{
register size_t dl = 0;
while(*src++) dl++;
return dl;
}
int
nhwcmp(s1, s2) /* case sensitive comparison */
register const nhwchar *s1, *s2;
{
register nhwchar t1, t2;
for (;;) {
if (!*s2) return (*s1 != 0); /* s1 >= s2 */
else if (!*s1) return -1; /* s1 < s2 */
t1 = *s1++;
t2 = *s2++;
if (t1 != t2) return (t1 > t2) ? 1 : -1;
}
return 0; /* s1 == s2 */
}
int
nhwncmp(s1, s2, n) /* case sensitive counted nhwchar (wide string) comparison */
register const nhwchar *s1, *s2;
register int n; /*(should probably be size_t, which is usually unsigned)*/
{
register nhwchar t1, t2;
while (n--) {
if (!*s2) return (*s1 != 0); /* s1 >= s2 */
else if (!*s1) return -1; /* s1 < s2 */
t1 = *s1++;
t2 = *s2++;
if (t1 != t2) return (t1 > t2) ? 1 : -1;
}
return 0; /* s1 == s2 */
}
int
nhwstrcmp(s1, s2)
register const nhwchar *s1;
const char *s2;
{
register nhwchar t1, t2;
for (;;) {
if (!*s2) return (*s1 != 0); /* s1 >= s2 */
else if (!*s1) return -1; /* s1 < s2 */
t1 = *s1++;
t2 = (nhwchar)*s2++;
if (t1 != t2) return (t1 > t2) ? 1 : -1;
}
return 0; /* s1 == s2 */
}
#endif
/*hacklib.c*/

View File

@@ -225,7 +225,6 @@ int glyph;
return encbuf;
}
#ifndef UNICODE_WIDEWINPORT
/*
* This differs from putstr() because the str parameter can
* contain a sequence of characters representing:
@@ -267,12 +266,25 @@ genl_putmixed(window, attr, str)
gv = (int)((gv * 16) + ((int)(dp - hex) / 2));
so = mapglyph(gv, &ch, &oc, &os, 0, 0);
*put++ = showsyms[so];
continue;
} else {
/* possible forgery - leave it the way it is */
cp = save_cp;
}
break;
# if 0
case 'S': /* symbol offset */
dcount = 0;
for (++cp; *cp && (dp = index(hex, *cp)) && (dcount++ < 4); cp++)
rndchk = (int)((rndchk * 16) + ((int)(dp - hex) / 2));
if (rndchk == context.rndencode) {
dcount = 0;
for (; *cp && (dp = index(hex, *cp)) && (dcount++ < 2); cp++)
so = (int)((so * 16) + ((int)(dp - hex) / 2));
}
*put++ = showsyms[so];
break;
# endif
case '\\':
break;
}
@@ -283,5 +295,4 @@ genl_putmixed(window, attr, str)
/* now send it to the normal putstr */
putstr(window, attr, buf);
}
#endif /*!UNICODE_WIDEWINPORT*/
/*mapglyph.c*/

View File

@@ -198,9 +198,6 @@ static struct Bool_Opt
{"tombstone",&flags.tombstone, TRUE, SET_IN_GAME},
{"toptenwin",&iflags.toptenwin, FALSE, SET_IN_GAME},
{"travel", &flags.travelcmd, TRUE, SET_IN_GAME},
#ifdef UNICODE_SUPPORT
{"unicode", &iflags.unicodedisp, FALSE, SET_IN_GAME},
#endif
#ifdef WIN32CON
{"use_inverse", &iflags.wc_inverse, TRUE, SET_IN_GAME}, /*WC*/
#else
@@ -605,9 +602,6 @@ initoptions_init()
iflags.msg_history = 20;
#ifdef TTY_GRAPHICS
iflags.prevmsg_window = 's';
# if defined(UNIX) && defined(UNICODE_WIDEWINPORT)
iflags.unicodecapable = TRUE;
# endif
#endif
iflags.menu_headings = ATR_INVERSE;
@@ -2514,7 +2508,7 @@ goodfruit:
boolean badflag = FALSE;
if (duplicate) complain_about_duplicate(opts,1);
if (!negated) {
for (i = PRIMARY; i <= ROGUESET; ++i) {
for (i = 0; i < NUM_GRAPHICS; ++i) {
if (symset[i].name)
badflag = TRUE;
else {
@@ -3359,7 +3353,7 @@ boolean setinitial,setfromfile;
|| !strcmp("roguesymset", optname)) {
menu_item *symset_pick = (menu_item *)0;
boolean primaryflag = (*optname == 's'),
rogueflag = (*optname == 'r'),
rogueflag = (*optname == 'r'),
ready_to_switch = FALSE,
nothing_to_do = FALSE;
int res;
@@ -3384,8 +3378,7 @@ boolean setinitial,setfromfile;
sl = symset_list;
while (sl) {
/* check restrictions */
if ((!rogueflag && sl->rogue) ||
(!iflags.unicodedisp && sl->unicode) ||
if ((!rogueflag && sl->rogue) ||
(!primaryflag && sl->primary)) {
sl = sl->next;
continue;
@@ -3398,8 +3391,8 @@ boolean setinitial,setfromfile;
}
if (!setcount) {
pline("There are no appropriate %ssymbol sets available.",
(rogueflag) ? "rogue level " :
(primaryflag) ? "primary " :
(rogueflag) ? "rogue level " :
(primaryflag) ? "primary " :
"");
return TRUE;
}
@@ -3415,7 +3408,6 @@ boolean setinitial,setfromfile;
while (sl) {
/* check restrictions */
if ((!rogueflag && sl->rogue) ||
(!iflags.unicodedisp && sl->unicode) ||
(!primaryflag && sl->primary)) {
sl = sl->next;
continue;
@@ -3502,7 +3494,7 @@ boolean setinitial,setfromfile;
if(rogueflag)
init_r_symbols();
else
init_l_symbols();
init_l_symbols();
if (symset[which_set].name) {
if (read_sym_file(which_set))
@@ -3568,14 +3560,9 @@ char *buf;
#endif
#ifdef BACKWARD_COMPAT
else if (!strcmp(optname, "boulder"))
Sprintf(buf,
# ifdef UNICODE_DRAWING
"\\x%04X",
# else
"%c",
# endif
iflags.bouldersym ? iflags.bouldersym :
showsyms[(int)objects[BOULDER].oc_class + SYM_OFF_O]);
Sprintf(buf, "%c", iflags.bouldersym ?
iflags.bouldersym :
showsyms[(int)objects[BOULDER].oc_class + SYM_OFF_O]);
#endif
else if (!strcmp(optname, "catname"))
Sprintf(buf, "%s", catname[0] ? catname : none);
@@ -4034,6 +4021,15 @@ char *buf;
return (struct symparse *)0;
}
int sym_val(strval)
char *strval;
{
char buf[QBUFSZ];
buf[0] = '\0';
escapes(strval, buf);
return (int)*buf;
}
/* data for option_help() */
static const char *opt_intro[] = {
"",

View File

@@ -571,7 +571,7 @@ do_look(mode, click_cc)
for (i = 0; i < MAXMCLASSES; i++) {
if (sym == ((from_screen || clicklook) ?
showsyms[i + SYM_OFF_M] : def_monsyms[i].sym) &&
def_monsyms[i].explain) {
def_monsyms[i].explain) {
need_to_look = TRUE;
if (!found) {
Sprintf(out_str, "%s %s",

View File

@@ -76,11 +76,7 @@ pline VA_DECL(const char *, line)
return;
}
#ifndef MAC
# ifdef UNICODE_WIDEWINPORT
if (no_repeat && !nhwstrcmp(toplines, line))
# else
if (no_repeat && !strcmp(toplines, line))
# endif
if (no_repeat && !strcmp(line, toplines))
return;
#endif /* MAC */
if (vision_full_recalc) vision_recalc(0);

View File

@@ -64,6 +64,9 @@ int GUILaunched;
extern int redirect_stdout;
static BOOL FDECL(CtrlHandler, (DWORD));
/* Flag for whether unicode is supported */
static boolean has_unicode;
#ifdef PORT_DEBUG
static boolean display_cursor_info = FALSE;
#endif
@@ -146,12 +149,6 @@ static void NDECL(init_ttycolor);
# endif
static void NDECL(really_move_cursor);
#ifdef UNICODE_WIDEWINPORT
void FDECL(xputc_core,(NHWCHAR_P));
#else
void FDECL(xputc_core,(int));
#endif
#define MAX_OVERRIDES 256
unsigned char key_overrides[MAX_OVERRIDES];
@@ -199,14 +196,11 @@ const char *s;
void
setftty()
{
static int cp = 0;
if (!cp) cp = GetConsoleOutputCP();
/* SetConsoleOutputCP(1250); */
#ifdef CHANGE_COLOR
if (altered_palette) adjust_palette();
#endif
start_screen();
iflags.unicodecapable = ((GetVersion() & 0x80000000) == 0);
has_unicode = ((GetVersion() & 0x80000000) == 0);
}
void
@@ -457,61 +451,24 @@ int x,y;
ttyDisplay->cury = y;
}
#ifdef UNICODE_WIDEWINPORT
#define T(x) L##x
#else
#define T(x) x
#endif
void
xputc_core(ich)
#ifdef UNICODE_WIDEWINPORT
nhwchar ich;
#else
int ich;
#endif
xputc_core(ch)
char ch;
{
static uchar c[2] = {0,0};
char ch = (char)ich;
#if 0
/*EURO symbol*/
if (ich == 0x20AC) {
if (!c[0]) {
wchar_t t[2]={0x20ac, 0x0000};
int cp = GetConsoleOutputCP();
(void) WideCharToMultiByte(cp,
0,
t, 1,
c, 2,
(LPCSTR)0,
(LPBOOL)0);
}
ich = (nhwchar)c[0];
}
#endif
#ifdef UNICODE_WIDEWINPORT
switch(ich) {
#else
switch(ch) {
#endif
case T('\n'):
case '\n':
cursor.Y++;
/* fall through */
case T('\r'):
case '\r':
cursor.X = 1;
break;
case T('\b'):
case '\b':
cursor.X--;
break;
default:
WriteConsoleOutputAttribute(hConOut,&attr,1,
cursor,&acount);
if (iflags.unicodedisp) {
#ifdef UNICODE_WIDEWINPORT
WriteConsoleOutputCharacterW(hConOut,&ich,1,
cursor,&ccount);
#else
if (has_unicode) {
/* Avoid bug in ANSI API on WinNT */
WCHAR c2[2];
int rc;
@@ -522,7 +479,6 @@ int ich;
c2, 2);
WriteConsoleOutputCharacterW(hConOut,c2,rc,
cursor,&ccount);
#endif
}
else {
WriteConsoleOutputCharacterA(hConOut,&ch,1,
@@ -534,11 +490,7 @@ int ich;
void
xputc(ch)
#ifdef UNICODE_WIDEWINPORT
nhwchar ch;
#else
int ch;
#endif
char ch;
{
cursor.X = ttyDisplay->curx;
cursor.Y = ttyDisplay->cury;
@@ -569,8 +521,8 @@ const char *s;
* for win32. It is used for glyphs only, not text.
*/
void
g_putch(in_sym)
int in_sym;
g_putch(in_ch)
int in_ch;
{
/* CP437 to Unicode mapping according to the Unicode Consortium */
static const WCHAR cp437[] =
@@ -608,18 +560,12 @@ int in_sym;
0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248,
0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
};
uchar ch = (uchar)in_sym;
unsigned char ch = (unsigned char)in_ch;
cursor.X = ttyDisplay->curx;
cursor.Y = ttyDisplay->cury;
WriteConsoleOutputAttribute(hConOut,&attr,1,cursor,&acount);
#ifdef UNICODE_DRAWING
if (symset[currentgraphics].name &&
symset[currentgraphics].unicode && iflags.unicodedisp)
WriteConsoleOutputCharacterW(hConOut,(LPCWSTR)&in_sym,1,cursor,&ccount);
else
#endif
if (SYMHANDLING(H_IBM))
if (has_unicode)
WriteConsoleOutputCharacterW(hConOut,&cp437[ch],1,cursor,&ccount);
else
WriteConsoleOutputCharacterA(hConOut,&ch,1,cursor,&ccount);

View File

@@ -24,25 +24,6 @@ extern int NDECL(extcmd_via_menu); /* cmd.c */
extern char erase_char, kill_char; /* from appropriate tty.c file */
/* cloned from topl.c, but not identical
*/
#ifdef UNICODE_WIDEWINPORT
/* nhwchar is wchar; data from core needs narrow-to-wide conversion;
data going back to core needs wide-to-narrow conversion; data
used within tty routines typically needs wide-to-wide awareness */
STATIC_VAR nhwchar getl_wbuf[BUFSZ];
STATIC_VAR char getl_nbuf[BUFSZ];
#define T(x) L##x
#define Waddtopl(str) addtopl(nhwstrcpy(getl_wbuf,str))
#define Wputsyms(str) putsyms(nhwstrcpy(getl_wbuf,str))
#define NWstrcpy(wdst,src) nhwstrcpy(wdst,src) /* narrow-to-wide */
#else /*!UNICODE_WIDEWINPORT*/
/* nhwchar is char; no conversions needed */
#define T(x) x
#define Waddtopl(str) addtopl(str)
#define Wputsyms(str) putsyms(str)
#endif /*?UNICODE_WIDEWINPORT*/
/*
* Read a line closed with '\n' into the array char bufp[BUFSZ].
* (The '\n' is not stored. The string is closed with a '\0'.)
@@ -76,12 +57,7 @@ getlin_hook_proc hook;
*obufp = 0;
for(;;) {
(void) fflush(stdout);
#ifdef UNICODE_WIDEWINPORT
Strcat(strcat(strcpy(getl_nbuf, query), " "), obufp);
(void)NWstrcpy(toplines, getl_nbuf);
#else
Strcat(strcat(strcpy(toplines, query), " "), obufp);
#endif
c = pgetchar();
if (c == '\033' || c == EOF) {
obufp[0] = '\033';
@@ -100,10 +76,10 @@ getlin_hook_proc hook;
ttyDisplay->inread = sav;
tty_clear_nhwindow(WIN_MESSAGE);
cw->maxcol = cw->maxrow;
Waddtopl(query);
Waddtopl(T(" "));
addtopl(query);
addtopl(" ");
*bufp = 0;
Waddtopl(obufp);
addtopl(obufp);
} else {
if (!doprev)
(void) tty_doprev_message();/* need two initially */
@@ -115,10 +91,10 @@ getlin_hook_proc hook;
tty_clear_nhwindow(WIN_MESSAGE);
cw->maxcol = cw->maxrow;
doprev = 0;
Waddtopl(query);
Waddtopl(T(" "));
addtopl(query);
addtopl(" ");
*bufp = 0;
Waddtopl(obufp);
addtopl(obufp);
}
if(c == erase_char || c == '\b') {
if(bufp != obufp) {
@@ -128,11 +104,11 @@ getlin_hook_proc hook;
#endif /* NEWAUTOCOMP */
bufp--;
#ifndef NEWAUTOCOMP
putsyms(T("\b \b"));/* putsym converts \b */
putsyms("\b \b");/* putsym converts \b */
#else /* NEWAUTOCOMP */
putsyms(T("\b"));
for (i = bufp; *i; ++i) putsyms(T(" "));
for (; i > bufp; --i) putsyms(T("\b"));
putsyms("\b");
for (i = bufp; *i; ++i) putsyms(" ");
for (; i > bufp; --i) putsyms("\b");
*bufp = 0;
#endif /* NEWAUTOCOMP */
} else tty_nhbell();
@@ -155,21 +131,21 @@ getlin_hook_proc hook;
#endif /* NEWAUTOCOMP */
*bufp = c;
bufp[1] = 0;
Wputsyms(bufp);
putsyms(bufp);
bufp++;
if (hook && (*hook)(obufp)) {
Wputsyms(bufp);
putsyms(bufp);
#ifndef NEWAUTOCOMP
bufp = eos(bufp);
#else /* NEWAUTOCOMP */
/* pointer and cursor left where they were */
for (i = bufp; *i; ++i) putsyms(T("\b"));
for (i = bufp; *i; ++i) putsyms("\b");
} else if (i > bufp) {
char *s = i;
/* erase rest of prior guess */
for (; i > bufp; --i) putsyms(T(" "));
for (; s > bufp; --s) putsyms(T("\b"));
for (; i > bufp; --i) putsyms(" ");
for (; s > bufp; --s) putsyms("\b");
#endif /* NEWAUTOCOMP */
}
} else if(c == kill_char || c == '\177') { /* Robert Viduya */
@@ -177,11 +153,11 @@ getlin_hook_proc hook;
#ifndef NEWAUTOCOMP
while(bufp != obufp) {
bufp--;
putsyms(T("\b \b"));
putsyms("\b \b");
}
#else /* NEWAUTOCOMP */
for (; *bufp; ++bufp) putsyms(T(" "));
for (; bufp != obufp; --bufp) putsyms(T("\b \b"));
for (; *bufp; ++bufp) putsyms(" ");
for (; bufp != obufp; --bufp) putsyms("\b \b");
*bufp = 0;
#endif /* NEWAUTOCOMP */
} else
@@ -192,8 +168,6 @@ getlin_hook_proc hook;
clear_nhwindow(WIN_MESSAGE); /* clean up after ourselves */
}
#undef T
void
xwaitforspace(s)
register const char *s; /* chars allowed besides return */

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 topl.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 topl.c $Date: 2012/01/23 06:29:37 $ $Revision: 1.24 $ */
/* NetHack 3.5 topl.c $NHDT-Date: 1425081315 2015/02/27 23:55:15 $ $NHDT-Branch: (no branch, rebasing scshunt-unconditionals) $:$NHDT-Revision: 1.24 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -15,44 +14,8 @@
#define C(c) (0x1f & (c))
#endif
/* use caution with this stuff; it's very easy to get things mixed up...
*/
#ifdef UNICODE_WIDEWINPORT
/* nhwchar is wchar; data from core needs narrow-to-wide conversion;
data going back to core needs wide-to-narrow conversion; data
used within tty routines typically needs wide-to-wide awareness */
STATIC_VAR nhwchar topl_wbuf[BUFSZ];
STATIC_VAR char topl_nbuf[BUFSZ];
#define T(x) L##x
#define DoGputch(x) ((x) >= 0x80)
#define Waddtopl(str) addtopl(nhwstrcpy(topl_wbuf,str))
#define Wputstr(win,atr,wstr) putstr(win,atr,strnhwcpy(topl_nbuf,wstr))
#define Windex(wstr,wchr) nhwindex(wstr,wchr)
#define Wstrlen(wstr) (int)nhwlen(wstr)
#define NWstrcpy(wdst,src) nhwstrcpy(wdst,src) /* narrow-to-wide */
#define WNstrcpy(dst,wsrc) strnhwcpy(dst,wsrc) /* wide-to-narrow */
#define WWstrcpy(wdst,wsrc) nhwcpy(wdst,wsrc) /* wide-to-wide */
#define WWstrcat(wdst,wsrc) nhwcat(wdst,wsrc)
#define WWstrncpy(wdst,wsrc,ln nhwncpy(wdst,wsrc,ln)
#define WWstrncmp(wst1,wst2,ln) nhwncmp(wst1,wst2,ln)
#else /*!UNICODE_WIDEWINPORT*/
/* nhwchar is char; no conversions needed */
#define T(x) x
#define DoGputch(x) ((x) & 0x80)
#define Waddtopl(str) addtopl(str)
#define Wputstr(win,atr,str) putstr(win,atr,str)
#define Windex(wstr,wchr) index(wstr,wchr)
#define Wstrlen(wstr) (int)strlen(wstr)
#define NWstrcpy(wdst,src) strcpy(wdst,src)
#define WNstrcpy(dst,wsrc) strcpy(dst,wsrc)
#define WWstrcpy(wdst,wsrc) strcpy(wdst,wsrc)
#define WWstrcat(wdst,wsrc) strcat(wdst,wsrc)
#define WWstrncpy(wdst,wsrc,ln) strncpy(wdst,wsrc,ln)
#define WWstrncmp(wst1,wst2,ln) strncmp(wst1,wst2,ln)
#endif /*?UNICODE_WIDEWINPORT*/
STATIC_DCL void FDECL(redotoplin, (const nhwchar*));
STATIC_DCL void FDECL(topl_putsym, (NHWCHAR_P));
STATIC_DCL void FDECL(redotoplin, (const char*));
STATIC_DCL void FDECL(topl_putsym, (CHAR_P));
STATIC_DCL void NDECL(remember_topl);
STATIC_DCL void FDECL(removetopl, (int));
STATIC_DCL void FDECL(msghistory_snapshot, (BOOLEAN_P));
@@ -62,9 +25,9 @@ int
tty_doprev_message()
{
register struct WinDesc *cw = wins[WIN_MESSAGE];
winid prevmsg_win;
int i;
if ((iflags.prevmsg_window != 's') && !ttyDisplay->inread) { /* not single */
if(iflags.prevmsg_window == 'f') { /* full */
prevmsg_win = create_nhwindow(NHW_MENU);
@@ -73,11 +36,11 @@ tty_doprev_message()
cw->maxcol = cw->maxrow;
i = cw->maxcol;
do {
if (cw->data[i] && *cw->data[i])
Wputstr(prevmsg_win, 0, cw->data[i]);
if(cw->data[i] && strcmp(cw->data[i], "") )
putstr(prevmsg_win, 0, cw->data[i]);
i = (i + 1) % cw->rows;
} while (i != cw->maxcol);
Wputstr(prevmsg_win, 0, toplines);
putstr(prevmsg_win, 0, toplines);
display_nhwindow(prevmsg_win, TRUE);
destroy_nhwindow(prevmsg_win);
} else if (iflags.prevmsg_window == 'c') { /* combination */
@@ -104,12 +67,11 @@ tty_doprev_message()
cw->maxcol = cw->maxrow;
i = cw->maxcol;
do {
if (cw->data[i] && *cw->data[i])
Wputstr(prevmsg_win, 0, cw->data[i]);
if(cw->data[i] && strcmp(cw->data[i], "") )
putstr(prevmsg_win, 0, cw->data[i]);
i = (i + 1) % cw->rows;
} while (i != cw->maxcol);
Wputstr(prevmsg_win, 0, toplines);
putstr(prevmsg_win, 0, toplines);
display_nhwindow(prevmsg_win, TRUE);
destroy_nhwindow(prevmsg_win);
}
@@ -121,11 +83,11 @@ tty_doprev_message()
prevmsg_win = create_nhwindow(NHW_MENU);
putstr(prevmsg_win, 0, "Message History");
putstr(prevmsg_win, 0, "");
Wputstr(prevmsg_win, 0, toplines);
putstr(prevmsg_win, 0, toplines);
cw->maxcol=cw->maxrow-1;
if(cw->maxcol < 0) cw->maxcol = cw->rows-1;
do {
Wputstr(prevmsg_win, 0, cw->data[cw->maxcol]);
putstr(prevmsg_win, 0, cw->data[cw->maxcol]);
cw->maxcol--;
if (cw->maxcol < 0) cw->maxcol = cw->rows-1;
if (!cw->data[cw->maxcol])
@@ -156,19 +118,19 @@ tty_doprev_message()
}
STATIC_OVL void
redotoplin(symstr)
const nhwchar *symstr;
redotoplin(str)
const char *str;
{
int otoplin = ttyDisplay->toplin;
home();
if (DoGputch(*symstr)) {
if(*str & 0x80) {
/* kludge for the / command, the only time we ever want a */
/* graphics character on the top line */
g_putch((int)*symstr++);
g_putch((int)*str++);
ttyDisplay->curx++;
}
end_glyphout(); /* in case message printed during graphics output */
putsyms(symstr);
putsyms(str);
cl_end();
ttyDisplay->toplin = 1;
if(ttyDisplay->cury && otoplin != 3)
@@ -180,25 +142,25 @@ remember_topl()
{
register struct WinDesc *cw = wins[WIN_MESSAGE];
int idx = cw->maxrow;
unsigned len;
unsigned len = strlen(toplines) + 1;
if ((cw->flags & WIN_LOCKHISTORY) || !*toplines) return;
len = Wstrlen(toplines) + 1;
if (len > (unsigned)cw->datlen[idx]) {
if (cw->data[idx]) free(cw->data[idx]);
len += (8 - (len & 7)); /* pad up to next multiple of 8 */
cw->data[idx] = (nhwchar *)alloc(sizeof(nhwchar) * len);
cw->data[idx] = (char *)alloc(len);
cw->datlen[idx] = (short)len;
}
(void)WWstrcpy(cw->data[idx], toplines);
Strcpy(cw->data[idx], toplines);
*toplines = '\0';
cw->maxcol = cw->maxrow = (idx + 1) % cw->rows;
}
void
addtopl(s)
const nhwchar *s;
const char *s;
{
register struct WinDesc *cw = wins[WIN_MESSAGE];
@@ -219,8 +181,7 @@ more()
if(ttyDisplay->toplin) {
tty_curs(BASE_WINDOW, cw->curx+1, cw->cury);
if(cw->curx >= CO - 8)
topl_putsym(T('\n'));
if(cw->curx >= CO - 8) topl_putsym('\n');
}
if(flags.standout)
@@ -249,22 +210,22 @@ more()
void
update_topl(bp)
register const nhwchar *bp;
register const char *bp;
{
register nhwchar *tl, *otl;
register char *tl, *otl;
register int n0;
int notdied = 1;
struct WinDesc *cw = wins[WIN_MESSAGE];
/* If there is room on the line, print message on same line */
/* But messages like "You die..." deserve their own line */
n0 = Wstrlen(bp);
n0 = strlen(bp);
if ((ttyDisplay->toplin == 1 || (cw->flags & WIN_STOP)) &&
cw->cury == 0 &&
n0 + Wstrlen(toplines) + 3 < CO-8 && /* room for --More-- */
(notdied = WWstrncmp(bp, T("You die"), 7))) {
(void)WWstrcat(toplines, T(" "));
(void)WWstrcat(toplines, bp);
n0 + (int)strlen(toplines) + 3 < CO-8 && /* room for --More-- */
(notdied = strncmp(bp, "You die", 7))) {
Strcat(toplines, " ");
Strcat(toplines, bp);
cw->curx += 2;
if(!(cw->flags & WIN_STOP))
addtopl(bp);
@@ -277,7 +238,7 @@ update_topl(bp)
}
}
remember_topl();
(void)WWstrncpy(toplines, bp, TBUFSZ);
(void) strncpy(toplines, bp, TBUFSZ);
toplines[TBUFSZ - 1] = 0;
for(tl = toplines; n0 >= CO; ){
@@ -285,11 +246,11 @@ update_topl(bp)
for(tl+=CO-1; tl != otl && !isspace(*tl); --tl) ;
if(tl == otl) {
/* Eek! A huge token. Try splitting after it. */
tl = Windex(otl, T(' '));
tl = index(otl, ' ');
if (!tl) break; /* No choice but to spit it out whole. */
}
*tl++ = T('\n');
n0 = Wstrlen(tl);
*tl++ = '\n';
n0 = strlen(tl);
}
if(!notdied) cw->flags &= ~WIN_STOP;
if(!(cw->flags & WIN_STOP)) redotoplin(toplines);
@@ -298,21 +259,21 @@ update_topl(bp)
STATIC_OVL
void
topl_putsym(c)
nhwchar c;
char c;
{
register struct WinDesc *cw = wins[WIN_MESSAGE];
if(cw == (struct WinDesc *) 0) panic("Putsym window MESSAGE nonexistant");
switch(c) {
case T('\b'):
case '\b':
if(ttyDisplay->curx == 0 && ttyDisplay->cury > 0)
tty_curs(BASE_WINDOW, CO, (int)ttyDisplay->cury-1);
backsp();
ttyDisplay->curx--;
cw->curx = ttyDisplay->curx;
return;
case T('\n'):
case '\n':
cl_end();
ttyDisplay->curx = 0;
ttyDisplay->cury++;
@@ -323,7 +284,7 @@ topl_putsym(c)
break;
default:
if(ttyDisplay->curx == CO-1)
topl_putsym(T('\n')); /* 1 <= curx <= CO; avoid CO */
topl_putsym('\n'); /* 1 <= curx <= CO; avoid CO */
#ifdef WIN32CON
(void) putchar(c);
#endif
@@ -337,11 +298,11 @@ topl_putsym(c)
}
void
putsyms(symstr)
const nhwchar *symstr;
putsyms(str)
const char *str;
{
while(*symstr)
topl_putsym(*symstr++);
while(*str)
topl_putsym(*str++);
}
STATIC_OVL void
@@ -349,8 +310,7 @@ removetopl(n)
register int n;
{
/* assume addtopl() has been done, so ttyDisplay->toplin is already set */
while (n-- > 0)
putsyms(T("\b \b"));
while (n-- > 0) putsyms("\b \b");
}
extern char erase_char; /* from xxxtty.c; don't need kill_char */
@@ -413,7 +373,7 @@ char def;
ttyDisplay->inread = sav;
tty_clear_nhwindow(WIN_MESSAGE);
cw->maxcol = cw->maxrow;
Waddtopl(prompt);
addtopl(prompt);
} else {
if(!doprev)
(void) tty_doprev_message(); /* need two initially */
@@ -429,7 +389,7 @@ char def;
tty_clear_nhwindow(WIN_MESSAGE);
cw->maxcol = cw->maxrow;
doprev = 0;
Waddtopl(prompt);
addtopl(prompt);
q = '\0'; /* force another loop iteration */
continue;
}
@@ -450,14 +410,13 @@ char def;
tty_nhbell();
q = (char)0;
} else if (q == '#' || digit_ok) {
char z;
nhwchar digit_string[2];
char z, digit_string[2];
int n_len = 0;
long value = 0;
addtopl(T("#")), n_len++;
digit_string[1] = (nhwchar)0;
addtopl("#"), n_len++;
digit_string[1] = '\0';
if (q != '#') {
digit_string[0] = (nhwchar)q;
digit_string[0] = q;
addtopl(digit_string), n_len++;
value = q - '0';
q = '#';
@@ -467,7 +426,7 @@ char def;
if (digit(z)) {
value = (10 * value) + (z - '0');
if (value < 0) break; /* overflow: try again */
digit_string[0] = (nhwchar)z;
digit_string[0] = z;
addtopl(digit_string), n_len++;
} else if (z == 'y' || index(quitchars, z)) {
if (z == '\033') value = -1; /* abort */
@@ -492,7 +451,7 @@ char def;
if (q != '#') {
Sprintf(rtmp, "%c", q);
Waddtopl(rtmp);
addtopl(rtmp);
}
clean_up:
ttyDisplay->inread--;
@@ -505,7 +464,7 @@ char def;
}
/* shared by tty_getmsghistory() and tty_putmsghistory() */
static nhwchar **snapshot_mesgs = 0;
static char **snapshot_mesgs = 0;
/* collect currently available message history data into a sequential array;
optionally, purge that data from the active circular buffer set as we go */
@@ -513,7 +472,7 @@ STATIC_OVL void
msghistory_snapshot(purge)
boolean purge; /* clear message history buffer as we copy it */
{
nhwchar *mesg;
char *mesg;
int i, inidx, outidx;
struct WinDesc *cw;
@@ -528,24 +487,24 @@ boolean purge; /* clear message history buffer as we copy it */
history updating to take place because that could clobber them */
if (!purge) cw->flags |= WIN_LOCKHISTORY;
snapshot_mesgs = (nhwchar **)alloc((cw->rows + 1) * sizeof (nhwchar *));
snapshot_mesgs = (char **)alloc((cw->rows + 1) * sizeof (char *));
outidx = 0;
inidx = cw->maxrow;
for (i = 0; i < cw->rows; ++i) {
snapshot_mesgs[i] = (nhwchar *)0;
snapshot_mesgs[i] = (char *)0;
mesg = cw->data[inidx];
if (mesg && *mesg) {
snapshot_mesgs[outidx++] = mesg;
if (purge) {
/* we're taking this pointer away; subsequest history
updates will eventually allocate a new one to replace it */
cw->data[inidx] = (nhwchar *)0;
cw->data[inidx] = (char *)0;
cw->datlen[inidx] = 0;
}
}
inidx = (inidx + 1) % cw->rows;
}
snapshot_mesgs[cw->rows] = (nhwchar *)0; /* sentinel */
snapshot_mesgs[cw->rows] = (char *)0; /* sentinel */
/* for a destructive snapshot, history is now completely empty */
if (purge) cw->maxcol = cw->maxrow = 0;
@@ -565,7 +524,7 @@ boolean purged; /* True: took history's pointers, False: just cloned them */
free((genericptr_t)snapshot_mesgs[i]);
}
free((genericptr_t)snapshot_mesgs), snapshot_mesgs = (nhwchar **)0;
free((genericptr_t)snapshot_mesgs), snapshot_mesgs = (char **)0;
/* history can resume being updated at will now... */
if (!purged) wins[WIN_MESSAGE]->flags &= ~WIN_LOCKHISTORY;
@@ -587,7 +546,7 @@ tty_getmsghistory(init)
boolean init;
{
static int nxtidx;
nhwchar *nextmesg;
char *nextmesg;
char *result = 0;
if (init) {
@@ -598,11 +557,7 @@ boolean init;
if (snapshot_mesgs) {
nextmesg = snapshot_mesgs[nxtidx++];
if (nextmesg) {
#ifdef UNICODE_WIDEWINPORT
result = WNstrcpy(topl_nbuf, nextmesg); /* wide-to-narrow */
#else
result = (char *)nextmesg;
#endif
} else {
free_msghistory_snapshot(FALSE);
}
@@ -648,12 +603,12 @@ boolean restoring_msghist;
if (msg) {
/* move most recent message to history, make this become most recent */
remember_topl();
(void)NWstrcpy(toplines, msg); /* narrow-to-wide */
Strcpy(toplines, msg);
} else if (snapshot_mesgs) {
/* done putting arbitrary messages in; put the snapshot ones back */
for (idx = 0; snapshot_mesgs[idx]; ++idx) {
remember_topl();
(void)WWstrcpy(toplines, snapshot_mesgs[idx]); /* wide-to-wide */
Strcpy(toplines, snapshot_mesgs[idx]);
}
/* now release the snapshot */
free_msghistory_snapshot(TRUE);

View File

@@ -43,11 +43,6 @@ extern char mapped_menu_cmds[]; /* from options.c */
/* this is only needed until tty_status_* routines are written */
extern NEARDATA winid WIN_STATUS;
#ifdef UNICODE_WIDEWINPORT
void FDECL(tty_putmixed,(winid,int,const char *));
void FDECL(tty_putstr_core,(winid,int,const nhwchar *));
#endif
/* Interface definition, for windows.c */
struct window_procs tty_procs = {
"tty",
@@ -75,11 +70,7 @@ struct window_procs tty_procs = {
tty_destroy_nhwindow,
tty_curs,
tty_putstr,
#ifdef UNICODE_WIDEWINPORT
tty_putmixed,
#else
genl_putmixed,
#endif
tty_display_file,
tty_start_menu,
tty_add_menu,
@@ -151,12 +142,7 @@ static char obuf[BUFSIZ]; /* BUFSIZ is defined in stdio.h */
#endif
static char winpanicstr[] = "Bad window id %d";
#ifdef UNICODE_WIDEWINPORT
nhwchar defmorestr[] = L"--More--";
#else
nhwchar defmorestr[] = "--More--";
#endif
nhwchar emptysym[1] = {0};
char defmorestr[] = "--More--";
#ifdef CLIPPING
# if defined(USE_TILES) && defined(MSDOS)
@@ -196,11 +182,8 @@ STATIC_DCL void FDECL(process_menu_window, (winid,struct WinDesc *));
STATIC_DCL void FDECL(process_text_window, (winid,struct WinDesc *));
STATIC_DCL tty_menu_item *FDECL(reverse, (tty_menu_item *));
STATIC_DCL const char * FDECL(compress_str, (const char *));
STATIC_DCL void FDECL(tty_putsym, (winid, int, int, NHWCHAR_P));
STATIC_DCL void FDECL(tty_putsym, (winid, int, int, CHAR_P));
STATIC_DCL char *FDECL(copy_of, (const char *));
#ifdef UNICODE_WIDEWINPORT
STATIC_DCL nhwchar *FDECL(nhwchar_copy_of, (const nhwchar *));
#endif
STATIC_DCL void FDECL(bail, (const char *)); /* __attribute__((noreturn)) */
/*
@@ -295,11 +278,7 @@ if(wc_tracelogf)
for(i=WIN_INVEN; i < MAXWIN; i++)
if(wins[i] && wins[i]->active) {
/* cop-out */
#ifdef UNICODE_WIDEWINPORT
addtopl(L"Press Return to continue: ");
#else
addtopl("Press Return to continue: ");
#endif
break;
}
(void) fflush(stdout);
@@ -1120,24 +1099,24 @@ tty_create_nhwindow(type)
if(newwin->maxrow) {
newwin->data =
(nhwchar **) alloc(sizeof(nhwchar *) * (unsigned)newwin->maxrow);
(char **) alloc(sizeof(char *) * (unsigned)newwin->maxrow);
newwin->datlen =
(short *) alloc(sizeof(short) * (unsigned)newwin->maxrow);
if(newwin->maxcol) {
for (i = 0; i < newwin->maxrow; i++) {
newwin->data[i] = (nhwchar *) alloc(sizeof(nhwchar) * (unsigned)newwin->maxcol);
newwin->data[i] = (char *) alloc((unsigned)newwin->maxcol);
newwin->datlen[i] = newwin->maxcol;
}
} else {
for (i = 0; i < newwin->maxrow; i++) {
newwin->data[i] = (nhwchar *) 0;
newwin->data[i] = (char *) 0;
newwin->datlen[i] = 0;
}
}
if(newwin->type == NHW_MESSAGE)
newwin->maxrow = 0;
} else {
newwin->data = (nhwchar **)0;
newwin->data = (char **)0;
newwin->datlen = (short *)0;
}
@@ -1175,12 +1154,12 @@ free_window_info(cw, free_data)
for(i=0; i<cw->maxrow; i++)
if(cw->data[i]) {
free((genericptr_t)cw->data[i]);
cw->data[i] = (nhwchar *)0;
cw->data[i] = (char *)0;
if (cw->datlen) cw->datlen[i] = 0;
}
if (free_data) {
free((genericptr_t)cw->data);
cw->data = (nhwchar **)0;
cw->data = (char **)0;
if (cw->datlen) free((genericptr_t)cw->datlen);
cw->datlen = (short *)0;
cw->rows = 0;
@@ -1254,25 +1233,15 @@ dmore(cw, s)
register struct WinDesc *cw;
const char *s; /* valid responses */
{
#ifdef UNICODE_WIDEWINPORT
char buf[BUFSZ];
#endif
const nhwchar *prompt = cw->morestr ? cw->morestr : defmorestr;
const char *prompt = cw->morestr ? cw->morestr : defmorestr;
int offset = (cw->type == NHW_TEXT) ? 1 : 2;
tty_curs(BASE_WINDOW,
(int)ttyDisplay->curx + offset, (int)ttyDisplay->cury);
if(flags.standout)
standoutbeg();
#ifdef UNICODE_WIDEWINPORT
strnhwcpy(buf, prompt);
xputs(buf);
ttyDisplay->curx += strlen(buf);
#else
xputs(prompt);
ttyDisplay->curx += strlen(prompt);
#endif
if(flags.standout)
standoutend();
@@ -1387,13 +1356,13 @@ struct WinDesc *cw;
long count;
int n, curr_page, page_lines;
boolean finished, counting, reset_count;
char *cp, *rp, resp[QBUFSZ], gacc[QBUFSZ];
nhwchar *msave, *morestr;
char *cp, *rp, resp[QBUFSZ], gacc[QBUFSZ],
*msave, *morestr;
curr_page = page_lines = 0;
page_start = page_end = 0;
msave = cw->morestr; /* save the morestr */
cw->morestr = morestr = (nhwchar*) alloc(sizeof(nhwchar) * (unsigned) QBUFSZ);
cw->morestr = morestr = (char*) alloc((unsigned) QBUFSZ);
counting = FALSE;
count = 0L;
reset_count = TRUE;
@@ -1510,41 +1479,20 @@ struct WinDesc *cw;
Strcat(resp, gacc); /* group accelerators */
Strcat(resp, mapped_menu_cmds);
if (cw->npages > 1) {
#ifdef UNICODE_WIDEWINPORT
char buf[BUFSZ];
Sprintf(buf, "(%d of %d)",
curr_page + 1, (int) cw->npages);
(void)nhwstrcpy(cw->morestr, buf);
#else
if (cw->npages > 1)
Sprintf(cw->morestr, "(%d of %d)",
curr_page + 1, (int) cw->npages);
#endif
} else if (msave) {
#ifdef UNICODE_WIDEWINPORT
(void)nhwcpy(cw->morestr, msave);
#else
else if (msave)
Strcpy(cw->morestr, msave);
#endif
} else {
#ifdef UNICODE_WIDEWINPORT
(void)nhwcpy(cw->morestr, defmorestr);
#else
else
Strcpy(cw->morestr, defmorestr);
#endif
}
tty_curs(window, 1, page_lines);
cl_end();
dmore(cw, resp);
} else {
/* just put the cursor back... */
tty_curs(window,
#ifdef UNICODE_WIDEWINPORT
(int) nhwlen(cw->morestr) + 2,
#else
(int) strlen(cw->morestr) + 2,
#endif
page_lines);
tty_curs(window, (int) strlen(cw->morestr) + 2, page_lines);
xwaitforspace(resp);
}
@@ -1708,7 +1656,7 @@ winid window;
struct WinDesc *cw;
{
int i, n, attr;
register nhwchar *cp;
register char *cp;
for (n = 0, i = 0; i < cw->maxrow; i++) {
if (!cw->offx && (n + cw->offy == ttyDisplay->rows - 1)) {
@@ -1746,11 +1694,7 @@ struct WinDesc *cw;
*cp && (int) ttyDisplay->curx < (int) ttyDisplay->cols;
cp++, ttyDisplay->curx++)
#endif
#ifdef UNICODE_WIDEWINPORT
u_putch(*cp);
#else
(void) putchar(*cp);
#endif
term_end_attr(attr);
}
}
@@ -1996,7 +1940,7 @@ STATIC_OVL void
tty_putsym(window, x, y, ch)
winid window;
int x, y;
nhwchar ch;
char ch;
{
register struct WinDesc *cw = 0;
@@ -2008,11 +1952,7 @@ tty_putsym(window, x, y, ch)
case NHW_MAP:
case NHW_BASE:
tty_curs(window, x, y);
#ifdef UNICODE_WIDEWINPORT
u_putch(ch);
#else
(void) putchar(ch);
#endif
ttyDisplay->curx++;
cw->curx++;
break;
@@ -2055,14 +1995,9 @@ tty_putstr(window, attr, str)
const char *str;
{
register struct WinDesc *cw = 0;
#ifdef UNICODE_WIDEWINPORT
nhwchar symbuf[BUFSZ];
register const nhwchar *symstr = symbuf;
#else
register const nhwchar *nb;
register nhwchar *ob;
register char *ob;
register const char *nb;
register int i, j, n0;
#endif
/* Assume there's a real problem if the window is missing --
* probably a panic message
@@ -2077,52 +2012,21 @@ tty_putstr(window, attr, str)
return;
if(cw->type != NHW_MESSAGE)
str = compress_str(str);
#if defined(USER_SOUNDS) && defined(WIN32CON)
else
play_sound_for_message(str);
#endif
#ifdef UNICODE_WIDEWINPORT
nhwstrcpy(symbuf, str);
tty_putstr_core(window, attr, symstr);
}
void
tty_putstr_core(window, attr, symstr)
winid window;
int attr;
const nhwchar *symstr;
{
register struct WinDesc *cw = wins[window];
register const nhwchar *nb;
register nhwchar *ob;
register int i, j, n0;
#endif
ttyDisplay->lastwin = window;
switch(cw->type) {
case NHW_MESSAGE:
/* really do this later */
#ifdef UNICODE_WIDEWINPORT
update_topl(symstr);
#else
update_topl(str);
#if defined(USER_SOUNDS) && defined(WIN32CON)
play_sound_for_message(str);
#endif
update_topl(str);
break;
case NHW_STATUS:
ob = &cw->data[cw->cury][j = cw->curx];
if(context.botlx) *ob = 0;
#ifdef UNICODE_WIDEWINPORT
if(!cw->cury && (int)nhwlen(symstr) >= CO) {
/* the characters before "St:" are unnecessary */
nb = nhwindex(symstr, L':');
if(nb && nb > symstr+2)
symstr = nb - 2;
}
nb = symstr;
#else
if(!cw->cury && (int)strlen(str) >= CO) {
/* the characters before "St:" are unnecessary */
nb = index(str, ':');
@@ -2130,8 +2034,6 @@ tty_putstr_core(window, attr, symstr)
str = nb - 2;
}
nb = str;
#endif
for(i = cw->curx+1, n0 = cw->cols; i < n0; i++, nb++) {
if(!*nb) {
if(*ob || context.botlx) {
@@ -2146,31 +2048,19 @@ tty_putstr_core(window, attr, symstr)
if(*ob) ob++;
}
#ifdef UNICODE_WIDEWINPORT
(void) nhwncpy(&cw->data[cw->cury][j], symstr, cw->cols - j - 1);
#else
(void) strncpy(&cw->data[cw->cury][j], str, cw->cols - j - 1);
#endif
cw->data[cw->cury][cw->cols-1] = (nhwchar)0; /* null terminate */
cw->data[cw->cury][cw->cols-1] = '\0'; /* null terminate */
cw->cury = (cw->cury+1) % 2;
cw->curx = 0;
break;
case NHW_MAP:
tty_curs(window, cw->curx+1, cw->cury);
term_start_attr(attr);
#ifdef UNICODE_WIDEWINPORT
while(*symstr && (int) ttyDisplay->curx < (int) ttyDisplay->cols-1) {
u_putch(*symstr);
symstr++;
ttyDisplay->curx++;
}
#else
while(*str && (int) ttyDisplay->curx < (int) ttyDisplay->cols-1) {
(void) putchar(*str);
str++;
ttyDisplay->curx++;
}
#endif
cw->curx = 0;
cw->cury++;
term_end_attr(attr);
@@ -2178,23 +2068,14 @@ tty_putstr_core(window, attr, symstr)
case NHW_BASE:
tty_curs(window, cw->curx+1, cw->cury);
term_start_attr(attr);
#ifdef UNICODE_WIDEWINPORT
while (*symstr) {
#else
while (*str) {
#endif
if ((int) ttyDisplay->curx >= (int) ttyDisplay->cols-1) {
cw->curx = 0;
cw->cury++;
tty_curs(window, cw->curx+1, cw->cury);
}
#ifdef UNICODE_WIDEWINPORT
u_putch(*symstr);
symstr++;
#else
(void) putchar(*str);
str++;
#endif
ttyDisplay->curx++;
}
cw->curx = 0;
@@ -2221,10 +2102,10 @@ tty_putstr_core(window, attr, symstr)
}
/* always grows one at a time, but alloc 12 at a time */
if(cw->cury >= cw->rows) {
nhwchar **tmp;
char **tmp;
cw->rows += 12;
tmp = (nhwchar **) alloc(sizeof(nhwchar *) * (unsigned)cw->rows);
tmp = (char **) alloc(sizeof(char *) * (unsigned)cw->rows);
for(i=0; i<cw->maxrow; i++)
tmp[i] = cw->data[i];
if(cw->data)
@@ -2236,19 +2117,10 @@ tty_putstr_core(window, attr, symstr)
}
if(cw->data[cw->cury])
free((genericptr_t)cw->data[cw->cury]);
#ifdef UNICODE_WIDEWINPORT
n0 = nhwlen(symstr) + 1;
#else
n0 = strlen(str) + 1;
#endif
ob = cw->data[cw->cury] = (nhwchar *)alloc(sizeof(nhwchar) * ((unsigned)n0 + 1));
*ob++ = (nhwchar)(attr + 1); /* avoid nuls, for convenience */
#ifdef UNICODE_WIDEWINPORT
(void)nhwcpy(ob, symstr);
#else
ob = cw->data[cw->cury] = (char *)alloc((unsigned)n0 + 1);
*ob++ = (char)(attr + 1); /* avoid nuls, for convenience */
Strcpy(ob, str);
#endif
if(n0 > cw->maxcol)
cw->maxcol = n0;
@@ -2256,19 +2128,11 @@ tty_putstr_core(window, attr, symstr)
cw->maxrow = cw->cury;
if(n0 > CO) {
/* attempt to break the line */
#ifdef UNICODE_WIDEWINPORT
for(i = CO-1; i && symstr[i] != L' ' && symstr[i] != L'\n';)
#else
for(i = CO-1; i && str[i] != ' ' && str[i] != '\n';)
#endif
i--;
if(i) {
cw->data[cw->cury-1][++i] = (nhwchar)0;
#ifdef UNICODE_WIDEWINPORT
tty_putstr_core(window, attr, &symstr[i]);
#else
cw->data[cw->cury-1][++i] = '\0';
tty_putstr(window, attr, &str[i]);
#endif
}
}
@@ -2276,60 +2140,6 @@ tty_putstr_core(window, attr, symstr)
}
}
#ifdef UNICODE_WIDEWINPORT
/*
* This differs from putstr() because the str parameter can
* contain a sequence of characters representing:
* \GXXXXNNNN a glyph value, encoded by encglyph().
*
*/
void
tty_putmixed(window, attr, str)
winid window;
int attr;
const char *str;
{
nhwchar wbuf[BUFSZ];
const char *cp = str;
nhwchar *put = wbuf;
while (*cp) {
if (*cp == '\\') {
int rndchk = 0, so = 0, gv = 0, ch, oc, dcount;
unsigned os;
const char *dp, *hex = "00112233445566778899aAbBcCdDeEfF";
const char *save_cp = cp;
cp++;
switch(*cp) {
case 'G': /* glyph value \GXXXXNNNN*/
dcount = 0;
for (++cp; *cp && (dp = index(hex, *cp)) && (dcount++ < 4); cp++)
rndchk = (int)((rndchk * 16) + ((int)(dp - hex) / 2));
if (rndchk == context.rndencode) {
dcount = 0;
for (; *cp && (dp = index(hex, *cp)) && (dcount++ < 4); cp++)
gv = (int)((gv * 16) + ((int)(dp - hex) / 2));
so = mapglyph(gv, &ch, &oc, &os, 0, 0);
*put++ = (nhwchar)showsyms[so];
continue;
} else {
/* possible forgery - leave it the way it is */
cp = save_cp;
}
break;
case '\\':
break;
}
}
*put++ = (nhwchar)*cp++;
}
*put = (nhwchar)0;
/* now send it to tty_putstr_core() */
tty_putstr_core(window, attr, wbuf);
}
#endif /*UNICODE_WIDEWINPORT*/
void
tty_display_file(fname, complain)
const char *fname;
@@ -2515,7 +2325,7 @@ tty_end_menu(window, prompt)
/* Reverse the list so that items are in correct order. */
cw->mlist = reverse(cw->mlist);
/* Put the prompt at the beginning of the menu. */
/* Put the promt at the beginning of the menu. */
if (prompt) {
anything any;
@@ -2567,19 +2377,10 @@ tty_end_menu(window, prompt)
/* produce the largest demo string */
Sprintf(buf, "(%d of %d) ", cw->npages, cw->npages);
len = strlen(buf);
#ifdef UNICODE_WIDEWINPORT
cw->morestr = nhwchar_copy_of(emptysym);
#else
cw->morestr = copy_of("");
#endif
} else {
#ifdef UNICODE_WIDEWINPORT
cw->morestr = nhwchar_copy_of(L"(end) ");
len = nhwlen(cw->morestr);
#else
cw->morestr = copy_of("(end) ");
len = strlen(cw->morestr);
#endif
}
if (len > (int)ttyDisplay->cols) {
@@ -2699,11 +2500,7 @@ tty_wait_synch()
} else {
tty_display_nhwindow(WIN_MAP, FALSE);
if(ttyDisplay->inmore) {
#ifdef UNICODE_WIDEWINPORT
addtopl(L"--More--");
#else
addtopl("--More--");
#endif
(void) fflush(stdout);
} else if(ttyDisplay->inread > program_state.gameover) {
/* this can only happen if we were reading and got interrupted */
@@ -2775,58 +2572,6 @@ end_glyphout()
#endif
}
#ifdef UNICODE_WIDEWINPORT
/*
* Parts of u_putch() were contributed by Adam Wozniak, 2005.
*/
void
u_putch(sym)
nhwchar sym;
{
unsigned long unicode = sym;
if (!iflags.unicodedisp)
putchar((char)sym);
else {
#if defined(UNIX) || defined(VMS)
/* send utf8 to display */
if (unicode < 0x80) {
(void) putchar(unicode);
} else if (unicode < 0x00000800) {
(void) putchar(0xC0 | (unicode >> 6));
(void) putchar(0x80 | (unicode & 0x3F));
} else if (unicode < 0x00010000) {
(void) putchar(0xE0 | (unicode >> 12));
(void) putchar(0x80 | ((unicode >> 6) & 0x3F));
(void) putchar(0x80 | (unicode & 0x3F));
} else if (unicode < 0x00200000) {
(void) putchar(0xF0 | (unicode >> 18));
(void) putchar(0x80 | ((unicode >> 12) & 0x3F));
(void) putchar(0x80 | ((unicode >> 6) & 0x3F));
(void) putchar(0x80 | (unicode & 0x3F));
} else if (unicode < 0x04000000) {
(void) putchar(0xF8 | (unicode >> 24));
(void) putchar(0x80 | ((unicode >> 18) & 0x3F));
(void) putchar(0x80 | ((unicode >> 12) & 0x3F));
(void) putchar(0x80 | ((unicode >> 6) & 0x3F));
(void) putchar(0x80 | (unicode & 0x3F));
} else {
(void) putchar(0xFC | (unicode >> 30));
(void) putchar(0x80 | ((unicode >> 24) & 0x3F));
(void) putchar(0x80 | ((unicode >> 18) & 0x3F));
(void) putchar(0x80 | ((unicode >> 12) & 0x3F));
(void) putchar(0x80 | ((unicode >> 6) & 0x3F));
(void) putchar(0x80 | (unicode & 0x3F));
}
#else
/* it is assumed that whatever is being substituted for
putchar() can handle unicode characters directly at
this point (nttty's xputc() for example) */
(void) putchar(sym);
#endif
}
}
#endif /*UNICODE_WIDEWINPORT*/
#ifndef WIN32
void
g_putch(in_ch)
@@ -2835,11 +2580,6 @@ int in_ch;
register char ch = (char)in_ch;
# if defined(ASCIIGRAPH) && !defined(NO_TERMS)
# if defined(UNICODE_WIDEWINPORT) && defined(UNICODE_DRAWING)
if (iflags.unicodedisp && symset[currentgraphics].name) {
u_putch(in_ch);
} else
# endif
if (SYMHANDLING(H_IBM) || iflags.eight_bit_tty) {
/* IBM-compatible displays don't need other stuff */
(void) putchar(ch);
@@ -2923,9 +2663,9 @@ tty_print_glyph(window, x, y, glyph)
xchar x, y;
int glyph;
{
int ch, idx;
int ch;
boolean reverse_on = FALSE;
int color;
int color;
unsigned special;
#ifdef CLIPPING
@@ -2935,7 +2675,7 @@ tty_print_glyph(window, x, y, glyph)
}
#endif
/* map glyph to character and color */
idx = mapglyph(glyph, &ch, &color, &special, x, y);
(void)mapglyph(glyph, &ch, &color, &special, x, y);
/* Move the cursor. */
tty_curs(window, x,y);
@@ -2968,11 +2708,6 @@ tty_print_glyph(window, x, y, glyph)
if (iflags.grmode && iflags.tile_view)
xputg(glyph,ch,special);
else
#endif
#if defined(UNICODE_WIDEWINPORT) && defined(UNICODE_DRAWING)
if (iflags.unicodedisp && symset[currentgraphics].name)
g_putch(showsyms[idx]); /* use the unicode symset */
else
#endif
g_putch(ch); /* print the character */
@@ -3127,15 +2862,6 @@ copy_of(s)
return strcpy((char *) alloc((unsigned) (strlen(s) + 1)), s);
}
# ifdef UNICODE_WIDEWINPORT
STATIC_OVL nhwchar *
nhwchar_copy_of(s)
const nhwchar *s;
{
if (!s) s = emptysym;
return nhwcpy((nhwchar *) alloc(sizeof(nhwchar) * (unsigned) (nhwlen(s) + 1)), s);
}
# endif /*UNICODE_WIDEWINPORT*/
#endif /* TTY_GRAPHICS */
/*wintty.c*/