メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# dkcStdio.h

buffer over flowしないよ　関数^^; [詳細]

`#include "dkcOSIndependent.h"`

dkcStdio.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

## 関数
DKC_EXTERN int WINAPI | dkc_memcpy (void *dest, size_t size1, const void *src, size_t size2)
DKC_EXTERN int WINAPI | dkc_memcpy_zc (void *dest, size_t size1, const void *src, size_t size2)
| zero checked memcpy
DKC_EXTERN int WINAPI | dkc_memmove (void *dest, size_t size1, const void *src, size_t size2)
DKC_EXTERN int WINAPI | dkc_memcmp (const void *buf1, size_t buf1PermitSize, const void *buf2, size_t count)
DKC_EXTERN int WINAPI | dkc_strcpy (char *dest, size_t size1, const char *src, size_t srclen)
DKC_EXTERN int WINAPI | dkc_strcpy_amap (char *dest, size_t size1, const char *src, size_t srclen)
DKC_EXTERN int WINAPI | dkc_strcpy_amap2 (char *dest, size_t size1, const char *src)
DKC_EXTERN int WINAPI | dkc_strcat (char *dest, size_t destsize, size_t destlen, const char *src, size_t srclen)
DKC_EXTERN int WINAPI | dkc_strcat2 (char *dest, size_t destsize, const char *src)
DKC_EXTERN int WINAPI | dkc_strcat_amap (char *dest, size_t destsize, size_t destlen, const char *src, size_t srclen)
DKC_EXTERN int WINAPI | dkc_strcat_amap2 (char *dest, size_t destsize, const char *src)
DKC_EXTERN int WINAPI | dkc_strcmp (const char *b1, size_t b1size, const char *b2, size_t b2size)
DKC_EXTERN int WINAPI | dkc_wcscat2 (wchar_t *dest, size_t destsize, const wchar_t *src)
| destsizeはバイト単位･･･
DKC_EXTERN size_t | dkc_beam (int num)
DKC_EXTERN void | dkc_memswap (void *va, void *vb, size_t size)
| va から size バイトの内容と、vb から size バイトの内容を交換する。
DKC_EXTERN void | dkc_memreverse (void *array, size_t num, size_t size)
| 大きさ size の要素 num 個からなる配列 array の要素を 逆順に並べ替える。
DKC_EXTERN void | dkc_memrrotate (void *array, size_t shift, size_t num, size_t size)
| 大きさ size の要素 num 個からなる配列 array の要素を 右方向に要素 shift 個分だけ回転移動する。
DKC_EXTERN void | dkc_memlrotate (void *array, size_t shift, size_t num, size_t size)
| 大きさ size の要素 num 個からなる配列 array の要素を 左方向に要素 shift 個分だけ回転移動する。
DKC_EXTERN int | dkc_stream_swap (char *memory, size_t size, size_t point)
| 一つのメモリ領域をpointを基準に入れ替える。

## 説明

buffer over flowしないよ　関数^^;

作者:
  d金魚

から:
  transplanted from dkutilStdio.h:2004/2/28

TODO:
  前までstdioというのはC言語で標準的な意味を持つのか？と思ってきたが、 最近STanDard Input Outputの略と言うことが分かった。 なのでこのファイル名はSTanDard LIBraryの方がイイと思ったので dkcStdlibにしようかと考えて見た。 が、面倒なのでいちおうこのままにしておこう＾＾；
  覚え書き:
    ここを見よ！
    http://www-6.ibm.com/jp/developerworks/security/000616/j-buffer-defend.html

dkcStdio.h で定義されています。

## 関数

DKC_EXTERN size_t dkc_beam | ( | int | num | ) |

| 戻り値: 10進法での桁数を返す dkcStdio.c の 153 行で定義されています。
    00153                                    {
    00154     size_t b = 0 ;
    00155     int i=0;
    00156     for(i = 10 ; num >= i ; i *= 10 ){
    00157         b ++ ;
    00158     }
    00159     return b;
    00160 }

DKC_EXTERN int WINAPI dkc_memcmp | ( | const void * | buf1,
|  | size_t | buf1PermitSize,
|  | const void * | buf2,
|  | size_t | count
| ) |

| 参照: dkutil::dkmemcmp dkcStdio.c の 99 行で定義されています。 参照元 dkcFileBinaryCompare(), と dkcFileWithSignatureCheckCheat().
    00101 {
    00102     if(buf1PermitSize < count)return edk_LogicError;
    00103     if(0 !=memcmp(buf1,buf2,count))return edk_FAILED;
    00104     return edk_SUCCEEDED;
    00105 }

DKC_EXTERN int WINAPI dkc_memcpy | ( | void * | dest,
|  | size_t | size1,
|  | const void * | src,
|  | size_t | size2
| ) |

| dkcStdio.c の 15 行で定義されています。 参照元 dkc_memcpy_zc(), dkcAllocCircularMemoryStreamCopy(), dkcBufferGet_INL(), dkcBufferGetOffset_INL(), dkcBufferSet_INL(), dkcBufferSetOffset_INL(), dkcGetSingleListBuffer(), dkcMD4Digest(), dkcMD5Digest(), dkcMemoryStreamLoadFromMemory(), dkcMemoryStreamRead(), dkcMemoryStreamWrite(), dkcMemoryStreamWriteToMemory(), dkcNewSingleList(), dkcSingleListGetBuffer(), dkcSingleListSetBuffer(), と dkcStringGetBuffer().
    00015                                                                            {
    00016     if(size1 < size2) return edk_FAILED;
    00017     memcpy(dest,src,size2);
    00018     return edk_SUCCEEDED;
    00019 }

DKC_EXTERN int WINAPI dkc_memcpy_zc | ( | void * | dest,
|  | size_t | size1,
|  | const void * | src,
|  | size_t | size2
| ) |

| zero checked memcpy dkcStdio.c の 21 行で定義されています。 参照先 dkc_memcpy(), と NULL. 参照元 dkc2TreeGetBuffer(), と dkc2TreeSetBuffer().
    00021                                                                               {
    00022     if(size1 == 0 || size2 == 0) return edk_FAILED;
    00023     if(NULL==dest || NULL==src) return edk_FAILED;
    00024     return dkc_memcpy(dest,size1,src,size2);
    00025 }

DKC_EXTERN void dkc_memlrotate | ( | void * | array,
|  | size_t | shift,
|  | size_t | num,
|  | size_t | size
| ) |

| 大きさ size の要素 num 個からなる配列 array の要素を 左方向に要素 shift 個分だけ回転移動する。 参照: dkutil::memlrotate dkcStdio.c の 245 行で定義されています。 参照先 dkc_memreverse().
    00246 {
    00247     dkc_memreverse( array,                      shift,     size ); // 012345678 -> 210345678
    00248     dkc_memreverse( (char *)array+(size*shift), num-shift, size ); // 210345678 -> 210876543
    00249     dkc_memreverse( array,                      num,       size ); // 210876543 -> 345678012
    00250 }//memlrotate

DKC_EXTERN int WINAPI dkc_memmove | ( | void * | dest,
|  | size_t | size1,
|  | const void * | src,
|  | size_t | size2
| ) |

| dkcStdio.c の 28 行で定義されています。
    00029 {
    00030     if(size1 < size2){
    00031         return edk_FAILED;
    00032     }
    00033     memmove(dest,src,size2);
    00034     return edk_SUCCEEDED;
    00035 }

DKC_EXTERN void dkc_memreverse | ( | void * | array,
|  | size_t | num,
|  | size_t | size
| ) |

| 大きさ size の要素 num 個からなる配列 array の要素を 逆順に並べ替える。 参照: dkutil::memreverse dkcStdio.c の 221 行で定義されています。 参照先 dkc_memswap(). 参照元 dkc_memlrotate(), と dkc_memrrotate().
    00222 {
    00223     char *l;
    00224     char *r;
    00225
    00226     l = (char *)array;
    00227     r = (char *)array + ((num-1) * size);
    00228     for( ; l < r; l = l+size, r = r-size )
    00229         dkc_memswap( l, r, size );
    00230 }//memreverse

DKC_EXTERN void dkc_memrrotate | ( | void * | array,
|  | size_t | shift,
|  | size_t | num,
|  | size_t | size
| ) |

| 大きさ size の要素 num 個からなる配列 array の要素を 右方向に要素 shift 個分だけ回転移動する。 参照: dkutil::memrrotate dkcStdio.c の 235 行で定義されています。 参照先 dkc_memreverse().
    00236 {
    00237     dkc_memreverse( array,                      num,       size ); // 012345678 -> 876543210
    00238     dkc_memreverse( array,                      shift,     size ); // 876543210 -> 678543210
    00239     dkc_memreverse( (char *)array+(size*shift), num-shift, size ); // 678543210 -> 678012345
    00240 }//memrrotate

DKC_EXTERN void dkc_memswap | ( | void * | va,
|  | void * | vb,
|  | size_t | size
| ) |

| va から size バイトの内容と、vb から size バイトの内容を交換する。 参照: dkutil::memswap dkcStdio.c の 204 行で定義されています。 参照元 dkc_memreverse().
    00205 {
    00206     char *ca;
    00207     char *cb;
    00208     char  cTmp;
    00209     for( ca = (char *)va, cb = (char *)vb; size > 0; size--, ca++, cb++ )
    00210     {
    00211         cTmp = *ca;
    00212         *ca  = *cb;
    00213         *cb  = cTmp;
    00214     }
    00215 }//memswap

DKC_EXTERN int WINAPI dkc_strcat | ( | char * | dest,
|  | size_t | destsize,
|  | size_t | destlen,
|  | const char * | src,
|  | size_t | srclen
| ) |

| 参照: dkutil::dkstrcat dkcStdio.c の 66 行で定義されています。 参照元 dkc_strcat2().
    00068 {
    00069     //destlen + srclen + NULL文字
    00070     if(destsize < destlen + srclen + 1) return edk_FAILED;
    00071     strncat(dest,src,srclen);
    00072     return edk_SUCCEEDED;
    00073 }

DKC_EXTERN int WINAPI dkc_strcat2 | ( | char * | dest,
|  | size_t | destsize,
|  | const char * | src
| ) |

| 参照: dkutil::dkstrcat2 dkcStdio.c の 75 行で定義されています。 参照先 dkc_strcat(). 参照元 dkcSemiRealRandomInit().
    00075                                                                   {
    00076     return dkc_strcat(dest,destsize,strlen(dest),src,strlen(src));
    00077 }

DKC_EXTERN int WINAPI dkc_strcat_amap | ( | char * | dest,
|  | size_t | destsize,
|  | size_t | destlen,
|  | const char * | src,
|  | size_t | srclen
| ) |

| 参照: dkutil::dkstrcat_amap dkcStdio.c の 79 行で定義されています。 参照元 dkc_strcat_amap2(), と dkcDirectoryConcatenate().
    00081 {
    00082     //destlen + srclen + NULL文字
    00083     int result = edk_SUCCEEDED;
    00084     size_t lsize = destlen + srclen + 1;
    00085     if(destsize < lsize)
    00086     {//オーバーしてたら･･･
    00087         srclen = lsize - destsize - 1;
    00088         result = edk_Not_Satisfactory;
    00089     }
    00090     strncat(dest,src,srclen);
    00091     //dest[destlen + srclen - 1] = '\0';
    00092     return result;
    00093 }

DKC_EXTERN int WINAPI dkc_strcat_amap2 | ( | char * | dest,
|  | size_t | destsize,
|  | const char * | src
| ) |

| 参照: dkutil::dkstrcat_amap2 dkcStdio.c の 95 行で定義されています。 参照先 dkc_strcat_amap().
    00095                                                                        {
    00096     return dkc_strcat_amap(dest,destsize,strlen(dest),src,strlen(src));
    00097 }

DKC_EXTERN int WINAPI dkc_strcmp | ( | const char * | b1,
|  | size_t | b1size,
|  | const char * | b2,
|  | size_t | b2size
| ) |

| dkcStdio.c の 107 行で定義されています。
    00108 {
    00109     int result = edk_SUCCEEDED;
    00110     size_t i = 0;
    00111     //検索する文字列が多いとおかしいのでエラー
    00112     if(b1size < b2size) return edk_LogicError;
    00113     //if(b1size < b2size) return edk_LogicError;
    00114
    00115     //とりあえずマッチするか確かめる。
    00116     for(i=0;i<b2size;i++)
    00117     {
    00118         if(b1[i] != b2[i])
    00119         {
    00120             result = edk_FAILED;
    00121             break;
    00122         }
    00123     }
    00124     return result;
    00125 }

DKC_EXTERN int WINAPI dkc_strcpy | ( | char * | dest,
|  | size_t | size1,
|  | const char * | src,
|  | size_t | srclen
| ) |

| dkcStdio.c の 37 行で定義されています。 参照元 dkcFindFileGetFileName(), dkcGetCurrentDirectory(), dkcPathStringDevideBegin_Logic(), dkcPathStringDevideNext_Logic(), dkcPathStringGetDirectory(), dkcPathStringGetDrive(), dkcPathStringGetFileExtension(), dkcPathStringGetFileName(), dkcSHA1DigestStr(), dkcSHA256DigestStr(), dkcSHA384DigestStr(), と dkcSHA512DigestStr().
    00037                                                                             {
    00038     if(size1 <= srclen) return edk_FAILED;
    00039     strncpy(dest,src,srclen);
    00040     //if(dest[srclen] != '\0') return edk_FAILED;
    00041     dest[srclen] = '\0';
    00042     return edk_SUCCEEDED;
    00043 }

DKC_EXTERN int WINAPI dkc_strcpy_amap | ( | char * | dest,
|  | size_t | size1,
|  | const char * | src,
|  | size_t | srclen
| ) |

| dkcStdio.c の 46 行で定義されています。 参照元 dkc_strcpy_amap2().
    00046                                                                                  {
    00047 #   ifndef NDEBUG
    00048     if(!(0 == size1 && 0 == srclen)){
    00049         return edk_FAILED;
    00050     }
    00051 #   endif
    00052     if(size1 <= srclen){//ここは<=か！？
    00053         strncpy(dest,src,size1);
    00054         dest[size1 - 1] = '\0';
    00055         return edk_Not_Satisfactory;
    00056     }else{
    00057         strncpy(dest,src,srclen);
    00058         dest[srclen] = '\0';
    00059         return edk_SUCCEEDED;
    00060     }
    00061 }

DKC_EXTERN int WINAPI dkc_strcpy_amap2 | ( | char * | dest,
|  | size_t | size1,
|  | const char * | src
| ) |

| 参照: dkutil::dkstrcpy_amap2 dkcStdio.c の 62 行で定義されています。 参照先 dkc_strcpy_amap().
    00062                                                                     {
    00063     return dkc_strcpy_amap(dest,size1,src,strlen(src));
    00064 }

DKC_EXTERN int dkc_stream_swap | ( | char * | memory,
|  | size_t | size,
|  | size_t | point
| ) |

  | 一つのメモリ領域をpointを基準に入れ替える。 引数:
  | memory[in][out] | バッファへのポインタ
  | size[in] | memoryのサイズ
  | point[in] | 何処を基点(何バイト目から)にSwapするか？
戻り値: edk_SUCCEEDED以外ならエラー 覚え書き: char *buff="buffer";みたいに初期化したバッファをSwapさせるとエラーする。 dkcStdio.c の 163 行で定義されています。 参照先 FALSE, と TRUE. 参照元 dkcStringErase(), と dkcStringInsert().
    00164 {
    00165     char *p;
    00166     size_t big;
    00167     size_t small__;
    00168     BOOL isLeft = FALSE;//左の方がでかいとTRUE
    00169     if(size <= 1){
    00170         return edk_FAILED;//スワップのしようが無い
    00171     }
    00172
    00173
    00174     if(size - point < point){
    00175         big = point;//left
    00176         small__ = size - point;
    00177         isLeft = TRUE;
    00178     }else{
    00179         big = size - point;//right
    00180         small__ = point;
    00181     }
    00182
    00183     p = (char *)malloc(big);
    00184     if(!p) return edk_OutOfMemory;
    00185
    00186     if(isLeft)
    00187     {
    00188         memcpy(p,memory,big);
    00189         memcpy(memory,&memory[big],small__);
    00190         memcpy(&memory[small__],p,big);
    00191     }else{
    00192         memcpy(p,&memory[small__],big);
    00193         memcpy(&memory[big],memory,small__);
    00194         memcpy(memory,p,big);
    00195     }
    00196
    00197     free(p);
    00198     return edk_SUCCEEDED;
    00199 }

DKC_EXTERN int WINAPI dkc_wcscat2 | ( | wchar_t * | dest,
|  | size_t | destsize,
|  | const wchar_t * | src
| ) |

| destsizeはバイト単位･･･ dkcStdio.c の 141 行で定義されています。 参照元 dkcSemiRealRandomInit().
    00143 {
    00144     size_t dlen = wcslen(dest);
    00145     size_t slen = wcslen(src);
    00146
    00147     if(destsize / sizeof(wchar_t) < dlen + slen + 1)    return edk_FAILED;
    00148
    00149     wcsncpy(&dest[dlen],src,slen);
    00150     return edk_SUCCEEDED;
    00151 }