/* MMDFiles_dirname: get directory name from path */ char *MMDFiles_dirname(const char *file) { int i, len, index = -1; char size; char *dir; len = MMDFiles_strlen(file); for(i = 0; i < len; i += size) { size = MMDFiles_getcharsize(&file[i]); if(size == 1 && MMDFiles_dirseparator(file[i]) == true) index = i; } if(index >= 0) { dir = (char *) malloc(sizeof(char *) * (index + 1)); strncpy(dir, file, index); dir[index] = '\0'; } else { dir = MMDFiles_strdup("."); } return dir; }
/* MMDFiles_basename: get file name from path */ char *MMDFiles_basename(const char *file) { int i, len, index = -1; char size; char *base; len = MMDFiles_strlen(file); for(i = 0; i < len; i += size) { size = MMDFiles_getcharsize(&file[i]); if(size == 1 && MMDFiles_dirseparator(file[i]) == true) index = i; } if(index >= 0) { base = (char *) malloc(sizeof(char) * (len - index)); strncpy(base, &file[index + 1], len - index - 1); base[len - index - 1] = '\0'; } else { base = MMDFiles_strdup(file); } return base; }
/* MMDAgent_getcharsize: get character size */ char MMDAgent_getcharsize(const char *str) { return MMDFiles_getcharsize(str); }
/* MMDFiles_pathdup: convert charset from application to system */ char *MMDFiles_pathdup(const char *str) { #ifdef _WIN32 return MMDFiles_strdup(str); #endif /* _WIN32 */ #ifdef __APPLE__ size_t i, size; char *inBuff, *outBuff; size_t inLen, outLen; CFStringRef cfs; inLen = MMDFiles_strlen(str); if(inLen <= 0) return NULL; inBuff = MMDFiles_strdup(str); if(inBuff == NULL) return NULL; /* convert directory separator */ for(i = 0; i < inLen; i += size) { size = MMDFiles_getcharsize(&inBuff[i]); if(size == 1 && MMDFiles_dirseparator(inBuff[i]) == true) inBuff[i] = MMDFILES_DIRSEPARATOR; } /* convert multi-byte char */ cfs = CFStringCreateWithCString(NULL, inBuff, kCFStringEncodingDOSJapanese); outLen = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfs), kCFStringEncodingUTF8) + 1; outBuff = (char *) malloc(outLen); CFStringGetCString(cfs, outBuff, outLen, kCFStringEncodingUTF8); CFRelease(cfs); free(inBuff); return outBuff; #endif /* __APPLE__ */ #if !defined(_WIN32) && !defined(__APPLE__) iconv_t ic; size_t i, size; char *inBuff, *outBuff; char *inFile, *outFile; size_t inLen, outLen; inLen = MMDFiles_strlen(str); if(inLen <= 0) return NULL; outLen = inLen * MMDFILESUTILS_MAXCHARBYTE; ic = iconv_open(MMDFILES_CHARSET, "SJIS"); if(ic < 0) return NULL; inBuff = inFile = MMDFiles_strdup(str); outBuff = outFile = (char *) calloc(outLen, sizeof(char)); /* convert directory separator */ for(i = 0; i < inLen; i += size) { size = MMDFiles_getcharsize(&inFile[i]); if(size == 1 && MMDFiles_dirseparator(inFile[i]) == true) inFile[i] = MMDFILES_DIRSEPARATOR; } /* convert muli-byte char */ if(iconv(ic, &inFile, &inLen, &outFile, &outLen) >= 0) { outFile = '\0'; } else { strcpy(outBuff, ""); } iconv_close(ic); free(inBuff); return outBuff; #endif /* !_WIN32 && !__APPLE__ */ }