--- np2/generic/hostdrvs.c 2004/01/09 07:27:15 1.2 +++ np2/generic/hostdrvs.c 2005/03/18 09:23:10 1.15 @@ -1,13 +1,19 @@ #include "compiler.h" + +#if defined(SUPPORT_HOSTDRV) + +#if defined(OSLANG_EUC) || defined(OSLANG_UTF8) || defined(OSLANG_UCS2) +#include "oemtext.h" +#endif #include "dosio.h" #include "pccore.h" #include "hostdrv.h" #include "hostdrvs.h" -static const HDRVDIR hddroot = {" ", 0, 0x10}; +static const HDRVDIR hddroot = {" ", 0, 0, 0, 0x10, {0}, {0}}; -static const BYTE dospathchr[] = { +static const UINT8 dospathchr[] = { 0xfa, 0x23, // '&%$#"! /.-,+*)( 0xff, 0x03, // 76543210 ?>=<;:98 0xff, 0xff, // GFEDCBA@ ONMLKJIH @@ -15,18 +21,19 @@ static const BYTE dospathchr[] = { 0x01, 0x00, // gfedcba` onmlkjih 0x00, 0x40}; // wvutsrqp ~}|{zyx -static void rcnvfcb(char *dst, UINT dlen, char *src, UINT slen) { + +static void rcnvfcb(char *dst, UINT dlen, const char *src) { REG8 c; - while((slen) && (dlen)) { - slen--; + while(dlen) { c = (UINT8)*src++; if (c == 0) { break; } +#if defined(OSLANG_SJIS) || defined(OSLANG_EUC) || defined(OSLANG_UTF8) || defined(OSLANG_UCS2) if ((((c ^ 0x20) - 0xa1) & 0xff) < 0x3c) { - if ((!slen) || (src[0] == '\0')) { + if (src[0] == '\0') { break; } if (dlen < 2) { @@ -37,29 +44,62 @@ static void rcnvfcb(char *dst, UINT dlen dst += 2; dlen -= 2; } - else { + else if (((c - 0x20) & 0xff) < 0x60) { if (((c - 'a') & 0xff) < 26) { c -= 0x20; } - if ((c >= 0x20) && (c < 0x80) && - (dospathchr[(c >> 3) - (0x20 >> 3)] & (1 << (c & 7)))) { + if (dospathchr[(c >> 3) - (0x20 >> 3)] & (1 << (c & 7))) { *dst++ = c; dlen--; } } + else if (((c - 0xa0) & 0xff) < 0x40) { + *dst++ = c; + dlen--; + } +#else + if (((c - 0x20) & 0xff) < 0x60) { + if (((c - 'a') & 0xff) < 26) { + c -= 0x20; + } + if (dospathchr[(c >> 3) - (0x20 >> 3)] & (1 << (c & 7))) { + *dst++ = c; + dlen--; + } + } + else if (c >= 0x80) { + *dst++ = c; + dlen--; + } +#endif } } -static BOOL realname2fcb(char *fcbname, FLINFO *fli) { +static BRESULT realname2fcb(char *fcbname, FLINFO *fli) { - char *realname; - char *ext; + OEMCHAR *ext; +#if defined(OSLANG_EUC) || defined(OSLANG_UTF8) || defined(OSLANG_UCS2) + char sjis[MAX_PATH]; +#endif - realname = fli->path; FillMemory(fcbname, 11, ' '); - ext = file_getext(realname); - rcnvfcb(fcbname+0, 8, realname, ext - realname); - rcnvfcb(fcbname+8, 3, ext, (UINT)-1); + + ext = file_getext(fli->path); +#if defined(OSLANG_EUC) || defined(OSLANG_UTF8) || defined(OSLANG_UCS2) + oemtext_oemtosjis(sjis, sizeof(sjis), ext, (UINT)-1); + rcnvfcb(fcbname+8, 3, sjis); +#else + rcnvfcb(fcbname+8, 3, ext); +#endif + + file_cutext(fli->path); +#if defined(OSLANG_EUC) || defined(OSLANG_UTF8) || defined(OSLANG_UCS2) + oemtext_oemtosjis(sjis, sizeof(sjis), fli->path, (UINT)-1); + rcnvfcb(fcbname+0, 8, sjis); +#else + rcnvfcb(fcbname+0, 8, fli->path); +#endif + return(SUCCESS); } @@ -71,7 +111,16 @@ static BOOL hddsea(void *vpItem, void *v return(FALSE); } -LISTARRAY hostdrvs_getpathlist(const char *realpath) { +static BOOL hddseadir(void *vpItem, void *vpArg) { + + if ((((HDRVLST)vpItem)->di.attr & 0x10) && + (!memcmp(((HDRVLST)vpItem)->di.fcbname, vpArg, 11))) { + return(TRUE); + } + return(FALSE); +} + +LISTARRAY hostdrvs_getpathlist(const OEMCHAR *realpath) { FLISTH flh; FLINFO fli; @@ -96,9 +145,14 @@ LISTARRAY hostdrvs_getpathlist(const cha break; } CopyMemory(hdd->di.fcbname, fcbname, 11); + hdd->di.exist = 1; + hdd->di.caps = fli.caps; hdd->di.size = fli.size; hdd->di.attr = fli.attr; - milstr_ncpy(hdd->realname, fli.path, sizeof(hdd->realname)); + hdd->di.date = fli.date; + hdd->di.time = fli.time; + file_cpyname(hdd->realname, fli.path, NELEMENTS(hdd->realname)); +// TRACEOUT(("%s -> %11s", fli.path, fcbname)); } } while(file_listnext(flh, &fli) == SUCCESS); if (listarray_getitems(ret) == 0) { @@ -163,20 +217,20 @@ static char *dospath2fcb(char *fcbname, BOOL hostdrvs_getrealpath(HDRVPATH *hdp, char *dospath) { - char path[MAX_PATH]; + OEMCHAR path[MAX_PATH]; LISTARRAY lst; const HDRVDIR *di; HDRVLST hdl; char fcbname[11]; - file_cpyname(path, np2cfg.hdrvroot, sizeof(path)); + file_cpyname(path, np2cfg.hdrvroot, NELEMENTS(path)); lst = NULL; di = &hddroot; while(dospath[0] != '\0') { if ((dospath[0] != '\\') || (!(di->attr & 0x10))) { goto hdsgrp_err; } - file_setseparator(path, sizeof(path)); + file_setseparator(path, NELEMENTS(path)); dospath++; if (dospath[0] == '\0') { di = &hddroot; @@ -189,12 +243,12 @@ const HDRVDIR *di; if (hdl == NULL) { goto hdsgrp_err; } - file_catname(path, hdl->realname, sizeof(path)); + file_catname(path, hdl->realname, NELEMENTS(path)); di = &hdl->di; } if (hdp) { CopyMemory(&hdp->di, di, sizeof(HDRVDIR)); - file_cpyname(hdp->path, path, sizeof(hdp->path)); + file_cpyname(hdp->path, path, NELEMENTS(hdp->path)); } listarray_destroy(lst); return(SUCCESS); @@ -204,88 +258,104 @@ hdsgrp_err: return(FAILURE); } -BOOL hostdrvs_newrealpath(HDRVPATH *hdp, char *dospath) { +BOOL hostdrvs_getrealdir(OEMCHAR *path, int size, char *fcb, char *dospath) { - char path[MAX_PATH]; LISTARRAY lst; HDRVLST hdl; - char fcbname[11]; - char dosname[16]; - UINT i; - char *p; - file_cpyname(path, np2cfg.hdrvroot, sizeof(path)); - lst = NULL; - if (dospath[0] != '\\') { - goto hdsgrp_err; + file_cpyname(path, np2cfg.hdrvroot, size); + if (dospath[0] == '\\') { + file_setseparator(path, size); + dospath++; + } + else if (dospath[0] != '\0') { + goto hdsgrd_err; } while(1) { - file_setseparator(path, sizeof(path)); - dospath++; - if (dospath[0] == '\0') { - goto hdsgrp_err; - } - dospath = dospath2fcb(fcbname, dospath); + dospath = dospath2fcb(fcb, dospath); if (dospath[0] != '\\') { break; } - listarray_destroy(lst); lst = hostdrvs_getpathlist(path); - hdl = (HDRVLST)listarray_enum(lst, hddsea, fcbname); - if ((hdl == NULL) || (!(hdl->di.attr & 0x10))) { - goto hdsgrp_err; + hdl = (HDRVLST)listarray_enum(lst, hddseadir, fcb); + if (hdl != NULL) { + file_catname(path, hdl->realname, size); + } + listarray_destroy(lst); + if (hdl == NULL) { + goto hdsgrd_err; } - file_catname(path, hdl->realname, sizeof(path)); + file_setseparator(path, size); + dospath++; } if (dospath[0] != '\0') { - goto hdsgrp_err; + goto hdsgrd_err; + } + return(SUCCESS); + +hdsgrd_err: + return(FAILURE); +} + +BOOL hostdrvs_newrealpath(HDRVPATH *hdp, char *dospath) { + + OEMCHAR path[MAX_PATH]; + char fcb[11]; + LISTARRAY lst; + HDRVLST hdl; + char dosname[16]; + UINT i; + char *p; +#if defined(OSLANG_EUC) || defined(OSLANG_UTF8) || defined(OSLANG_UCS2) + OEMCHAR oemname[64]; +#endif + + if ((hostdrvs_getrealdir(path, NELEMENTS(path), fcb, dospath) + != SUCCESS) || + (fcb[0] == ' ')) { + return(FAILURE); } - listarray_destroy(lst); lst = hostdrvs_getpathlist(path); - hdl = (HDRVLST)listarray_enum(lst, hddsea, fcbname); + hdl = (HDRVLST)listarray_enum(lst, hddsea, fcb); if (hdl != NULL) { - file_catname(path, hdl->realname, sizeof(path)); + file_catname(path, hdl->realname, NELEMENTS(path)); if (hdp) { CopyMemory(&hdp->di, &hdl->di, sizeof(HDRVDIR)); - file_cpyname(hdp->path, path, sizeof(hdp->path)); + file_cpyname(hdp->path, path, NELEMENTS(hdp->path)); } } else { p = dosname; - for (i=0; (i<8) && (fcbname[i] != ' '); i++) { - *p++ = fcbname[i]; + for (i=0; (i<8) && (fcb[i] != ' '); i++) { + *p++ = fcb[i]; } - if (fcbname[8] != ' ') { + if (fcb[8] != ' ') { *p++ = '.'; - for (i=8; (i<11) && (fcbname[i] != ' '); i++) { - *p++ = fcbname[i]; + for (i=8; (i<11) && (fcb[i] != ' '); i++) { + *p++ = fcb[i]; } } *p = '\0'; - file_catname(path, dosname, sizeof(path)); + // ここで SJIS->OEMコードに未変換! +#if defined(OSLANG_EUC) || defined(OSLANG_UTF8) || defined(OSLANG_UCS2) + oemtext_sjistooem(oemname, NELEMENTS(oemname), dosname, (UINT)-1); + file_catname(path, oemname, NELEMENTS(path)); +#else + file_catname(path, dosname, NELEMENTS(path)); +#endif if (hdp) { - CopyMemory(hdp->di.fcbname, fcbname, 11); - hdp->di.size = 0; - hdp->di.attr = 0; - file_cpyname(hdp->path, path, sizeof(hdp->path)); + ZeroMemory(&hdp->di, sizeof(hdp->di)); + CopyMemory(hdp->di.fcbname, fcb, 11); + file_cpyname(hdp->path, path, NELEMENTS(hdp->path)); } } listarray_destroy(lst); return(SUCCESS); - -hdsgrp_err: - listarray_destroy(lst); - return(FAILURE); } // ---- -void hostdrvs_fhdlreopen(LISTARRAY fhdl) { - - (void)fhdl; -} - static BOOL fhdlallclose(void *vpItem, void *vpArg) { long fh; @@ -330,3 +400,5 @@ HDRVFILE hostdrvs_fhdlsea(LISTARRAY fhdl return(ret); } +#endif +