#include "dkcBlockSort.h"
dkcBlockSort.cのインクルード依存関係図
マクロ定義 | |
#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_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) |
仕様 -BSEとは block sort encodeの略である 巷での牛問題とは関係ない。 -BSDとは block sort decodeの略である いわいるOSの類とは関係ない 。
BSD Licence
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(_)mdkcBlockSort.c で定義されています。
マクロ定義
|
dkcBlockSort.c の 41 行で定義されています。 |
|
dkcBlockSort.c の 39 行で定義されています。 |
|
dkcBlockSort.c の 596 行で定義されています。 参照元 dkcBlockSortDecode(). |
|
dkcBlockSort.c の 589 行で定義されています。 参照元 dkcBlockSortEncode(). |
|
dkcBlockSort.c の 594 行で定義されています。 |
|
dkcBlockSort.c の 591 行で定義されています。 |
|
dkcBlockSort.c の 35 行で定義されています。 |
|
dkcBlockSort.c の 485 行で定義されています。 |
|
dkcBlockSort.c の 96 行で定義されています。 参照先 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 } |
|
dkcBlockSort.c の 44 行で定義されています。 参照先 BYTE. 参照元 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 } |
|
dkcBlockSort.c の 540 行で定義されています。 参照先 bs_insertion_sort_to_table(), BYTE, DKC_BLOCKSORT_INFO, dkc_BlockSortInfo::mOffset, と NULL.
00541 { 00542 size_t i,offset; 00543 BYTE *p,*pout; 00544 size_t ppsize = sizeof(BYTE *) * buffsize; 00545 BYTE **pp = NULL; 00546 int r = edk_OutOfMemory; 00547 BYTE *pwork = (BYTE *)malloc(buffsize); 00548 00549 if(NULL==pwork){ 00550 goto END; 00551 } 00552 memcpy(pwork,buff,buffsize); 00553 00554 00555 pp = (BYTE **)malloc(ppsize); 00556 if(NULL==pp){ 00557 goto END; 00558 } 00559 00560 //テーブルを元に辞書順ソートする。 00561 r = bs_insertion_sort_to_table((BYTE *)pwork,buffsize,1,pp); 00562 if(DKUTIL_FAILED(r)){ 00563 goto END; 00564 } 00565 00566 offset = pinfo->mOffset; 00567 p = pp[offset]; 00568 pout = (BYTE *)buff; 00569 for(i = 0;i<buffsize;i++) 00570 { 00571 pout[i] = *p; 00572 //二次使用 00573 offset = p - (BYTE *)pwork; 00574 p = pp[offset]; 00575 } 00576 00577 END: 00578 if(pp){ 00579 free(pp); 00580 } 00581 if(pwork){ 00582 free(pwork); 00583 } 00584 00585 return r; 00586 00587 } |
|
dkcBlockSort.c の 490 行で定義されています。 参照先 bs_insertion_sort_to_table(), bse_sorted_table_to_data(), BYTE, DKC_BLOCKSORT_INFO, と NULL.
00491 { 00492 int r = edk_OutOfMemory; 00493 BYTE *rotabuff = NULL; 00494 size_t rotasize = buffsize * 2; 00495 00496 00497 BYTE **pp = (BYTE **)malloc(buffsize * sizeof(BYTE *)); 00498 if(NULL==pp){ 00499 goto END; 00500 } 00501 00502 rotabuff = (BYTE *)malloc(rotasize); 00503 if(!rotabuff){ 00504 goto END; 00505 } 00506 00507 00508 //テーブルにBlock sortに使うシフトされたデータをセットする 00509 memcpy(rotabuff,buff,buffsize); 00510 memcpy(rotabuff + buffsize,buff,buffsize); 00511 00512 00513 /*r = bse_target_to_table(buff,buffsize,pp,ppsize,1); 00514 00515 if(DKUTIL_FAILED(r)){ 00516 goto END; 00517 }*/ 00518 //テーブルを元に辞書順ソートする。 00519 r = bs_insertion_sort_to_table(rotabuff,buffsize,buffsize,pp); 00520 00521 if(DKUTIL_FAILED(r)){ 00522 goto END; 00523 } 00524 //辞書順にソートされたテーブルから出力データを求める。 00525 r = bse_sorted_table_to_data((BYTE *)buff,buffsize,(BYTE *)rotabuff,pp,buffsize,pinfo); 00526 00527 END: 00528 //free_table2d(pp,buffsize); 00529 if(rotabuff){ 00530 free(rotabuff); 00531 } 00532 if(pp){ 00533 free(pp); 00534 //free_table2d(pp,1); 00535 } 00536 return r; 00537 } |
|
dkcBlockSort.c の 457 行で定義されています。 参照先 BOOL, BYTE, DKC_BLOCKSORT_INFO, FALSE, dkc_BlockSortInfo::mOffset, dkc_BlockSortInfo::mResultPointer, と TRUE. 参照元 bse_basic_logic().
00459 { 00460 size_t i; 00461 BYTE *pout = (BYTE *)buff; 00462 BYTE *pt; 00463 BOOL flag = FALSE; 00464 00465 if(buffsize < twidth){ 00466 return edk_ArgumentException; 00467 } 00468 00469 for(i = 0;i<twidth;i++){ 00470 pt = table2d[i]; 00471 if(rotabuff == pt){ 00472 pinfo->mOffset = i; 00473 flag = TRUE; 00474 } 00475 pout[i] = pt[twidth - 1]; 00476 } 00477 pinfo->mResultPointer = buff; 00478 00479 if(flag){ 00480 return edk_SUCCEEDED; 00481 }else{ 00482 return edk_FAILED; 00483 } 00484 } |
|
dkcBlockSort.c の 604 行で定義されています。 参照先 DKC_BLOCKSORT_INFO, と dkcfBSD_BASIC.
00604 { 00605 return dkcfBSD_BASIC(buff,buffsize,p); 00606 } |
|
dkcBlockSort.c の 599 行で定義されています。 参照先 DKC_BLOCKSORT_INFO, と dkcfBSE_BASIC.
00600 { 00601 return dkcfBSE_BASIC(buff,buffsize,p); 00602 } |
|
dkcBlockSort.c の 68 行で定義されています。 参照元 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 } |