Diff for /np2/generic/hostdrvs.c between versions 1.2 and 1.13

version 1.2, 2004/01/09 07:27:15 version 1.13, 2005/02/12 12:13:57
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
   
   #if defined(SUPPORT_HOSTDRV)
   
   #if defined(OSLANG_EUC) || defined(OSLANG_UTF8)
   #include        "oemtext.h"
   #endif
 #include        "dosio.h"  #include        "dosio.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "hostdrv.h"  #include        "hostdrv.h"
 #include        "hostdrvs.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,             // '&%$#"!  /.-,+*)(                          0xfa, 0x23,             // '&%$#"!  /.-,+*)(
                         0xff, 0x03,             // 76543210 ?>=<;:98                          0xff, 0x03,             // 76543210 ?>=<;:98
                         0xff, 0xff,             // GFEDCBA@ ONMLKJIH                          0xff, 0xff,             // GFEDCBA@ ONMLKJIH
Line 25  static void rcnvfcb(char *dst, UINT dlen Line 31  static void rcnvfcb(char *dst, UINT dlen
                 if (c == 0) {                  if (c == 0) {
                         break;                          break;
                 }                  }
   #if defined(OSLANG_SJIS) || defined(OSLANG_EUC) || defined(OSLANG_UTF8)
                 if ((((c ^ 0x20) - 0xa1) & 0xff) < 0x3c) {                  if ((((c ^ 0x20) - 0xa1) & 0xff) < 0x3c) {
                         if ((!slen) || (src[0] == '\0')) {                          if ((!slen) || (src[0] == '\0')) {
                                 break;                                  break;
Line 37  static void rcnvfcb(char *dst, UINT dlen Line 44  static void rcnvfcb(char *dst, UINT dlen
                         dst += 2;                          dst += 2;
                         dlen -= 2;                          dlen -= 2;
                 }                  }
                 else {                  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 - 0xa0) & 0xff) < 0x40) {
                           *dst++ = c;
                           dlen--;
                   }
   #else
                   if (((c - 0x20) & 0xff) < 0x60) {
                         if (((c - 'a') & 0xff) < 26) {                          if (((c - 'a') & 0xff) < 26) {
                                 c -= 0x20;                                  c -= 0x20;
                         }                          }
                         if ((c >= 0x20) && (c < 0x80) &&                          if (dospathchr[(c >> 3) - (0x20 >> 3)] & (1 << (c & 7))) {
                                 (dospathchr[(c >> 3) - (0x20 >> 3)] & (1 << (c & 7)))) {  
                                 *dst++ = c;                                  *dst++ = c;
                                 dlen--;                                  dlen--;
                         }                          }
                 }                  }
                   else if (c >= 0x80) {
                           *dst++ = c;
                           dlen--;
                   }
   #endif
         }          }
 }  }
   
 static BOOL realname2fcb(char *fcbname, FLINFO *fli) {  static BOOL realname2fcb(char *fcbname, FLINFO *fli) {
   
   #if defined(OSLANG_EUC) || defined(OSLANG_UTF8)
           char    sjis[MAX_PATH];
   #endif
         char    *realname;          char    *realname;
         char    *ext;          char    *ext;
   
   #if defined(OSLANG_EUC) || defined(OSLANG_UTF8)
           oemtext_oemtosjis(sjis, sizeof(sjis), fli->path, NELEMENTS(fli->path));
           realname = sjis;
   #else
         realname = fli->path;          realname = fli->path;
   #endif
         FillMemory(fcbname, 11, ' ');          FillMemory(fcbname, 11, ' ');
           // ToDo: SJISに変換済みなのに OEM依存してる
         ext = file_getext(realname);          ext = file_getext(realname);
         rcnvfcb(fcbname+0, 8, realname, ext - realname);          rcnvfcb(fcbname+0, 8, realname, ext - realname);
         rcnvfcb(fcbname+8, 3, ext, (UINT)-1);          rcnvfcb(fcbname+8, 3, ext, (UINT)-1);
Line 71  static BOOL hddsea(void *vpItem, void *v Line 105  static BOOL hddsea(void *vpItem, void *v
         return(FALSE);          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;          FLISTH          flh;
         FLINFO          fli;          FLINFO          fli;
Line 96  LISTARRAY hostdrvs_getpathlist(const cha Line 139  LISTARRAY hostdrvs_getpathlist(const cha
                                 break;                                  break;
                         }                          }
                         CopyMemory(hdd->di.fcbname, fcbname, 11);                          CopyMemory(hdd->di.fcbname, fcbname, 11);
                           hdd->di.exist = 1;
                           hdd->di.caps = fli.caps;
                         hdd->di.size = fli.size;                          hdd->di.size = fli.size;
                         hdd->di.attr = fli.attr;                          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);          } while(file_listnext(flh, &fli) == SUCCESS);
         if (listarray_getitems(ret) == 0) {          if (listarray_getitems(ret) == 0) {
Line 163  static char *dospath2fcb(char *fcbname,  Line 211  static char *dospath2fcb(char *fcbname, 
   
 BOOL hostdrvs_getrealpath(HDRVPATH *hdp, char *dospath) {  BOOL hostdrvs_getrealpath(HDRVPATH *hdp, char *dospath) {
   
         char            path[MAX_PATH];          OEMCHAR         path[MAX_PATH];
         LISTARRAY       lst;          LISTARRAY       lst;
 const HDRVDIR   *di;  const HDRVDIR   *di;
         HDRVLST         hdl;          HDRVLST         hdl;
         char            fcbname[11];          char            fcbname[11];
   
         file_cpyname(path, np2cfg.hdrvroot, sizeof(path));          file_cpyname(path, np2cfg.hdrvroot, NELEMENTS(path));
         lst = NULL;          lst = NULL;
         di = &hddroot;          di = &hddroot;
         while(dospath[0] != '\0') {          while(dospath[0] != '\0') {
                 if ((dospath[0] != '\\') || (!(di->attr & 0x10))) {                  if ((dospath[0] != '\\') || (!(di->attr & 0x10))) {
                         goto hdsgrp_err;                          goto hdsgrp_err;
                 }                  }
                 file_setseparator(path, sizeof(path));                  file_setseparator(path, NELEMENTS(path));
                 dospath++;                  dospath++;
                 if (dospath[0] == '\0') {                  if (dospath[0] == '\0') {
                         di = &hddroot;                          di = &hddroot;
Line 189  const HDRVDIR  *di; Line 237  const HDRVDIR  *di;
                 if (hdl == NULL) {                  if (hdl == NULL) {
                         goto hdsgrp_err;                          goto hdsgrp_err;
                 }                  }
                 file_catname(path, hdl->realname, sizeof(path));                  file_catname(path, hdl->realname, NELEMENTS(path));
                 di = &hdl->di;                  di = &hdl->di;
         }          }
         if (hdp) {          if (hdp) {
                 CopyMemory(&hdp->di, di, sizeof(HDRVDIR));                  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);          listarray_destroy(lst);
         return(SUCCESS);          return(SUCCESS);
Line 204  hdsgrp_err: Line 252  hdsgrp_err:
         return(FAILURE);          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;          LISTARRAY       lst;
         HDRVLST         hdl;          HDRVLST         hdl;
         char            fcbname[11];  
         char            dosname[16];  
         UINT            i;  
         char            *p;  
   
         file_cpyname(path, np2cfg.hdrvroot, sizeof(path));          file_cpyname(path, np2cfg.hdrvroot, size);
         lst = NULL;          if (dospath[0] == '\\') {
         if (dospath[0] != '\\') {                  file_setseparator(path, size);
                 goto hdsgrp_err;                  dospath++;
           }
           else if (dospath[0] != '\0') {
                   goto hdsgrd_err;
         }          }
         while(1) {          while(1) {
                 file_setseparator(path, sizeof(path));                  dospath = dospath2fcb(fcb, dospath);
                 dospath++;  
                 if (dospath[0] == '\0') {  
                         goto hdsgrp_err;  
                 }  
                 dospath = dospath2fcb(fcbname, dospath);  
                 if (dospath[0] != '\\') {                  if (dospath[0] != '\\') {
                         break;                          break;
                 }                  }
                 listarray_destroy(lst);  
                 lst = hostdrvs_getpathlist(path);                  lst = hostdrvs_getpathlist(path);
                 hdl = (HDRVLST)listarray_enum(lst, hddsea, fcbname);                  hdl = (HDRVLST)listarray_enum(lst, hddseadir, fcb);
                 if ((hdl == NULL) || (!(hdl->di.attr & 0x10))) {                  if (hdl != NULL) {
                         goto hdsgrp_err;                          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') {          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)
           OEMCHAR         oemname[64];
   #endif
   
           if ((hostdrvs_getrealdir(path, NELEMENTS(path), fcb, dospath)
                                                                                                                           != SUCCESS) ||
                   (fcb[0] == ' ')) {
                   return(FAILURE);
         }          }
         listarray_destroy(lst);  
         lst = hostdrvs_getpathlist(path);          lst = hostdrvs_getpathlist(path);
         hdl = (HDRVLST)listarray_enum(lst, hddsea, fcbname);          hdl = (HDRVLST)listarray_enum(lst, hddsea, fcb);
         if (hdl != NULL) {          if (hdl != NULL) {
                 file_catname(path, hdl->realname, sizeof(path));                  file_catname(path, hdl->realname, NELEMENTS(path));
                 if (hdp) {                  if (hdp) {
                         CopyMemory(&hdp->di, &hdl->di, sizeof(HDRVDIR));                          CopyMemory(&hdp->di, &hdl->di, sizeof(HDRVDIR));
                         file_cpyname(hdp->path, path, sizeof(hdp->path));                          file_cpyname(hdp->path, path, NELEMENTS(hdp->path));
                 }                  }
         }          }
         else {          else {
                 p = dosname;                  p = dosname;
                 for (i=0; (i<8) && (fcbname[i] != ' '); i++) {                  for (i=0; (i<8) && (fcb[i] != ' '); i++) {
                         *p++ = fcbname[i];                          *p++ = fcb[i];
                 }                  }
                 if (fcbname[8] != ' ') {                  if (fcb[8] != ' ') {
                         *p++ = '.';                          *p++ = '.';
                         for (i=8; (i<11) && (fcbname[i] != ' '); i++) {                          for (i=8; (i<11) && (fcb[i] != ' '); i++) {
                                 *p++ = fcbname[i];                                  *p++ = fcb[i];
                         }                          }
                 }                  }
                 *p = '\0';                  *p = '\0';
                 file_catname(path, dosname, sizeof(path));                  // ここで SJIS->OEMコードに未変換!
   #if defined(OSLANG_EUC) || defined(OSLANG_UTF8)
                   oemtext_sjistooem(oemname, NELEMENTS(oemname), dosname, (UINT)-1);
                   file_catname(path, oemname, NELEMENTS(path));
   #else
                   file_catname(path, dosname, NELEMENTS(path));
   #endif
                 if (hdp) {                  if (hdp) {
                         CopyMemory(hdp->di.fcbname, fcbname, 11);                          ZeroMemory(&hdp->di, sizeof(hdp->di));
                         hdp->di.size = 0;                          CopyMemory(hdp->di.fcbname, fcb, 11);
                         hdp->di.attr = 0;                          file_cpyname(hdp->path, path, NELEMENTS(hdp->path));
                         file_cpyname(hdp->path, path, sizeof(hdp->path));  
                 }                  }
         }          }
         listarray_destroy(lst);          listarray_destroy(lst);
         return(SUCCESS);          return(SUCCESS);
   
 hdsgrp_err:  
         listarray_destroy(lst);  
         return(FAILURE);  
 }  }
   
   
 // ----  // ----
   
 void hostdrvs_fhdlreopen(LISTARRAY fhdl) {  
   
         (void)fhdl;  
 }  
   
 static BOOL fhdlallclose(void *vpItem, void *vpArg) {  static BOOL fhdlallclose(void *vpItem, void *vpArg) {
   
         long    fh;          long    fh;
Line 330  HDRVFILE hostdrvs_fhdlsea(LISTARRAY fhdl Line 394  HDRVFILE hostdrvs_fhdlsea(LISTARRAY fhdl
         return(ret);          return(ret);
 }  }
   
   #endif
   

Removed from v.1.2  
changed lines
  Added in v.1.13


RetroPC.NET-CVS <cvs@retropc.net>