#include "dkcOSIndependent.h"
#include "dkcStream.h"
#include "dkcStdio.h"
#include <limits.h>
dkcStream.cのインクルード依存関係図
関数 | |
DKC_INLINE int | SetStreamInfo (DKC_STREAM *p, UINT flag) |
DKC_STREAM *WINAPI | dkcAllocStreamMemoryType (UINT flag, const void *default_data, size_t size) |
DKC_STREAM *WINAPI | dkcAllocStreamFileType (UINT flag, const char *filename, const char *mode) |
DKC_STREAM *WINAPI | dkcAllocStream (UINT flag, const void *default_data, size_t size, const char *filename, const char *mode) |
ストリーム領域を得る。 | |
int WINAPI | dkcFreeStream (DKC_STREAM **p) |
dkcAllocNewStream()で確保したストリーム領域を開放する | |
int WINAPI | dkcStreamSeek (DKC_STREAM *ptr, int offset, int origin) |
streamをシークする。fseekみたいなもの | |
long WINAPI | dkcStreamTell (DKC_STREAM *ptr) |
streamの位置を取得する。 | |
DKC_INLINE int | dkcStreamReadObayAnOrder (DKC_STREAM *ptr, void *buffer, size_t size, size_t *readsize) |
DKC_INLINE int WINAPI | dkcStreamRead (DKC_STREAM *ptr, void *buffer, size_t size, size_t *readsize) |
streamをリードする。freadみたいなもの | |
DKC_INLINE int | dkcStreamWriteObayAnOrder (DKC_STREAM *ptr, const void *buffer, size_t size) |
DKC_INLINE int WINAPI | dkcStreamWrite (DKC_STREAM *ptr, const void *buffer, size_t size) |
streamをライトする。fwriteみたいなもの | |
int WINAPI | StreamWrite (DKC_STREAM *ptr, void *buffer, size_t size, void *hoge) |
int WINAPI | dkcStreamWrite16 (DKC_STREAM *ptr, const void *buffer, size_t size) |
int WINAPI | dkcStreamWrite32 (DKC_STREAM *ptr, const void *buffer, size_t size) |
int WINAPI | dkcStreamWrite64 (DKC_STREAM *ptr, const void *buffer, size_t size) |
int WINAPI | dkcStreamProcess (DKC_STREAM *ptr, void *buffer, size_t size, DKC_STREAM_PROCESS_TYPE write_t, void *data) |
int WINAPI | dkcStreamProcess16 (DKC_STREAM *ptr, void *buffer, size_t size, DKC_STREAM_PROCESS_TYPE write_t, void *data) |
int WINAPI | dkcStreamProcess32 (DKC_STREAM *ptr, void *buffer, size_t size, DKC_STREAM_PROCESS_TYPE write_t, void *data) |
int WINAPI | dkcStreamProcess64 (DKC_STREAM *ptr, void *buffer, size_t size, DKC_STREAM_PROCESS_TYPE write_t, void *data) |
int WINAPI | dkcStreamClear (DKC_STREAM *ptr) |
stream内をmemset(0)する。(seek位置も最初に戻される。 |
|
ストリーム領域を得る。
dkcStream.c の 89 行で定義されています。
00092 { 00093 00094 DKC_STREAM *p; 00095 void *psig; 00096 00097 00098 p = dkcAllocate(sizeof(DKC_STREAM)); 00099 if(NULL==p){ 00100 return NULL; 00101 } 00102 00103 if(DKUTIL_FAILED(SetStreamInfo(p,flag))){ 00104 goto Error; 00105 } 00106 00107 switch(p->mMode){ 00108 case edkcStreamInitMemory: 00109 psig = (void *)dkcAllocMemoryStream(size); 00110 if(NULL==psig){ 00111 goto Error; 00112 } 00113 //update 00114 p->mSig = psig; 00115 //write default data 00116 dkcStreamWrite(p,default_data,size); 00117 break; 00118 case edkcStreamInitFile: 00119 psig = (void *)dkcFOpen(filename,mode); 00120 if(NULL==psig){ 00121 goto Error; 00122 } 00123 //update 00124 p->mSig = psig; 00125 00126 break; 00127 default: 00128 goto Error; 00129 } 00130 00131 00132 //p->mEndianMode = endianmode 00133 00134 return p; 00135 Error: 00136 dkcFree(&p); 00137 return NULL; 00138 } |
|
dkcStream.c の 83 行で定義されています。 参照先 DKC_STREAM, dkcAllocStream(), DKUTIL_FLAG_DOWN, DKUTIL_FLAG_UP, edkcStreamInitFile, edkcStreamInitMemory, と NULL. 参照元 dkcOpenFileWithSignature().
00083 { 00084 DKUTIL_FLAG_DOWN(flag,edkcStreamInitMemory); 00085 DKUTIL_FLAG_UP(flag,edkcStreamInitFile); 00086 return dkcAllocStream(flag,NULL,0,filename,mode); 00087 } |
|
dkcStream.c の 76 行で定義されています。 参照先 DKC_STREAM, dkcAllocStream(), DKUTIL_FLAG_DOWN, DKUTIL_FLAG_UP, edkcStreamInitFile, edkcStreamInitMemory, と NULL.
00076 { 00077 DKUTIL_FLAG_DOWN(flag,edkcStreamInitFile); 00078 DKUTIL_FLAG_UP(flag,edkcStreamInitMemory); 00079 return dkcAllocStream(flag,default_data,size,NULL,NULL); 00080 00081 } |
|
dkcAllocNewStream()で確保したストリーム領域を開放する
dkcStream.c の 141 行で定義されています。 参照先 DKC_MEMORYSTREAM, DKC_STREAM, dkcFClose(), dkcFree(), dkcFreeMemoryStream(), dkcmNOT_ASSERT, edk_FAILED, edkcStreamInitFile, edkcStreamInitMemory, dkc_Stream::mMode, dkc_Stream::mSig, と NULL. 参照元 dkcCloseFileWithSignature(), と dkcOpenFileWithSignature().
00141 { 00142 DKC_STREAM *t; 00143 if(NULL==p){ 00144 return edk_FAILED; 00145 } 00146 t = *p; 00147 if(NULL==t){ 00148 return edk_FAILED; 00149 } 00150 00151 switch(t->mMode){ 00152 case edkcStreamInitMemory: 00153 dkcFreeMemoryStream((DKC_MEMORYSTREAM **)&(t->mSig)); 00154 break; 00155 case edkcStreamInitFile: 00156 dkcFClose((FILE **)&(t->mSig)); 00157 break; 00158 #ifdef DEBUG 00159 default: 00160 dkcmNOT_ASSERT("dkcFreeStream FAILED"); 00161 #endif 00162 } 00163 return dkcFree(p); 00164 } |
|
stream内をmemset(0)する。(seek位置も最初に戻される。
dkcStream.c の 531 行で定義されています。 参照先 DKC_STREAM, dkcMemoryStreamClear(), dkcStreamWrite(), DKUTIL_FAILED, edk_FAILED, edk_SUCCEEDED, edkcStreamInitFile, edkcStreamInitMemory, dkc_Stream::mMode, と dkc_Stream::mSig.
00531 { 00532 //file size 00533 size_t fsize; 00534 //temp size 00535 size_t tsize; 00536 size_t write_size; 00537 FILE *fp; 00538 int r = edk_FAILED; 00539 char null_array[1024]; 00540 00541 00542 switch(ptr->mMode){ 00543 case edkcStreamInitMemory: 00544 r = dkcMemoryStreamClear( ptr->mSig ); 00545 break; 00546 case edkcStreamInitFile: 00547 00548 memset(null_array,0,sizeof(null_array)); 00549 fp = ptr->mSig; 00550 00551 00552 fseek( fp, 0, SEEK_END ) ; 00553 fsize = ftell( fp ) ; 00554 fseek( fp, 0, SEEK_SET ) ; 00555 00556 if(fsize > sizeof(null_array)) 00557 {//ファイルのサイズがNULL配列より大きい場合 00558 00559 tsize = 0; 00560 write_size = sizeof(null_array); 00561 for(;;){ 00562 00563 r = dkcStreamWrite(ptr,null_array,write_size); 00564 00565 if(DKUTIL_FAILED(r)){ 00566 return r; 00567 } 00568 if(tsize >= fsize){ 00569 r = edk_SUCCEEDED; 00570 break; 00571 } 00572 00573 if(tsize + write_size > fsize){ 00574 write_size = fsize - tsize; 00575 }else{ 00576 tsize += write_size; 00577 00578 //こいつはいらないけど一応・・・ 00579 write_size = sizeof(null_array); 00580 } 00581 } 00582 }else{//ちっこいなら上書き上書き・・・ 00583 r = dkcStreamWrite(ptr,null_array,fsize); 00584 } 00585 00586 break; 00587 } 00588 return r; 00589 } |
|
dkcStream.c の 408 行で定義されています。 参照先 DKC_STREAM, と DKC_STREAM_PROCESS_TYPE. 参照元 dkcFileWithSignatureWrite(), dkcFileWithSignatureWrite16(), dkcFileWithSignatureWrite32(), dkcFileWithSignatureWrite64(), と FileWithSignatureReadLogic().
00410 {
00411 return write_t(ptr,buffer,size,data);
00412 }
|
|
dkcStream.c の 416 行で定義されています。 参照先 DKC_STREAM, DKC_STREAM_PROCESS_TYPE, dkcReverseEndian16(), edk_ArgumentException, edk_FAILED, dkc_Stream::mChangeEndian, と NULL. 参照元 dkcStreamWrite16().
00417 { 00418 int r; 00419 USHORT *pb; 00420 size_t elem_num,pause = 16; 00421 size_t i; 00422 00423 if(size % pause != 0){ 00424 return edk_ArgumentException; 00425 } 00426 if(ptr->mChangeEndian) 00427 {//エンディアンチェンジが必要 00428 pb = (USHORT *)malloc(size); 00429 if(NULL==pb){ 00430 return edk_FAILED; 00431 } 00432 00433 //メモリコピー 00434 memcpy(pb,buffer,size); 00435 elem_num = size / pause; 00436 00437 //エンディアンをチェンジさせる。 00438 for(i=0;i<elem_num;i++){ 00439 pb[i] = dkcReverseEndian16(pb[i]); 00440 } 00441 //書き込む 00442 r = write_t(ptr,pb,size,data); 00443 00444 free(pb); 00445 }else{ 00446 r = write_t(ptr,buffer,size,data); 00447 } 00448 return r; 00449 } |
|
dkcStream.c の 450 行で定義されています。 参照先 DKC_STREAM, DKC_STREAM_PROCESS_TYPE, dkcReverseEndian32(), edk_ArgumentException, edk_FAILED, dkc_Stream::mChangeEndian, と NULL. 参照元 dkcStreamWrite32().
00451 { 00452 int r; 00453 ULONG *pb; 00454 size_t elem_num,pause = 32; 00455 size_t i; 00456 00457 if(size % pause != 0){ 00458 return edk_ArgumentException; 00459 } 00460 if(ptr->mChangeEndian) 00461 {//エンディアンチェンジが必要 00462 pb = (ULONG *)malloc(size); 00463 if(NULL==pb){ 00464 return edk_FAILED; 00465 } 00466 00467 //メモリコピー 00468 memcpy(pb,buffer,size); 00469 elem_num = size / pause; 00470 00471 //エンディアンをチェンジさせる。 00472 for(i=0;i<elem_num;i++){ 00473 pb[i] = dkcReverseEndian32(pb[i]); 00474 } 00475 //書き込む 00476 r = write_t(ptr,pb,size,data); 00477 00478 free(pb); 00479 }else{ 00480 r = write_t(ptr,buffer,size,data); 00481 } 00482 return r; 00483 00484 } |
|
dkcStream.c の 493 行で定義されています。 参照先 DKC_STREAM, DKC_STREAM_PROCESS_TYPE, dkcReverseEndian64(), edk_ArgumentException, edk_FAILED, dkc_Stream::mChangeEndian, NULL, と ULONGLONG. 参照元 dkcStreamWrite64().
00494 { 00495 int r; 00496 ULONGLONG *pb; 00497 size_t elem_num,pause = 64; 00498 size_t i; 00499 00500 if(size % pause != 0){ 00501 return edk_ArgumentException; 00502 } 00503 if(ptr->mChangeEndian) 00504 {//エンディアンチェンジが必要 00505 pb = (ULONGLONG *)malloc(size); 00506 if(NULL==pb){ 00507 return edk_FAILED; 00508 } 00509 00510 //メモリコピー 00511 memcpy(pb,buffer,size); 00512 elem_num = size / pause; 00513 00514 //エンディアンをチェンジさせる。 00515 for(i=0;i<elem_num;i++){ 00516 pb[i] = dkcReverseEndian64(pb[i]); 00517 } 00518 //書き込む 00519 r = write_t(ptr,pb,size,data); 00520 00521 free(pb); 00522 }else{ 00523 r = write_t(ptr,buffer,size,data); 00524 } 00525 return r; 00526 } |
|
streamをリードする。freadみたいなもの
dkcStream.c の 257 行で定義されています。 参照先 DKC_INLINE, DKC_STREAM, dkcMemoryStreamRead(), dkcStreamReadObayAnOrder(), edk_FAILED, edk_SUCCEEDED, edkcStreamInitFile, edkcStreamInitMemory, edkcStreamProcessDefault, dkc_Stream::mMode, dkc_Stream::mProcessMode, dkc_Stream::mSig, と NULL. 参照元 ReadCallback().
00257 { 00258 int r = edk_FAILED; 00259 FILE *fp = ptr->mSig; 00260 size_t redsize = 0; 00261 if(NULL==readsize){ 00262 readsize = &redsize; 00263 } 00264 00265 //エンディアンチェンジ指定されているよ~~。 00266 /*if(flag & edkcStreamReadErrorWhenEndianChange){ 00267 if(ptr->mChangeEndian){ 00268 return edk_Not_Satisfactory; 00269 } 00270 }*/ 00271 00272 switch(ptr->mMode){ 00273 case edkcStreamInitMemory: 00274 r = dkcMemoryStreamRead(ptr->mSig, 00275 buffer,size,readsize); 00276 break; 00277 case edkcStreamInitFile: 00278 00279 if(ptr->mProcessMode & edkcStreamProcessDefault){ 00280 *readsize = fread(buffer,1,size,fp); 00281 if(!ferror(fp)){ 00282 r = edk_SUCCEEDED; 00283 } 00284 }else{ 00285 r = dkcStreamReadObayAnOrder(ptr,buffer,size,readsize); 00286 } 00287 00288 00289 break; 00290 } 00291 return r; 00292 } |
|
dkcStream.c の 196 行で定義されています。 参照先 BYTE, DKC_INLINE, DKC_STREAM, dkcmNOT_ASSERT, edk_BufferOverFlow, edk_FAILED, edk_SUCCEEDED, dkc_Stream::mSig, と NULL. 参照元 dkcStreamRead().
00198 { 00199 int r = edk_FAILED; 00200 size_t readsize_ = 0; 00201 size_t count; 00202 size_t tc,tsize; 00203 BYTE *tbuffer; 00204 FILE *fp = ptr->mSig; 00205 00206 if(NULL==readsize){ 00207 readsize = &readsize_; 00208 } 00209 00210 //1,sizeの引数を入れ替えるとどうか? 00211 //1 = fread(buffer,size,1,ptr->mfp); 00212 //read size 00213 tsize = size; 00214 //temp variable 00215 tc = 0; 00216 //offset counter 00217 count = 0; 00218 //byte type pointer 00219 tbuffer = (BYTE *)buffer; 00220 for(;;) 00221 { 00222 //error check 00223 if(ferror(fp) ){ 00224 //*readsize = count; 00225 r = edk_FAILED; 00226 break; 00227 } 00228 if(feof(fp)){ 00229 //*readsize = count; 00230 r = edk_BufferOverFlow; 00231 break; 00232 } 00233 //read 00234 tc = fread(&tbuffer[count],1,tsize,fp); 00235 //update 00236 tsize -= tc; 00237 count += tc; 00238 00239 if(count == size){ 00240 r = edk_SUCCEEDED; 00241 break; 00242 } 00243 # ifdef DEBUG 00244 //ありえないエラーチェック 00245 dkcmNOT_ASSERT(count > size); 00246 # else 00247 if(count > size){ 00248 break; 00249 } 00250 # endif 00251 } 00252 *readsize = count; 00253 return r; 00254 00255 } |
|
streamをシークする。fseekみたいなもの
dkcStream.c の 169 行で定義されています。 参照先 DKC_STREAM, dkcMemoryStreamSeek(), edk_FAILED, edkcStreamInitFile, edkcStreamInitMemory, dkc_Stream::mMode, と dkc_Stream::mSig. 参照元 dkcCircularStreamWrite(), dkcCloseFileWithSignature(), と dkcOpenFileWithSignature().
00169 { 00170 int r = edk_FAILED; 00171 switch(ptr->mMode){ 00172 case edkcStreamInitMemory: 00173 r = dkcMemoryStreamSeek(ptr->mSig,offset,origin); 00174 break; 00175 case edkcStreamInitFile: 00176 r = fseek(ptr->mSig,offset,origin); 00177 break; 00178 } 00179 return r; 00180 00181 } |
|
streamの位置を取得する。
dkcStream.c の 184 行で定義されています。 参照先 DKC_STREAM, dkcMemoryStreamTell, edk_FAILED, edkcStreamInitFile, edkcStreamInitMemory, dkc_Stream::mMode, と dkc_Stream::mSig. 参照元 dkcCloseFileWithSignature(), dkcFileWithSignatureCheckCheat(), dkcFileWithSignatureRead(), と ReadEOFCheck().
00184 { 00185 int r = edk_FAILED; 00186 switch(ptr->mMode){ 00187 case edkcStreamInitMemory: 00188 r = dkcMemoryStreamTell(ptr->mSig); 00189 case edkcStreamInitFile: 00190 r = ftell(ptr->mSig); 00191 } 00192 return r; 00193 //dkcmNOT_ASSERT("dkcStreamTell failed"); 00194 } |
|
|
dkcStream.c の 390 行で定義されています。 参照先 DKC_STREAM, dkcStreamProcess16(), NULL, と StreamWrite(). 参照元 dkcFileWithSignatureWrite16().
00390 { 00391 return dkcStreamProcess16(ptr,(void *)buffer,size,StreamWrite,NULL); 00392 } |
|
dkcStream.c の 394 行で定義されています。 参照先 DKC_STREAM, dkcStreamProcess32(), NULL, と StreamWrite(). 参照元 dkcFileWithSignatureWrite32().
00394 { 00395 return dkcStreamProcess32(ptr,(void *)buffer,size,StreamWrite,NULL); 00396 00397 } |
|
dkcStream.c の 401 行で定義されています。 参照先 DKC_STREAM, dkcStreamProcess64(), NULL, と StreamWrite(). 参照元 dkcFileWithSignatureWrite64().
00401 { 00402 return dkcStreamProcess64(ptr,(void *)buffer,size,StreamWrite,NULL); 00403 } |
|
dkcStream.c の 294 行で定義されています。 参照先 BYTE, DKC_INLINE, DKC_STREAM, dkcmNOT_ASSERT, edk_BufferOverFlow, edk_FAILED, edk_SUCCEEDED, と dkc_Stream::mSig. 参照元 dkcStreamWrite().
00294 { 00295 int r = edk_FAILED; 00296 size_t tc,tsize; 00297 size_t count; 00298 const BYTE *tbuffer = buffer; 00299 FILE *fp; 00300 00301 tc = 0; 00302 count = 0; 00303 tsize = size; 00304 fp = ptr->mSig; 00305 00306 for(;;){ 00307 //error check 00308 if(ferror(fp)){ 00309 return edk_FAILED; 00310 } 00311 if(feof(fp)){ 00312 return edk_BufferOverFlow; 00313 } 00314 //write 00315 tc = fwrite(&tbuffer[count],1,tsize,fp); 00316 //update 00317 tsize -= tc; 00318 count += tc; 00319 00320 if(count == size){ 00321 r = edk_SUCCEEDED; 00322 break; 00323 } 00324 # ifdef DEBUG 00325 //ありえないエラーチェック 00326 dkcmNOT_ASSERT(count > size); 00327 # else 00328 if(count > size){ 00329 00330 break; 00331 } 00332 # endif 00333 00334 } 00335 00336 00337 return r; 00338 } |
|
d金魚
ストリームの種類をきめる エンディアンをきめる dkcStream.c の 13 行で定義されています。 参照先 BOOL, BYTE, DKC_INLINE, DKC_STREAM, dkcIsLittleEndian(), dkcmNOT_ASSERT, edk_FAILED, edk_SUCCEEDED, edkcStreamBigEndian, edkcStreamInitFile, edkcStreamInitMemory, edkcStreamLittleEndian, edkcStreamProcessAsOrdered, edkcStreamProcessDefault, edkcStreamWriteErrorWhenEndianChange, FALSE, dkc_Stream::mChangeEndian, dkc_Stream::mMode, dkc_Stream::mProcessMode, と TRUE. 参照元 dkcAllocStream().
00013 { 00014 UINT stream_mode = 0; 00015 BYTE endian_mode = 0; 00016 UINT proc_mode = 0; 00017 00018 BOOL isLittle = dkcIsLittleEndian(); 00019 00020 00022 if(flag & edkcStreamInitMemory){ 00023 stream_mode = edkcStreamInitMemory; 00024 }else if(flag & edkcStreamInitFile){ 00025 stream_mode = edkcStreamInitFile; 00026 }else{ 00027 goto Error; 00028 } 00029 00030 00031 endian_mode = FALSE; 00033 if(flag & edkcStreamBigEndian){ 00034 //endianmode = edkcStreamBigEndian; 00035 if(isLittle){ 00036 endian_mode = TRUE; 00037 } 00038 }else if(flag & edkcStreamLittleEndian){ 00039 //endianmode = edkcStreamLittleEndian; 00040 if(!isLittle){ 00041 endian_mode = TRUE; 00042 } 00043 }else /*if(flag & edkcStreamInitDefaultEndian)*/{ 00044 if(isLittle){ 00045 //endianmode = edkcStreamLittleEndian; 00046 }else{ 00047 //endianmode = edkcStreamBigEndian; 00048 } 00049 } 00050 00051 //プロセスの詳細 設定 00052 proc_mode |= (flag & edkcStreamProcessDefault); 00053 if(0==proc_mode){ 00054 proc_mode |= (flag & edkcStreamProcessAsOrdered); 00055 00056 if(0==proc_mode){ 00057 proc_mode |= edkcStreamProcessAsOrdered; 00058 } 00059 } 00060 proc_mode |= (flag & edkcStreamWriteErrorWhenEndianChange ); 00061 00062 //update 00063 p->mMode = stream_mode; 00064 00065 dkcmNOT_ASSERT(proc_mode > UCHAR_MAX); 00066 p->mProcessMode = (BYTE)proc_mode; 00067 00068 p->mChangeEndian = endian_mode; 00069 00070 return edk_SUCCEEDED; 00071 Error: 00072 return edk_FAILED; 00073 00074 } |
|
dkcStream.c の 364 行で定義されています。 参照先 DKC_STREAM, と dkcStreamWrite(). 参照元 dkcStreamWrite16(), dkcStreamWrite32(), と dkcStreamWrite64().
00364 { 00365 return dkcStreamWrite(ptr,buffer,size); 00366 } |