|
|
| 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'; |
| } | } |
| } | } |