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