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

dkcBlockSort.c

#include "dkcBlockSort.h"

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

Include dependency graph

ソースコードを見る。

マクロ定義

#define DKUTIL_C_BLOCKSORT_C
#define DEBUG_BSE
#define DBSE_PRINTF   printf
#define dkcfBSE_BASIC   bse_basic_logic
#define dkcfBSE_NORMAL   bse_logic01
#define dkcfBSE_FAST   bse_logic01
#define dkcfBSD_BASIC   bsd_basic_logic

型定義

typedef BYTE ** pa_type

関数

int bs_insertion_sort_to_table (BYTE *rotabuff, size_t cycle, size_t len, BYTE **tablework)
void free_table2d (BYTE **table2d, size_t table_height_num)
BYTE ** alloc_table2d (size_t width, size_t height)
int bse_target_to_table (void *buff, size_t buffsize, BYTE **table2d, size_t twidth, size_t theight)
int bse_sorted_table_to_data (BYTE *buff, size_t buffsize, BYTE *rotabuff, BYTE **table2d, size_t twidth, DKC_BLOCKSORT_INFO *pinfo)
int bse_basic_logic (void *buff, size_t buffsize, DKC_BLOCKSORT_INFO *pinfo)
int bsd_basic_logic (void *buff, size_t buffsize, DKC_BLOCKSORT_INFO *pinfo)
int WINAPI dkcBlockSortEncode (void *buff, size_t buffsize, DKC_BLOCKSORT_INFO *p)
int WINAPI dkcBlockSortDecode (void *buff, size_t buffsize, DKC_BLOCKSORT_INFO *p)


説明

d金魚
から:
2004/10/17
覚え書き:
ソースコード構築の再に使用したメモ http://d.hatena.ne.jp/studiokingyo/20041011

仕様 -BSEとは block sort encodeの略である 巷での牛問題とは関係ない。 -BSDとは block sort decodeの略である いわいるOSの類とは関係ない 。

licence

BSD Licence

うんちく1

rotabuffをbuffの二倍のサイズで用意する事により、 buffsize * buffsize byte 必要なシフトバッファを減らしている。 例:  abcは abc bca cab のパターンがある。3*3 == 9である。しかし、 char *p = abcabc; で p[0] だとabc p[1] だと=[2] だと cab p[3] でabc...

謝辞

これらのBlockSortのソースは M.Hiroi's Home Page http://www.geocities.co.jp/SiliconValley-Oakland/1680/ を参考にして作りました。 この場をお借りして感謝申し上げます。m(_)m

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


マクロ定義

#define DBSE_PRINTF   printf
 

dkcBlockSort.c41 行で定義されています。

#define DEBUG_BSE
 

dkcBlockSort.c39 行で定義されています。

#define dkcfBSD_BASIC   bsd_basic_logic
 

dkcBlockSort.c591 行で定義されています。

参照元 dkcBlockSortDecode().

#define dkcfBSE_BASIC   bse_basic_logic
 

dkcBlockSort.c584 行で定義されています。

参照元 dkcBlockSortEncode().

#define dkcfBSE_FAST   bse_logic01
 

dkcBlockSort.c589 行で定義されています。

#define dkcfBSE_NORMAL   bse_logic01
 

dkcBlockSort.c586 行で定義されています。

#define DKUTIL_C_BLOCKSORT_C
 

dkcBlockSort.c35 行で定義されています。


型定義

typedef BYTE** pa_type
 

dkcBlockSort.c484 行で定義されています。


関数

BYTE** alloc_table2d size_t  width,
size_t  height
[static]
 

引数:
width[in] 横のサイズ
height[in] 縦のサイズ
覚え書き:
tableのイメージ
0 1 2 3 width 0 p[0][0] p[0][1] p[0][2] .. 1 ... 2 ... 3 ... p[3][1] ... height

dkcBlockSort.c96 行で定義されています。

参照先 BYTE, free_table2d(), と NULL.

00097 {
00098     size_t i,t;
00099     BYTE **table2d = (BYTE **)malloc(height);
00100     
00101     if(NULL==table2d){
00102         goto Error;
00103     }
00104     memset(table2d,(int)NULL,height);
00105     
00106     t = height / sizeof(BYTE *);
00107 
00108     for(i=0;i<t;i++){
00109         table2d[i] = (BYTE *)malloc(width);
00110         if(NULL==table2d[i]){
00111             goto Error;
00112         }
00113     }
00114     
00115     return table2d;
00116 Error:
00117     free_table2d(table2d,width);
00118     return NULL;
00119 }

int bs_insertion_sort_to_table BYTE rotabuff,
size_t  cycle,
size_t  len,
BYTE **  tablework
[static]
 

dkcBlockSort.c44 行で定義されています。

参照先 BYTE, と edk_SUCCEEDED.

参照元 bsd_basic_logic(), と bse_basic_logic().

00047 {
00048     size_t i,j;
00049 
00050     BYTE *t;
00051     for( i = 0; i < cycle;i++ ){
00052         tablework[i] = (BYTE *)&rotabuff[i];
00053     }
00054     for( i = 1;i < cycle;i++)
00055     {
00056         t = tablework[i];
00057         for( j = i - 1;j >= 0 && j != UINT_MAX && memcmp( t,tablework[j],len) < 0;j--)
00058         {
00059             
00060             tablework[j + 1] = tablework[j];
00061                 
00062         }
00063         tablework[j + 1] = t;
00064     }
00065     return edk_SUCCEEDED;
00066 }

int bsd_basic_logic void *  buff,
size_t  buffsize,
DKC_BLOCKSORT_INFO pinfo
[static]
 

dkcBlockSort.c535 行で定義されています。

参照先 bs_insertion_sort_to_table(), BYTE, DKC_BLOCKSORT_INFO, DKUTIL_FAILED, edk_OutOfMemory, dkc_BlockSortInfo::mOffset, と NULL.

00536 {
00537     size_t i,offset;
00538     BYTE *p,*pout;
00539     size_t ppsize = sizeof(BYTE *) * buffsize;
00540     BYTE **pp = NULL;
00541     int r = edk_OutOfMemory;
00542     BYTE *pwork = (BYTE *)malloc(buffsize);
00543     
00544     if(NULL==pwork){
00545         goto END;
00546     }
00547     memcpy(pwork,buff,buffsize);
00548     
00549 
00550     pp = (BYTE **)malloc(ppsize);
00551     if(NULL==pp){
00552         goto END;
00553     }
00554 
00555     //テーブルを元に辞書順ソートする。
00556     r = bs_insertion_sort_to_table((BYTE *)pwork,buffsize,1,pp);
00557     if(DKUTIL_FAILED(r)){
00558         goto END;
00559     }
00560 
00561     offset = pinfo->mOffset;
00562     p = pp[offset];
00563     pout = (BYTE *)buff;
00564     for(i = 0;i<buffsize;i++)   
00565     {
00566         pout[i] = *p;
00567         //二次使用
00568         offset = p - (BYTE *)pwork;
00569         p = pp[offset];
00570     }
00571 
00572 END:
00573     if(pp){
00574         free(pp);
00575     }
00576     if(pwork){
00577         free(pwork);
00578     }
00579 
00580     return r;
00581 
00582 }

int bse_basic_logic void *  buff,
size_t  buffsize,
DKC_BLOCKSORT_INFO pinfo
[static]
 

dkcBlockSort.c486 行で定義されています。

参照先 bs_insertion_sort_to_table(), bse_sorted_table_to_data(), BYTE, DKC_BLOCKSORT_INFO, DKUTIL_FAILED, edk_OutOfMemory, と NULL.

00487 {
00488     int r = edk_OutOfMemory;
00489     BYTE *rotabuff = NULL;
00490     size_t rotasize = buffsize * 2;
00491     
00492     
00493     BYTE **pp = (BYTE **)malloc(buffsize * sizeof(BYTE *));
00494     if(NULL==pp){
00495         goto END;
00496     }   
00497 
00498     rotabuff = (BYTE *)malloc(rotasize);
00499     if(!rotabuff){
00500         goto END;
00501     }
00502 
00503 
00504     //テーブルにBlock sortに使うシフトされたデータをセットする
00505     memcpy(rotabuff,buff,buffsize);
00506     memcpy(rotabuff + buffsize,buff,buffsize);
00507 
00508     
00509     /*r = bse_target_to_table(buff,buffsize,pp,ppsize,1);
00510 
00511     if(DKUTIL_FAILED(r)){
00512         goto END;
00513     }*/
00514     //テーブルを元に辞書順ソートする。
00515     r = bs_insertion_sort_to_table(rotabuff,buffsize,buffsize,pp);
00516     
00517     if(DKUTIL_FAILED(r)){
00518         goto END;
00519     }
00520     //辞書順にソートされたテーブルから出力データを求める。
00521     r = bse_sorted_table_to_data((BYTE *)buff,buffsize,(BYTE *)rotabuff,pp,buffsize,pinfo);
00522 
00523 END:
00524     //free_table2d(pp,buffsize);
00525     if(rotabuff){
00526         free(rotabuff);
00527     }
00528     if(pp){
00529         free(pp);
00530         //free_table2d(pp,1);
00531     }
00532     return r;
00533 }

int bse_sorted_table_to_data BYTE buff,
size_t  buffsize,
BYTE rotabuff,
BYTE **  table2d,
size_t  twidth,
DKC_BLOCKSORT_INFO pinfo
[static]
 

dkcBlockSort.c456 行で定義されています。

参照先 BOOL, BYTE, DKC_BLOCKSORT_INFO, edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, FALSE, dkc_BlockSortInfo::mOffset, dkc_BlockSortInfo::mResultPointer, と TRUE.

参照元 bse_basic_logic().

00458 {
00459     size_t i;
00460     BYTE *pout = (BYTE *)buff;
00461     BYTE *pt;
00462     BOOL flag = FALSE;
00463 
00464     if(buffsize < twidth){
00465         return edk_ArgumentException;
00466     }
00467 
00468     for(i = 0;i<twidth;i++){
00469         pt = table2d[i];
00470         if(rotabuff == pt){
00471             pinfo->mOffset = i;
00472             flag = TRUE;
00473         }
00474         pout[i] = pt[twidth - 1];
00475     }
00476     pinfo->mResultPointer = buff;
00477 
00478     if(flag){
00479         return edk_SUCCEEDED;
00480     }else{
00481         return edk_FAILED;
00482     }
00483 }

int bse_target_to_table void *  buff,
size_t  buffsize,
BYTE **  table2d,
size_t  twidth,
size_t  theight
[static]
 

dkcBlockSort.c440 行で定義されています。

参照先 BYTE, dkcRotateShiftRightMemory(), edk_ArgumentException, と edk_SUCCEEDED.

00442 {
00443     size_t i;
00444     if(buffsize > twidth){
00445         return edk_ArgumentException;
00446     }
00447 
00448     for(i = 0;i<theight;i++)
00449     {
00450         memcpy(table2d[i],buff,buffsize);
00451         dkcRotateShiftRightMemory(buff,buffsize,1);
00452     }
00453     return edk_SUCCEEDED;
00454 }

int WINAPI dkcBlockSortDecode void *  buff,
size_t  buffsize,
DKC_BLOCKSORT_INFO p
 

dkcBlockSort.c599 行で定義されています。

参照先 DKC_BLOCKSORT_INFO, と dkcfBSD_BASIC.

00599                                                                                {
00600     return dkcfBSD_BASIC(buff,buffsize,p);
00601 }

int WINAPI dkcBlockSortEncode void *  buff,
size_t  buffsize,
DKC_BLOCKSORT_INFO p
 

引数:
buff[in][out] ソートするデータ
buffsize[in] buffの有効範囲のバイト単位のサイズ
p[out] 処理結果を返す。この関数の戻り値が成功を示さなければ正しい処理結果を返さない。
戻り値:
edk_SUCCEEDEDで成功。それ以外は処理を完了されていない。
覚え書き:
buffに入れたデータはメチャクチャになっているので buffにいったんぶち込んだデータをこの関数が失敗した再、再利用してはいけない。

dkcBlockSort.c594 行で定義されています。

参照先 DKC_BLOCKSORT_INFO, と dkcfBSE_BASIC.

00595 {
00596     return dkcfBSE_BASIC(buff,buffsize,p);
00597 }

void free_table2d BYTE **  table2d,
size_t  table_height_num
[static]
 

dkcBlockSort.c68 行で定義されています。

参照先 BYTE, と NULL.

参照元 alloc_table2d().

00068                                                                 {
00069     size_t i;
00070 
00071     if(table2d){
00072         for(i = 0;i<table_height_num;i++){
00073             if(NULL != table2d[i]){
00074                 free(table2d[i]);
00075             }
00076         }
00077         free((void *)table2d);
00078     }
00079 
00080 }


dkutil_cに対してTue Dec 7 01:10:02 2004に生成されました。 doxygen 1.3.6