--- np2/sdl/dosio.c 2003/11/21 06:51:12 1.1 +++ np2/sdl/dosio.c 2004/06/21 02:01:32 1.7 @@ -4,6 +4,8 @@ #include "dosio.h" #if defined(WIN32) #include +#else +#include #endif #if 0 #include @@ -23,17 +25,35 @@ void dosio_term(void) { /* ファイル操作 */ FILEH file_open(const char *path) { +#if defined(WIN32) && defined(OSLANG_EUC) + char sjis[MAX_PATH]; + codecnv_euc2sjis(sjis, sizeof(sjis), path, (UINT)-1); + return(fopen(sjis, "rb+")); +#else return(fopen(path, "rb+")); +#endif } FILEH file_open_rb(const char *path) { +#if defined(WIN32) && defined(OSLANG_EUC) + char sjis[MAX_PATH]; + codecnv_euc2sjis(sjis, sizeof(sjis), path, (UINT)-1); + return(fopen(sjis, "rb+")); +#else return(fopen(path, "rb+")); +#endif } FILEH file_create(const char *path) { +#if defined(WIN32) && defined(OSLANG_EUC) + char sjis[MAX_PATH]; + codecnv_euc2sjis(sjis, sizeof(sjis), path, (UINT)-1); + return(fopen(sjis, "wb+")); +#else return(fopen(path, "wb+")); +#endif } long file_seek(FILEH handle, long pointer, int method) { @@ -98,24 +118,33 @@ struct stat sb; return(-1); } +static BOOL cnv_sttime(time_t *t, DOSDATE *dosdate, DOSTIME *dostime) { + +struct tm *ftime; + + ftime = localtime(t); + if (ftime == NULL) { + return(FAILURE); + } + 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); +} + short file_getdatetime(FILEH handle, 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; - } + if (cnv_sttime(&sb.st_mtime, dosdate, dostime) == SUCCESS) { return(0); } } @@ -140,50 +169,193 @@ short file_dircreate(const char *path) { /* カレントファイル操作 */ void file_setcd(const char *exepath) { - milstr_ncpy(curpath, exepath, sizeof(curpath)); + file_cpyname(curpath, exepath, sizeof(curpath)); curfilep = file_getname(curpath); *curfilep = '\0'; } char *file_getcd(const char *path) { - milstr_ncpy(curfilep, path, sizeof(curpath) - (curfilep - curpath)); + file_cpyname(curfilep, path, sizeof(curpath) - (curfilep - curpath)); return(curpath); } FILEH file_open_c(const char *path) { - milstr_ncpy(curfilep, path, sizeof(curpath) - (curfilep - curpath)); + file_cpyname(curfilep, path, sizeof(curpath) - (curfilep - curpath)); return(file_open(curpath)); } FILEH file_open_rb_c(const char *path) { - milstr_ncpy(curfilep, path, sizeof(curpath) - (curfilep - curpath)); + file_cpyname(curfilep, path, sizeof(curpath) - (curfilep - curpath)); return(file_open_rb(curpath)); } FILEH file_create_c(const char *path) { - milstr_ncpy(curfilep, path, sizeof(curpath) - (curfilep - curpath)); + file_cpyname(curfilep, path, sizeof(curpath) - (curfilep - curpath)); return(file_create(curpath)); } short file_delete_c(const char *path) { - milstr_ncpy(curfilep, path, sizeof(curpath) - (curfilep - curpath)); + file_cpyname(curfilep, path, sizeof(curpath) - (curfilep - curpath)); return(file_delete(curpath)); } short file_attr_c(const char *path) { - milstr_ncpy(curfilep, path, sizeof(curpath) - (curfilep - curpath)); + file_cpyname(curfilep, path, sizeof(curpath) - (curfilep - curpath)); return(file_attr_c(curpath)); } +#if defined(WIN32) +static BOOL cnvdatetime(FILETIME *file, DOSDATE *dosdate, DOSTIME *dostime) { + + FILETIME localtime; + SYSTEMTIME systime; + + if ((FileTimeToLocalFileTime(file, &localtime) == 0) || + (FileTimeToSystemTime(&localtime, &systime) == 0)) { + return(FAILURE); + } + if (dosdate) { + dosdate->year = (UINT16)systime.wYear; + dosdate->month = (UINT8)systime.wMonth; + dosdate->day = (UINT8)systime.wDay; + } + if (dostime) { + dostime->hour = (UINT8)systime.wHour; + dostime->minute = (UINT8)systime.wMinute; + dostime->second = (UINT8)systime.wSecond; + } + return(SUCCESS); +} + +static BOOL setflist(WIN32_FIND_DATA *w32fd, FLINFO *fli) { + + if ((w32fd->dwFileAttributes & FILEATTR_DIRECTORY) && + ((!file_cmpname(w32fd->cFileName, ".")) || + (!file_cmpname(w32fd->cFileName, "..")))) { + return(FAILURE); + } + fli->caps = FLICAPS_SIZE | FLICAPS_ATTR; + fli->size = w32fd->nFileSizeLow; + fli->attr = w32fd->dwFileAttributes; + if (cnvdatetime(&w32fd->ftLastWriteTime, &fli->date, &fli->time) + == SUCCESS) { + fli->caps |= FLICAPS_DATE | FLICAPS_TIME; + } +#if defined(OSLANG_EUC) + codecnv_sjis2euc(fli->path, sizeof(fli->path), + w32fd->cFileName, (UINT)-1); +#else + file_cpyname(fli->path, w32fd->cFileName, sizeof(fli->path)); +#endif + return(SUCCESS); +} + +FLISTH file_list1st(const char *dir, FLINFO *fli) { + + char path[MAX_PATH]; + HANDLE hdl; + WIN32_FIND_DATA w32fd; + + file_cpyname(path, dir, sizeof(path)); + file_setseparator(path, sizeof(path)); + file_catname(path, "*.*", sizeof(path)); + hdl = FindFirstFile(path, &w32fd); + if (hdl != INVALID_HANDLE_VALUE) { + do { + if (setflist(&w32fd, fli) == SUCCESS) { + return(hdl); + } + } while(FindNextFile(hdl, &w32fd)); + FindClose(hdl); + } + return(FLISTH_INVALID); +} + +BOOL file_listnext(FLISTH hdl, FLINFO *fli) { + + WIN32_FIND_DATA w32fd; + + while(FindNextFile(hdl, &w32fd)) { + if (setflist(&w32fd, fli) == SUCCESS) { + return(SUCCESS); + } + } + return(FAILURE); +} + +void file_listclose(FLISTH hdl) { + + FindClose(hdl); +} +#else +FLISTH file_list1st(const char *dir, FLINFO *fli) { + + DIR *ret; + + ret = opendir(dir); + if (ret == NULL) { + goto ff1_err; + } + if (file_listnext((FLISTH)ret, fli) == SUCCESS) { + return((FLISTH)ret); + } + closedir(ret); + +ff1_err: + return(FLISTH_INVALID); +} + +BOOL file_listnext(FLISTH hdl, FLINFO *fli) { + +struct dirent *de; +struct stat sb; + UINT32 attr; + + de = readdir((DIR *)hdl); + if (de == NULL) { + return(FAILURE); + } + if (fli) { + if (stat(de->d_name, &sb) == 0) { + fli->caps = FLICAPS_SIZE | FLICAPS_ATTR; + fli->size = sb.st_size; + attr = 0; + if (S_ISDIR(sb.st_mode)) { + attr = FILEATTR_DIRECTORY; + } + else if (!(sb.st_mode & S_IWUSR)) { + attr = FILEATTR_READONLY; + } + fli->attr = attr; + if (cnv_sttime(&sb.st_mtime, &fli->date, &fli->time) == SUCCESS) { + fli->caps |= FLICAPS_DATE | FLICAPS_TIME; + } + } + else { + fli->caps = 0; + fli->size = 0; + fli->attr = 0; + } + mileuc_ncpy(fli->path, de->d_name, sizeof(fli->path)); + } + return(SUCCESS); +} + +void file_listclose(FLISTH hdl) { + + closedir((DIR *)hdl); +} +#endif + void file_catname(char *path, const char *name, int maxlen) { - char c; + int csize; while(maxlen > 0) { if (*path == '\0') { @@ -192,54 +364,28 @@ void file_catname(char *path, const char path++; maxlen--; } - if (maxlen > 0) { - maxlen--; - while(maxlen > 0) { - maxlen--; - c = *name++; - maxlen = 0; - if (ISKANJI1ST(c)) { - if ((maxlen == 0) || (*name == '\0')) { - break; - } - *path++ = c; - *path++ = *name++; - } - else if (c == '\\') { - *path++ = '/'; - } - else if (c) { - *path++ = c; - } - else { - break; - } + file_cpyname(path, name, maxlen); + while((csize = milstr_charsize(path)) != 0) { + if ((csize == 1) && (*path == '\\')) { + *path = '/'; } - *path = '\0'; + path += csize; } } -char *file_getname(char *path) { +char *file_getname(const char *path) { - char *ret; +const char *ret; + int csize; ret = path; - while(1) { - if (ISKANJI1ST(*path)) { - if (*(path+1) == '\0') { - break; - } - path++; - } - else if (*path == '/') { + while((csize = milstr_charsize(path)) != 0) { + if ((csize == 1) && (*path == '/')) { ret = path + 1; } - else if (*path == '\0') { - break; - } - path++; + path += csize; } - return(ret); + return((char *)ret); } void file_cutname(char *path) { @@ -250,10 +396,10 @@ void file_cutname(char *path) { *p = '\0'; } -char *file_getext(char *path) { +char *file_getext(const char *path) { - char *p; - char *q; +const char *p; +const char *q; p = file_getname(path); q = NULL; @@ -266,7 +412,7 @@ char *file_getext(char *path) { if (q == NULL) { q = p; } - return(q); + return((char *)q); } void file_cutext(char *path) { @@ -292,7 +438,9 @@ void file_cutseparator(char *path) { int pos; pos = strlen(path) - 1; - if ((pos > 0) && (path[pos] == '/')) { + if ((pos > 0) && // 2文字以上でー + (path[pos] == '/') && // ケツが \ でー + ((pos != 1) || (path[0] != '.'))) { // './' ではなかったら path[pos] = '\0'; } }