#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 }
|
1.3.6