Diff for /np2/x11/dosio.c between versions 1.1 and 1.16

version 1.1, 2003/10/16 17:59:41 version 1.16, 2011/01/03 11:49:25
Line 1 Line 1
 #include        "compiler.h"  /*      $Id$    */
 #include        <sys/stat.h>  
 #include        <time.h>  
 #include        "codecnv.h"  
 #include        "dosio.h"  
 #if defined(WIN32)  
 #include        <direct.h>  
 #endif  
 #if 0  
 #include <sys/param.h>  
 #include <unistd.h>  
 #endif  
   
 static  char    curpath[MAX_PATH];  #include "compiler.h"
 static  char    *curfilep = curpath;  
   #include <sys/stat.h>
   #include <time.h>
   
   #include "codecnv.h"
   #include "dosio.h"
   
   
   static OEMCHAR curpath[MAX_PATH];
   static OEMCHAR *curfilep = curpath;
   
 #define ISKANJI(c)      ((((c) - 0xa1) & 0xff) < 0x5c)  #define ISKANJI(c)      ((((c) - 0xa1) & 0xff) < 0x5c)
   
   
 void dosio_init(void) {  void
   dosio_init(void)
   {
   
           /* nothing to do */
 }  }
   
 void dosio_term(void) {  void
   dosio_term(void)
   {
   
           /* nothing to do */
 }  }
   
 /* ¥Õ¥¡¥¤¥ëÁàºî */  /* ¡¦¥æ¡¦¡£¡¦¡¢¡¦öÃà¼*/
 FILEH file_open(const char *path) {  FILEH
   file_open(const OEMCHAR *path)
   {
           FILEH fh;
   
         return(fopen(path, "rb+"));          fh = fopen(path, "rb+");
           if (fh)
                   return fh;
           return fopen(path, "rb");
 }  }
   
 FILEH file_open_rb(const char *path) {  FILEH
   file_open_rb(const OEMCHAR *path)
   {
   
         return(fopen(path, "rb+"));          return fopen(path, "rb");
 }  }
   
 FILEH file_create(const char *path) {  FILEH
   file_create(const OEMCHAR *path)
   {
   
         return(fopen(path, "wb+"));          return fopen(path, "wb+");
 }  }
   
 long file_seek(FILEH handle, long pointer, int method) {  long
   file_seek(FILEH handle, long pointer, int method)
   {
   
         fseek(handle, pointer, method);          fseek(handle, pointer, method);
         return(ftell(handle));          return ftell(handle);
 }  }
   
 UINT file_read(FILEH handle, void *data, UINT length) {  UINT
   file_read(FILEH handle, void *data, UINT length)
   {
   
         return((UINT)fread(data, 1, length, handle));          return (UINT)fread(data, 1, length, handle);
 }  }
   
 UINT file_write(FILEH handle, const void *data, UINT length) {  UINT
   file_write(FILEH handle, const void *data, UINT length)
   {
   
         return((UINT)fwrite(data, 1, length, handle));          return (UINT)fwrite(data, 1, length, handle);
 }  }
   
 short file_close(FILEH handle) {  short
   file_close(FILEH handle)
   {
   
         fclose(handle);          fclose(handle);
         return(0);          return 0;
 }  }
   
 UINT file_getsize(FILEH handle) {  UINT
   file_getsize(FILEH handle)
   {
         struct stat sb;          struct stat sb;
   
         if (fstat(fileno(handle), &sb) == 0) {          if (fstat(fileno(handle), &sb) == 0)
                 return(sb.st_size);                  return sb.st_size;
         }          return 0;
         return(0);  
 }  }
   
 short file_attr(const char *path) {  short
   file_attr(const OEMCHAR *path)
 struct stat     sb;  {
         short   attr;          struct stat sb;
           short attr;
   
         if (stat(path, &sb) == 0) {          if (stat(path, &sb) == 0) {
 #ifndef WIN32  
                 if (S_ISDIR(sb.st_mode)) {                  if (S_ISDIR(sb.st_mode)) {
                         return(FILEATTR_DIRECTORY);                          return FILEATTR_DIRECTORY;
                 }                  }
                 attr = 0;                  attr = 0;
                 if (!(sb.st_mode & S_IWUSR)) {                  if (!(sb.st_mode & S_IWUSR)) {
                         attr |= FILEATTR_READONLY;                          attr |= FILEATTR_READONLY;
                 }                  }
 #else                  return attr;
                 if (sb.st_mode & _S_IFDIR) {  
                         attr = FILEATTR_DIRECTORY;  
                 }  
                 else {  
                         attr = 0;  
                 }  
                 if (!(sb.st_mode & S_IWRITE)) {  
                         attr |= FILEATTR_READONLY;  
                 }  
 #endif  
                 return(attr);  
         }          }
         return(-1);          return -1;
 }  }
   
 short file_getdatetime(FILEH handle, DOSDATE *dosdate, DOSTIME *dostime) {  static BOOL
   cnvdatetime(struct stat *sb, DOSDATE *dosdate, DOSTIME *dostime)
   {
           struct tm *ftime;
   
 struct stat sb;          ftime = localtime(&sb->st_mtime);
 struct tm       *ftime;          if (ftime) {
                   if (dosdate) {
         if (fstat(fileno(handle), &sb) == 0) {                          dosdate->year = ftime->tm_year + 1900;
                 ftime = localtime(&sb.st_mtime);                          dosdate->month = ftime->tm_mon + 1;
                 if (ftime) {                          dosdate->day = ftime->tm_mday;
                         if (dosdate) {                  }
                                 dosdate->year = ftime->tm_year + 1900;                  if (dostime) {
                                 dosdate->month = ftime->tm_mon + 1;                          dostime->hour = ftime->tm_hour;
                                 dosdate->day = ftime->tm_mday;                          dostime->minute = ftime->tm_min;
                         }                          dostime->second = ftime->tm_sec;
                         if (dostime) {  
                                 dostime->hour = ftime->tm_hour;  
                                 dostime->minute = ftime->tm_min;  
                                 dostime->second = ftime->tm_sec;  
                         }  
                         return(0);  
                 }                  }
                   return SUCCESS;
         }          }
         return(-1);          return FAILURE;
   }
   
   short
   file_getdatetime(FILEH handle, DOSDATE *dosdate, DOSTIME *dostime)
   {
           struct stat sb;
   
           if ((fstat(fileno(handle), &sb) == 0)
            && (cnvdatetime(&sb, dosdate, dostime)))
                   return 0;
           return -1;
 }  }
   
 short file_delete(const char *path) {  short
   file_delete(const OEMCHAR *path)
   {
   
         return(unlink(path));          return (short)unlink(path);
 }  }
   
 short file_dircreate(const char *path) {  short
   file_dircreate(const OEMCHAR *path)
   {
   
 #ifndef WIN32          return (short)mkdir(path, 0777);
         return((short)mkdir(path, 0777));  
 #else  
         return((short)mkdir(path));  
 #endif  
 }  }
   
   
 /* ¥«¥ì¥ó¥È¥Õ¥¡¥¤¥ëÁàºî */  /* ¡¦¥©¡¦ø§ó¥È¥Õ¥¡¥¤¥ëÁàº*/
 void file_setcd(const char *exepath) {  void
   file_setcd(const OEMCHAR *exepath)
   {
   
         milstr_ncpy(curpath, exepath, sizeof(curpath));          milstr_ncpy(curpath, exepath, sizeof(curpath));
         curfilep = file_getname(curpath);          curfilep = file_getname(curpath);
         *curfilep = '\0';          *curfilep = '\0';
 }  }
   
 char *file_getcd(const char *sjis) {  char *
   file_getcd(const OEMCHAR *filename)
   {
   
         *curfilep = '\0';          *curfilep = '\0';
         file_catname(curpath, sjis, sizeof(curpath));          file_catname(curpath, filename, sizeof(curpath));
         return(curpath);          return curpath;
 }  }
   
 FILEH file_open_c(const char *sjis) {  FILEH
   file_open_c(const OEMCHAR *filename)
   {
   
         *curfilep = '\0';          *curfilep = '\0';
         file_catname(curpath, sjis, sizeof(curpath));          file_catname(curpath, filename, sizeof(curpath));
         return(file_open(curpath));          return file_open(curpath);
 }  }
   
 FILEH file_open_rb_c(const char *sjis) {  FILEH
   file_open_rb_c(const OEMCHAR *filename)
   {
   
         *curfilep = '\0';          *curfilep = '\0';
         file_catname(curpath, sjis, sizeof(curpath));          file_catname(curpath, filename, sizeof(curpath));
         return(file_open_rb(curpath));          return file_open_rb(curpath);
 }  }
   
 FILEH file_create_c(const char *sjis) {  FILEH
   file_create_c(const OEMCHAR *filename)
   {
   
         *curfilep = '\0';          *curfilep = '\0';
         file_catname(curpath, sjis, sizeof(curpath));          file_catname(curpath, filename, sizeof(curpath));
         return(file_create(curpath));          return file_create(curpath);
 }  }
   
 short file_delete_c(const char *sjis) {  short
   file_delete_c(const OEMCHAR *filename)
   {
   
         *curfilep = '\0';          *curfilep = '\0';
         file_catname(curpath, sjis, sizeof(curpath));          file_catname(curpath, filename, sizeof(curpath));
         return(file_delete(curpath));          return file_delete(curpath);
 }  }
   
 short file_attr_c(const char *sjis) {  short
   file_attr_c(const OEMCHAR *filename)
   {
   
         *curfilep = '\0';          *curfilep = '\0';
         file_catname(curpath, sjis, sizeof(curpath));          file_catname(curpath, filename, sizeof(curpath));
         return(file_attr_c(curpath));          return file_attr(curpath);
 }  }
   
   FLISTH
   file_list1st(const OEMCHAR *dir, FLINFO *fli)
   {
           FLISTH ret;
   
           ret = (FLISTH)_MALLOC(sizeof(_FLISTH), "FLISTH");
           if (ret == NULL) {
                   VERBOSE(("file_list1st: couldn't alloc memory (size = %d)", sizeof(_FLISTH)));
                   return FLISTH_INVALID;
           }
   
           milstr_ncpy(ret->path, dir, sizeof(ret->path));
           file_setseparator(ret->path, sizeof(ret->path));
           ret->hdl = opendir(ret->path);
           VERBOSE(("file_list1st: opendir(%s)", ret->path));
           if (ret->hdl == NULL) {
                   VERBOSE(("file_list1st: opendir failure"));
                   _MFREE(ret);
                   return FLISTH_INVALID;
           }
           if (file_listnext((FLISTH)ret, fli) == SUCCESS) {
                   return (FLISTH)ret;
           }
           VERBOSE(("file_list1st: file_listnext failure"));
           closedir(ret->hdl);
           _MFREE(ret);
           return FLISTH_INVALID;
   }
   
   BOOL
   file_listnext(FLISTH hdl, FLINFO *fli)
   {
           OEMCHAR buf[MAX_PATH];
           struct dirent *de;
           struct stat sb;
   
           de = readdir(hdl->hdl);
           if (de == NULL) {
                   VERBOSE(("file_listnext: readdir failure"));
                   return FAILURE;
           }
   
 static int euckanji1st(const char *str, int pos) {          milstr_ncpy(buf, hdl->path, sizeof(buf));
           milstr_ncat(buf, de->d_name, sizeof(buf));
           if (stat(buf, &sb) != 0) {
                   VERBOSE(("file_listnext: stat failure. (path = %s)", buf));
                   return FAILURE;
           }
   
           fli->caps = FLICAPS_SIZE | FLICAPS_ATTR | FLICAPS_DATE | FLICAPS_TIME;
           fli->size = sb.st_size;
           fli->attr = 0;
           if (S_ISDIR(sb.st_mode)) {
                   fli->attr |= FILEATTR_DIRECTORY;
           }
           if (!(sb.st_mode & S_IWUSR)) {
                   fli->attr |= FILEATTR_READONLY;
           }
           cnvdatetime(&sb, &fli->date, &fli->time);
           milstr_ncpy(fli->path, de->d_name, sizeof(fli->path));
           VERBOSE(("file_listnext: success"));
           return SUCCESS;
   }
   
         int             ret;  void
   file_listclose(FLISTH hdl)
   {
   
         ret = 0;          if (hdl) {
         while((pos >= 0) &&                  closedir(hdl->hdl);
                 (((str[pos--] - 0xa1) & 0xff) < 0x5d)) {                  _MFREE(hdl);
                 ret ^= 1;  
         }          }
         return(ret);  
 }  }
   
 void file_cpyname(char *dst, const char *src, int maxlen) {  static int
   euckanji1st(const OEMCHAR *str, int pos)
   {
           int ret;
           int c;
   
         int             i;          for (ret = 0; pos >= 0; ret ^= 1) {
                   c = (UINT8)str[pos--];
                   if (!ISKANJI(c))
                           break;
           }
           return ret;
   }
   
   void
   file_cpyname(OEMCHAR *dst, const OEMCHAR *src, int maxlen)
   {
           int i;
   
         if (maxlen--) {          if (maxlen-- > 0) {
                 for (i=0; i<maxlen && src[i]; i++) {                  for (i = 0; i < maxlen && src[i] != '\0'; i++) {
                         dst[i] = src[i];                          dst[i] = src[i];
                 }                  }
                 if (i) {                  if (i > 0) {
                         if (euckanji1st(src, i-1)) {                          if (euckanji1st(src, i-1)) {
                                 i--;                                  i--;
                         }                          }
Line 220  void file_cpyname(char *dst, const char  Line 332  void file_cpyname(char *dst, const char 
         }          }
 }  }
   
 void file_catname(char *path, const char *sjis, int maxlen) {  void
   file_catname(OEMCHAR *path, const OEMCHAR *filename, int maxlen)
   {
   
         while(maxlen) {          for (; maxlen > 0; path++, maxlen--) {
                 if (*path == '\0') {                  if (*path == '\0') {
                         break;                          break;
                 }                  }
                 path++;  
                 maxlen--;  
         }          }
         if (maxlen) {          if (maxlen > 0) {
                 codecnv_sjis2euc(path, maxlen, sjis, (UINT)-1);                  milstr_ncpy(path, filename, maxlen);
                 while(1) {                  for (; *path != '\0'; path++) {
                         if (!ISKANJI(*path)) {                          if (!ISKANJI(*path)) {
                                 if (*(path+1) == '\0') {                                  path++;
                                   if (*path == '\0') {
                                         break;                                          break;
                                 }                                  }
                                 path++;                          } else if (((*path - 0x41) & 0xff) < 26) {
                         }  
                         else if ((((*path) - 0x41) & 0xff) < 26) {  
                                 *path |= 0x20;                                  *path |= 0x20;
                         }                          } else if (*path == '\\') {
                         else if (*path == '\\') {  
                                 *path = '/';                                  *path = '/';
                         }                          }
                         else if (*path == '\0') {  
                                 break;  
                         }  
                         path++;  
                 }                  }
         }          }
 }  }
   
 BOOL file_cmpname(char *path, const char *sjis) {  BOOL
   file_cmpname(const OEMCHAR *path, const OEMCHAR *path2)
         char    euc[MAX_PATH];  {
   
         codecnv_sjis2euc(euc, sizeof(euc), sjis, (UINT)-1);          return strcasecmp(path, path2);
         return(strcmp(path, euc));  
 }  }
   
 char *file_getname(char *path) {  OEMCHAR *
   file_getname(const OEMCHAR *path)
   {
           const OEMCHAR *ret;
   
         char    *ret;          for (ret = path; *path != '\0'; path++) {
   
         ret = path;  
         while(1) {  
                 if (ISKANJI(*path)) {                  if (ISKANJI(*path)) {
                         if (*(path+1) == '\0') {                          path++;
                           if (*path == '\0') {
                                 break;                                  break;
                         }                          }
                         path++;                  } else if (*path == '/') {
                 }  
                 else if (*path == '/') {  
                         ret = path + 1;                          ret = path + 1;
                 }                  }
                 else if (*path == '\0') {  
                         break;  
                 }  
                 path++;  
         }          }
         return(ret);          return (OEMCHAR *)ret;
 }  }
   
 void file_cutname(char *path) {  void
   file_cutname(OEMCHAR *path)
         char    *p;  {
           OEMCHAR *p;
   
         p = file_getname(path);          p = file_getname(path);
         *p = '\0';          *p = '\0';
 }  }
   
 char *file_getext(char *path) {  OEMCHAR *
   file_getext(const OEMCHAR *path)
   {
           const OEMCHAR *p, *q;
   
         char    *p;          for (p = file_getname(path), q = NULL; *p != '\0'; p++) {
         char    *q;  
   
         p = file_getname(path);  
         q = NULL;  
         while(*p != '\0') {  
                 if (*p == '.') {                  if (*p == '.') {
                         q = p + 1;                          q = p + 1;
                 }                  }
                 p++;  
         }          }
         if (q == NULL) {          if (q == NULL) {
                 q = p;                  q = p;
         }          }
         return(q);          return (char *)q;
 }  }
   
 void file_cutext(char *path) {  void
   file_cutext(OEMCHAR *path)
   {
           OEMCHAR *p, *q;
   
         char    *p;          for (p = file_getname(path), q = NULL; *p != '\0'; p++) {
         char    *q;  
   
         p = file_getname(path);  
         q = NULL;  
         while(*p != '\0') {  
                 if (*p == '.') {                  if (*p == '.') {
                         q = p;                          q = p;
                 }                  }
                 p++;  
         }          }
         if (q != NULL) {          if (q != NULL) {
                 *q = '\0';                  *q = '\0';
         }          }
 }  }
   
 void file_cutseparator(char *path) {  void
   file_cutseparator(OEMCHAR *path)
         int             pos;  {
           int pos;
   
         pos = strlen(path) - 1;          pos = strlen(path) - 1;
         if ((pos > 0) && (path[pos] == '/')) {          if ((pos > 0) && (path[pos] == '/')) {
Line 338  void file_cutseparator(char *path) { Line 434  void file_cutseparator(char *path) {
         }          }
 }  }
   
 void file_setseparator(char *path, int maxlen) {  void
   file_setseparator(OEMCHAR *path, int maxlen)
         int             pos;  {
           int pos;
   
         pos = strlen(path);          pos = strlen(path);
         if ((pos) && (path[pos-1] != '/') && ((pos + 2) < maxlen)) {          if ((pos) && (path[pos-1] != '/') && ((pos + 2) < maxlen)) {
Line 348  void file_setseparator(char *path, int m Line 445  void file_setseparator(char *path, int m
                 path[pos] = '\0';                  path[pos] = '\0';
         }          }
 }  }
   

Removed from v.1.1  
changed lines
  Added in v.1.16


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