TTF output to display Chinese and Korean filenames with code pages 936/949/950

This commit is contained in:
Wengier
2021-05-12 03:23:12 -04:00
parent c157e7efbb
commit b773554878
14 changed files with 64742 additions and 11 deletions

View File

@@ -11,8 +11,9 @@
4DOS files, text utilties in TEXTUTIL directory and
TITLE command to change window title. (Wengier)
- CHCP command in the Truetype font (TTF) output now
allows code page 932 for display Japanese filenames
when DBCS is enabled in non-PC98 mode. (Wengier)
allows code page 932, 936, 949, and 950 for display
Chinese, Japanese and Korean filenames when DBCS is
enabled in non-PC98 mode. (Wengier)
- Command-line option -fastlaunch will now suppress
messages by "automountall=true" option. (Wengier)
- The return value of AL in Int21/AX=0Eh is no longer

22065
contrib/mappings/CP936.TXT Normal file

File diff suppressed because it is too large Load Diff

17322
contrib/mappings/CP949.TXT Normal file

File diff suppressed because it is too large Load Diff

13777
contrib/mappings/CP950.TXT Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -18,4 +18,6 @@
./sb2u.pl cp872_to_unicode <CP872.TXT >../../include/cp872_uni.h || exit 1
./sb2u.pl cp874_to_unicode <CP874.TXT >../../include/cp874_uni.h || exit 1
./sjis2u.pl cp932_to_unicode <CP932.TXT >../../include/cp932_uni.h || exit 1
./sjis2u.pl cp936_to_unicode <CP936.TXT >../../include/cp936_uni.h || exit 1
./sjis2u.pl cp949_to_unicode <CP949.TXT >../../include/cp949_uni.h || exit 1
./sjis2u.pl cp950_to_unicode <CP950.TXT >../../include/cp950_uni.h || exit 1

View File

@@ -70,7 +70,7 @@ for ($y=0;$y < 65536;$y += $pagesize) {
}
}
print "/* double-byte SHIFT-JIS charset to unicode. 0x0000 means no mapping */\n";
print "/* DBCS (double-byte) charset to unicode. 0x0000 means no mapping */\n";
print "/* hi = (code >> 6) */\n";
print "/* lo = code & 0x3F */\n";
print "/* rawoff = $arrayname"."_hitbl[hi] */\n";

View File

@@ -1,4 +1,4 @@
/* double-byte SHIFT-JIS charset to unicode. 0x0000 means no mapping */
/* DBCS (double-byte) charset to unicode. 0x0000 means no mapping */
/* hi = (code >> 6) */
/* lo = code & 0x3F */
/* rawoff = cp932_to_unicode_hitbl[hi] */

4273
include/cp936_uni.h Normal file

File diff suppressed because it is too large Load Diff

3886
include/cp949_uni.h Normal file

File diff suppressed because it is too large Load Diff

3382
include/cp950_uni.h Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -87,6 +87,9 @@
#include "cp872_uni.h"
#include "cp874_uni.h"
#include "cp932_uni.h"
#include "cp936_uni.h"
#include "cp949_uni.h"
#include "cp950_uni.h"
#if defined(PATH_MAX) && !defined(MAX_PATH)
#define MAX_PATH PATH_MAX
@@ -199,7 +202,7 @@ template <class MT> bool String_DBCS_TO_HOST_SHIFTJIS_uint16(uint16_t *d/*CROSS_
while (*s != 0 && s < sf) {
uint16_t ic = (unsigned char)(*s++);
if ((ic & 0xE0) == 0x80 || (ic & 0xE0) == 0xE0) {
if ((dos.loaded_codepage==932 &&((ic & 0xE0) == 0x80 || (ic & 0xE0) == 0xE0)) || ((dos.loaded_codepage==936 || dos.loaded_codepage==949 || dos.loaded_codepage==950) && (ic & 0x80) == 0x80)) {
if (*s == 0) return false;
ic <<= 8U;
ic += (unsigned char)(*s++);
@@ -229,7 +232,7 @@ template <class MT> bool String_DBCS_TO_HOST_SHIFTJIS(host_cnv_char_t *d/*CROSS_
while (*s != 0 && s < sf) {
uint16_t ic = (unsigned char)(*s++);
if ((ic & 0xE0) == 0x80 || (ic & 0xE0) == 0xE0) {
if ((dos.loaded_codepage==932 &&((ic & 0xE0) == 0x80 || (ic & 0xE0) == 0xE0)) || ((dos.loaded_codepage==936 || dos.loaded_codepage==949 || dos.loaded_codepage==950) && (ic & 0x80) == 0x80)) {
if (*s == 0) return false;
ic <<= 8U;
ic += (unsigned char)(*s++);
@@ -414,6 +417,12 @@ bool CodePageHostToGuest(char *d/*CROSS_LEN*/,const host_cnv_char_t *s/*CROSS_LE
return String_HOST_TO_SBCS<uint16_t>(d,s,cp874_to_unicode,sizeof(cp874_to_unicode)/sizeof(cp874_to_unicode[0]));
case 932:
return String_HOST_TO_DBCS_SHIFTJIS<uint16_t>(d,s,cp932_to_unicode_hitbl,cp932_to_unicode_raw,sizeof(cp932_to_unicode_raw)/sizeof(cp932_to_unicode_raw[0]));
case 936:
return String_HOST_TO_DBCS_SHIFTJIS<uint16_t>(d,s,cp936_to_unicode_hitbl,cp936_to_unicode_raw,sizeof(cp936_to_unicode_raw)/sizeof(cp936_to_unicode_raw[0]));
case 949:
return String_HOST_TO_DBCS_SHIFTJIS<uint16_t>(d,s,cp949_to_unicode_hitbl,cp949_to_unicode_raw,sizeof(cp949_to_unicode_raw)/sizeof(cp949_to_unicode_raw[0]));
case 950:
return String_HOST_TO_DBCS_SHIFTJIS<uint16_t>(d,s,cp950_to_unicode_hitbl,cp950_to_unicode_raw,sizeof(cp950_to_unicode_raw)/sizeof(cp950_to_unicode_raw[0]));
default:
/* at this time, it would be cruel and unusual to not allow any file I/O just because
* our code page support is so limited. */
@@ -467,6 +476,12 @@ bool CodePageGuestToHostUint16(uint16_t *d/*CROSS_LEN*/,const char *s/*CROSS_LEN
return String_SBCS_TO_HOST_uint16<uint16_t>(d,s,cp874_to_unicode,sizeof(cp874_to_unicode)/sizeof(cp874_to_unicode[0]));
case 932:
return String_DBCS_TO_HOST_SHIFTJIS_uint16<uint16_t>(d,s,cp932_to_unicode_hitbl,cp932_to_unicode_raw,sizeof(cp932_to_unicode_raw)/sizeof(cp932_to_unicode_raw[0]));
case 936:
return String_DBCS_TO_HOST_SHIFTJIS_uint16<uint16_t>(d,s,cp936_to_unicode_hitbl,cp936_to_unicode_raw,sizeof(cp936_to_unicode_raw)/sizeof(cp936_to_unicode_raw[0]));
case 949:
return String_DBCS_TO_HOST_SHIFTJIS_uint16<uint16_t>(d,s,cp949_to_unicode_hitbl,cp949_to_unicode_raw,sizeof(cp949_to_unicode_raw)/sizeof(cp949_to_unicode_raw[0]));
case 950:
return String_DBCS_TO_HOST_SHIFTJIS_uint16<uint16_t>(d,s,cp950_to_unicode_hitbl,cp950_to_unicode_raw,sizeof(cp950_to_unicode_raw)/sizeof(cp950_to_unicode_raw[0]));
default: // Otherwise just use code page 437
return String_SBCS_TO_HOST_uint16<uint16_t>(d,s,cp437_to_unicode,sizeof(cp437_to_unicode)/sizeof(cp437_to_unicode[0]));
}
@@ -514,6 +529,12 @@ bool CodePageGuestToHost(host_cnv_char_t *d/*CROSS_LEN*/,const char *s/*CROSS_LE
return String_SBCS_TO_HOST<uint16_t>(d,s,cp874_to_unicode,sizeof(cp874_to_unicode)/sizeof(cp874_to_unicode[0]));
case 932:
return String_DBCS_TO_HOST_SHIFTJIS<uint16_t>(d,s,cp932_to_unicode_hitbl,cp932_to_unicode_raw,sizeof(cp932_to_unicode_raw)/sizeof(cp932_to_unicode_raw[0]));
case 936:
return String_DBCS_TO_HOST_SHIFTJIS<uint16_t>(d,s,cp936_to_unicode_hitbl,cp936_to_unicode_raw,sizeof(cp936_to_unicode_raw)/sizeof(cp936_to_unicode_raw[0]));
case 949:
return String_DBCS_TO_HOST_SHIFTJIS<uint16_t>(d,s,cp949_to_unicode_hitbl,cp949_to_unicode_raw,sizeof(cp949_to_unicode_raw)/sizeof(cp949_to_unicode_raw[0]));
case 950:
return String_DBCS_TO_HOST_SHIFTJIS<uint16_t>(d,s,cp950_to_unicode_hitbl,cp950_to_unicode_raw,sizeof(cp950_to_unicode_raw)/sizeof(cp950_to_unicode_raw[0]));
default:
/* at this time, it would be cruel and unusual to not allow any file I/O just because
* our code page support is so limited. */

View File

@@ -20,6 +20,7 @@
#include "dosbox.h"
#include "cross.h"
#include "support.h"
#include "dos_inc.h"
#include <string>
#include <limits.h>
#include <stdlib.h>
@@ -225,6 +226,7 @@ bool Cross::IsPathAbsolute(std::string const& in) {
#if defined (WIN32)
typedef wchar_t host_cnv_char_t;
extern char *CodePageHostToGuest(const host_cnv_char_t *s);
extern bool enable_dbcs_tables;
/* does the filename fit the 8.3 format? */
static bool is_filename_8by3w(const wchar_t* fname) {
@@ -235,7 +237,7 @@ static bool is_filename_8by3w(const wchar_t* fname) {
i=0;
while (*fname != 0 && *fname != L'.') {
if (*fname<=32||*fname==127||*fname==L'"'||*fname==L'+'||*fname==L'='||*fname==L','||*fname==L';'||*fname==L':'||*fname==L'<'||*fname==L'>'||*fname==L'|'||*fname==L'?'||*fname==L'*') return false;
if (IS_PC98_ARCH && (*fname & 0xFF00u) != 0u && (*fname & 0xFCu) != 0x08u) i++;
if ((IS_PC98_ARCH || ((dos.loaded_codepage==932 || dos.loaded_codepage==936 || dos.loaded_codepage==949 || dos.loaded_codepage==950) && enable_dbcs_tables)) && (*fname & 0xFF00u) != 0u && (*fname & 0xFCu) != 0x08u) i++;
fname++; i++;
}
if (i > 8) return false;
@@ -246,7 +248,7 @@ static bool is_filename_8by3w(const wchar_t* fname) {
i=0;
while (*fname != 0 && *fname != L'.') {
if (*fname<=32||*fname==127||*fname==L'"'||*fname==L'+'||*fname==L'='||*fname==L','||*fname==L';'||*fname==L':'||*fname==L'<'||*fname==L'>'||*fname==L'|'||*fname==L'?'||*fname==L'*') return false;
if (IS_PC98_ARCH && (*fname & 0xFF00u) != 0u && (*fname & 0xFCu) != 0x08u) i++;
if ((IS_PC98_ARCH || ((dos.loaded_codepage==932 || dos.loaded_codepage==936 || dos.loaded_codepage==949 || dos.loaded_codepage==950) && enable_dbcs_tables)) && (*fname & 0xFF00u) != 0u && (*fname & 0xFCu) != 0x08u) i++;
fname++; i++;
}
if (i > 3) return false;

View File

@@ -1514,7 +1514,7 @@ void SHELL_Init() {
MSG_Add("SHELL_CMD_ALIAS_HELP", "Defines or displays aliases.\n");
MSG_Add("SHELL_CMD_ALIAS_HELP_LONG", "ALIAS [name[=value] ... ]\n\nType ALIAS without parameters to display the list of aliases in the form:\n`ALIAS NAME = VALUE'\n");
MSG_Add("SHELL_CMD_CHCP_HELP", "Displays or changes the current DOS code page.\n");
MSG_Add("SHELL_CMD_CHCP_HELP_LONG", "CHCP [nnn]\n\n nnn Specifies a code page number.\n\nSupported code pages for changing in the TrueType font output:\n437,808,850,852,853,855,857,858,860,861,862,863,864,865,866,869,872,874,932\n");
MSG_Add("SHELL_CMD_CHCP_HELP_LONG", "CHCP [nnn]\n\n nnn Specifies a code page number.\n\nSupported code pages for changing in the TrueType font output:\n437,808,850,852,853,855,857,858,860,861,862,863,864,865,866,869,872,874\n\nAlso double-byte code pages including 932, 936, 949, and 950.\n");
MSG_Add("SHELL_CMD_CHCP_ACTIVE", "Active code page: %d\n");
MSG_Add("SHELL_CMD_CHCP_INVALID", "Invalid code page number - %s\n");
MSG_Add("SHELL_CMD_COUNTRY_HELP", "Displays or changes the current country.\n");

View File

@@ -3977,7 +3977,7 @@ void DOS_Shell::CMD_COUNTRY(char * args) {
int setTTFCodePage(void);
void runRescan(const char *str), SetupDBCSTable();
void toSetCodePage(DOS_Shell *shell, int newCP) {
if (newCP == 437 || newCP == 808 || newCP == 850 || newCP == 852 || newCP == 853 || newCP == 855 || newCP == 857 || newCP == 858 || (newCP >= 860 && newCP <= 866) || newCP == 869 || newCP == 872 || newCP == 874 || newCP == 932) {
if (newCP == 437 || newCP == 808 || newCP == 850 || newCP == 852 || newCP == 853 || newCP == 855 || newCP == 857 || newCP == 858 || (newCP >= 860 && newCP <= 866) || newCP == 869 || newCP == 872 || newCP == 874 || newCP == 932 || newCP == 936 || newCP == 949 || newCP == 950) {
dos.loaded_codepage = newCP;
int missing = setTTFCodePage();
shell->WriteOut(MSG_Get("SHELL_CMD_CHCP_ACTIVE"), dos.loaded_codepage);