--- np2/x11/dosio.c 2003/12/19 16:08:01 1.6 +++ np2/x11/dosio.c 2011/01/03 11:49:25 1.16 @@ -1,15 +1,16 @@ +/* $Id: dosio.c,v 1.16 2011/01/03 11:49:25 monaka Exp $ */ + #include "compiler.h" #include #include -#include #include "codecnv.h" #include "dosio.h" -static char curpath[MAX_PATH]; -static char *curfilep = curpath; +static OEMCHAR curpath[MAX_PATH]; +static OEMCHAR *curfilep = curpath; #define ISKANJI(c) ((((c) - 0xa1) & 0xff) < 0x5c) @@ -30,7 +31,7 @@ dosio_term(void) /* ファイル操作 */ FILEH -file_open(const char *path) +file_open(const OEMCHAR *path) { FILEH fh; @@ -41,14 +42,14 @@ file_open(const char *path) } FILEH -file_open_rb(const char *path) +file_open_rb(const OEMCHAR *path) { return fopen(path, "rb"); } FILEH -file_create(const char *path) +file_create(const OEMCHAR *path) { return fopen(path, "wb+"); @@ -95,7 +96,7 @@ file_getsize(FILEH handle) } short -file_attr(const char *path) +file_attr(const OEMCHAR *path) { struct stat sb; short attr; @@ -113,40 +114,48 @@ file_attr(const char *path) return -1; } -short -file_getdatetime(FILEH handle, DOSDATE *dosdate, DOSTIME *dostime) +static BOOL +cnvdatetime(struct stat *sb, DOSDATE *dosdate, DOSTIME *dostime) { - struct stat sb; struct tm *ftime; - if (fstat(fileno(handle), &sb) == 0) { - ftime = localtime(&sb.st_mtime); - if (ftime) { - if (dosdate) { - dosdate->year = ftime->tm_year + 1900; - dosdate->month = ftime->tm_mon + 1; - dosdate->day = ftime->tm_mday; - } - if (dostime) { - dostime->hour = ftime->tm_hour; - dostime->minute = ftime->tm_min; - dostime->second = ftime->tm_sec; - } - return 0; + ftime = localtime(&sb->st_mtime); + if (ftime) { + if (dosdate) { + dosdate->year = ftime->tm_year + 1900; + dosdate->month = ftime->tm_mon + 1; + dosdate->day = ftime->tm_mday; + } + if (dostime) { + dostime->hour = ftime->tm_hour; + dostime->minute = ftime->tm_min; + dostime->second = ftime->tm_sec; } + return SUCCESS; } + 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) +file_delete(const OEMCHAR *path) { return (short)unlink(path); } short -file_dircreate(const char *path) +file_dircreate(const OEMCHAR *path) { return (short)mkdir(path, 0777); @@ -155,7 +164,7 @@ file_dircreate(const char *path) /* カレントファイル操作 */ void -file_setcd(const char *exepath) +file_setcd(const OEMCHAR *exepath) { milstr_ncpy(curpath, exepath, sizeof(curpath)); @@ -164,131 +173,153 @@ file_setcd(const char *exepath) } char * -file_getcd(const char *sjis) +file_getcd(const OEMCHAR *filename) { *curfilep = '\0'; - file_catname(curpath, sjis, sizeof(curpath)); + file_catname(curpath, filename, sizeof(curpath)); return curpath; } FILEH -file_open_c(const char *sjis) +file_open_c(const OEMCHAR *filename) { *curfilep = '\0'; - file_catname(curpath, sjis, sizeof(curpath)); + file_catname(curpath, filename, sizeof(curpath)); return file_open(curpath); } FILEH -file_open_rb_c(const char *sjis) +file_open_rb_c(const OEMCHAR *filename) { *curfilep = '\0'; - file_catname(curpath, sjis, sizeof(curpath)); + file_catname(curpath, filename, sizeof(curpath)); return file_open_rb(curpath); } FILEH -file_create_c(const char *sjis) +file_create_c(const OEMCHAR *filename) { *curfilep = '\0'; - file_catname(curpath, sjis, sizeof(curpath)); + file_catname(curpath, filename, sizeof(curpath)); return file_create(curpath); } short -file_delete_c(const char *sjis) +file_delete_c(const OEMCHAR *filename) { *curfilep = '\0'; - file_catname(curpath, sjis, sizeof(curpath)); + file_catname(curpath, filename, sizeof(curpath)); return file_delete(curpath); } short -file_attr_c(const char *sjis) +file_attr_c(const OEMCHAR *filename) { *curfilep = '\0'; - file_catname(curpath, sjis, sizeof(curpath)); - return file_attr_c(curpath); + file_catname(curpath, filename, sizeof(curpath)); + return file_attr(curpath); } -FILEFINDH -file_find1st(const char *dir, FILEFINDT *fft) +FLISTH +file_list1st(const OEMCHAR *dir, FLINFO *fli) { - DIR *ret; + FLISTH ret; - ret = opendir(dir); + ret = (FLISTH)_MALLOC(sizeof(_FLISTH), "FLISTH"); if (ret == NULL) { - return FILEFINDH_INVALID; + VERBOSE(("file_list1st: couldn't alloc memory (size = %d)", sizeof(_FLISTH))); + return FLISTH_INVALID; } - if (file_findnext((FILEFINDH)ret, fft) == SUCCESS) { - return (FILEFINDH)ret; - } - closedir(ret); - return FILEFINDH_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_findnext(FILEFINDH hdl, FILEFINDT *fft) +file_listnext(FLISTH hdl, FLINFO *fli) { + OEMCHAR buf[MAX_PATH]; struct dirent *de; struct stat sb; - UINT32 attr; - UINT32 size; - de = readdir((DIR *)hdl); + de = readdir(hdl->hdl); if (de == NULL) { + VERBOSE(("file_listnext: readdir failure")); return FAILURE; } - if (fft) { - mileuc_ncpy(fft->path, de->d_name, sizeof(fft->path)); - size = 0; - attr = 0; - if (stat(de->d_name, &sb) == 0) { - size = sb.st_size; - if (S_ISDIR(sb.st_mode)) { - attr = FILEATTR_DIRECTORY; - } - else if (!(sb.st_mode & S_IWUSR)) { - attr = FILEATTR_READONLY; - } - } - fft->size = size; - fft->attr = attr; + + 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; } void -file_findclose(FILEFINDH hdl) +file_listclose(FLISTH hdl) { - closedir((DIR *)hdl); + if (hdl) { + closedir(hdl->hdl); + _MFREE(hdl); + } } static int -euckanji1st(const char *str, int pos) +euckanji1st(const OEMCHAR *str, int pos) { int ret; + int c; - ret = 0; - while ((pos >= 0) && (((str[pos--] - 0xa1) & 0xff) < 0x5d)) { - ret ^= 1; + for (ret = 0; pos >= 0; ret ^= 1) { + c = (UINT8)str[pos--]; + if (!ISKANJI(c)) + break; } return ret; } void -file_cpyname(char *dst, const char *src, int maxlen) +file_cpyname(OEMCHAR *dst, const OEMCHAR *src, int maxlen) { int i; - if (maxlen--) { + if (maxlen-- > 0) { for (i = 0; i < maxlen && src[i] != '\0'; i++) { dst[i] = src[i]; } @@ -302,102 +333,90 @@ file_cpyname(char *dst, const char *src, } void -file_catname(char *path, const char *sjis, int maxlen) +file_catname(OEMCHAR *path, const OEMCHAR *filename, int maxlen) { - while (maxlen) { + for (; maxlen > 0; path++, maxlen--) { if (*path == '\0') { break; } - path++; - maxlen--; } - if (maxlen) { - codecnv_sjis2euc(path, maxlen, sjis, (UINT)-1); - for (; path[0] != '\0'; path++) { - if (!ISKANJI(path[0])) { - if (path[1] == '\0') { + if (maxlen > 0) { + milstr_ncpy(path, filename, maxlen); + for (; *path != '\0'; path++) { + if (!ISKANJI(*path)) { + path++; + if (*path == '\0') { break; } - path++; - } else if ((((path[0]) - 0x41) & 0xff) < 26) { - path[0] |= 0x20; - } else if (path[0] == '\\') { - path[0] = '/'; + } else if (((*path - 0x41) & 0xff) < 26) { + *path |= 0x20; + } else if (*path == '\\') { + *path = '/'; } } } } BOOL -file_cmpname(const char *path, const char *sjis) +file_cmpname(const OEMCHAR *path, const OEMCHAR *path2) { - char euc[MAX_PATH]; - codecnv_sjis2euc(euc, sizeof(euc), sjis, (UINT)-1); - return strcmp(path, euc); + return strcasecmp(path, path2); } -char * -file_getname(char *path) +OEMCHAR * +file_getname(const OEMCHAR *path) { - char *ret; + const OEMCHAR *ret; - for (ret = path; path[0] != '\0'; path++) { - if (ISKANJI(path[0])) { - if (path[1] == '\0') { + for (ret = path; *path != '\0'; path++) { + if (ISKANJI(*path)) { + path++; + if (*path == '\0') { break; } - path++; - } else if (path[0] == '/') { + } else if (*path == '/') { ret = path + 1; } } - return ret; + return (OEMCHAR *)ret; } void -file_cutname(char *path) +file_cutname(OEMCHAR *path) { - char *p; + OEMCHAR *p; p = file_getname(path); *p = '\0'; } -char * -file_getext(char *path) +OEMCHAR * +file_getext(const OEMCHAR *path) { - char *p; - char *q; + const OEMCHAR *p, *q; - p = file_getname(path); - q = NULL; - while (*p != '\0') { + for (p = file_getname(path), q = NULL; *p != '\0'; p++) { if (*p == '.') { q = p + 1; } - p++; } if (q == NULL) { q = p; } - return q; + return (char *)q; } void -file_cutext(char *path) +file_cutext(OEMCHAR *path) { - char *p; - char *q; + OEMCHAR *p, *q; - p = file_getname(path); - q = NULL; - while (*p != '\0') { + for (p = file_getname(path), q = NULL; *p != '\0'; p++) { if (*p == '.') { q = p; } - p++; } if (q != NULL) { *q = '\0'; @@ -405,7 +424,7 @@ file_cutext(char *path) } void -file_cutseparator(char *path) +file_cutseparator(OEMCHAR *path) { int pos; @@ -416,7 +435,7 @@ file_cutseparator(char *path) } void -file_setseparator(char *path, int maxlen) +file_setseparator(OEMCHAR *path, int maxlen) { int pos;