about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/GridText.c2
-rw-r--r--src/HTFWriter.c13
-rw-r--r--src/HTInit.c13
-rw-r--r--src/HTML.c20
-rw-r--r--src/LYCharSets.c4
-rw-r--r--src/LYCharVals.h28
-rw-r--r--src/LYMain.c12
-rw-r--r--src/LYMainLoop.c119
-rw-r--r--src/LYOptions.c90
-rw-r--r--src/LYPrint.c14
-rw-r--r--src/LYReadCFG.c27
-rw-r--r--src/LYStrings.c76
-rw-r--r--src/LYStrings.h12
-rw-r--r--src/LYStyle.c15
-rw-r--r--src/LYTraversal.c52
-rw-r--r--src/LYrcFile.c58
-rw-r--r--src/Makefile.old3
-rw-r--r--src/UCAuto.c9
-rw-r--r--src/UCAux.c3
-rw-r--r--src/UCdomap.c7
-rw-r--r--src/UCdomap.h4
-rw-r--r--src/chrtrans/cp1250_uni.tbl3
-rw-r--r--src/chrtrans/cp1251_uni.tbl3
-rw-r--r--src/chrtrans/cp1252_uni.tbl3
-rw-r--r--src/chrtrans/cp1253_uni.tbl3
-rw-r--r--src/chrtrans/cp1255_uni.tbl3
-rw-r--r--src/chrtrans/cp1256_uni.tbl3
-rw-r--r--src/chrtrans/cp1257_uni.tbl3
-rw-r--r--src/chrtrans/cp437_uni.tbl3
-rw-r--r--src/chrtrans/cp737_uni.tbl3
-rw-r--r--src/chrtrans/cp775_uni.tbl3
-rw-r--r--src/chrtrans/cp850_uni.tbl3
-rw-r--r--src/chrtrans/cp852_uni.tbl3
-rw-r--r--src/chrtrans/cp862_uni.tbl3
-rw-r--r--src/chrtrans/cp864_uni.tbl3
-rw-r--r--src/chrtrans/cp866_uni.tbl4
-rw-r--r--src/chrtrans/cp869_uni.tbl3
-rw-r--r--src/chrtrans/iso01_uni.tbl3
-rw-r--r--src/chrtrans/iso02_uni.tbl3
-rw-r--r--src/chrtrans/iso03_uni.tbl3
-rw-r--r--src/chrtrans/iso04_uni.tbl3
-rw-r--r--src/chrtrans/iso05_uni.tbl3
-rw-r--r--src/chrtrans/iso06_uni.tbl3
-rw-r--r--src/chrtrans/iso07_uni.tbl3
-rw-r--r--src/chrtrans/iso08_uni.tbl3
-rw-r--r--src/chrtrans/iso09_uni.tbl3
-rw-r--r--src/chrtrans/jcuken_kb.h21
-rw-r--r--src/chrtrans/koi8r_uni.tbl3
-rw-r--r--src/chrtrans/makefile.in4
-rw-r--r--src/chrtrans/makeuctb.c32
-rw-r--r--src/chrtrans/rot13_kb.h21
-rw-r--r--src/chrtrans/yawerty_kb.h21
-rw-r--r--src/makefile.dos44
-rw-r--r--src/makefile.dsl41
-rw-r--r--src/makefile.in7
-rw-r--r--src/makefile.wsl41
56 files changed, 537 insertions, 355 deletions
diff --git a/src/GridText.c b/src/GridText.c
index 7b4ee540..ebca529f 100644
--- a/src/GridText.c
+++ b/src/GridText.c
@@ -81,7 +81,7 @@ extern HTCJKlang HTCJK;
 PUBLIC HText * HTMainText = NULL;		/* Equivalent of main window */
 PUBLIC HTParentAnchor * HTMainAnchor = NULL;	/* Anchor for HTMainText */
 
-PUBLIC char * HTAppName = "Lynx";		/* Application name */
+PUBLIC char * HTAppName = LYNX_NAME;		/* Application name */
 PUBLIC char * HTAppVersion = LYNX_VERSION;	/* Application version */
 
 PUBLIC int HTFormNumber = 0;
diff --git a/src/HTFWriter.c b/src/HTFWriter.c
index 3b83f1f3..667c8480 100644
--- a/src/HTFWriter.c
+++ b/src/HTFWriter.c
@@ -369,18 +369,7 @@ PRIVATE void HTFWriter_free ARGS1(HTStream *, me)
 	if (me->anchor->FileCache)
 	    remove(me->anchor->FileCache);
 	FREE(me);
-#ifndef NOSIGHUP
-	(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-	(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-	(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-	if (no_suspend)
-	  (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-	exit(0);
+	exit_immediately(0);
     }
 
     FREE(me);
diff --git a/src/HTInit.c b/src/HTInit.c
index 27290dff..44c915b6 100644
--- a/src/HTInit.c
+++ b/src/HTInit.c
@@ -588,18 +588,7 @@ PRIVATE int ExitWithError ARGS1(
 {
     if (txt)
 	fprintf(tfp, "metamail: %s\n", txt);
-#ifndef NOSIGHUP
-    (void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-    (void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-    (void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-    if (no_suspend)
-	(void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-    exit(-1);
+    exit_immediately(-1);
     return(-1);
 }
 
diff --git a/src/HTML.c b/src/HTML.c
index e3d05a3a..0e1bf5bf 100644
--- a/src/HTML.c
+++ b/src/HTML.c
@@ -655,10 +655,13 @@ PRIVATE void HTML_start_element ARGS6(
 	UPDATE_STYLE;
     }
 
+    CTRACE(tfp, "me->tag_charset: %d -> ", me->tag_charset); 
     if (tag_charset < 0)
 	me->tag_charset = me->UCLYhndl;
     else
 	me->tag_charset = tag_charset;
+    CTRACE(tfp, "%d (me->UCLYhndl: %d, tag_charset: %d)\n",  
+	me->tag_charset, me->UCLYhndl, tag_charset); 
 
 /* this should be done differently */
 #if defined(USE_COLOR_STYLE)
@@ -4089,7 +4092,7 @@ PRIVATE void HTML_start_element ARGS6(
 	    /*
 	     *	Before any input field, add a collapsible space if
 	     *	we're not in a PRE block, to promote a wrap there
-	     *	for any long values that would extent past the right
+	     *	for any long values that would extend past the right
 	     *	margin from our current position in the line.  If
 	     *	we are in a PRE block, start a new line if the last
 	     *	line already is within 6 characters of the wrap point
@@ -4244,7 +4247,7 @@ PRIVATE void HTML_start_element ARGS6(
 	    /*
 	     *	Before any input field, add a collapsible space if
 	     *	we're not in a PRE block, to promote a wrap there
-	     *	for any long values that would extent past the right
+	     *	for any long values that would extend past the right
 	     *	margin from our current position in the line.  If
 	     *	we are in a PRE block, start a new line if the last
 	     *	line already is within 6 characters of the wrap point
@@ -7084,18 +7087,7 @@ PUBLIC HTStructured* HTML_new ARGS3(
 	    return HTMLGenerator(intermediate);
 	fprintf(stderr, "\n** Internal error: can't parse HTML to %s\n",
 		HTAtom_name(format_out));
-#ifndef NOSIGHUP
-	(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-	(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-	(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-	if (no_suspend)
-	  (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-	exit (-1);
+	exit_immediately (-1);
     }
 
     me = (HTStructured*) calloc(sizeof(*me),1);
diff --git a/src/LYCharSets.c b/src/LYCharSets.c
index 891b795f..03f9f74e 100644
--- a/src/LYCharSets.c
+++ b/src/LYCharSets.c
@@ -348,7 +348,7 @@ PUBLIC CONST char ** LYCharSets[MAXCHARSETS]={
  *  Add the name that the user will see below.
  *  The order of LYCharSets and LYchar_set_names MUST be the same
  */
-PUBLIC CONST char * LYchar_set_names[MAXCHARSETSP]={
+PUBLIC CONST char * LYchar_set_names[MAXCHARSETS + 1]={
 	"Western (ISO-8859-1)",
 	"Western (cp850)",
 	"Western (windows-1252)",
@@ -394,7 +394,7 @@ PUBLIC LYUCcharset LYCharSet_UC[MAXCHARSETS]=
   {-1,"cp850",		UCT_ENC_8BIT,
 			UCT_REP_SUPERSETOF_LAT1,
 			0,			UCT_R_8BIT,UCT_R_ASCII},
-  {-1,"windows-1251", 	UCT_ENC_8BIT,
+  {-1,"windows-1252", 	UCT_ENC_8BIT,
 			UCT_REP_SUPERSETOF_LAT1,
 			0,			UCT_R_8BIT,UCT_R_ASCII},
   {-1,"cp437",		UCT_ENC_8BIT,0,0,	UCT_R_8BIT,UCT_R_ASCII},
diff --git a/src/LYCharVals.h b/src/LYCharVals.h
index 9b4d59e4..2b985cce 100644
--- a/src/LYCharVals.h
+++ b/src/LYCharVals.h
@@ -3,21 +3,25 @@
 
 #include <HTUtils.h>
 
+/*
+ * Use integer values for character constants rather than '\octal' form, since
+ * not all compilers agree that those will fit in a character, even when cast.
+ */
 #ifndef   CH_ESC
 #ifdef    EBCDIC
-#define CH_DEL     '\x07'
-#define CH_ESC     '\x27'
-#define CH_ESC_PAR '\x27'
-#define CH_HICTL   '\x3f'
-#define CH_NBSP    '\x41'
-#define CH_SHY     '\xca'
+#define CH_DEL     	0x07
+#define CH_ESC     	0x27
+#define CH_ESC_PAR 	0x27
+#define CH_HICTL   	0x3f
+#define CH_NBSP    	0x41
+#define CH_SHY     	0xca
 #else  /* EBCDIC */
-#define CH_ESC     '\033'
-#define CH_DEL     '\177'
-#define CH_ESC_PAR '\233'
-#define CH_HICTL   '\237'
-#define CH_NBSP    '\240'
-#define CH_SHY     '\255'
+#define CH_ESC     	0033
+#define CH_DEL     	0177
+#define CH_ESC_PAR 	0233
+#define CH_HICTL   	0237
+#define CH_NBSP    	0240
+#define CH_SHY     	0255
 #endif /* EBCDIC */
 #endif /* CH_ESC */
 
diff --git a/src/LYMain.c b/src/LYMain.c
index f93d173a..0cd4de25 100644
--- a/src/LYMain.c
+++ b/src/LYMain.c
@@ -49,11 +49,11 @@
 #include <LYexit.h>
 #include <LYLeaks.h>
 
-#ifdef FNAMES_8_3 
+#ifdef FNAMES_8_3
 #define COOKIE_FILE "cookies"
-#else 
+#else
 #define COOKIE_FILE ".lynx_cookies"
-#endif /* FNAMES_8_3 */ 
+#endif /* FNAMES_8_3 */
 
 /* ahhhhhhhhhh!! Global variables :-< */
 #ifdef SOCKS
@@ -517,7 +517,7 @@ PRIVATE void LYStdinArgs_free NOARGS
     return;
 }
 
-PRIVATE void exit_immediately ARGS1(
+PUBLIC void exit_immediately ARGS1(
 	int,		code)
 {
 #ifndef NOSIGHUP
@@ -2482,8 +2482,8 @@ static int version_fun ARGS3(
     SetOutputMode( O_TEXT );
 
     printf("\n");
-    printf(gettext("\n%s Version %s (%.*s)\n"), 
-	  LYNX_NAME, LYNX_VERSION, 
+    printf(gettext("\n%s Version %s (%.*s)\n"),
+	  LYNX_NAME, LYNX_VERSION,
 	  LYNX_DATE_LEN,
 	  LYNX_RELEASE ? LYNX_RELEASE_DATE : &LYNX_DATE[LYNX_DATE_OFF]
 	  );
diff --git a/src/LYMainLoop.c b/src/LYMainLoop.c
index 2f6a7b44..f9268079 100644
--- a/src/LYMainLoop.c
+++ b/src/LYMainLoop.c
@@ -602,18 +602,7 @@ try_again:
 			if ((ofp = LYAppendToTxtFile(TRAVERSE_ERRORS)) == NULL) {
 			    if ((ofp = LYNewTxtFile(TRAVERSE_ERRORS)) == NULL) {
 				perror(NOOPEN_TRAV_ERR_FILE);
-#ifndef NOSIGHUP
-				(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-				(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-				(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-				if (no_suspend)
-				    (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-				exit(-1);
+				exit_immediately(-1);
 			    }
 			}
 			fprintf(ofp, "%s %s\tin %s\n",
@@ -649,18 +638,7 @@ try_again:
 			}
 
 			if (!dump_output_immediately) {
-#ifndef NOSIGHUP
-			    (void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-			    (void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-			    (void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-			    if (no_suspend)
-				(void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-			    exit(-1);
+			    exit_immediately(-1);
 			}
 			return(-1);
 		    }
@@ -753,18 +731,7 @@ try_again:
 			       SetOutputMode( O_BINARY );
 			   }
 			   if (!dump_output_immediately) {
-#ifndef NOSIGHUP
-				(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-				(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-				(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-				if (no_suspend)
-				    (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-			       exit(-1);
+			       exit_immediately(-1);
 			   }
 			   return(-1);
 		       }
@@ -1033,7 +1000,7 @@ try_again:
 
 	    /*
 	     *	Set the remaining document elements and add to
-	     *	the visitied links list. - FM
+	     *	the visited links list. - FM
 	     */
 	    if (ownerS_address != NULL) {
 		if (HTOutputFormat == WWW_SOURCE && !HText_getOwner())
@@ -1397,12 +1364,39 @@ try_again:
 			    if (no_mail) {
 				statusline(FORM_LINK_SUBMIT_MAILTO_DIS_MSG);
 			    } else {
-				statusline(FORM_LINK_SUBMIT_MAILTO_MSG);
+				if(user_mode == ADVANCED_MODE) {
+				    char *submit_str = NULL;
+
+				    StrAllocCopy(submit_str, FORM_LINK_SUBMIT_MAILTO_PREFIX);
+				    StrAllocCat(submit_str, links[curdoc.link].form->submit_action);
+				    statusline(submit_str);
+				    FREE(submit_str);
+				} else {
+				    statusline(FORM_LINK_SUBMIT_MAILTO_MSG);
+				}
 			    }
 			} else if (links[curdoc.link].form->no_cache) {
-			    statusline(FORM_LINK_RESUBMIT_MESSAGE);
+			    if(user_mode == ADVANCED_MODE) {
+				char *submit_str = NULL;
+
+				StrAllocCopy(submit_str, FORM_LINK_RESUBMIT_PREFIX);
+				StrAllocCat(submit_str, links[curdoc.link].form->submit_action);
+				statusline(submit_str);
+				FREE(submit_str);
+			    } else {
+				statusline(FORM_LINK_RESUBMIT_MESSAGE);
+			    }
 			} else {
-			    statusline(FORM_LINK_SUBMIT_MESSAGE);
+			    if(user_mode == ADVANCED_MODE) {
+				char *submit_str = NULL;
+
+				StrAllocCopy(submit_str, FORM_LINK_SUBMIT_PREFIX);
+				StrAllocCat(submit_str, links[curdoc.link].form->submit_action);
+				statusline(submit_str);
+				FREE(submit_str);
+			    } else {
+				statusline(FORM_LINK_SUBMIT_MESSAGE);
+			    }
 			}
 			break;
 		    case F_RESET_TYPE:
@@ -1515,18 +1509,7 @@ try_again:
 			printf(
 			gettext("Fatal error - could not open output file %s\n"),cfile);
 		    if (!dump_output_immediately) {
-#ifndef NOSIGHUP
-			(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-			(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-			(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-			if (no_suspend)
-			    (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-			exit(-1);
+			exit_immediately(-1);
 		    }
 		    return(-1);
 		}
@@ -1642,18 +1625,7 @@ new_keyboard_input:
 			    (nhist <= 0 )) {
 			    if (!dump_output_immediately) {
 				cleanup();
-#ifndef NOSIGHUP
-				(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-				(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-				(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-				if (no_suspend)
-				    (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-				exit(-1);
+				exit_immediately(-1);
 			    }
 			    return(-1);
 			}
@@ -1681,18 +1653,7 @@ new_keyboard_input:
 			(nhist <= 0 )) {
 			if (!dump_output_immediately) {
 			    cleanup();
-#ifndef NOSIGHUP
-			    (void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-			    (void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-			    (void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-			    if (no_suspend)
-				(void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-			    exit(-1);
+			    exit_immediately(-1);
 			}
 			return(-1);
 		    }
@@ -2061,7 +2022,7 @@ new_cmd:  /*
 		historical_comments = TRUE;
 	    if (minimal_comments) {
 		HTAlert(historical_comments ?
-		        HISTORICAL_ON_MINIMAL_OFF : HISTORICAL_OFF_MINIMAL_ON);
+			HISTORICAL_ON_MINIMAL_OFF : HISTORICAL_OFF_MINIMAL_ON);
 	    } else {
 		HTAlert(historical_comments ?
 			HISTORICAL_ON_VALID_OFF : HISTORICAL_OFF_VALID_ON);
@@ -2097,7 +2058,7 @@ new_cmd:  /*
 			MINIMAL_ON_IN_EFFECT : MINIMAL_OFF_VALID_ON);
 	    } else {
 		HTAlert(minimal_comments ?
-		        MINIMAL_ON_BUT_HISTORICAL : MINIMAL_OFF_HISTORICAL_ON);
+			MINIMAL_ON_BUT_HISTORICAL : MINIMAL_OFF_HISTORICAL_ON);
 	    }
 	    break;
 
@@ -3848,7 +3809,7 @@ if (!LYUseFormsOptions) {
 		 */
 		HTuncache_current_document();
 	    }
-#endif /* !NO_OPTION_FORMS */ 
+#endif /* !NO_OPTION_FORMS */
 	    break;
 
 	case LYK_INDEX_SEARCH: /* search for a user string */
diff --git a/src/LYOptions.c b/src/LYOptions.c
index fb8bb8cc..073e38d6 100644
--- a/src/LYOptions.c
+++ b/src/LYOptions.c
@@ -87,16 +87,17 @@ PRIVATE int popup_choice PARAMS((
 
 #define L_KEYPAD	14
 #define L_LINEED	15
+#define L_LAYOUT	16
 
 #ifdef DIRED_SUPPORT
-#define L_DIRED		16
+#define L_DIRED		17
+#define L_USER_MODE	18
+#define L_USER_AGENT	19
+#define L_EXEC		20
+#else
 #define L_USER_MODE	17
 #define L_USER_AGENT	18
 #define L_EXEC		19
-#else
-#define L_USER_MODE	16
-#define L_USER_AGENT	17
-#define L_EXEC		18
 #endif /* DIRED_SUPPORT */
 
 #define L_VERBOSE_IMAGES L_USER_MODE
@@ -115,6 +116,7 @@ PRIVATE int popup_choice PARAMS((
 #define L_Color (use_assume_charset ? L_COLOR + 1 : L_COLOR)
 #define L_Keypad (use_assume_charset ? L_KEYPAD + 1 : L_KEYPAD)
 #define L_Lineed (use_assume_charset ? L_LINEED + 1 : L_LINEED)
+#define L_Layout (use_assume_charset ? L_LAYOUT + 1 : L_LAYOUT)
 #define L_Dired (use_assume_charset ? L_DIRED + 1 : L_DIRED)
 #define L_User_Mode (use_assume_charset ? L_USER_MODE + 1 : L_USER_MODE)
 #define L_User_Agent (use_assume_charset ? L_USER_AGENT + 1 : L_USER_AGENT)
@@ -394,6 +396,12 @@ draw_options:
     addlbl("li(N)e edit style            : ");
     addstr(LYLineeditNames[current_lineedit]);
 
+#ifdef EXP_KEYBOARD_LAYOUT
+    move(L_Layout, 5);
+    addlbl("Ke(Y)board layout            : ");
+    addstr(LYKbLayoutNames[current_layout]);
+#endif
+
 #ifdef DIRED_SUPPORT
     move(L_Dired, 5);
     addlbl("l(I)st directory style       : ");
@@ -1363,6 +1371,40 @@ draw_options:
 		}
 		break;
 
+#ifdef EXP_KEYBOARD_LAYOUT
+	    case 'y':	/* Change keyboard layout */
+	    case 'Y':
+		if (!LYSelectPopups) {
+		    current_layout = boolean_choice(current_layout,
+						      L_Layout, -1,
+						      LYKbLayoutNames);
+		} else {
+		    current_layout = popup_choice(current_layout,
+						    L_Layout, -1,
+						    LYKbLayoutNames,
+						    0, FALSE);
+#if defined(VMS) || defined(USE_SLANG)
+		    move(L_Layout, COL_OPTION_VALUES);
+		    clrtoeol();
+		    addstr(LYKbLayoutNames[current_layout]);
+#endif /* VMS || USE_SLANG */
+		}
+		response = ' ';
+		if (LYSelectPopups) {
+#if !defined(VMS) || defined(USE_SLANG)
+		    if (term_options) {
+			term_options = FALSE;
+		    } else {
+			AddValueAccepted = TRUE;
+		    }
+		    goto draw_options;
+#else
+		    term_options = FALSE;
+#endif /* !VMS || USE_SLANG */
+		}
+		break;
+#endif /* EXP_KEYBOARD_LAYOUT */
+
 #ifdef DIRED_SUPPORT
 	    case 'i':	/* Change local directory sorting. */
 	    case 'I':
@@ -3225,6 +3267,9 @@ static OptValues exec_links_values[]	= {
 	{ 0, 0, 0 }};
 #endif /* ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS */
 
+#ifdef EXP_KEYBOARD_LAYOUT
+static char * kblayout_string		= "kblayout";
+#endif
 static char * keypad_mode_string	= "keypad_mode";
 static OptValues keypad_mode_values[]	= {
 	{ NUMBERS_AS_ARROWS,  "Numbers act as arrows", "number_arrows" },
@@ -3233,6 +3278,7 @@ static OptValues keypad_mode_values[]	= {
 			      "Links and form fields are numbered",
 			      "links_and_forms" },
 	{ 0, 0, 0 }};
+static char * lineedit_style_string	= "lineedit_style";
 static char * mail_address_string	= "mail_address";
 static char * search_type_string	= "search_type";
 static OptValues search_type_values[] = {
@@ -3548,6 +3594,18 @@ PUBLIC int postoptions ARGS1(
 	    keypad_mode = GetOptValues(keypad_mode_values, data[i].value);
 	}
 
+	/* Line edit style: SELECT */
+	if (!strcmp(data[i].tag, lineedit_style_string)) {
+	    current_lineedit = atoi(data[i].value);
+	}
+
+#ifdef EXP_KEYBOARD_LAYOUT
+	/* Keyboard layout: SELECT */
+	if (!strcmp(data[i].tag, kblayout_string)) {
+	    current_layout = atoi(data[i].value);
+	}
+#endif /* EXP_KEYBOARD_LAYOUT */
+
 	/* Mail Address: INPUT */
 	if (!strcmp(data[i].tag, mail_address_string)) {
 	    FREE(personal_mail_address);
@@ -3889,6 +3947,28 @@ PUBLIC int gen_options ARGS1(
     PutOptValues(fp0, keypad_mode, keypad_mode_values);
     EndSelect(fp0);
 
+    /* Line edit style: SELECT */
+    PutLabel(fp0, "Line edit style");
+    BeginSelect(fp0, lineedit_style_string);
+    for (i = 0; LYLineeditNames[i]; i++) {
+	char temp[16];
+	sprintf(temp, "%d", i);
+	PutOption(fp0, i==current_lineedit, temp, LYLineeditNames[i]);
+    }
+    EndSelect(fp0);
+
+#ifdef EXP_KEYBOARD_LAYOUT
+    /* Keyboard layout: SELECT */
+    PutLabel(fp0, "Keyboard layout");
+    BeginSelect(fp0, kblayout_string);
+    for (i = 0; LYKbLayoutNames[i]; i++) {
+	char temp[16];
+	sprintf(temp, "%d", i);
+	PutOption(fp0, i==current_layout, temp, LYKbLayoutNames[i]);
+    }
+    EndSelect(fp0);
+#endif /* EXP_KEYBOARD_LAYOUT */
+
     /* Mail Address: INPUT */
     PutLabel(fp0, gettext("Personal mail address"));
     PutTextInput(fp0, mail_address_string,
diff --git a/src/LYPrint.c b/src/LYPrint.c
index b95a8ec8..1367d8f1 100644
--- a/src/LYPrint.c
+++ b/src/LYPrint.c
@@ -69,7 +69,7 @@ PUBLIC int printfile ARGS1(
     int lines_in_file = 0;
     int printer_number = 0;
     int pages = 0;
-    int type = 0, c;
+    int type = 0, c = 0;
     BOOLEAN Lpansi = FALSE;
     FILE *outfile_fp;
     char *cp = NULL;
@@ -418,7 +418,7 @@ PUBLIC int printfile ARGS1(
 #endif /* VMS */
 		    c = 0;
 		    while (TOUPPER(c)!='Y' && TOUPPER(c)!='N' &&
-			   c != 7 && c != 3)
+			   TOUPPER(c)!='A' && c != 7 && c != 3)
 			c = LYgetch();
 #ifdef VMS
 		    if (HadVMSInterrupt) {
@@ -439,7 +439,15 @@ PUBLIC int printfile ARGS1(
 		    }
 		}
 
-		if ((outfile_fp = LYNewTxtFile(buffer)) == NULL) {
+		/*
+		 *  See if we can write to it.
+		 */
+		CTRACE(tfp, "LYPrint: filename is %s, action is `%c'\n", buffer, c);
+
+		if ((outfile_fp = (TOUPPER(c) == 'A'
+			? LYAppendToTxtFile(buffer)
+			: LYNewTxtFile(buffer))) == NULL) {
+		    CTRACE(tfp, "LYPrint: error is %s\n", strerror(errno));
 		    HTAlert(CANNOT_WRITE_TO_FILE);
 		    _statusline(NEW_FILENAME_PROMPT);
 		    FirstRecall = TRUE;
diff --git a/src/LYReadCFG.c b/src/LYReadCFG.c
index 6522879c..d5a9ac6f 100644
--- a/src/LYReadCFG.c
+++ b/src/LYReadCFG.c
@@ -379,19 +379,7 @@ The special strings 'nocolor' or 'default', or\n")
 		Color_Strings[i + 2], Color_Strings[i + 3]);
     }
     fprintf (stderr, "%s\n%s\n", gettext("Offending line:"), error_line);
-
-#ifndef NOSIGHUP
-    (void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-    (void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-    (void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-    if (no_suspend)
-	(void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-    exit(-1);
+    exit_immediately(-1);
 }
 
 /*
@@ -624,6 +612,16 @@ static int jumpfile_fun ARGS1(
     return 0;
 }
 
+#ifdef EXP_KEYBOARD_LAYOUT
+static int keyboard_layout_fun ARGS1(
+	char *, 	key)
+{
+    if (!LYSetKbLayout(key))
+	CTRACE(tfp, "Failed to set keyboard layout %s\n", key);
+    return 0;
+}
+#endif /* EXP_KEYBOARD_LAYOUT */
+
 static int keymap_fun ARGS1(
 	char *, 	key)
 {
@@ -862,6 +860,9 @@ static Config_Type Config_Table [] =
      PARSE_STR("jump_prompt", CONF_STR, jumpprompt),
      PARSE_SET("jumpbuffer", CONF_BOOL, jump_buffer),
      PARSE_FUN("jumpfile", CONF_FUN, jumpfile_fun),
+#ifdef EXP_KEYBOARD_LAYOUT
+     PARSE_FUN("keyboard_layout", CONF_FUN, keyboard_layout_fun),
+#endif
      PARSE_FUN("keymap", CONF_FUN, keymap_fun),
      PARSE_SET("list_news_numbers", CONF_BOOL, LYListNewsNumbers),
      PARSE_SET("list_news_dates", CONF_BOOL, LYListNewsDates),
diff --git a/src/LYStrings.c b/src/LYStrings.c
index 80307411..b8421f43 100644
--- a/src/LYStrings.c
+++ b/src/LYStrings.c
@@ -21,6 +21,7 @@
 
 #include <LYLeaks.h>
 
+extern unsigned short *LYKbLayout;
 extern BOOL HTPassHighCtrlRaw;
 extern HTCJKlang HTCJK;
 
@@ -576,7 +577,7 @@ PRIVATE int map_string_to_keysym ARGS2(char*, str, int*,keysym)
 
 /*
  * Starting at a nonblank character, skip over a token, counting quoted and
- * escaped characters. 
+ * escaped characters.
  */
 PRIVATE char *skip_keysym ARGS1(char *, parse)
 {
@@ -876,18 +877,7 @@ re_read:
 #endif /* USE_GETCHAR */
 
 	cleanup();
-#ifndef NOSIGHUP
-	(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-	(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-	(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-	if (no_suspend)
-	  (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-	exit(0);
+	exit_immediately(0);
     }
 #endif /* USE_SLANG */
 
@@ -1411,10 +1401,13 @@ PUBLIC int LYEdit1 ARGS4(
 	int,		action,
 	BOOL,		maxMessage)
 {   /* returns 0    character processed
-     *	       ch   otherwise
+     *         ch   otherwise
      */
     int i;
     int length;
+#ifdef EXP_KEYBOARD_LAYOUT
+    static int map_active = 0;
+#endif
 
     if (MaxLen <= 0)
 	return(0); /* Be defensive */
@@ -1423,6 +1416,14 @@ PUBLIC int LYEdit1 ARGS4(
     StrLen = length;
 
     switch (action) {
+#ifdef EXP_KEYBOARD_LAYOUT
+    case LYE_SWMAP:
+	/*
+	 *  Turn input character mapping on or off.
+	 */
+	map_active = ~map_active;
+	break;
+#endif
     case LYE_AIX:
 	/*
 	 *  Hex 97.
@@ -1433,6 +1434,11 @@ PUBLIC int LYEdit1 ARGS4(
 	 if (HTCJK == NOCJK && LYlowest_eightbit[current_char_set] > 0x97)
 	     return(ch);
     case LYE_CHAR:
+#ifdef EXP_KEYBOARD_LAYOUT
+	if (map_active && ch < 128 && LYKbLayouts[current_layout][ch])
+	    ch = UCTransUniChar((long) LYKbLayouts[current_layout][ch],
+		current_char_set);
+#endif
 	/*
 	 *  ch is printable or ISO-8859-1 escape character.
 	 */
@@ -1514,14 +1520,28 @@ PUBLIC int LYEdit1 ARGS4(
 	}
 	break;
 
+    case LYE_DELEL:
+	/*
+	 *  Delete from current cursor position thru EOL.
+	 */
+	{
+	    int pos0 = Pos;
+	    LYEdit1(edit, 0, LYE_EOL, FALSE);
+	    pos0 = Pos - pos0;
+	    while (pos0--)
+		LYEdit1(edit, 0, LYE_DELP, FALSE);
+	}
+	break;
+
     case LYE_DELN:
 	/*
-	 *  Delete next character
+	 *  Delete next character (I-beam style cursor), or current
+	 *  character (box/underline style cursor).
 	 */
 	if (Pos >= length)
 	    break;
 	Pos++;
-	/* fall through */
+	/* fall through - DO NOT RELOCATE the LYE_DELN case wrt LYE_DELP */
 
     case LYE_DELP:
 	/*
@@ -1536,18 +1556,6 @@ PUBLIC int LYEdit1 ARGS4(
 	Buf[i] = 0;
 	break;
 
-    case LYE_DELC:
-	/*
-	 *  Delete current character.
-	 */
-	if (length == 0 || Pos == length)
-	    break;
-	for (i = Pos; i < length; i++)
-	    Buf[i] = Buf[i+1];
-	i--;
-	Buf[i] = 0;
-	break;
-
     case LYE_FORW:
 	/*
 	 *  Move cursor to the right.
@@ -1600,11 +1608,11 @@ PUBLIC void LYRefreshEdit ARGS1(
     edit->strlen = length;
 /*
  *  Now we have:
- *		  .--DspWdth---.
- *	+---------+=============+-----------+
- *	|	  |M	       M|	    |	(M=margin)
- *	+---------+=============+-----------+
- *	0	  DspStart		     length
+ *                .--DspWdth---.
+ *      +---------+=============+-----------+
+ *      |         |M           M|           |   (M=margin)
+ *      +---------+=============+-----------+
+ *      0         DspStart                   length
  *
  *  Insertion point can be anywhere between 0 and stringlength.
  *  Figure out new display starting point.
@@ -1872,7 +1880,7 @@ PUBLIC char * LYno_attr_char_case_strstr ARGS2(
  *			       LY_UNDERLINE_END_CHAR
  *			       LY_BOLD_START_CHAR
  *			       LY_BOLD_END_CHAR
- *				LY_SOFT_HYPHEN
+ *			       LY_SOFT_HYPHEN
  *			       if present in chptr.
  *  It is a case sensitive search.
  */
diff --git a/src/LYStrings.h b/src/LYStrings.h
index 224f6985..22e7de00 100644
--- a/src/LYStrings.h
+++ b/src/LYStrings.h
@@ -122,9 +122,9 @@ typedef struct _EditFieldData {
 #define LYE_TAB   (LYE_ENTER +1)  /* Input complete, return TAB  */
 #define LYE_ABORT (LYE_TAB   +1)  /* Input cancelled       */
 
-#define LYE_DELN  (LYE_ABORT +1)  /* Delete next    char   */
-#define LYE_DELC  (LYE_DELN  +1)  /* Delete current char   */
-#define LYE_DELP  (LYE_DELC  +1)  /* Delete prev    char   */
+#define LYE_DELN  (LYE_ABORT +1)  /* Delete next/curr char */
+#define LYE_DELC  (LYE_DELN)      /* Obsolete (DELC case was equiv to DELN) */
+#define LYE_DELP  (LYE_DELN  +1)  /* Delete prev      char */
 #define LYE_DELNW (LYE_DELP  +1)  /* Delete next word      */
 #define LYE_DELPW (LYE_DELNW +1)  /* Delete prev word      */
 
@@ -142,7 +142,11 @@ typedef struct _EditFieldData {
 
 #define LYE_LKCMD (LYE_UPPER +1)  /* Invoke command prompt */
 
-#define LYE_AIX   (LYE_LKCMD +1)  /* Hex 97		   */
+#define LYE_AIX   (LYE_LKCMD +1)  /* Hex 97                */
+
+#define LYE_DELEL (LYE_AIX   +1)  /* Delete thru EOL       */
+
+#define LYE_SWMAP (LYE_DELEL +1)  /* Switch input keymap   */
 
 #if defined(USE_KEYMAPS)
 extern int lynx_initialize_keymaps NOPARAMS;
diff --git a/src/LYStyle.c b/src/LYStyle.c
index 6628c235..053ff53e 100644
--- a/src/LYStyle.c
+++ b/src/LYStyle.c
@@ -1,6 +1,6 @@
 /* character level styles for Lynx
  * (c) 1996 Rob Partington -- donated to the Lyncei (if they want it :-)
- * @Id: LYStyle.c 1.20 Tue, 10 Nov 1998 12:47:38 -0700 dickey @
+ * @Id: LYStyle.c 1.21 Wed, 18 Nov 1998 12:23:55 -0700 dickey @
  */
 #include <HTUtils.h>
 #include <HTML.h>
@@ -126,18 +126,7 @@ The line must be of the form:\n\
 OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n\
 where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n\n"), buffer);
 	if (!dump_output_immediately) {
-#ifndef NOSIGHUP
-	    (void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-	    (void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-	    (void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-	    if (no_suspend)
-		(void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-	    exit(-1);
+	    exit_immediately(-1);
 	}
 	exit(1);
     }
diff --git a/src/LYTraversal.c b/src/LYTraversal.c
index 9e733aaf..d358cecc 100644
--- a/src/LYTraversal.c
+++ b/src/LYTraversal.c
@@ -17,18 +17,7 @@ PUBLIC BOOLEAN lookup ARGS1(char *,target)
     if ((ifp = fopen(TRAVERSE_FILE,"r")) == NULL) {
         if ((ifp = LYNewTxtFile(TRAVERSE_FILE)) == NULL) {
             perror(CANNOT_OPEN_TRAV_FILE);
-#ifndef NOSIGHUP
-	    (void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-	    (void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-	    (void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-	    if (no_suspend)
-	        (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-            exit(-1);
+	    exit_immediately(-1);
 	} else {
             fclose(ifp);
             return(FALSE);
@@ -55,18 +44,7 @@ PUBLIC void add_to_table ARGS1(char *,target)
 
     if ((ifp = LYAppendToTxtFile(TRAVERSE_FILE)) == NULL) {
 	perror(CANNOT_OPEN_TRAV_FILE);
-#ifndef NOSIGHUP
-	(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-	(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-	(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-	if (no_suspend)
-	    (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-	exit(-1);
+	exit_immediately(-1);
     }
 
     fprintf(ifp,"%s\n",target);
@@ -81,18 +59,7 @@ PUBLIC void add_to_traverse_list ARGS2(char *,fname, char *,prev_link_name)
 
     if ((ifp = LYAppendToTxtFile(TRAVERSE_FOUND_FILE)) == NULL) {
 	perror(CANNOT_OPEN_TRAF_FILE);
-#ifndef NOSIGHUP
-	(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-	(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-	(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-	if (no_suspend)
-	    (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-	exit(-1);
+	exit_immediately(-1);
     }
 
     fprintf(ifp,"%s\t%s\n",fname, prev_link_name);
@@ -131,18 +98,7 @@ PUBLIC void add_to_reject_list ARGS1(char *,target)
 
     if ((ifp = LYAppendToTxtFile(TRAVERSE_REJECT_FILE)) == NULL) {
 	perror(CANNOT_OPEN_REJ_FILE);
-#ifndef NOSIGHUP
-	(void) signal(SIGHUP, SIG_DFL);
-#endif /* NOSIGHUP */
-	(void) signal(SIGTERM, SIG_DFL);
-#ifndef VMS
-	(void) signal(SIGINT, SIG_DFL);
-#endif /* !VMS */
-#ifdef SIGTSTP
-	if (no_suspend)
-	    (void) signal(SIGTSTP,SIG_DFL);
-#endif /* SIGTSTP */
-	exit(-1);
+	exit_immediately(-1);
     }
 
     fprintf(ifp,"%s\n",target);
diff --git a/src/LYrcFile.c b/src/LYrcFile.c
index 63269ac6..d2613946 100644
--- a/src/LYrcFile.c
+++ b/src/LYrcFile.c
@@ -7,6 +7,7 @@
 #include <LYCharSets.h>
 #include <LYBookmark.h>
 #include <LYCookie.h>
+#include <LYKeymap.h>
 
 #include <LYLeaks.h>
 
@@ -190,7 +191,7 @@ PUBLIC void read_rc NOPARAMS
 	    }
 
 	/*
-	 * FTP/file sorting method.
+	 *  FTP/file sorting method.
 	 */
 	} else if ((cp = LYstrstr(line_buffer,
 				  "file_sorting_method")) != NULL &&
@@ -278,7 +279,7 @@ PUBLIC void read_rc NOPARAMS
 	    StrAllocCopy(pref_charset, cp);
 
 	/*
-	 * VI keys.
+	 *  VI keys.
 	 */
 	} else if ((cp = LYstrstr(line_buffer, "vi_keys")) != NULL &&
 		   cp-line_buffer < number_sign) {
@@ -387,7 +388,27 @@ PUBLIC void read_rc NOPARAMS
 		keypad_mode = NUMBERS_AS_ARROWS;
 
 	/*
-	 *  Linedit mode.
+	 *  Keyboard layout.
+	 */
+#ifdef EXP_KEYBOARD_LAYOUT
+	} else if ((cp = LYstrstr(line_buffer, "kblayout")) != NULL &&
+		   cp-line_buffer < number_sign) {
+
+	    int i = 0;
+
+	    if ((cp2 = (char *)strchr(cp, '=')) != NULL)
+		cp = cp2 + 1;
+	    cp = LYSkipBlanks(cp);
+	    for (; LYKbLayoutNames[i]; i++) {
+		if (!strcmp(cp, LYKbLayoutNames[i])) {
+		    current_layout = i;
+		    break;
+		}
+	    }
+#endif /* EXP_KEYBOARD_LAYOUT */
+
+	/*
+	 *  Line edit mode.
 	 */
 	} else if ((cp = LYstrstr(line_buffer, "lineedit_mode")) != NULL &&
 		   cp-line_buffer < number_sign) {
@@ -406,7 +427,7 @@ PUBLIC void read_rc NOPARAMS
 
 #ifdef DIRED_SUPPORT
 	/*
-	 *  List directory style.
+	 *  Directory list style.
 	 */
 	} else if ((cp = LYstrstr(line_buffer, "dir_list_style")) != NULL &&
 		   cp-line_buffer < number_sign) {
@@ -440,7 +461,7 @@ PUBLIC void read_rc NOPARAMS
 
 
 	/*
-	 * Accept all cookies from certain domains?
+	 *  Accept all cookies from certain domains?
 	 */
 	} else if ((cp = LYstrstr(line_buffer, "cookie_accept_domains"))
 		!= NULL && cp-line_buffer < number_sign) {
@@ -452,7 +473,7 @@ PUBLIC void read_rc NOPARAMS
 
 
 	/*
-	 * Reject all cookies from certain domains?
+	 *  Reject all cookies from certain domains?
 	 */
 	} else if ((cp = LYstrstr(line_buffer, "cookie_reject_domains"))
 		!= NULL && cp-line_buffer < number_sign) {
@@ -464,7 +485,7 @@ PUBLIC void read_rc NOPARAMS
 
 #ifdef EXP_PERSISTENT_COOKIES
 	/*
-	 * File to store cookies in.
+	 *  File to store cookies in.
 	 */
 	} else if ((cp = LYstrstr(line_buffer, "cookie_file"))
 		!= NULL && cp-line_buffer < number_sign) {
@@ -511,8 +532,8 @@ PUBLIC void read_rc NOPARAMS
 
 #ifdef DISP_PARTIAL
 	/*
-	 * Partial display logic--set the threshold # of lines before
-	 * Lynx redraws the screen
+	 *  Partial display logic--set the threshold # of lines before
+	 *  Lynx redraws the screen
 	 */
 	} else if ((cp = LYstrstr(line_buffer, "partial_thres")) != NULL &&
 		   cp-line_buffer < number_sign) {
@@ -852,7 +873,7 @@ PUBLIC int save_rc NOPARAMS
 
 #ifdef DISP_PARTIAL
     /*
-     * Partial display threshold
+     *  Partial display threshold
      */
     fprintf(fp, gettext("\
 # partial_thres specifies the number of lines Lynx should download and render\n\
@@ -864,7 +885,7 @@ PUBLIC int save_rc NOPARAMS
 #endif /* DISP_PARTIAL */
 
     /*
-     *  Lineedit mode.
+     *  Line edit mode.
      */
     fprintf(fp, gettext("\
 # lineedit_mode specifies the key binding used for inputting strings in\n\
@@ -886,10 +907,13 @@ PUBLIC int save_rc NOPARAMS
 	}
     }
     fprintf(fp, "lineedit_mode=%s\n\n", LYLineeditNames[current_lineedit]);
+#ifdef EXP_KEYBOARD_LAYOUT
+    fprintf(fp, "kblayout=%s\n\n", LYKbLayoutNames[current_layout]);
+#endif
 
 #ifdef DIRED_SUPPORT
     /*
-     *  List directory style.
+     *  Directory list style.
      */
     fprintf(fp, gettext("\
 # dir_list_styles specifies the directory list style under DIRED_SUPPORT\n\
@@ -919,7 +943,7 @@ PUBLIC int save_rc NOPARAMS
 					  "ADVANCED" : "INTERMEDIATE")));
 
     /*
-     * Cookie options
+     *  Cookie options
      */
     fprintf(fp, gettext("\
 # accept_all_cookies allows the user to tell Lynx to automatically\n\
@@ -940,14 +964,14 @@ PUBLIC int save_rc NOPARAMS
     fprintf(fp, "# cookie_reject_domains=\n\n");
 
     /*
-     * cookie_accept_domains and cookie_reject_domains not set here because
-     * there's not currently a method on the options menu (maybe later?)
-     * to set them.
+     *  cookie_accept_domains and cookie_reject_domains not set here because
+     *  there's not currently a method on the options menu (maybe later?)
+     *  to set them.
      */
 
 #ifdef EXP_PERSISTENT_COOKIES
     /*
-     * Cookie file.
+     *  Cookie file.
      */
     fprintf(fp, gettext("\
 # cookie_file specifies the file in which to store persistent cookies.\n\
diff --git a/src/Makefile.old b/src/Makefile.old
index 49e6ea04..9ca8a343 100644
--- a/src/Makefile.old
+++ b/src/Makefile.old
@@ -45,11 +45,12 @@ LYReadCFG.o: ../userdefs.h
 HTFWriter.o: ../userdefs.h
 LYGetFile.o: ../userdefs.h
 LYOptions.o: ../userdefs.h
-LYReadCFG.o: ../userdefs.h
 LYrcFile.o: ../userdefs.h
 LYMail.o: ../userdefs.h
 LYUtils.o: ../userdefs.h
 HTInit.o: ../userdefs.h
+LYKeymap.o: ../userdefs.h
+LYShowInfo.o: ../userdefs.h
 LYTraversal.o: ../userdefs.h
 LYMail.o: ../userdefs.h
 LYCharSets.o: ../userdefs.h
diff --git a/src/UCAuto.c b/src/UCAuto.c
index a3584ecb..bac25ab3 100644
--- a/src/UCAuto.c
+++ b/src/UCAuto.c
@@ -330,7 +330,16 @@ PUBLIC void UCChangeTerminalCodepage ARGS2(
 	int,		newcs,
 	LYUCcharset *,	p)
 {
+#ifdef __EMX__
+    int res = 0;
+
+    if (p->codepage) {
+	res = VioSetCp(0, p->codepage, 0);
+	CTRACE(tfp, "UCChangeTerminalCodepage: VioSetCp(%d) returned %d\n", p->codepage, res);
+    }
+#else
     CTRACE(tfp, "UCChangeTerminalCodepage: Called, but not implemented!");
+#endif
 }
 #endif /* LINUX */
 
diff --git a/src/UCAux.c b/src/UCAux.c
index 6847b150..d10df1e8 100644
--- a/src/UCAux.c
+++ b/src/UCAux.c
@@ -150,6 +150,9 @@ PUBLIC void UCSetTransParams ARGS5(
     int,		cs_out,
     CONST LYUCcharset*,	p_out)
 {
+    CTRACE(tfp, "UCSetTransParams: from %s(%d) to %s(%d)\n",
+	   p_in->MIMEname, p_in->UChndl, p_out->MIMEname, p_out->UChndl);
+
     /*
     **  Initialize this element to FALSE, and set it TRUE
     **  below if we're dealing with VISCII. - FM
diff --git a/src/UCdomap.c b/src/UCdomap.c
index 4a579f34..49599e74 100644
--- a/src/UCdomap.c
+++ b/src/UCdomap.c
@@ -1901,6 +1901,7 @@ PRIVATE int UC_Register_with_LYCharSets ARGS4(
      */
     LYCharSet_UC[LYhndl].MIMEname = UC_MIMEcharset;
     LYCharSet_UC[LYhndl].enc = UCInfo[s].enc;
+    LYCharSet_UC[LYhndl].codepage = UCInfo[s].codepage;
 
     /*
      *	@@@ We really SHOULD get more info from the table files,
@@ -1930,7 +1931,7 @@ PRIVATE int UC_Register_with_LYCharSets ARGS4(
  *  This only sets up the structure - no initialization of the tables
  * is done here yet.
  */
-PUBLIC void UC_Charset_Setup ARGS8(
+PUBLIC void UC_Charset_Setup ARGS9(
 	CONST char *,		UC_MIMEcharset,
 	CONST char *,		UC_LYNXcharset,
 	u8 *,			unicount,
@@ -1938,7 +1939,8 @@ PUBLIC void UC_Charset_Setup ARGS8(
 	int,			nnuni,
 	struct unimapdesc_str,	replacedesc,
 	int,			lowest_eight,
-	int,			UC_rawuni)
+	int,			UC_rawuni,
+	int,			codepage)
 {
     int s, Gn;
     int i, status = 0, found;
@@ -1979,6 +1981,7 @@ PUBLIC void UC_Charset_Setup ARGS8(
 	lowest_eight = 128;  /* cheat here */
     UCInfo[s].lowest_eight = lowest_eight;
     UCInfo[s].enc = UC_rawuni;
+    UCInfo[s].codepage = codepage;
     UCInfo[s].LYhndl = UC_Register_with_LYCharSets(s,
 						   UC_MIMEcharset,
 						   UC_LYNXcharset,
diff --git a/src/UCdomap.h b/src/UCdomap.h
index e0160953..6805b712 100644
--- a/src/UCdomap.h
+++ b/src/UCdomap.h
@@ -29,7 +29,8 @@ extern void UC_Charset_Setup PARAMS((
 	int			nnuni,
 	struct unimapdesc_str	replacedesc,
 	int			lowest_eight,
-	int			UC_rawuni));
+	int			UC_rawuni,
+	int			codepage));
 
 CONST char *UC_GNsetMIMEnames[4] =
 	{"iso-8859-1", "x-dec-graphics", "cp437", "x-transparent"};
@@ -48,6 +49,7 @@ struct UC_charset {
 	int GN;
 	int lowest_eight;
 	int enc;
+	int codepage;	/* codepage number, used by OS/2 font-switching code */
 };
 
 extern int UCNumCharsets;
diff --git a/src/chrtrans/cp1250_uni.tbl b/src/chrtrans/cp1250_uni.tbl
index 49ba9008..7b3820d0 100644
--- a/src/chrtrans/cp1250_uni.tbl
+++ b/src/chrtrans/cp1250_uni.tbl
@@ -4,6 +4,9 @@ Mwindows-1250
 #Name as a Display Charset (used on Options screen)
 OEastern European (windows-1250)
 
+#Codepage number
+C1250
+
 #
 #    Name:     cp1250 to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp1251_uni.tbl b/src/chrtrans/cp1251_uni.tbl
index 541f8640..21cfb598 100644
--- a/src/chrtrans/cp1251_uni.tbl
+++ b/src/chrtrans/cp1251_uni.tbl
@@ -4,6 +4,9 @@ Mwindows-1251
 #Name as a Display Charset (used on Options screen)
 OCyrillic (windows-1251)
 
+#Codepage number
+C1251
+
 #
 #    Name:     cp1251 to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp1252_uni.tbl b/src/chrtrans/cp1252_uni.tbl
index 09ee9b6a..0dd82ef8 100644
--- a/src/chrtrans/cp1252_uni.tbl
+++ b/src/chrtrans/cp1252_uni.tbl
@@ -8,6 +8,9 @@ Mwindows-1252
 #Name as a Display Charset (used on Options screen)
 OWestern (windows-1252)
 
+#Codepage number 
+C1252 
+
 #
 #    Name:     cp1252 to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp1253_uni.tbl b/src/chrtrans/cp1253_uni.tbl
index b53e44a2..3340d719 100644
--- a/src/chrtrans/cp1253_uni.tbl
+++ b/src/chrtrans/cp1253_uni.tbl
@@ -4,6 +4,9 @@ Mwindows-1253
 #Name as a Display Charset (used on Options screen)
 OGreek (windows-1253)
 
+#Codepage number
+C1253
+
 #
 #    Name:     cp1253 to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp1255_uni.tbl b/src/chrtrans/cp1255_uni.tbl
index 6c4ca7d0..1c38f40a 100644
--- a/src/chrtrans/cp1255_uni.tbl
+++ b/src/chrtrans/cp1255_uni.tbl
@@ -4,6 +4,9 @@ Mwindows-1255
 #Name as a Display Charset (used on Options screen).
 OHebrew (windows-1255)
 
+#Codepage number
+C1255
+
 #
 #    Name:     cp1255 to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp1256_uni.tbl b/src/chrtrans/cp1256_uni.tbl
index 23af4614..b38c412d 100644
--- a/src/chrtrans/cp1256_uni.tbl
+++ b/src/chrtrans/cp1256_uni.tbl
@@ -4,6 +4,9 @@ Mwindows-1256
 #Name as a Display Charset (used on Options screen).
 OArabic (windows-1256)
 
+#Codepage number
+C1256
+
 #
 #    Name:     cp1256 to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp1257_uni.tbl b/src/chrtrans/cp1257_uni.tbl
index 4c1e70e6..d42d6731 100644
--- a/src/chrtrans/cp1257_uni.tbl
+++ b/src/chrtrans/cp1257_uni.tbl
@@ -4,6 +4,9 @@ Mwindows-1257
 #Name as a Display Charset (used on Options screen)
 OBaltic Rim (windows-1257)
 
+#Codepage number
+C1257
+
 #
 #    Name:     cp1257 to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp437_uni.tbl b/src/chrtrans/cp437_uni.tbl
index b84f503f..aa02cee3 100644
--- a/src/chrtrans/cp437_uni.tbl
+++ b/src/chrtrans/cp437_uni.tbl
@@ -8,6 +8,9 @@ Mcp437
 #Name as a Display Charset (used on Options screen)
 OIBM PC US codepage (cp437)
 
+#Codepage number
+C437
+
 #
 #    Name:     cp437_DOSLatinUS to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp737_uni.tbl b/src/chrtrans/cp737_uni.tbl
index 81442ccc..80e33531 100644
--- a/src/chrtrans/cp737_uni.tbl
+++ b/src/chrtrans/cp737_uni.tbl
@@ -4,6 +4,9 @@ Mcp737
 #Name as a Display Charset (used on Options screen)
 OGreek (cp737)
 
+#Codepage number
+C737
+
 #
 #    Name:     cp737_DOSGreek to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp775_uni.tbl b/src/chrtrans/cp775_uni.tbl
index 4d63208b..5b0e0149 100644
--- a/src/chrtrans/cp775_uni.tbl
+++ b/src/chrtrans/cp775_uni.tbl
@@ -4,6 +4,9 @@ Mcp775
 #Name as a Display Charset (used on Options screen)
 OBaltic Rim (cp775)
 
+#Codepage number
+C775
+
 #    Name:     cp775_DOSBaltRim to Unicode table
 #    Unicode version: 2.0
 #    Table version: 2.00
diff --git a/src/chrtrans/cp850_uni.tbl b/src/chrtrans/cp850_uni.tbl
index af4dbff5..bc44cde8 100644
--- a/src/chrtrans/cp850_uni.tbl
+++ b/src/chrtrans/cp850_uni.tbl
@@ -10,6 +10,9 @@ Mcp850
 #Name as a Display Charset (used on Options screen)
 OWestern (cp850)
 
+#Codepage number
+C850
+
 #
 #    Name:     cp850_DOSLatin1 to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp852_uni.tbl b/src/chrtrans/cp852_uni.tbl
index 946b4996..fec2ecf4 100644
--- a/src/chrtrans/cp852_uni.tbl
+++ b/src/chrtrans/cp852_uni.tbl
@@ -4,6 +4,9 @@ Mcp852
 #Name as a Display Charset (used on Options screen)
 OEastern European (cp852)
 
+#Codepage number
+C852
+
 #
 #    Name:     cp852_DOSLatin2 to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp862_uni.tbl b/src/chrtrans/cp862_uni.tbl
index 60d9692e..3dfa09e5 100644
--- a/src/chrtrans/cp862_uni.tbl
+++ b/src/chrtrans/cp862_uni.tbl
@@ -4,6 +4,9 @@ Mcp862
 #Name as a Display Charset (used on Options screen).
 OHebrew (cp862)
 
+#Codepage number
+C862
+
 #    Name:     cp862_DOSHebrew to Unicode table
 #    Unicode version: 2.0
 #    Table version: 2.00
diff --git a/src/chrtrans/cp864_uni.tbl b/src/chrtrans/cp864_uni.tbl
index 8411f8b7..e5ec56d3 100644
--- a/src/chrtrans/cp864_uni.tbl
+++ b/src/chrtrans/cp864_uni.tbl
@@ -4,6 +4,9 @@ Mcp864
 #Name as a Display Charset (used on Options screen).
 OArabic (cp864)
 
+#Codepage number
+C864
+
 #    Name:     cp864_DOSArabic to Unicode table
 #    Unicode version: 2.0
 #    Table version: 2.00
diff --git a/src/chrtrans/cp866_uni.tbl b/src/chrtrans/cp866_uni.tbl
index 55ce0718..87ebbfcc 100644
--- a/src/chrtrans/cp866_uni.tbl
+++ b/src/chrtrans/cp866_uni.tbl
@@ -4,6 +4,10 @@ Mcp866
 
 #Name as a Display Charset (used on Options screen)
 OCyrillic (cp866)
+ 
+#Codepage number
+C866
+
 #
 #    Name:     cp866_DOSCyrillicRussian to Unicode table
 #    Unicode version: 2.0
diff --git a/src/chrtrans/cp869_uni.tbl b/src/chrtrans/cp869_uni.tbl
index 1f418728..2e75ae39 100644
--- a/src/chrtrans/cp869_uni.tbl
+++ b/src/chrtrans/cp869_uni.tbl
@@ -4,6 +4,9 @@ Mcp869
 #Name as a Display Charset (used on Options screen)
 OGreek2 (cp869)
 
+#Codepage number
+C869
+
 #    Name:     cp869_DOSGreek2 to Unicode table
 #    Unicode version: 2.0
 #    Table version: 2.00
diff --git a/src/chrtrans/iso01_uni.tbl b/src/chrtrans/iso01_uni.tbl
index 5b697e02..a00be71d 100644
--- a/src/chrtrans/iso01_uni.tbl
+++ b/src/chrtrans/iso01_uni.tbl
@@ -10,6 +10,9 @@ Miso-8859-1
 #Name as a Display Charset (used on Options screen)
 OWestern (ISO-8859-1)
 
+#Codepage number
+C819
+
 #
 #	Name:             ISO 8859-1 (1987) to Unicode
 #	Unicode version:  1.1
diff --git a/src/chrtrans/iso02_uni.tbl b/src/chrtrans/iso02_uni.tbl
index 7fa0df92..383b4674 100644
--- a/src/chrtrans/iso02_uni.tbl
+++ b/src/chrtrans/iso02_uni.tbl
@@ -4,6 +4,9 @@ Miso-8859-2
 #Name as a Display Charset (used on Options screen)
 OEastern European (ISO-8859-2)
 
+#Codepage number
+C912
+
 #
 #	Name:             ISO 8859-2 (1987) to Unicode
 #	Unicode version:  1.1
diff --git a/src/chrtrans/iso03_uni.tbl b/src/chrtrans/iso03_uni.tbl
index a3c1f07a..de91afa3 100644
--- a/src/chrtrans/iso03_uni.tbl
+++ b/src/chrtrans/iso03_uni.tbl
@@ -4,6 +4,9 @@ Miso-8859-3
 #Name as a Display Charset (used on Options screen)
 OLatin 3 (ISO-8859-3)
  
+#Codepage number
+C913
+
 #
 #	Name:             ISO 8859-3 (1988) to Unicode
 #	Unicode version:  1.1
diff --git a/src/chrtrans/iso04_uni.tbl b/src/chrtrans/iso04_uni.tbl
index 29be0be5..11383922 100644
--- a/src/chrtrans/iso04_uni.tbl
+++ b/src/chrtrans/iso04_uni.tbl
@@ -4,6 +4,9 @@ Miso-8859-4
 #Name as a Display Charset (used on Options screen)
 OLatin 4 (ISO-8859-4)
  
+#Codepage number
+C914
+
 #
 #	Name:             ISO 8859-4 (1988) to Unicode
 #	Unicode version:  1.1
diff --git a/src/chrtrans/iso05_uni.tbl b/src/chrtrans/iso05_uni.tbl
index a715b64f..a7ed8555 100644
--- a/src/chrtrans/iso05_uni.tbl
+++ b/src/chrtrans/iso05_uni.tbl
@@ -4,6 +4,9 @@ Miso-8859-5
 #Name as a Display Charset (used on Options screen)
 OCyrillic (ISO-8859-5)
 
+#Codepage number
+C915
+
 #
 #	Name:             ISO 8859-5 (1988) to Unicode
 #	Unicode version:  1.1
diff --git a/src/chrtrans/iso06_uni.tbl b/src/chrtrans/iso06_uni.tbl
index 549b592d..0e390018 100644
--- a/src/chrtrans/iso06_uni.tbl
+++ b/src/chrtrans/iso06_uni.tbl
@@ -4,6 +4,9 @@ Miso-8859-6
 #Name as a Display Charset (used on Options screen).
 OArabic (ISO-8859-6)
 
+#Codepage number
+C1089
+
 #
 #	Name:             ISO 8859-6 (1987) to Unicode
 #	Unicode version:  1.1
diff --git a/src/chrtrans/iso07_uni.tbl b/src/chrtrans/iso07_uni.tbl
index dffca758..f629e6bc 100644
--- a/src/chrtrans/iso07_uni.tbl
+++ b/src/chrtrans/iso07_uni.tbl
@@ -4,6 +4,9 @@ Miso-8859-7
 #Name as a Display Charset (used on Options screen)
 OGreek (ISO-8859-7)
  
+#Codepage number
+C813
+
 #
 #	Name:             ISO 8859-7 (1987) to Unicode
 #	Unicode version:  1.1
diff --git a/src/chrtrans/iso08_uni.tbl b/src/chrtrans/iso08_uni.tbl
index 050be29d..d8c9d848 100644
--- a/src/chrtrans/iso08_uni.tbl
+++ b/src/chrtrans/iso08_uni.tbl
@@ -4,6 +4,9 @@ Miso-8859-8
 #Name as a Display Charset (used on Options screen).
 OHebrew (ISO-8859-8)
 
+#Codepage number
+C916
+
 #
 #	Name:             ISO 8859-8 (1988) to Unicode
 #	Unicode version:  1.1
diff --git a/src/chrtrans/iso09_uni.tbl b/src/chrtrans/iso09_uni.tbl
index 5abe799f..f0e1f608 100644
--- a/src/chrtrans/iso09_uni.tbl
+++ b/src/chrtrans/iso09_uni.tbl
@@ -4,6 +4,9 @@ Miso-8859-9
 #Name as a Display Charset (used on Options screen)
 OTurkish (ISO-8859-9)
  
+#Codepage number
+C920
+
 #
 #	Name:             ISO 8859-9 (1989) to Unicode
 #	Unicode version:  1.1
diff --git a/src/chrtrans/jcuken_kb.h b/src/chrtrans/jcuken_kb.h
new file mode 100644
index 00000000..8fbe458b
--- /dev/null
+++ b/src/chrtrans/jcuken_kb.h
@@ -0,0 +1,21 @@
+static unsigned short kb_layout_jcuken[128] = { 
+0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 00..07 */ 
+0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 08..0F */ 
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 10..17 */ 
+0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 18..1F */ 
+ 
+0x0020, 0x0021, 0x042D, 0x002F, 0x0024, 0x003A, 0x002E, 0x044D, /* 20..27 */ 
+0x003F, 0x0025, 0x003B, 0x002B, 0x0431, 0x002D, 0x044E, 0x0451, /* 28..2F */ 
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 30..37 */ 
+0x0038, 0x0039, 0x0416, 0x0436, 0x0411, 0x003D, 0x042E, 0x0401, /* 38..3F */ 
+ 
+0x0022, 0x0424, 0x0418, 0x0421, 0x0412, 0x0423, 0x0410, 0x041F, /* 40..47 */ 
+0x0420, 0x0428, 0x041E, 0x041B, 0x0414, 0x042C, 0x0422, 0x0429, /* 48..4F */ 
+0x0417, 0x0419, 0x041A, 0x042B, 0x0415, 0x0413, 0x041C, 0x0426, /* 50..57 */ 
+0x0427, 0x041D, 0x042F, 0x0445, 0x005C, 0x044A, 0x002C, 0x005F, /* 58..5F */ 
+ 
+0x0029, 0x0444, 0x0438, 0x0441, 0x0432, 0x0443, 0x0430, 0x043F, /* 60..67 */ 
+0x0440, 0x0448, 0x043E, 0x043B, 0x0434, 0x044C, 0x0442, 0x0449, /* 68..6F */ 
+0x0437, 0x0439, 0x043A, 0x044B, 0x0435, 0x0433, 0x043C, 0x0446, /* 70..77 */ 
+0x0447, 0x043D, 0x044F, 0x0425, 0x007C, 0x042A, 0x0028, 0x007F  /* 78..7F */ 
+}; 
diff --git a/src/chrtrans/koi8r_uni.tbl b/src/chrtrans/koi8r_uni.tbl
index 69eef3c2..dfb61be0 100644
--- a/src/chrtrans/koi8r_uni.tbl
+++ b/src/chrtrans/koi8r_uni.tbl
@@ -4,6 +4,9 @@ OCyrillic (KOI8-R)
 # MIME name for this charset
 Mkoi8-r
 
+#Codepage number
+C878
+
 0x20-0x7f       idem
 # Based on a table received from "Glenn E. Thobe" <thobe@lafn.org>
 # (verified against RFC1489).
diff --git a/src/chrtrans/makefile.in b/src/chrtrans/makefile.in
index 31dd3bc0..8173b31e 100644
--- a/src/chrtrans/makefile.in
+++ b/src/chrtrans/makefile.in
@@ -19,7 +19,7 @@ top_builddir	= ../..
 LIBS		= @LIBS@ $(SITE_LIBS)
 LDFLAGS		= @LDFLAGS@
 
-INTLLIB		= @INTLDIR_MAKE@@INTLLIBS@ 
+INTLLIB		= @INTLDIR_MAKE@@INTLLIBS@
 
 WWWINC		= WWW/Library/Implementation
 SITE_DEFS	= # FIXME: set in parent makefile
@@ -102,7 +102,7 @@ makeuctb.o: $(srcdir)/UCkd.h $(srcdir)/makeuctb.c
 	@ECHO_CC@$(CPP) -C $(CPP_OPTS) $*.c >$@
 
 .tbl.h:
-	./makeuctb $(srcdir)/$*.tbl > $@
+	./makeuctb$x $(srcdir)/$*.tbl > $@
 
 # table files listed here once again to get the make dependencies
 # right, in case makeuctb was recompiled.
diff --git a/src/chrtrans/makeuctb.c b/src/chrtrans/makeuctb.c
index cc721723..b9d2c520 100644
--- a/src/chrtrans/makeuctb.c
+++ b/src/chrtrans/makeuctb.c
@@ -91,7 +91,7 @@ PRIVATE int getunicode ARGS1(
 
     while (*p == ' ' || *p == '\t')
 	p++;
-	
+
     if (*p == '-') {
 	return -2;
     } else if (*p != 'U' || p[1] != '+' ||
@@ -115,6 +115,8 @@ char *tblname;
 
 PRIVATE int RawOrEnc = 0;
 PRIVATE int Raw_found = 0;		/* whether explicit R directive found */
+PRIVATE int CodePage = 0;
+PRIVATE int CodePage_found = 0;		/* whether explicit C directive found */
 
 PRIVATE void addpair_str ARGS2(
 	char *,		str,
@@ -380,6 +382,24 @@ PUBLIC int main ARGS2(
 		}
 		this_LYNXcharset[i] = '\0';
 		continue;
+
+	    /*
+	     *  Codepage number.  Three or four digit code.
+	     */
+	    case 'C':
+		if (p[1] == 'o' || p[1] == 'O') {
+		    buffer[sizeof(buffer) - 1] = '\0';
+		    if (!strncasecomp(p, "CodePage", 8)) {
+			p += 8;
+		    }
+		}
+		p++;
+		while (*p == ' ' || *p == '\t') {
+	  	    p++;
+		}
+		CodePage = strtol(p,0,10);
+		CodePage_found = 1;
+		continue;
 	}
 
 	if (*p == 'U') {
@@ -456,7 +476,7 @@ PUBLIC int main ARGS2(
 		for (ch = *(++p); (ch = *p) != '\0'; p++, p1++) {
 		    if ((unsigned char)ch < 32 || ch == '\\' || ch == '\"' ||
 			(unsigned char)ch >= 127) {
-			sprintf(p1, "\\%.3o", (unsigned char)ch); 
+			sprintf(p1, "\\%.3o", (unsigned char)ch);
 #ifdef NOTDEFINED
 			fprintf(stderr, "%s\n", tbuf);
 #endif /* NOTDEFINED */
@@ -608,7 +628,7 @@ PUBLIC int main ARGS2(
      *  Okay, we hit EOF, now output tables.
      */
     fclose(ctbl);
-  
+
 
     /*
      *  Compute total size of Unicode list.
@@ -731,7 +751,7 @@ static struct unipair_str repl_map%s[%d] = \n\
 	printf("\n\
 /* static struct unipair_str repl_map%s[]; */\n", id_append);
     }
-    
+
     for (i = 0; i < themap_str.entry_ct; i++) {
 	printf("{0x%x,\"%s\"}",
 	       themap_str.entries[i].unicode,
@@ -761,9 +781,9 @@ static struct unimapdesc_str dfont_replacedesc%s = {0,NULL,",id_append);
     printf("#define UC_CHARSET_SETUP%s UC_Charset_Setup(\
 \"%s\",\\\n\"%s\",\\\n\
 dfont_unicount%s,dfont_unitable%s,%d,\\\n\
-dfont_replacedesc%s,%d,%d)\n",
+dfont_replacedesc%s,%d,%d,%d)\n",
 id_append, this_MIMEcharset, this_LYNXcharset,
-id_append, id_append, nuni, id_append, lowest_eight, RawOrEnc);
+id_append, id_append, nuni, id_append, lowest_eight, RawOrEnc, CodePage);
 
     done(EX_OK);
 }
diff --git a/src/chrtrans/rot13_kb.h b/src/chrtrans/rot13_kb.h
new file mode 100644
index 00000000..8bc1a9dc
--- /dev/null
+++ b/src/chrtrans/rot13_kb.h
@@ -0,0 +1,21 @@
+static unsigned short kb_layout_rot13[128] = { 
+0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 00..07 */ 
+0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 08..0F */ 
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 10..17 */ 
+0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 18..1F */ 
+ 
+0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 20..27 */ 
+0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 28..2F */ 
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 30..37 */ 
+0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 38..3F */ 
+ 
+0x0000, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, /* 40..48 */  
+0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0041, 0x0042, /* 40..4F */  
+0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, /* 50..58 */  
+0x004b, 0x004c, 0x004d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 50..5F */  
+ 
+0x0000, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, /* 60..68 */  
+0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0061, 0x0062, /* 60..6F */  
+0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, /* 70..78 */  
+0x006b, 0x006c, 0x006d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000  /* 70..7F */ 
+}; 
diff --git a/src/chrtrans/yawerty_kb.h b/src/chrtrans/yawerty_kb.h
new file mode 100644
index 00000000..2592b822
--- /dev/null
+++ b/src/chrtrans/yawerty_kb.h
@@ -0,0 +1,21 @@
+static unsigned short kb_layout_yawerty[128] = { 
+0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 00..07 */ 
+0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 08..0F */ 
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 10..17 */ 
+0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 18..1F */ 
+ 
+0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 20..27 */ 
+0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 28..2F */ 
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 30..37 */ 
+0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 38..3F */ 
+ 
+0x042e, 0x0410, 0x0412, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, /* 40..47 */ 
+0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 48..4F */ 
+0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, /* 50..57 */ 
+0x042c, 0x042b, 0x0417, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 58..5F */ 
+ 
+0x044e, 0x0430, 0x0432, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, /* 60..67 */ 
+0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 68..6F */ 
+0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, /* 70..77 */ 
+0x044c, 0x044b, 0x0437, 0x0428, 0x042d, 0x0429, 0x0427, 0x0000  /* 78..7F */ 
+};  
diff --git a/src/makefile.dos b/src/makefile.dos
index 283bcc27..24622277 100644
--- a/src/makefile.dos
+++ b/src/makefile.dos
@@ -40,28 +40,22 @@ lint:
 clean:

 	rm -f lynx.exe core *.[ob]

 

-LYMain.o: ../userdefs.h

-LYMainLoop.o: LYMainLoop.c ../userdefs.h

-LYReadCFG.o: LYReadCFG.c ../userdefs.h

-HTFWriter.o: HTFWriter.c ../userdefs.h

-LYGetFile.o: LYGetFile.c ../userdefs.h

-LYOptions.o: LYOptions.c ../userdefs.h

-LYReadCFG.o: LYReadCFG.c ../userdefs.h

-LYTraversal.o: LYTraversal.c ../userdefs.h

-LYCharSets.o: LYCharSets.c ../userdefs.h

-LYShowInfo.o: LYShowInfo.c ../userdefs.h

-LYStrings.o: LYStrings.c ../userdefs.h

-LYBookmark.o: LYBookmark.c ../userdefs.h

-LYHistory.o: LYHistory.c ../userdefs.h

-LYDownload.o: LYDownload.c ../userdefs.h

-DefaultStyle.o: DefaultStyle.c ../userdefs.h

-LYEditmap.o: LYEditmap.c ../userdefs.h

-LYCharUtils.o: LYCharUtils.c ../userdefs.h

-LYExtern.o: LYExtern.c ../userdefs.h

-LYCookie.o: ../userdefs.h

-

-#UCdomap.o: UCdomap.c ../userdefs.h lycharsets.h

-#UCdomap.o: UCdomap.c chrtrans/UCkd.h chrtrans/makeuctb chrtrans/makeuctb.c \

-#                UCdomap.h UCMap.h ../userdefs.h

-#UCAux.o : UCAux.c $(CMN)UCAux.h $(CMN)UCDefs.h

-

+DefaultStyle.o:	../userdefs.h

+HTFWriter.o:	../userdefs.h

+LYBookmark.o:	../userdefs.h

+LYCharSets.o:	../userdefs.h

+LYCharUtils.o:	../userdefs.h

+LYCookie.o:	../userdefs.h

+LYDownload.o:	../userdefs.h

+LYEditmap.o:	../userdefs.h

+LYExtern.o:	../userdefs.h

+LYGetFile.o:	../userdefs.h

+LYHistory.o:	../userdefs.h

+LYKeymap.o:	../userdefs.h

+LYMain.o:	../userdefs.h

+LYMainLoop.o:	../userdefs.h

+LYOptions.o:	../userdefs.h

+LYReadCFG.o:	../userdefs.h

+LYShowInfo.o:	../userdefs.h

+LYStrings.o:	../userdefs.h

+LYTraversal.o:	../userdefs.h

diff --git a/src/makefile.dsl b/src/makefile.dsl
index a66349ca..e77a2289 100644
--- a/src/makefile.dsl
+++ b/src/makefile.dsl
@@ -40,23 +40,24 @@ lint:
 clean:

 	rm -f lynx.exe core *.[ob]

 

-LYMain.o: ../userdefs.h

-LYMainLoop.o: LYMainLoop.c ../userdefs.h

-LYReadCFG.o: LYReadCFG.c ../userdefs.h

-HTFWriter.o: HTFWriter.c ../userdefs.h

-LYGetFile.o: LYGetFile.c ../userdefs.h

-LYOptions.o: LYOptions.c ../userdefs.h

-LYReadCFG.o: LYReadCFG.c ../userdefs.h

-LYTraversal.o: LYTraversal.c ../userdefs.h

-LYCharSets.o: LYCharSets.c ../userdefs.h

-LYShowInfo.o: LYShowInfo.c ../userdefs.h

-LYStrings.o: LYStrings.c ../userdefs.h

-LYBookmark.o: LYBookmark.c ../userdefs.h

-LYHistory.o: LYHistory.c ../userdefs.h

-LYDownload.o: LYDownload.c ../userdefs.h

-DefaultStyle.o: DefaultStyle.c ../userdefs.h

-LYEditmap.o: LYEditmap.c ../userdefs.h

-LYCharUtils.o: LYCharUtils.c ../userdefs.h

-LYExtern.o: LYExtern.c ../userdefs.h

-LYUtils.o: LYUtils.c ../userdefs.h

-LYCookie.o: ../userdefs.h

+DefaultStyle.o:	../userdefs.h

+HTFWriter.o:	../userdefs.h

+LYBookmark.o:	../userdefs.h

+LYCharSets.o:	../userdefs.h

+LYCharUtils.o:	../userdefs.h

+LYCookie.o:	../userdefs.h

+LYDownload.o:	../userdefs.h

+LYEditmap.o:	../userdefs.h

+LYExtern.o:	../userdefs.h

+LYGetFile.o:	../userdefs.h

+LYHistory.o:	../userdefs.h

+LYKeymap.o:	../userdefs.h

+LYMain.o:	../userdefs.h

+LYMainLoop.o:	../userdefs.h

+LYOptions.o:	../userdefs.h

+LYReadCFG.o:	../userdefs.h

+LYReadCFG.o:	../userdefs.h

+LYShowInfo.o:	../userdefs.h

+LYStrings.o:	../userdefs.h

+LYTraversal.o:	../userdefs.h

+LYUtils.o:	../userdefs.h

diff --git a/src/makefile.in b/src/makefile.in
index 0ec8fa9d..87ef8437 100644
--- a/src/makefile.in
+++ b/src/makefile.in
@@ -35,7 +35,7 @@ WAISLIB		= # FIXME: set in parent makefile
 WWWINC		= WWW/Library/Implementation
 WWWLIB		= $(top_builddir)/WWW/Library/unix/libwww.a
 
-INTLLIB		= @INTLDIR_MAKE@@INTLLIBS@ 
+INTLLIB		= @INTLDIR_MAKE@@INTLLIBS@
 
 CPP_OPTS	= $(DEFS) $(CPPFLAGS) \
 		-DLOCALEDIR=\"$(localedir)\" \
@@ -111,12 +111,13 @@ HTFWriter.o:	$(top_srcdir)/userdefs.h
 HTInit.o:	$(top_srcdir)/userdefs.h
 LYCharSets.o:	$(top_srcdir)/userdefs.h
 LYGetFile.o:	$(top_srcdir)/userdefs.h
+LYKeymap.o:	$(top_srcdir)/userdefs.h
 LYMail.o:	$(top_srcdir)/userdefs.h
 LYMain.o:	$(top_srcdir)/userdefs.h
 LYMainLoop.o:	$(top_srcdir)/userdefs.h
 LYOptions.o:	$(top_srcdir)/userdefs.h
 LYReadCFG.o:	$(top_srcdir)/userdefs.h
-LYShowInfo.o:	$(top_srcdir)/cfg_defs.h
+LYShowInfo.o:	$(top_builddir)/cfg_defs.h
 LYTraversal.o:	$(top_srcdir)/userdefs.h
 LYUtils.o:	$(top_srcdir)/userdefs.h
 LYrcFile.o:	$(top_srcdir)/userdefs.h
@@ -166,7 +167,7 @@ CMN=$(top_srcdir)/WWW/Library/Implementation/
 $(TABLES):
 	-cd chrtrans && $(MAKE) tables
 
-UCdomap.o: UCdomap.c chrtrans/UCkd.h chrtrans/makeuctb chrtrans/makeuctb.c \
+UCdomap.o: UCdomap.c chrtrans/UCkd.h chrtrans/makeuctb$x chrtrans/makeuctb.c \
                  UCdomap.h $(CMN)UCMap.h $(TABLES) $(top_srcdir)/userdefs.h
 
 UCAux.o : UCAux.c $(CMN)UCAux.h $(CMN)UCDefs.h
diff --git a/src/makefile.wsl b/src/makefile.wsl
index af721f2f..82964341 100644
--- a/src/makefile.wsl
+++ b/src/makefile.wsl
@@ -40,23 +40,24 @@ lint:
 clean:

 	rm -f lynx.exe core *.[ob]

 

-LYMain.o: ../userdefs.h

-LYMainLoop.o: LYMainLoop.c ../userdefs.h

-LYReadCFG.o: LYReadCFG.c ../userdefs.h

-HTFWriter.o: HTFWriter.c ../userdefs.h

-LYGetFile.o: LYGetFile.c ../userdefs.h

-LYOptions.o: LYOptions.c ../userdefs.h

-LYReadCFG.o: LYReadCFG.c ../userdefs.h

-LYTraversal.o: LYTraversal.c ../userdefs.h

-LYCharSets.o: LYCharSets.c ../userdefs.h

-LYShowInfo.o: LYShowInfo.c ../userdefs.h

-LYStrings.o: LYStrings.c ../userdefs.h

-LYBookmark.o: LYBookmark.c ../userdefs.h

-LYHistory.o: LYHistory.c ../userdefs.h

-LYDownload.o: LYDownload.c ../userdefs.h

-DefaultStyle.o: DefaultStyle.c ../userdefs.h

-LYEditmap.o: LYEditmap.c ../userdefs.h

-LYCharUtils.o: LYCharUtils.c ../userdefs.h

-LYExtern.o: LYExtern.c ../userdefs.h

-LYUtils.o: LYUtils.c ../userdefs.h

-LYCookie.o: ../userdefs.h

+DefaultStyle.o:	../userdefs.h

+HTFWriter.o:	../userdefs.h

+LYBookmark.o:	../userdefs.h

+LYCharSets.o:	../userdefs.h

+LYCharUtils.o:	../userdefs.h

+LYCookie.o:	../userdefs.h

+LYDownload.o:	../userdefs.h

+LYEditmap.o:	../userdefs.h

+LYExtern.o:	../userdefs.h

+LYGetFile.o:	../userdefs.h

+LYHistory.o:	../userdefs.h

+LYKeymap.o:	../userdefs.h

+LYMain.o:	../userdefs.h

+LYMainLoop.o:	../userdefs.h

+LYOptions.o:	../userdefs.h

+LYReadCFG.o:	../userdefs.h

+LYReadCFG.o:	../userdefs.h

+LYShowInfo.o:	../userdefs.h

+LYStrings.o:	../userdefs.h

+LYTraversal.o:	../userdefs.h

+LYUtils.o:	../userdefs.h