メインページ | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcSJISFileSystem.c

#include "dkcOSIndependent.h"
#include "dkcSJISFileSystem.h"
#include "dkcStdio.h"
#include "dkcString.h"
#include "dkcThreadLock.h"
#include "dkcSingleList.h"

dkcSJISFileSystem.cのインクルード依存関係図

Include dependency graph

ソースコードを見る。

マクロ定義

#define MAX_PATH_CHECK(dsize)

関数

DKC_INLINE BOOL jms1 (int c)
DKC_INLINE BOOL jms2 (int c)
DKC_EXTERN int WINAPI dkcIsShiftJIS (const char *str, int nPos)
DKC_INLINE int isJMS (const char *str, int nPos)
DKC_INLINE char * strtail (const char *stringg)
 文字列末尾の文字 '' の位置を返す

char *WINAPI dkcGetFileExtension (const char *PathName)
 パス名から、拡張子の開始位置を取得する ファイル名の末尾からファイル名の最後の '.' までを、拡張子と判断する

BOOL WINAPI dkcIsEffectivePath (const char *path, size_t size)
BOOL WINAPI dkcIsRelativityPath (const char *path)
BOOL WINAPI dkcIsAbsolutelyPath (const char *path)
BOOL WINAPI dkcIsTailPathSep (const char *src, size_t dlen)
 srcの一番後ろににがついていたらTRUE

int WINAPI dkcPushBackPathSep (char *dest, size_t dlen, size_t size)
 path separatorを挿入する必要があり、挿入出来たらTRUE

int WINAPI dkcDirectoryConcatenate (char *dest, size_t dlen, size_t dsize, const char *src)
int WINAPI dkcCurrentDirectoryConcatenate (char *dest, size_t dsize, const char *src)
int ToAbsolutelyLogic (char *dest, size_t dsize, const char *src)
int WINAPI dkcToAbsolutelyPath (char *dest, size_t dsize, const char *src, size_t ssize)
 パスを正規化(相対パスから絶対パス)する関数

DKC_PATHSTRING *WINAPI dkcAllocPathString (const char *path)
int WINAPI dkcFreePathString (DKC_PATHSTRING **ptr)
size_t WINAPI dkcPathStringSize (const DKC_PATHSTRING *p)
const char *WINAPI dkcPathStringPointer (const DKC_PATHSTRING *p)
int WINAPI dkcPathStringDevideBegin (DKC_PATHSTRING *ptr, char *buff, size_t size)
int WINAPI dkcPathStringDevideNext (DKC_PATHSTRING *ptr, char *buff, size_t size)
void WINAPI dkcPathStringDevideEnd (DKC_PATHSTRING *ptr)
int WINAPI dkcPathStringDevideBegin_Logic (DKC_PATHSTRING *ptr, size_t *count, char *buff, size_t size)
 dkcPathStringDevideBegin()

int WINAPI dkcPathStringDevideNext_Logic (DKC_PATHSTRING *ptr, size_t *count, char *buff, size_t size)
 dkcPathStringDevideNext()

void WINAPI dkcPathStringDevideEnd_Logic (size_t *count)
 dkcPathStringDevideEnd()

int WINAPI dkcPathStringElementInsert_Logic (DKC_PATHSTRING *ptr, size_t count, const char *src, size_t len)
 パスの要素を挿入する。(正規化はしない lenは文字数

int WINAPI dkcPathStringElementErase_Logic (DKC_PATHSTRING *ptr, size_t count)
int WINAPI dkcPathStringElementReplace_Logic (DKC_PATHSTRING *ptr, size_t count, const char *src, size_t len)
 パスの要素を置換する。(正規化はしない lenは文字数

int dkcPathStringNormalizeCopyLogic (DKC_PATHSTRING *ptr, const char *buff, size_t size, int(WINAPI *function__)(DKC_STRING *, const char *, size_t))
int WINAPI dkcPathStringCopy (DKC_PATHSTRING *ptr, const char *buff, size_t size)
 パスを正規化して入れる。

int WINAPI dkcPathStringNormalizeConcatenateLogic (DKC_PATHSTRING *ptr, const char *buff, size_t size)
int WINAPI dkcPathStringConcatenate (DKC_PATHSTRING *ptr, const char *buff, size_t size)
 パスを正規化して繋げる。

int WINAPI dkcPathStringGetDrive (DKC_PATHSTRING *ptr, char *buff, size_t size)
int WINAPI dkcPathStringGetFileExtension (DKC_PATHSTRING *ptr, char *buff, size_t size)
int WINAPI dkcPathStringGetFileName (DKC_PATHSTRING *ptr, char *buff, size_t size)
int WINAPI dkcPathStringGetDirectory (DKC_PATHSTRING *ptr, char *buff, size_t size)
BOOL WINAPI dkcFileExist (const char *filename)
UINT WINAPI dkcFileSize (const char *filename)
BOOL WINAPI dkcSetCurrentDirectory (const char *filename)
BOOL WINAPI dkcGetCurrentDirectory (char *buff, size_t size)
BOOL WINAPI dkcCreateDirectoryLogic (const char *dir, const void *ptr)
int WINAPI dkcCreateDirectory (const char *pPath)
BOOL WINAPI dkcFileCopy (const char *dest, const char *src)
BOOL WINAPI dkcFileCopyEx (const char *dest, const char *src, size_t inner_buffer_size, BOOL bThreadLock)
BOOL WINAPI dkcFileRemove (const char *filename)
BOOL WINAPI dkcFileRename (const char *oldname, const char *newname)
BOOL WINAPI dkcCreateZeroByteFile (const char *filename, BOOL rewrite)
DKC_FINDFILE *WINAPI dkcAllocFindFile ()
int WINAPI dkcFreeFindFile (DKC_FINDFILE **ptr)
int WINAPI dkcFindFirstFile (DKC_FINDFILE *ptr, const char *target)
int WINAPI dkcFindNextFile (DKC_FINDFILE *ptr)
int WINAPI dkcFindClose (DKC_FINDFILE *ptr)
int WINAPI dkcFindFileGetFileName (DKC_FINDFILE *ptr, char *buff, size_t buffsize)
BOOL WINAPI dkcFindFileIsFolder (DKC_FINDFILE *ptr)
BOOL WINAPI dkcFindFileIsDot (DKC_FINDFILE *ptr)
BOOL WINAPI dkcFindFileIsNormalFile (DKC_FINDFILE *ptr)
BOOL WINAPI dkcFindFileIsReadOnly (DKC_FINDFILE *ptr)
void WINAPI dkcFindFileSize (DKC_FINDFILE *ptr, ULONG *High, ULONG *Low)


説明

d金魚 @

dkcSJISFileSystem.c で定義されています。


マクロ定義

#define MAX_PATH_CHECK dsize   ) 
 

値:

{\
    dkcmNOT_ASSERT(dsize < dkcdMAXPATH_BUFFER);\
    if(dsize < dkcdMAXPATH_BUFFER){\
        return edk_BufferOverFlow;\
    }\
}

dkcSJISFileSystem.c177 行で定義されています。

参照元 dkcToAbsolutelyPath(), と ToAbsolutelyLogic().


関数

DKC_FINDFILE* WINAPI dkcAllocFindFile  ) 
 

dkcSJISFileSystem.c1359 行で定義されています。

参照先 DKC_FINDFILE, と dkcAllocate().

01360 {
01361     DKC_FINDFILE *p;
01362     p = dkcAllocate(sizeof(DKC_FINDFILE));
01363     return p;
01364 }

DKC_PATHSTRING* WINAPI dkcAllocPathString const char *  path  ) 
 

引数:
path[in] ファイル、ディレクトリへのパスを入れる。
戻り値:
無効な文字列が使われていたり、上手く割り当て出来なかったらNULL
覚え書き:
パスが相対パスだった場合、内部で勝手に絶対パスに変換される。

dkcSJISFileSystem.c323 行で定義されています。

参照先 DKC_PATHSTRING, dkcAllocate(), dkcAllocString(), dkcdMAXPATH_BUFFER, dkcFree(), dkcFreeString(), dkcIsNativePathString(), dkcPathStringCopy(), FALSE, dkc_PathString::mIterateCount, dkc_PathString::mString, と NULL.

00324 {
00325     DKC_PATHSTRING *p;
00326     size_t len;
00327     /*if(NULL==path){
00328         return NULL;
00329     }*/
00330 
00331     p = dkcAllocate(sizeof(DKC_PATHSTRING));
00332     if(NULL==p) return NULL;
00333 
00334     p->mString = dkcAllocString(dkcdMAXPATH_BUFFER + 1);//このサイズじゃないとダメ
00335     if(NULL==p->mString) goto Error;
00336 
00337     //パス名をコピー
00338     if(path){
00339         len = strlen(path);
00340         //ネイティブなパスを入れる。
00341         if(FALSE==dkcIsNativePathString(path,len)){
00342             goto Error;
00343         }
00344         dkcPathStringCopy(p,path,len);
00345     }
00346     p->mIterateCount = 0;
00347 
00348     return p;
00349 Error:
00350     if(p){
00351         dkcFreeString(&p->mString);
00352     }
00353     dkcFree(&p);
00354     return NULL;
00355 }

int WINAPI dkcCreateDirectory const char *  pPath  ) 
 

覚え書き:
Thread safe ではありません。(多分safeでなくても大丈夫だと思いますが。

dkcSJISFileSystem.c791 行で定義されています。

参照先 BOOL, dkcCreateDirectoryLogic(), dkcdMAXPATH_BUFFER, dkcdMAXPATH_LEN, dkcdPATH_SEP, dkcmIS_INVALID_FOLDERNAME_CHAR, dkcmIS_PATH_SEP, dkcmIsSJIS1, dkcmIsSJIS2, dkcmNOT_ASSERT, dkcmNOT_ASSERT_MESSAGE, DKUTIL_STRUCTURE_INIT, edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, FALSE, NULL, と NULL_CHAR_ARRAY.

00792 {
00793     BOOL result;
00794     char work[dkcdMAXPATH_BUFFER];
00795     unsigned long n = 0;
00796     unsigned long len = strlen(pPath);
00797 
00798 #ifdef WIN32//sjis support
00799     SECURITY_ATTRIBUTES attr;
00800     
00801     DKUTIL_STRUCTURE_INIT(attr);
00802     NULL_CHAR_ARRAY(work);
00803 
00804     //error check
00805     if(dkcdMAXPATH_LEN < len){
00806         dkcmNOT_ASSERT_MESSAGE("pathが長すぎる。",pPath);
00807         return edk_FAILED;
00808     }
00809     if(0==len ){
00810         return edk_ArgumentException;
00811     }
00812 
00813     //まずは一つ目を撃破
00814     if ( dkcmIsSJIS1(pPath[n]) || ! dkcmIS_INVALID_FOLDERNAME_CHAR(pPath[n]) )
00815     {//SJISの1文字目かINVALIDな値では無かったら。
00816         work[n] = pPath[n];
00817         if(1==len){
00818             //フォルダ作成
00819             attr.nLength = sizeof(SECURITY_ATTRIBUTES);
00820             attr.lpSecurityDescriptor = NULL;
00821             attr.bInheritHandle = FALSE;
00822 
00823             result = dkcCreateDirectoryLogic( work, &attr );
00824             
00825             dkcmNOT_ASSERT("directoryを作れなかった" && FALSE==result);
00826             return edk_SUCCEEDED;
00827         }
00828     }
00829     n++;
00830     //二つ目から開始
00831     while ( n < len )
00832     {
00833          //フォルダ名取得
00834         while ( n < len )
00835         {
00836             
00837             if(! dkcmIsSJIS1(pPath[n - 1]) && ! dkcmIsSJIS2(pPath[n]) )
00838             {//SJISではない!!
00839                 if ( ( dkcmIS_PATH_SEP(pPath[n]) ) /*&& pPath[n] != '\0'*//*(n != '\0')*/ )
00840                 {
00841                     if ( work[n-1] != ':' )
00842                     {//driveを読み込ませたくないらしい。
00843                         break;
00844                     }
00845                 }
00846                 else if(dkcmIS_INVALID_FOLDERNAME_CHAR(pPath[n]))
00847                 {//SJIS問題をクリアしたのに間違いだった
00848                     return edk_FAILED;
00849                 }
00850             }
00851             
00852             work[n] = pPath[n];
00853             n++;
00854         }
00855         work[n] = '\0';
00856 
00857         //フォルダ作成
00858         attr.nLength = sizeof(SECURITY_ATTRIBUTES);
00859         attr.lpSecurityDescriptor = NULL;
00860         attr.bInheritHandle = FALSE;
00861 
00862         result = dkcCreateDirectoryLogic( work, &attr );
00863         
00864         //dkcmNOT_ASSERT("directoryを作れなかった" && FALSE==result);
00865         if(FALSE==result){
00866             return edk_FAILED;
00867         }
00868         work[n++] = dkcdPATH_SEP;
00869     }
00870 #else //no support sjis
00871     NULL_CHAR_ARRAY(work);
00872     
00873         //error check
00874     if(dkcdMAXPATH_LEN < len){
00875         dkcmNOT_ASSERT_MESSAGE("pathが長すぎる。",pPath);
00876         return edk_FAILED;
00877     }
00878     if(0==len ){
00879         return edk_ArgumentException;
00880     }
00881 
00882     while ( n < len )
00883     {
00884          //フォルダ名取得
00885         while ( n < len )
00886         {
00887             if ( ( dkcmIS_PATH_SEP(pPath[n]) ) && (n != '\0') )
00888             {
00889                 if ( work[n-1] != ':' )//Linuxのドライブのパスはコレデいいのかな?
00890                 {
00891                     break;
00892                 }
00893             }
00894             work[n] = pPath[n];
00895             n++;
00896         }
00897         work[n] = '\0';
00898 
00899         result = dkcCreateDirectoryLogic( work,NULL );
00900 
00901         //dkcmNOT_ASSERT("directoryを作れなかった" && FALSE==result);
00902         if(FALSE==result){
00903             return edk_FAILED;
00904         }
00905         work[n++] = dkcdPATH_SEP;
00906     }
00907 
00908 #endif
00909 
00910     return edk_SUCCEEDED;
00911 }

BOOL WINAPI dkcCreateDirectoryLogic const char *  dir,
const void *  ptr
[static]
 

dkcSJISFileSystem.c780 行で定義されています。

参照先 BOOL.

参照元 dkcCreateDirectory().

00780                                                                            {
00781 #ifdef WIN32
00782      //return (0 == _mkdir( dir ));
00783      return (0 != CreateDirectory(dir,(SECURITY_ATTRIBUTES *)ptr));
00784 #else
00785      return (0 == mkdir( dir ));
00786 #endif
00787 }

BOOL WINAPI dkcCreateZeroByteFile const char *  filename,
BOOL  rewrite
 

引数:
filename[in] ファイル名
rewrite[in] 上書き保存を許可するかどうか? zerobyteのファイルを作る

dkcSJISFileSystem.c1027 行で定義されています。

参照先 BOOL, dkcFileExist(), FALSE, と TRUE.

01028 {
01029     FILE *fp;
01030     int r = FALSE;
01031     if(FALSE==dkcFileExist(filename) || TRUE==rewrite){
01032         fp = fopen(filename,"wb");
01033         if(!fp){
01034             return r;
01035         }
01036         fclose(fp);
01037         r = TRUE;
01038     }
01039     return r;
01040 }

int WINAPI dkcCurrentDirectoryConcatenate char *  dest,
size_t  dsize,
const char *  src
 

引数:
dest[out] バッファへのポインタ
dsize[in] destのサイズ
src[in] ファイルの文字列 無条件でsrcに入れた文字列をカレントディレクトリ+srcとしてdestに出力する。
覚え書き:
dsizeがdkcdMAXPATH_LEN以下だと失敗する。
戻り値:
edk_SUCCEEDEDで成功

dkcSJISFileSystem.c165 行で定義されています。

参照先 dkcDirectoryConcatenate(), dkcdMAXPATH_LEN, dkcGetCurrentDirectory(), と dkcmNOT_ASSERT.

参照元 dkcToAbsolutelyPath().

00166 {
00167     //size_t len;
00168     //int point;
00169     
00170     dkcmNOT_ASSERT(dsize <= dkcdMAXPATH_LEN);//<=はNULL文字も含むため。
00171     
00172     dkcGetCurrentDirectory(dest,dsize);
00173     
00174     
00175     return dkcDirectoryConcatenate(dest,strlen(dest),dsize,src);
00176 }

int WINAPI dkcDirectoryConcatenate char *  dest,
size_t  dlen,
size_t  dsize,
const char *  src
 

引数:
dest[in] カレントディレクトリの文字列が入っているバッファへのポインタ
dlen[in] destの文字数
dsize[in] destのサイズ
src[in] 元文字列
戻り値:
dlen + 2 > dsizeだとバッファオーバーフローする可能性があるので失敗する。

dkcSJISFileSystem.c143 行で定義されています。

参照先 dkc_strcat_amap(), dkcmNOT_ASSERT, dkcPushBackPathSep(), と edk_FAILED.

参照元 dkcCurrentDirectoryConcatenate().

00143                                                                                        {
00144     //int point;
00145     //error check
00146     dkcmNOT_ASSERT(dlen + 2 > dsize);
00147     if(dlen + 2 > dsize){
00148         return edk_FAILED;
00149     }
00150     
00151     /*point = dkcSJIS_StrChrSearchTail(dest,dlen,dkcdPATH_SEP);
00152     if(point != -1 && (size_t)point != dlen)
00153     {//path separatorが見つかり、それがdestの最期に無い時
00154         if(!dkcmIS_PATH_SEP(src[0]) )
00155         {//path separatorで無い時
00156             //path 区切り文字を付加してやる。
00157             dest[dlen ] = dkcdPATH_SEP;
00158             dest[dlen + 1] = '\0';//こいつを忘れてはいけない。
00159         }
00160     }*/
00161     dkcPushBackPathSep(dest,dlen,dsize);
00162     return dkc_strcat_amap(dest,dsize,dlen,src,strlen(src));
00163 }

BOOL WINAPI dkcFileCopy const char *  dest,
const char *  src
 

覚え書き:
thread safe ではありません。(気になる方はdkcFileCopyExをお使いください。) 何故ならコピーするファイルがデカいと処理が止まったままになってしまうからです。

dkcSJISFileSystem.c913 行で定義されています。

参照先 BOOL, dkcFileCopyEx(), と FALSE.

00913                                                          {
00914     return dkcFileCopyEx(dest,src,1024 * 64,FALSE);
00915 }

BOOL WINAPI dkcFileCopyEx const char *  dest,
const char *  src,
size_t  inner_buffer_size,
BOOL  bThreadLock
 

引数:
inner_buffer_size[in] 内部のコピーで使うバッファのサイズを設定する。
bThreadLock[in] TRUEだとスレッドをロックする。(大きいファイルの場合は危険)
戻り値:
TRUEだと成功

TODO:
HDのサイズ等を取得してコピーするのが安全かどうかを調べなければならない。 スレッド生成してすぐに処理を返すとか? スレッドをロックするオプションは廃止する。

dkcSJISFileSystem.c917 行で定義されています。

参照先 BOOL, dkcCreateEmptyFile(), dkcFClose(), dkcFileSize(), dkcFOpen(), dkcLoadBinary(), dkcmNOT_ASSERT, dkcSaveBinary(), dkcThreadLock_Lock(), dkcThreadLock_Unlock(), DKUTIL_FAILED, FALSE, NULL, ODS, と TRUE.

参照元 dkcFileCopy().

00919 {
00920     void *buff;
00921     FILE *srcf,*destf;
00922     size_t filesize;//ファイルサイズ
00923     size_t readed;//読み込んだデータ
00924     size_t count;//count
00925     size_t i;
00926     size_t rest;//残り
00927     int result = FALSE;//戻り値
00928 
00929     if(NULL==dest || NULL==src) return FALSE;
00930     if(inner_buffer_size <= 1024){
00931         inner_buffer_size = 1024;
00932     }
00933 
00934     //バッファの準備
00935     buff = malloc(inner_buffer_size);
00936     if(NULL==buff){
00937         inner_buffer_size = 1024 * 256;
00938         buff = malloc(inner_buffer_size);
00939         if(NULL==buff)
00940             return FALSE;
00941     }
00942     //thread lock
00943     if(bThreadLock){
00944         dkcThreadLock_Lock();
00945     }
00946     //ちっちゃい場合
00947     filesize = dkcFileSize(src);
00948     for(;;)
00949     {//non loop 
00950         if(0 == filesize)
00951         {//ファイルサイズが0の場合
00952             dkcCreateEmptyFile(dest);
00953             break;
00954         }
00955         if(filesize < inner_buffer_size)
00956         {//ファイルサイズがバッファに収まってしまう場合。
00957             if(DKUTIL_FAILED(dkcLoadBinary(buff,filesize,src,&readed)))
00958             {
00959                 goto Error;
00960             }
00961 #   ifdef DEBUG
00962             if(readed != filesize){
00963                 ODS("readed != filesize why?\n");
00964             }
00965 #   endif
00966             dkcSaveBinary(buff,filesize,dest);
00967             break;
00968         }
00969         //バッファを使わなければコピーできない場合。
00970 
00971         srcf = dkcFOpen(src,"rb");
00972         if(NULL==srcf) goto Error;
00973         destf = dkcFOpen(dest,"wb");
00974         if(NULL==destf) goto Error;
00975 
00976         //ループする回数を計算
00977         count = filesize / inner_buffer_size;
00978 
00979         for(i=0;i<count;i++){
00980             dkcmNOT_ASSERT(1 != fread(buff,inner_buffer_size,1,srcf));
00981             dkcmNOT_ASSERT(1 != fwrite(buff,inner_buffer_size,1,destf));
00982         }
00983 
00984         rest = filesize - (count * inner_buffer_size);
00985 
00986         //残りを出力
00987         dkcmNOT_ASSERT(rest != fread(buff,1,rest,srcf));
00988         dkcmNOT_ASSERT(rest != fwrite(buff,1,rest,destf));
00989 
00990         //close
00991         dkcFClose(&srcf);
00992         dkcFClose(&destf);
00993 
00994         break;
00995     }//end of for
00996 
00997 
00998     result = TRUE;
00999 Error:
01000     if(bThreadLock){
01001         dkcThreadLock_Unlock();
01002     }
01003     if(buff){
01004         free(buff);buff=NULL;
01005     }
01006     return result;
01007 }

BOOL WINAPI dkcFileExist const char *  filename  ) 
 

戻り値:
TRUEだとファイルが存在する

dkcSJISFileSystem.c719 行で定義されています。

参照先 BOOL, FALSE, と TRUE.

参照元 dkcCreateZeroByteFile(), と dkcIsEffectivePath().

00719                                               {
00720     struct stat s;
00721     if(!filename) return FALSE;
00722     return (stat(filename,&s)==0) ? TRUE : FALSE;
00723 }

BOOL WINAPI dkcFileRemove const char *  filename  ) 
 

ファイルを削除する。

戻り値:
削除できたらTRUE
引数:
filename[in] ファイル名

dkcSJISFileSystem.c1009 行で定義されています。

参照先 BOOL.

01010 {
01011 #ifdef WIN32
01012     return (0 != DeleteFile(filename));
01013     //return (0==remove(filename));
01014 #else
01015     return (0==remove(filename));
01016 #endif
01017 }

BOOL WINAPI dkcFileRename const char *  oldname,
const char *  newname
 

引数:
oldname[in] 古い名前へのポインタ
newname[in] 新しい名前へのポインタ

dkcSJISFileSystem.c1019 行で定義されています。

参照先 BOOL.

01019                                                                   {
01020 #ifdef WIN32
01021     return (0==rename(oldname,newname));
01022 #else
01023     return (0==rename(oldname,newname));
01024 #endif
01025 }

UINT WINAPI dkcFileSize const char *  filename  ) 
 

戻り値:
0だとファイルサイズが0 または 内部エラー また はファイルが存在しない

dkcSJISFileSystem.c725 行で定義されています。

参照元 dkcAllocDeserialize(), と dkcFileCopyEx().

00725                                              {
00726     struct stat s;//s
00727     if(!filename) return 0;
00728   return (stat(filename,&s)==0) ? (UINT)s.st_size : 0;
00729 }

int WINAPI dkcFindClose DKC_FINDFILE ptr  ) 
 

FindClose()

参照:
dkcFindFirstFile()

dkcSJISFileSystem.c1421 行で定義されています。

参照先 DKC_FINDFILE, edk_FAILED, edk_SUCCEEDED, dkc_FindFile::mDirent, dkc_FindFile::mHandle, と NULL.

01422 {
01423 #ifdef WIN32
01424     if(INVALID_HANDLE_VALUE == ptr->mHandle){
01425         return edk_FAILED;
01426     }
01427     FindClose(ptr->mHandle);
01428     ptr->mHandle = INVALID_HANDLE_VALUE;//しっかりリセット
01429 #else
01430     if(0 == ptr->mHandle){
01431         return edk_FAILED;
01432     }
01433     closedir(ptr->mHandle);
01434     ptr->mHandle = 0;//しっかりリセット
01435     ptr->mDirent = NULL;
01436 #endif
01437 
01438     return edk_SUCCEEDED;
01439 
01440 }

int WINAPI dkcFindFileGetFileName DKC_FINDFILE ptr,
char *  buff,
size_t  buffsize
 

dkcSJISFileSystem.c1442 行で定義されています。

参照先 DKC_FINDFILE, dkc_strcpy(), edk_FAILED, edk_LogicError, dkc_FindFile::mDirent, と NULL.

01443 {
01444     int r;
01445     size_t len;
01446 #ifdef WIN32
01447     len = strlen(ptr->mFindData.cFileName);
01448     if(0 == len) return edk_FAILED;
01449     r = dkc_strcpy(buff,buffsize,ptr->mFindData.cFileName,len);
01450 #else
01451     if(NULL==ptr->mDirent)
01452     {//呼び出しが間違っているよ^^;
01453         return edk_LogicError;
01454     }
01455     len = strlen(ptr->mDirent.d_name);
01456     if(0 == len) return edk_FAILED;
01457     r = dkc_strcpy(buff,buffsize,ptr->mDirent.d_name,len);
01458 #endif
01459     return r;
01460 }

BOOL WINAPI dkcFindFileIsDot DKC_FINDFILE ptr  ) 
 

dkcSJISFileSystem.c1478 行で定義されています。

参照先 BOOL, DKC_FINDFILE, と strcmp().

01478                                                {
01479 #ifdef WIN32
01480     return (
01481         strcmp(ptr->mFindData.cFileName,"..") == 0 || 
01482         strcmp(ptr->mFindData.cFileName,".") == 0
01483     );
01484 #else
01485     
01486 
01487 #endif
01488 }

BOOL WINAPI dkcFindFileIsFolder DKC_FINDFILE ptr  ) 
 

dkcSJISFileSystem.c1462 行で定義されています。

参照先 BOOL, DKC_FINDFILE, と strcmp().

01462                                                   {
01463 
01464 
01465 #ifdef WIN32
01466     return (
01467             ptr->mFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
01468             && strcmp(ptr->mFindData.cFileName,"..")!=0 
01469             && strcmp(ptr->mFindData.cFileName,".")!=0
01470             );
01471 #else
01472 
01473 
01474 #endif
01475 }

BOOL WINAPI dkcFindFileIsNormalFile DKC_FINDFILE ptr  ) 
 

dkcSJISFileSystem.c1490 行で定義されています。

参照先 BOOL, と DKC_FINDFILE.

01491 {
01492 #ifdef WIN32
01493     return (ptr->mFindData.dwFileAttributes & FILE_ATTRIBUTE_NORMAL);
01494 #else
01495 
01496 #endif
01497 }

BOOL WINAPI dkcFindFileIsReadOnly DKC_FINDFILE ptr  ) 
 

dkcSJISFileSystem.c1499 行で定義されています。

参照先 BOOL, と DKC_FINDFILE.

01499                                                     {
01500 #ifdef WIN32
01501     return (ptr->mFindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY);
01502 #else
01503 
01504 #endif
01505 }

void WINAPI dkcFindFileSize DKC_FINDFILE ptr,
ULONG *  High,
ULONG *  Low
 

dkcSJISFileSystem.c1506 行で定義されています。

参照先 DKC_FINDFILE.

01506                                                                      {
01507 #ifdef WIN32
01508     *High = ptr->mFindData.nFileSizeHigh;
01509     *Low = ptr->mFindData.nFileSizeLow;
01510 #else
01511 
01512 #endif
01513 
01514 }

int WINAPI dkcFindFirstFile DKC_FINDFILE ptr,
const char *  target
 

Windowsで言うFindFirstFile()のラッパー UNIXやLINUXでも動くかも?

dkcSJISFileSystem.c1373 行で定義されています。

参照先 DKC_FINDFILE, edk_FAILED, edk_SUCCEEDED, dkc_FindFile::mHandle, と NULL.

01373                                                                  {
01374 #ifdef WIN32
01375     ptr->mHandle = 
01376         FindFirstFileA( target, &(ptr->mFindData) );
01377     if(ptr->mHandle == INVALID_HANDLE_VALUE){
01378         return edk_FAILED;
01379     }
01380 #else
01381     ptr->mHandle = opendir( target );
01382     if(NULL==ptr->mHandle){
01383         return edk_FAILED;
01384     }
01385 
01386 #endif
01387     return edk_SUCCEEDED;
01388 }

int WINAPI dkcFindNextFile DKC_FINDFILE ptr  ) 
 

FindNextFile()

参照:
dkcFindFirstFile()

dkcSJISFileSystem.c1390 行で定義されています。

参照先 DKC_FINDFILE, edk_EndProcess, edk_FAILED, edk_SUCCEEDED, dkc_FindFile::mDirent, と dkc_FindFile::mHandle.

01390                                              {
01391 #   ifdef WIN32
01392     if ( 0 == FindNextFileA( ptr->mHandle, &(ptr->mFindData) ))
01393     {
01394         if ( GetLastError() == ERROR_NO_MORE_FILES )
01395         {//なんだ、もう無いじゃん。
01396             return edk_EndProcess;
01397         }
01398         else//最悪のパターン
01399         {
01400             return edk_FAILED;
01401         }
01402     }
01403 #   else
01404   errno = 0;
01405     ptr->mDirent = readdir( ptr->mHandle );
01406   if ( ptr->mDirent == 0 )
01407   {
01408     if ( errno == 0 )
01409     {//もう無いよ^^;
01410             return edk_EndProcess;
01411     }
01412         else//最悪のパターン
01413         {
01414             return edk_FAILED;
01415         }
01416   }
01417 #   endif
01418     return edk_SUCCEEDED;
01419 }

int WINAPI dkcFreeFindFile DKC_FINDFILE **  ptr  ) 
 

dkcSJISFileSystem.c1365 行で定義されています。

参照先 DKC_FINDFILE, dkcFree(), edk_FAILED, と NULL.

01365                                               {
01366     if(NULL==ptr /*|| *ptr==NULL*/){
01367         return edk_FAILED;
01368     }
01369     return dkcFree(ptr);
01370 }

int WINAPI dkcFreePathString DKC_PATHSTRING **  ptr  ) 
 

dkcSJISFileSystem.c357 行で定義されています。

参照先 DKC_PATHSTRING, dkcFree(), dkcFreeString(), edk_ArgumentException, と NULL.

00358 {
00359     if(NULL==ptr || NULL==*ptr){
00360         return edk_ArgumentException;
00361     }
00362     dkcFreeString(&((*ptr)->mString));
00363     return dkcFree(ptr);
00364 }

BOOL WINAPI dkcGetCurrentDirectory char *  buff,
size_t  size
 

戻り値:
TRUEで成功

dkcSJISFileSystem.c746 行で定義されています。

参照先 BOOL, dkc_strcpy(), dkcdMAXPATH_BUFFER, DKUTIL_SUCCEEDED, FALSE, NULL, と TRUE.

参照元 dkcCurrentDirectoryConcatenate().

00746                                                           {
00747 #   ifdef WIN32
00748     if(0==GetCurrentDirectory(size,buff)){
00749         return FALSE;
00750     }
00751     /*if(NULL==_getcwd(path,dkcdMAXPATH_BUFFER)){
00752         return FALSE;
00753     }*/
00754 #else
00755   if(NULL==getcwd(buff,size))
00756         return FALSE;
00757 #endif
00758     return TRUE;
00759 
00760 #if 0
00761     /* どういう実装になっているか分からないのでとりあえず+1 */
00762     char path[dkcdMAXPATH_BUFFER + 1];
00763     size_t len;
00764 #   ifdef WIN32
00765     if(0==GetCurrentDirectory(size,path)){
00766         return FALSE;
00767     }
00768     /*if(NULL==_getcwd(path,dkcdMAXPATH_BUFFER)){
00769         return FALSE;
00770     }*/
00771 #else
00772   if(NULL==getcwd(path,dkcdMAXPATH_BUFFER))
00773         return FALSE;
00774 #endif
00775     len = strlen(path);
00776     return DKUTIL_SUCCEEDED(dkc_strcpy(buff,size,path,len));
00777 #endif //end of if 0
00778 }

char* WINAPI dkcGetFileExtension const char *  PathName  ) 
 

パス名から、拡張子の開始位置を取得する ファイル名の末尾からファイル名の最後の '.' までを、拡張子と判断する

戻り値:
NULLだと拡張子は判別不能。また、与えられた文字列の最初のアドレスが返された場合も判別不能
覚え書き:
SJIS対策済み?

dkcSJISFileSystem.c67 行で定義されています。

参照先 isJMS(), と strtail().

00068 {
00069 
00070     char *p;
00071     char *get_tail;
00072 
00073     get_tail = strtail( PathName );
00074     for( p = get_tail; p >= PathName; p-- ) // 文字列の最後から最初まで
00075     {
00076         if ( ('\\'==*p) && !isJMS(PathName,p-PathName) )
00077             return get_tail; // ファイル名はここまで
00078 
00079         if ( '.' == *p )
00080             return p+1; // '.' を発見
00081     }
00082     return get_tail; // 拡張子なし
00083 }//GetFileExtension

BOOL WINAPI dkcIsAbsolutelyPath const char *  path  ) 
 

戻り値:
パスが絶対パスだったらTRUE

dkcSJISFileSystem.c113 行で定義されています。

参照先 BOOL, と dkcIsRelativityPath().

00114 {
00115     return !dkcIsRelativityPath(path);
00116 }

BOOL WINAPI dkcIsEffectivePath const char *  path,
size_t  size
 

戻り値:
pathが存在して、有効なパス名だったらTRUE

dkcSJISFileSystem.c86 行で定義されています。

参照先 BOOL, dkcdMAXPATH_BUFFER, dkcFileExist(), dkcIsNativePathString(), dkcToAbsolutelyPath(), DKUTIL_FAILED, FALSE, と TRUE.

参照元 dkcSetCurrentDirectory().

00086                                                             {
00087     char dest[dkcdMAXPATH_BUFFER];
00088     const size_t dsize = dkcdMAXPATH_BUFFER;
00089 
00090     //相対パス?絶対パス?でもそのファイルが存在するか?
00091     if(FALSE==dkcFileExist(path)){
00092         return FALSE;
00093     }
00094     //pathを正規化
00095     if(DKUTIL_FAILED(dkcToAbsolutelyPath(dest,dsize,path,size))){
00096         return FALSE;
00097     }
00098     //正規化して、ファイルに使用して良い文字列を使っているか?
00099     if(FALSE==dkcIsNativePathString(dest,strlen(dest))){
00100         return FALSE;
00101     }
00102 
00103     return TRUE;
00104 }

BOOL WINAPI dkcIsRelativityPath const char *  path  ) 
 

戻り値:
パスが相対パスだったらTRUE

dkcSJISFileSystem.c105 行で定義されています。

参照先 BOOL, dkcmNOT_ASSERT, dkcSJIS_StrChrSearch(), FALSE, NULL, と TRUE.

参照元 dkcIsAbsolutelyPath(), と dkcToAbsolutelyPath().

00106 {
00107     int point;
00108     dkcmNOT_ASSERT(NULL==path);
00109     point = dkcSJIS_StrChrSearch(path,':');
00110     if(point == -1) return TRUE;
00111     return FALSE;
00112 }

DKC_EXTERN int WINAPI dkcIsShiftJIS const char *  str,
int  nPos
 

文字列 str の str[nPos] について、

戻り値:
0 …… 1バイト文字
1 …… 2バイト文字の一部(第1バイト)
2 …… 2バイト文字の一部(第2バイト)

シフトJIS文字列の判定をします。

dkcSJISFileSystem.c36 行で定義されています。

参照先 DKC_EXTERN, jms1(), と jms2().

参照元 isJMS().

00037 {
00038     int i;
00039     int state; // { 0, 1, 2 } = { 1バイト文字, 2バイト文字の第1バイト, 2バイト文字の第2バイト }
00040 
00041     state = 0;
00042     for( i = 0; str[i] != '\0'; i++ )
00043     {
00044         if      ( ( state == 0 ) && ( jms1( str[i] ) ) ) state = 1; // 0 -> 1
00045         else if ( ( state == 1 ) && ( jms2( str[i] ) ) ) state = 2; // 1 -> 2
00046         else if ( ( state == 2 ) && ( jms1( str[i] ) ) ) state = 1; // 2 -> 1
00047         else                                             state = 0; // 2 -> 0, その他
00048 
00049         // str[nPos] での状態を返す。
00050         if ( i == nPos ) return state;
00051     }
00052     return 0;
00053 }

BOOL WINAPI dkcIsTailPathSep const char *  src,
size_t  dlen
 

srcの一番後ろににがついていたらTRUE

\

dkcSJISFileSystem.c119 行で定義されています。

参照先 BOOL, dkcSJIS_SearchPathSepLast(), FALSE, と TRUE.

参照元 dkcPathStringElementInsert_Logic(), dkcPathStringNormalizeConcatenateLogic(), と dkcPushBackPathSep().

00119                                                          {
00120     int point;
00121     point = dkcSJIS_SearchPathSepLast(src);
00122     //if(point != -1 && (size_t)point == dlen - 1/*&& (size_t)point != dlen*/)
00123     if((size_t)point == dlen - 1)
00124     {   //みつかった。
00125         return TRUE;
00126     }
00127     //みつからない。
00128     return FALSE;
00129 }

int WINAPI dkcPathStringConcatenate DKC_PATHSTRING ptr,
const char *  buff,
size_t  size
 

パスを正規化して繋げる。

dkcSJISFileSystem.c637 行で定義されています。

参照先 DKC_PATHSTRING, dkcdMAXPATH, dkcmNOT_ASSERT, dkcPathStringCopy(), dkcPathStringNormalizeConcatenateLogic(), edk_FAILED, dkc_String::mByteSize, と dkc_PathString::mString.

00638 {
00639     int result;
00640 
00641     dkcmNOT_ASSERT(ptr->mString->mByteSize + size >= dkcdMAXPATH);
00642     if(ptr->mString->mByteSize + size >= dkcdMAXPATH)
00643     {//これ以上は入れられない。
00644         return edk_FAILED;
00645     }
00646 
00647     if(ptr->mString->mByteSize)
00648     {//すでに入っているものがある。
00649         result = dkcPathStringNormalizeConcatenateLogic(ptr,buff,size);
00650     }
00651     else
00652     {//何も無い時はこちらで
00653         result =  dkcPathStringCopy(ptr,buff,size);
00654     }
00655     //return dkcPathStringNormalizeInsertLogic(ptr,buff,size,dkcStringConcatenate); 
00656     return result;
00657 }

int WINAPI dkcPathStringCopy DKC_PATHSTRING ptr,
const char *  buff,
size_t  size
 

パスを正規化して入れる。

dkcSJISFileSystem.c598 行で定義されています。

参照先 DKC_PATHSTRING, dkcdMAXPATH, dkcmNOT_ASSERT, dkcPathStringNormalizeCopyLogic(), dkcStringCopy(), edk_FAILED, dkc_String::mByteSize, と dkc_PathString::mString.

参照元 dkcAllocPathString(), dkcPathStringConcatenate(), と dkcPathStringNormalizeConcatenateLogic().

00599 {
00600     
00601     dkcmNOT_ASSERT(ptr->mString->mByteSize + size >= dkcdMAXPATH);
00602     if(ptr->mString->mByteSize + size >= dkcdMAXPATH)
00603     {//これ以上は入れられない。
00604         return edk_FAILED;
00605     }
00606     return dkcPathStringNormalizeCopyLogic(ptr,buff,size,dkcStringCopy);
00607 }

int WINAPI dkcPathStringDevideBegin DKC_PATHSTRING ptr,
char *  buff,
size_t  size
 

dkcSJISFileSystem.c380 行で定義されています。

参照先 DKC_PATHSTRING, dkcPathStringDevideBegin_Logic(), と dkc_PathString::mIterateCount.

00381 {
00382     return dkcPathStringDevideBegin_Logic(ptr,&ptr->mIterateCount,buff,size);
00383 }

int WINAPI dkcPathStringDevideBegin_Logic DKC_PATHSTRING ptr,
size_t *  count,
char *  buff,
size_t  size
 

dkcPathStringDevideBegin()

dkcSJISFileSystem.c396 行で定義されています。

参照先 DKC_PATHSTRING, dkc_strcpy(), dkcmNOT_ASSERT, dkcPathStringPointer(), dkcSJIS_StrChrSearch(), DKUTIL_FAILED, edk_BufferOverFlow, edk_EndProcess, edk_FAILED, edk_SUCCEEDED, と NULL.

参照元 dkcPathStringDevideBegin().

00397 {
00398     int i,point;
00399     const char *p;
00400     dkcmNOT_ASSERT(NULL==ptr || NULL==buff || 0==size);
00401     
00402     //len = dkcPathStringSize(ptr);
00403     p = dkcPathStringPointer(ptr);
00404 
00405     point = dkcSJIS_StrChrSearch(p,'\\');
00406     if(-1==point){return edk_EndProcess;}
00407 
00408     for(i=0;i<point;i++){//drive指定のものがあるかどうか。
00409         if(':'==p[i]){
00410             if(DKUTIL_FAILED(dkc_strcpy(
00411                 buff,size,p,(size_t)i//-1
00412                 )))
00413             {
00414                 return edk_BufferOverFlow;
00415             }
00416             point = dkcSJIS_StrChrSearch(&p[i],'\\');//次の物を見つける。
00417             //(まぁ:の次は\\と言う事が決まっているけど、いちおう。
00418             *count = (size_t)i + point + 1;//次に始めるのは
00419             return edk_SUCCEEDED;
00420         }
00421     }
00422     if(DKUTIL_FAILED(dkc_strcpy(
00423         buff,size,p,(size_t)point-1
00424         )))
00425     {
00426         return edk_FAILED;
00427     }
00428     *count = (size_t)point + 1;//次に始めるのは
00429     return edk_SUCCEEDED;
00430 }

void WINAPI dkcPathStringDevideEnd DKC_PATHSTRING ptr  ) 
 

dkcSJISFileSystem.c391 行で定義されています。

参照先 DKC_PATHSTRING, dkcPathStringDevideEnd_Logic(), と dkc_PathString::mIterateCount.

00391                                                        {
00392     dkcPathStringDevideEnd_Logic(&ptr->mIterateCount);
00393 }

void WINAPI dkcPathStringDevideEnd_Logic size_t *  count  ) 
 

dkcPathStringDevideEnd()

dkcSJISFileSystem.c469 行で定義されています。

参照元 dkcPathStringDevideEnd().

00469                                                        {
00470     *count = 0;
00471 }

int WINAPI dkcPathStringDevideNext DKC_PATHSTRING ,
char *  buff,
size_t  size
 

戻り値:
edk_EndProcessが返ってきたらdkcPathStringDevideEnd()を呼び出して終了する

dkcSJISFileSystem.c385 行で定義されています。

参照先 DKC_PATHSTRING, dkcPathStringDevideNext_Logic(), と dkc_PathString::mIterateCount.

00386 {
00387     return dkcPathStringDevideNext_Logic(ptr,&ptr->mIterateCount,buff,size);
00388 
00389 }

int WINAPI dkcPathStringDevideNext_Logic DKC_PATHSTRING ptr,
size_t *  count,
char *  buff,
size_t  size
 

dkcPathStringDevideNext()

dkcSJISFileSystem.c432 行で定義されています。

参照先 DKC_PATHSTRING, dkc_strcpy(), dkcPathStringPointer(), dkcSJIS_StrChrSearch(), dkcStringSize(), DKUTIL_FAILED, edk_EndProcess, edk_FAILED, edk_SUCCEEDED, と dkc_PathString::mString.

参照元 dkcPathStringDevideNext().

00433 {
00434     int point;
00435     const char *p;
00436     size_t len;
00437     //len = dkcPathStringSize(ptr);
00438     p = dkcPathStringPointer(ptr);
00439     len = dkcStringSize(ptr->mString);
00440     if(len <= *count)
00441     {//もうこの関数を呼び出すのは終わりだっちゅうに!!
00442         return edk_EndProcess;
00443     }
00444     point = dkcSJIS_StrChrSearch(&p[*count],'\\');
00445     if(-1==point)
00446     {//最後まで来ちまった。
00447 
00448     
00449         len -= *count;
00450         if(DKUTIL_FAILED(dkc_strcpy(//残り物を全部コピー
00451             buff,size,&p[*count],len
00452         )))
00453         {
00454             return edk_FAILED;
00455         }
00456         *count += len;
00457         return edk_SUCCEEDED;//out
00458     }
00459     if(DKUTIL_FAILED(dkc_strcpy(
00460         buff,size,&p[*count],(size_t)point
00461         )))
00462     {
00463         return edk_FAILED;
00464     }
00465     *count += (size_t)point + 1;//次に始めるのは
00466     return edk_SUCCEEDED;//out
00467 }

int WINAPI dkcPathStringElementErase_Logic DKC_PATHSTRING ptr,
size_t  count
 

dkcSJISFileSystem.c500 行で定義されています。

参照先 DKC_PATHSTRING, dkcPathStringPointer(), dkcPathStringSize(), dkcSJIS_SearchPathSep(), dkcStringErase(), と dkc_PathString::mString.

00502 {
00503     const char *p = dkcPathStringPointer(ptr);
00504     int endlen = dkcSJIS_SearchPathSep(&p[count]);
00505 
00506     if(-1==endlen){
00507         endlen = dkcPathStringSize(ptr);
00508         endlen = endlen - count;
00509     }else{
00510         //endlen;//マイナスしておく \\をReplaceしないため
00511     }
00512     return dkcStringErase(ptr->mString,count - 1,(size_t)endlen + 1);//count -1は前の\\を消すためendlen + 1は-1した為
00513 }

int WINAPI dkcPathStringElementInsert_Logic DKC_PATHSTRING ptr,
size_t  count,
const char *  src,
size_t  len
 

パスの要素を挿入する。(正規化はしない lenは文字数

dkcSJISFileSystem.c473 行で定義されています。

参照先 DKC_PATHSTRING, dkcIsNativePathString(), dkcIsTailPathSep(), dkcPushBackPathSep(), dkcStringInsert(), edk_FAILED, edk_OutOfMemory, FALSE, と dkc_PathString::mString.

00475 {
00476     int r;
00477     size_t size = len + 5;
00478     
00479     char *p;
00480     if(len==0 || FALSE==dkcIsNativePathString(src,len))
00481     {
00482         return edk_FAILED;
00483     }
00484     if(FALSE==dkcIsTailPathSep(src,len))//後ろにPathSeparatorが無い!!
00485     {
00486         p = malloc(size);
00487     
00488         if(!p) return edk_OutOfMemory;
00489         strcpy(p,src);//あまり使いたくないけどすでにバッファは保証されているのでstrcpy
00490         dkcPushBackPathSep(p,len,size);
00491 
00492         r = dkcStringInsert(ptr->mString,count,p,strlen(p));
00493         free(p);
00494     }else{
00495         r = dkcStringInsert(ptr->mString,count,src,len);
00496     }
00497     return r;
00498 }

int WINAPI dkcPathStringElementReplace_Logic DKC_PATHSTRING ptr,
size_t  count,
const char *  src,
size_t  len
 

パスの要素を置換する。(正規化はしない lenは文字数

dkcSJISFileSystem.c517 行で定義されています。

参照先 DKC_PATHSTRING, dkcIsNativePathString(), dkcPathStringPointer(), dkcPathStringSize(), dkcSJIS_SearchPathSep(), dkcStringReplace(), edk_FAILED, FALSE, と dkc_PathString::mString.

00519 {
00520     const char *p = dkcPathStringPointer(ptr);
00521     int endlen;
00522     if(len==0 || FALSE==dkcIsNativePathString(src,len))
00523     {
00524         return edk_FAILED;
00525     }
00526     endlen = dkcSJIS_SearchPathSep(&p[count]);//countから検索している
00527     if(-1==endlen){
00528         endlen = dkcPathStringSize(ptr);
00529         endlen = endlen - count;
00530     }else{
00531         if(0 != endlen)
00532             endlen--;//マイナスしておく \\をReplaceしないため
00533     }
00534     return dkcStringReplace(ptr->mString,count,count + endlen,src,len);
00535     /*
00536     size_t size = len + 5;
00537     int r;
00538 //  int point;
00539     const char *pointer;
00540     char *p ;
00541     if(FALSE==dkcIsTailPathSep(src,len))//後ろにPathSeparatorが無い!!
00542     {
00543         //文字列をちと変更
00544         p = malloc(size);
00545         if(!p) return edk_OutOfMemory;
00546         strcpy(p,src);
00547         r = dkcPushBackPathSep(p,len,size);
00548     }else{
00549         p = (char *)src;
00550     }
00551     pointer = dkcPathStringPointer(ptr);
00552     //countから調べる。
00553     dkcSJIS_SearchPathSep(&pointer[count]);
00554     */
00555     
00556 
00557 
00558     
00559 
00560 }

int WINAPI dkcPathStringGetDirectory DKC_PATHSTRING ,
char *  buff,
size_t  size
 

覚え書き:
取得した文字列の最後尾に\を付加させる。

dkcSJISFileSystem.c702 行で定義されています。

参照先 DKC_PATHSTRING, dkc_strcpy(), dkcdPATH_SEP, dkcSJIS_StrChrSearchTail(), dkcStringPointer(), dkcStringSize(), edk_FAILED, と dkc_PathString::mString.

00703 {
00704     const char *p = dkcStringPointer(ptr->mString);
00705     int point = dkcSJIS_StrChrSearchTail(p,strlen(p),dkcdPATH_SEP);
00706     size_t len = dkcStringSize(ptr->mString);
00707     //if(point - 1 <= 0) return edk_FAILED;
00708     if(point < 0) return edk_FAILED;
00709     if((size_t)(point + 1) > len) return edk_FAILED;
00710     //if((size_t)point == len) return edk_FAILED;//ファイル名が無い。
00711     return dkc_strcpy(buff,size,p,point);//\\も含める。
00712 
00713 }

int WINAPI dkcPathStringGetDrive DKC_PATHSTRING ptr,
char *  buff,
size_t  size
 

dkcSJISFileSystem.c661 行で定義されています。

参照先 DKC_PATHSTRING, dkc_strcpy(), dkcSJIS_StrChrSearch(), dkcStringPointer(), edk_Not_Found, と dkc_PathString::mString.

00661                                                                             {
00662     const char *p = dkcStringPointer(ptr->mString);
00663     int point = dkcSJIS_StrChrSearch(p,':');
00664     if(-1 == point) return edk_Not_Found;//見つからない。
00665     //return dkc_memcpy(buff,size,p,(size_t)point - 1);
00666     return dkc_strcpy(buff,size,p,(size_t)1);//driveなら1文字で十分だよね^^;
00667 }

int WINAPI dkcPathStringGetFileExtension DKC_PATHSTRING ptr,
char *  buff,
size_t  size
 

dkcSJISFileSystem.c669 行で定義されています。

参照先 DKC_PATHSTRING, dkc_strcpy(), dkcSJIS_SearchPathSep(), dkcSJIS_StrChrSearchLast(), dkcStringPointer(), dkcStringSize(), edk_FAILED, edk_Not_Found, と dkc_PathString::mString.

00670 {
00671     int point2;
00672     size_t len;
00673     const char *p = dkcStringPointer(ptr->mString);
00674     int point = dkcSJIS_StrChrSearchLast(p,'.');
00675 
00676     if(point < 0) return edk_Not_Found;//見つからない。
00677     
00678     point2 = dkcSJIS_SearchPathSep(&p[point]);
00679     if(point < point2){//C:\ok.OK\folderのような状況になっている。
00680         return edk_Not_Found;
00681     }
00682     len = dkcStringSize(ptr->mString);
00683     //if(point - 1 <= 0) return edk_FAILED;
00684 
00685     if((size_t)(point + 1) > len) return edk_FAILED;//Logicalなエラー??
00686     return dkc_strcpy(buff,size,&p[point + 1],(size_t)len - (size_t)point );
00687 
00688 }

int WINAPI dkcPathStringGetFileName DKC_PATHSTRING ptr,
char *  buff,
size_t  size
 

dkcSJISFileSystem.c690 行で定義されています。

参照先 DKC_PATHSTRING, dkc_strcpy(), dkcdPATH_SEP, dkcSJIS_StrChrSearchLast(), dkcStringPointer(), dkcStringSize(), edk_FAILED, と dkc_PathString::mString.

00691 {
00692     const char *p = dkcStringPointer(ptr->mString);
00693     int point = dkcSJIS_StrChrSearchLast(p,dkcdPATH_SEP);
00694     size_t len = dkcStringSize(ptr->mString);
00695     //if(point - 1 <= 0) return edk_FAILED;
00696     if(point < 0) return edk_FAILED;
00697     if((size_t)(point + 1) > len) return edk_FAILED;
00698     if((size_t)point == len) return edk_FAILED;//ファイル名が無い。
00699     return dkc_strcpy(buff,size,&p[point + 1],(size_t)len - (size_t)point );
00700 }

int WINAPI dkcPathStringNormalizeConcatenateLogic DKC_PATHSTRING ptr,
const char *  buff,
size_t  size
 

dkcSJISFileSystem.c609 行で定義されています。

参照先 DKC_PATHSTRING, dkcdMAXPATH_BUFFER, dkcdPATH_SEP_STR, dkcIsTailPathSep(), dkcPathStringCopy(), dkcPathStringPointer(), dkcPathStringSize(), dkcStringConcatenate(), DKUTIL_FAILED, edk_FAILED, FALSE, dkc_PathString::mString, と ToAbsolutelyLogic().

参照元 dkcPathStringConcatenate().

00611 {
00612     char dest[dkcdMAXPATH_BUFFER];
00613 
00614 
00615     if(FALSE==dkcIsTailPathSep(dkcPathStringPointer(ptr),dkcPathStringSize(ptr)))
00616     {
00617         dkcStringConcatenate(ptr->mString,dkcdPATH_SEP_STR,1);
00618     }
00619     dkcStringConcatenate(ptr->mString,buff,size);
00620     
00621     size = dkcPathStringSize(ptr) + 1;
00622 
00623     //p = malloc(dkcPathStringSize(ptr));
00624     //if(!p) return edk_OutOfMemory;
00625 
00626 
00627     if(DKUTIL_FAILED(
00628         ToAbsolutelyLogic(dest,sizeof(dest),dkcPathStringPointer(ptr))
00629         )){
00630         return edk_FAILED;
00631     }
00632 
00633     return dkcPathStringCopy(ptr,dest,strlen(dest));
00634 }

int dkcPathStringNormalizeCopyLogic DKC_PATHSTRING ptr,
const char *  buff,
size_t  size,
int(WINAPI *function__  )(DKC_STRING *, const char *, size_t)
[static]
 

dkcSJISFileSystem.c567 行で定義されています。

参照先 DKC_PATHSTRING, DKC_STRING, dkcdMAXPATH_BUFFER, dkcmNOT_ASSERT, dkcToAbsolutelyPath(), DKUTIL_FAILED, dkc_PathString::mString, と NULL.

参照元 dkcPathStringCopy().

00569 {
00570     //const size_t bsize = dkcdMAXPATH_BUFFER + 1;
00571     size_t len;
00572     int result;
00573     //char *pb = malloc(bsize);
00574     //if(NULL== pb) return edk_OutOfMemory;
00575     char pb[dkcdMAXPATH_BUFFER];
00576     size_t bsize = sizeof(pb);
00577 
00578     result =    dkcToAbsolutelyPath(pb,bsize,buff,size);
00579     
00580 
00581     len = strlen(pb);
00582 
00583 #   ifdef DEBUG //ありえないよ~エラーチェック
00584     dkcmNOT_ASSERT(DKUTIL_FAILED(result));  
00585     dkcmNOT_ASSERT(len >= bsize);// >=にするのはNULL文字が潰されているかどうか。
00586     dkcmNOT_ASSERT(NULL==function__);
00587 #   endif
00588     if(DKUTIL_FAILED(result)){
00589         goto Error;
00590     }
00591     result = function__(ptr->mString,pb,len);
00592 
00593 Error:
00594     //if(pb){free(pb);pb=NULL;}
00595     return result;
00596 }

const char* WINAPI dkcPathStringPointer const DKC_PATHSTRING p  ) 
 

dkcSJISFileSystem.c372 行で定義されています。

参照先 DKC_PATHSTRING, dkcStringPointer(), と dkc_PathString::mString.

参照元 dkcPathStringDevideBegin_Logic(), dkcPathStringDevideNext_Logic(), dkcPathStringElementErase_Logic(), dkcPathStringElementReplace_Logic(), と dkcPathStringNormalizeConcatenateLogic().

00373 {
00374     return dkcStringPointer(p->mString);
00375 }

size_t WINAPI dkcPathStringSize const DKC_PATHSTRING p  ) 
 

dkcSJISFileSystem.c367 行で定義されています。

参照先 DKC_PATHSTRING, dkcStringSize(), と dkc_PathString::mString.

参照元 dkcPathStringElementErase_Logic(), dkcPathStringElementReplace_Logic(), と dkcPathStringNormalizeConcatenateLogic().

00368 {
00369     return dkcStringSize(p->mString);
00370 }

int WINAPI dkcPushBackPathSep char *  dest,
size_t  dlen,
size_t  size
 

path separatorを挿入する必要があり、挿入出来たらTRUE

引数:
dest[in] バッファ
dlen[in] destの文字数
size[in] destのサイズ
戻り値:
edk_SUCCEEDEDなら成功
edk_OutputBufferWasLostはバッファが足りなかった
その他は入れる必要が無かった。

dkcSJISFileSystem.c131 行で定義されています。

参照先 dkcdPATH_SEP, dkcIsTailPathSep(), edk_EndProcess, edk_OutputBufferWasLost, edk_SUCCEEDED, と FALSE.

参照元 dkcDirectoryConcatenate(), と dkcPathStringElementInsert_Logic().

00131                                                                  {
00132     if(FALSE==dkcIsTailPathSep(dest,dlen)){
00133         if(size < dlen + 2){
00134             return edk_OutputBufferWasLost;//バッファが足らんよ!
00135         }
00136         dest[dlen ] = dkcdPATH_SEP;
00137         dest[dlen + 1] = '\0';//こいつを忘れてはいけない。
00138         return edk_SUCCEEDED;
00139     }
00140     return edk_EndProcess;
00141 }

BOOL WINAPI dkcSetCurrentDirectory const char *  filename  ) 
 

戻り値:
TRUEで成功

dkcSJISFileSystem.c732 行で定義されています。

参照先 BOOL, dkcIsEffectivePath(), dkcmNOT_ASSERT, と FALSE.

00732                                                         {
00733 #ifdef DEBUG
00734     size_t len = strlen(filename);
00735     dkcmNOT_ASSERT(0==len || FALSE==dkcIsEffectivePath(filename,len));
00736 #endif
00737 #   ifdef WIN32
00738     return(0 != SetCurrentDirectory(filename));
00739     //return (_chdir(filename)==0);
00740 #   else
00741     return (chdir(filename)==0);
00742 #   endif
00743 }

int WINAPI dkcToAbsolutelyPath char *  dest,
size_t  dsize,
const char *  src,
size_t  ssize
 

パスを正規化(相対パスから絶対パス)する関数

dkcSJISFileSystem.c204 行で定義されています。

参照先 dkcCurrentDirectoryConcatenate(), dkcdMAXPATH_BUFFER, dkcIsRelativityPath(), edk_FAILED, edk_OutOfMemory, MAX_PATH_CHECK, NULL, ToAbsolutelyLogic(), と TRUE.

参照元 dkcIsEffectivePath(), と dkcPathStringNormalizeCopyLogic().

00205 {
00206     char *tp = NULL;
00207     int r;
00208     MAX_PATH_CHECK(dsize);
00209 
00210     
00211     if(NULL==dest) return edk_FAILED;
00212 
00213     if(dkcIsRelativityPath(src)==TRUE)
00214     {//カレントディレクトリを付加する。
00215 
00216         tp = malloc(dkcdMAXPATH_BUFFER);
00217         if(NULL==tp) return edk_OutOfMemory;
00218 
00219         dkcCurrentDirectoryConcatenate(tp,dkcdMAXPATH_BUFFER,src);
00220         r =  ToAbsolutelyLogic(dest,dsize,tp);
00221         free(tp);
00222         return r;
00223 
00224     }
00225     return ToAbsolutelyLogic(dest,dsize,src);
00226 
00227 
00228     
00229     /*
00230     状態繊維
00231     PATH_SEP
00232     .
00233     sjis
00234 
00236     .....
00237     ../../
00238     /././
00239 
00240     */
00241         /*
00242     size_t i,di;
00243 //  size_t j;
00244     int point;
00245     //char prev;
00246     const char *pathsep="\\/";
00247     DKC_SINGLELIST_OBJECT *plo = NULL;
00248     DKC_SINGLELIST *lit = NULL;
00249     
00250     
00251     di = 0;
00252 
00253     if(dsize < ssize){
00254         return edk_ArgumentException;
00255     }
00256     //list確保
00257     plo = dkcAllocSingleListObject(NULL,20);
00258     if(NULL==plo) return edk_FAILED;
00259 
00260     //directoryをパース
00261     for(i=0;;){
00262         point = dkcSJIS_StrChrSearchInStr(&src[i],pathsep);
00263         if(point < 0){
00264             if(i != ssize){
00265                 if(FALSE==plo->push_back(plo,&src[i],size - i)){
00266                     return edk_FAILED;
00267                 }
00268             }
00269             break;
00270         }
00271         
00272         if(FALSE
00273             ==plo->push_back(plo,&src[i],point - 1)//見つかったところまでだから-1
00274             )
00275         {
00276             return edk_FAILED;
00277         }
00278 
00279         i += point;
00280     }
00281 
00282     for(i=0;i<ssize;){
00283 
00284 
00285         if(dkcmIsSJIS1(src[i]) && dkcmIsSJIS2(src[i + 1]))
00286         {//SJIS抜かし
00287             i++;
00288             i++;
00289             continue;
00290         }
00291         // src == //
00292         if(prev==dkcdPATH_SEP && src[i] == dkcdPATH_SEP)
00293         {
00294             i++;
00295             continue;
00296         }
00297         // src == ..
00298         if(prev=='.' && src[i] == '.')
00299         {
00300             while(src[i] != '.') i++;
00301             if(dkcdPATH_SEP==src[i]) i++;
00302             point = dkcSJIS_StrChrSearch(&src[i],dkcdPATH_SEP);
00303 
00304             if(point == -1){
00305                 break;
00306             }
00307             i += point;
00308 
00309             continue;
00310         }
00311 
00312         dest[di] = src[i];
00313         di++;
00314         i++;
00315         prev = src[i];
00316     }
00317 
00318     
00319     return edk_SUCCEEDED;   */
00320 }

DKC_INLINE int isJMS const char *  str,
int  nPos
[static]
 

dkcSJISFileSystem.c54 行で定義されています。

参照先 DKC_INLINE, と dkcIsShiftJIS().

参照元 dkcGetFileExtension().

00054                                                        {
00055     return dkcIsShiftJIS(str,nPos);
00056 }

DKC_INLINE BOOL jms1 int  c  )  [static]
 

dkcSJISFileSystem.c19 行で定義されています。

参照先 BOOL, と DKC_INLINE.

参照元 dkcIsShiftJIS().

00019                                   {
00020     return (((((unsigned char)(c))>=0x81)&&(((unsigned char)(c))<=0x9F))||((((unsigned char)(c))>=0xE0)&&(((unsigned char)(c))<=0xFC)));
00021 }

DKC_INLINE BOOL jms2 int  c  )  [static]
 

dkcSJISFileSystem.c22 行で定義されています。

参照先 BOOL, と DKC_INLINE.

参照元 dkcIsShiftJIS().

00022                                   {
00023     return ((((unsigned char)(c))!=0x7F)&&(((unsigned char)(c))>=0x40)&&(((unsigned char)(c))<=0xFC));
00024 }

DKC_INLINE char* strtail const char *  stringg  )  [static]
 

文字列末尾の文字 '' の位置を返す

dkcSJISFileSystem.c58 行で定義されています。

参照先 DKC_INLINE.

参照元 dkcGetFileExtension().

00059 {
00060     return strchr( stringg, '\0' );
00061 }//strtail

int ToAbsolutelyLogic char *  dest,
size_t  dsize,
const char *  src
[static]
 

dkcSJISFileSystem.c185 行で定義されています。

参照先 edk_FAILED, edk_SUCCEEDED, MAX_PATH_CHECK, と NULL.

参照元 dkcPathStringNormalizeConcatenateLogic(), と dkcToAbsolutelyPath().

00186 {
00187     /*if(dsize < dkcdMAXPATH_BUFFER){//こんなバッファじゃどうなるか分からないよ^^;
00188         return edk_BufferOverFlow;
00189     }*/
00190     MAX_PATH_CHECK(dsize);
00191 #   ifdef WIN32
00192 
00193     if(NULL==_fullpath(dest,src,dsize)){
00194         return edk_FAILED;
00195     }
00196 #   else//unix or linux ??
00197     if(NULL==__realpath(src,dest)){
00198         return edk_FAILED;
00199     }
00200 #   endif
00201     return edk_SUCCEEDED;   
00202 }


dkutil_cに対してSun Jul 18 22:46:16 2004に生成されました。 doxygen 1.3.6