#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_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) |
仕様 -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 の 591 行で定義されています。 参照元 dkcBlockSortDecode(). |
|
dkcBlockSort.c の 584 行で定義されています。 参照元 dkcBlockSortEncode(). |
|
dkcBlockSort.c の 589 行で定義されています。 |
|
dkcBlockSort.c の 586 行で定義されています。 |
|
dkcBlockSort.c の 35 行で定義されています。 |
|
dkcBlockSort.c の 484 行で定義されています。 |
|
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, と 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 } |
|
dkcBlockSort.c の 535 行で定義されています。 参照先 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 } |
|
dkcBlockSort.c の 486 行で定義されています。 参照先 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 } |
|
dkcBlockSort.c の 456 行で定義されています。 参照先 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 } |
|
dkcBlockSort.c の 440 行で定義されています。 参照先 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 } |
|
dkcBlockSort.c の 599 行で定義されています。 参照先 DKC_BLOCKSORT_INFO, と dkcfBSD_BASIC.
00599 { 00600 return dkcfBSD_BASIC(buff,buffsize,p); 00601 } |
|
dkcBlockSort.c の 594 行で定義されています。 参照先 DKC_BLOCKSORT_INFO, と dkcfBSE_BASIC.
00595 { 00596 return dkcfBSE_BASIC(buff,buffsize,p); 00597 } |
|
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 } |