Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/mty-makai/mty.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 218 by notanpe, Wed Apr 22 13:31:47 2009 UTC revision 222 by notanpe, Sat May 9 13:17:28 2009 UTC
# Line 58  Line 58 
58  #include "util.h"  #include "util.h"
59  #include "wdict.h"  #include "wdict.h"
60    
 #if USE_DT  
 #include "dt4.h"  
 #endif  
   
61  /* MAKAI start */  /* MAKAI start */
62  #define TRIP_LEN 10  #define TRIP_LEN 10
63    
# Line 121  struct Line 117  struct
117  #define KCLS_DT1 128  #define KCLS_DT1 128
118  #define KCLS_K2 256  #define KCLS_K2 256
119    
 #if USE_DT  
 /* 鍵キメ用辞書インデクス */  
 struct DT *kd[8 + 8];  
   
 /* 辞書インデクス */  
 struct DT *dtidx[0x100 + 1];  
 #endif  
   
120  /* MAKAI start */  /* MAKAI start */
 #ifdef CHIN  
 int     special = 1;    /* ウヒヒヒ */  
 #else /* CHIN */  
121  int     special = 0;  int     special = 0;
 #endif /* CHIN */  
122  #define ST_ALLN 1      /* 全数 */  #define ST_ALLN 1      /* 全数 */
123  #define ST_NIKO 1<<0x1 /* 二構 */  #define ST_NIKO 1<<0x1 /* 二構 */
124  #define ST_BUOO 1<<0x8 /* ぶお */  #define ST_BUOO 1<<0x8 /* ぶお */
125  #define ST_DOSU 1<<0x9 /* 怒数 */  #define ST_DOSU 1<<0x9 /* 怒数 */
126  #define ST_HREN 1<<0xd /* 飛連 */  #define ST_HREN 1<<0xd /* 飛連 */
127    #define ST_CHIN 1<<0xb /* ^Chinko Uni では 感嘆用のフラグ */
128    
129  #ifdef REON  #ifdef REON
130  #define REGEXPLEN 1024  #define REGEXPLEN 1024
# Line 196  key_make_map(uint8_t *key, int n) Line 181  key_make_map(uint8_t *key, int n)
181    int i, j;    int i, j;
182    unsigned c = kcls[n].map[key[n]];    unsigned c = kcls[n].map[key[n]];
183    
 #if USE_DT  
   if (3 <= n && n < 7 && kd[n - 3])  
         {  
           /* 辞書のケツの文字。後ろにナニヤラキャラクタが来る */  
           c = kd[n - 3]->c[0];  
           if ((0x81 <= c && c <= 0x9F)  
                   || (0xE0 <= c && c <= 0xFC))  
                 c = KCLS_K2;  
           else  
                 c = (cp932[256 * key[n]]  
                          | cp932[256 * (key[n] ^ 0x80)]);  
 #if DEBUG>=1  
           printf("*n=%d, key=%02X, cls=%04X\n",  
                          n,  
                          key[n],  
                          c);  
 #endif  
         }  
   else if (2 <= n && n < 6 && kd[n - 2])  
         {  
           return;  
         }  
   else if (1 <= n && n < 5 && kd[n - 1])  
         {  
           return;  
         }  
   else if (1 <= n && n < 5 && !kd[n - 1]  
                    //&& (c & KCLS_K2)  
                    && (c & KCLS_DT1))  
         {  
           /* 漢字2文字を拾っていきまつ */  
 #if DEBUG>=1  
           printf("(%d)%02X %02X(%02X:%02X:%02X:%02X)\n",  
                          n, key[n - 1], key[n],  
                          cp932[(256 * key[n - 1] + key[n])],  
                          cp932[(256 * key[n - 1] + key[n]) ^ 0x0080],  
                          cp932[(256 * key[n - 1] + key[n]) ^ 0x8000],  
                          cp932[(256 * key[n - 1] + key[n]) ^ 0x8080]);  
 #endif  
           if (n != 1 && n != 2  
                   && (cp932[(256 * key[n - 1] + key[n]) ^ 0x0080] & KCLS_DT1))  
                 key[n] ^= 0x80;  
           else if (n != 2 && n != 3  
                            && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8000] & KCLS_DT1))  
                 key[n - 1] ^= 0x80;  
           else if (n > 3 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8080] & KCLS_DT1))  
                 key[n - 1] ^= 0x80, key[n] ^= 0x80;  
           if (cp932[256 * key[n - 1] + key[n]] & KCLS_DT1)  
                 {  
                   for (kd[n - 1] = dtidx[key[n - 1]];  
                            kd[n - 1]->c[1] != key[n];  
                            kd[n - 1]++)  
                         assert(kd[n - 1]->c[0] == key[n - 1]);  
 #if DEBUG>=1  
                   printf("(%02X%02X:%02X%02X)%c%c%c%c\n",  
                                  kd[n - 1]->c[0],  
                                  kd[n - 1]->c[1],  
                                  kd[n - 1]->c[2],  
                                  kd[n - 1]->c[3],  
                                  kd[n - 1]->c[0],  
                                  kd[n - 1]->c[1],  
                                  kd[n - 1]->c[2],  
                                  kd[n - 1]->c[3]);  
 #endif  
                   return;  
                 }  
         }  
   else if (n < 4 && (c & KCLS_DT0) && kd[n] == NULL)  
         {  
           /* カタカナ埋め込みいきます */  
           assert(kd[n] == NULL);  
 #if DEBUG>=1  
           printf("n=%d, key=%02X\n", n, key[n]);  
 #endif  
           kd[n] = dtidx[key[n]];  
           if (!kd[n]  
                   && !(n == 1 || n == 2)  
                   && dtidx[key[n] ^ 0x80])  
                 {  
                   key[n] ^= 0x80;  
                   kd[n] = dtidx[key[n]];  
                 }  
           if (kd[n])  
                 return;  
         }  
   else  
         {  
           kd[n] = NULL;  
         }  
 #endif  
   
184    /* 最後の部分は class map を生成する必要ナシ */    /* 最後の部分は class map を生成する必要ナシ */
185    if (n >= 6)    if (n >= 6)
186          return;          return;
# Line 310  key_make_map(uint8_t *key, int n) Line 204  key_make_map(uint8_t *key, int n)
204            if (c & (KCLS_AN | KCLS_KA | KCLS_K2))            if (c & (KCLS_AN | KCLS_KA | KCLS_K2))
205                  for (j = 0; j < 256; j++)                  for (j = 0; j < 256; j++)
206                  {                  {
207                    bm |= cp932[256 * i + j] & (KCLS_AN | KCLS_KA | KCLS_K1                    bm |= cp932[256 * i + j] & (KCLS_AN | KCLS_KA | KCLS_K1 | KCLS_DT0);
                                                                           | KCLS_DT0);  
208  #if 0  #if 0
209                    if (j >= 127 && !(n == 0 || n == 1))                    if (j >= 127 && !(n == 0 || n == 1))
210                          break;                          break;
# Line 329  key_make_map(uint8_t *key, int n) Line 222  key_make_map(uint8_t *key, int n)
222          kcls[7].map[0x00] |= KCLS_AN;          kcls[7].map[0x00] |= KCLS_AN;
223  }  }
224    
 #if USE_DT  
 unsigned  
 dt_get(int kdn,  
            int xn,  
            int n,  
            int ch)  
 {  
   int i;  
 #if DEBUG>=1  
   printf("*dt_get(%d)%c%c%c%c(%02X%02X:%02X%02X)->ch=%d",  
                  n,  
                  kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],  
                  kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],  
                  ch);  
 #endif  
   /* まずは数える */  
   for (i = 0;  
            kd[kdn][i].c[xn] == kd[kdn]->c[xn];  
            i++)  
         ;  
   assert(i > 0);  
   kd[kdn] += ch % i;  
 #if DEBUG>=1  
   printf("/%d\n dt_get:  %c%c%c%c(%02X%02X:%02X%02X)->ch=%d\n",  
                  i,  
                  kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],  
                  kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],  
                  ch);  
 #endif  
   return kd[kdn]->c[n];  
 }  
 #endif  
   
225  /* マップから文字を拾ってセット */  /* マップから文字を拾ってセット */
226  unsigned  unsigned
227  key_set(int n, unsigned ch)  key_set(int n, unsigned ch)
228  {  {
229    int cnt = 0, i;    int cnt = 0, i;
230    
 #if USE_DT  
   if (3 <= n && n < 7 && kd[n - 3])  
         {  
           return dt_get(n - 3, 2, 3, ch);  
           return kd[n - 3]->c[3];  
         }  
   else if (2 <= n && n < 6 && kd[n - 2])  
         {  
           return dt_get(n - 2, 1, 2, ch);  
           return kd[n - 2]->c[2];  
         }  
   else if (1 <= n && n < 5 && kd[n - 1])  
         {  
           return dt_get(n - 1, 0, 1, ch);  
           return kd[n - 1]->c[1];  
         }  
 #endif  
   
231  #if DEBUG>=3  #if DEBUG>=3
232    if (cnt == 0)    if (cnt == 0)
233          {          {
# Line 569  key_inc(uint8_t *key, int n) Line 411  key_inc(uint8_t *key, int n)
411    printf("key_inc(n=%d,ck=%02X)\n", n, key[n]);    printf("key_inc(n=%d,ck=%02X)\n", n, key[n]);
412  #endif  #endif
413    
 #if USE_DT  
   /* 辞書語はインクリメントしていい約束にする */  
   if (3 <= n && n < 7 && kd[n - 3])  
         {  
           if ((key[n - 3] & 0x7F) == ((kd[n - 3] + 1)->c[0] & 0x7F)  
                   && (key[n - 2] & 0x7F) == ((kd[n - 3] + 1)->c[1] & 0x7F)  
                   && (key[n - 1] & 0x7F) == ((kd[n - 3] + 1)->c[2] & 0x7F))  
                 {  
                   memcpy(&key[n - 3], &(++kd[n - 3])->c[0], 4);  
 #if DEBUG>=2  
                   printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",  
                                  kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3],  
                                  kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3]);  
 #endif  
                   return 1;  
                 }  
           else  
                 {  
                   return 0;  
                 }  
         }  
   else if (2 <= n && n < 6 && kd[n - 2])  
         {  
           if ((key[n - 2] & 0x7F) == ((kd[n - 2] + 1)->c[0] & 0x7F)  
                   && (key[n - 1] & 0x7F) == ((kd[n - 2] + 1)->c[1] & 0x7F))  
                 {  
                   memcpy(&key[n - 2], &(++kd[n - 2])->c[0], 4);  
 #if DEBUG>=2  
                   printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",  
                                  kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3],  
                                  kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3]);  
 #endif  
                   return 1;  
                 }  
           else  
                 {  
                   return 0;  
                 }  
           if (kd[n - 2]->c[0] == key[n - 2])  
                 return 1;  
           else  
                 return 0;  
         }  
   else if (1 <= n && n < 5 && kd[n - 1])  
         {  
           unsigned c2 = kd[n - 1]->c[0];  
           if ((0x81 <= c2 && c2 <= 0x9F)  
                   || (0xE0 <= c2 && c2 <= 0xFC))  
                 {  
                   kd[n - 1] = NULL;  
 #if 0  
                   if (!(n == 1 && n == 2))  
                         key[n] &= 0x7F;  
                   if (!(n == 2 && n == 3))  
                         key[n - 1] &= 0x7F;  
 #endif  
                   key_make_map(n - 1);  
                 }  
           else if ((key[n - 1] & 0x7F) == ((kd[n - 1] + 1)->c[0] & 0x7F))  
                 {  
                   memcpy(&key[n - 1], &(++kd[n - 1])->c[0], 4);  
 #if DEBUG>=2  
                   printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",  
                                  kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3],  
                                  kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3]);  
 #endif  
                   return 1;  
                 }  
           else  
                 {  
                   return 0;  
                 }  
 #if 0  
           if (kd[n - 1]->c[0] == key[n - 1])  
                 return 1;  
           else  
                 return 0;  
 #endif  
         }  
   else if (n < 4 && kd[n])  
         {  
           if (0 && kd[n]->c[0] == key[n])  
                 return 1;  
           kd[n] = NULL;  
 #if 0  
           if (!(n == 1 || n == 2))  
                 key[n] &= 0x7F;  
 #endif  
         }  
 #endif  
   
414    /* 実際に増やしてみる */    /* 実際に増やしてみる */
415    assert(n >= 3);    assert(n >= 3);
416    for (;;)    for (;;)
# Line 698  key_init(uint8_t *key) Line 449  key_init(uint8_t *key)
449  {  {
450    int i, j;    int i, j;
451    
 #if USE_DT  
   /* 辞書を、インデクスを作りながらマップにはめこんで逝く  
          辞書はコード順昇順に並んでるものとする */  
   for (i = 0; i < dtcnt; i++)  
         {  
           unsigned c = dt[i].c[0];  
   
           assert(dt[i].c[0]  
                          && dt[i].c[1]  
                          && dt[i].c[2]  
                          && dt[i].c[3]);  
   
           /* BSD 鯖でしにそうな文字は残念ながら除外 */  
           assert((dt[i].c[0] & 0x7F)  
                          && (dt[i].c[1] & 0x7F)  
                          && (dt[i].c[2] & 0x7F)  
                          && (dt[i].c[3] & 0x7F));  
   
           /* インデクス */  
           if (!dtidx[c])  
                 dtidx[c] = &dt[i];  
   
           if ((0x81 <= c && c <= 0x9F)  
                   || (0xE0 <= c && c <= 0xFC))  
                 {  
                   /* 全角なので、2バイトきまった時点で立てる */  
                   cp932[256 * c + dt[i].c[1]] |= KCLS_DT1;  
                 }  
           else if (0xA1 <= c && c <= 0xDF)  
                 {  
                   /* 半角カナ */  
                   for (j = 0; j < 256; j++)  
                         cp932[256 * c + j] |= KCLS_DT0;  
                 }  
         }  
   /* ケツ、ちうか番人 */  
   dtidx[0x100] = &dt[i];  
 #endif  
   
452    key[8] = 0;    key[8] = 0;
453    
454    /* 初期マップを組む */    /* 初期マップを組む */
455    for (i = 0; i < 256; i++)    for ( i = 0; i < 256; i++ ) {
456          {     unsigned bm = 0;
457            unsigned bm = 0;  
458            kcls[0].map[i] = 0;     for ( j = 0; j < 256; j++ ) {
459            for (j = 0; j < 256; j++)      bm |= cp932[256 * i + j];
460                  bm |= cp932[256 * i + j];     }
461            kcls[0].map[i] = bm & (KCLS_AN | KCLS_KA | KCLS_K1     kcls[0].map[i] = bm & (KCLS_AN | KCLS_KA | KCLS_K1);
462                                                           | KCLS_DT0     if ( i >= 128 ) {
463                                                           );      kcls[0].map[i - 128] |= kcls[0].map[i];
464            if (i >= 128)     }
465                  kcls[0].map[i - 128] |= kcls[0].map[i];    }
         }  
466    
467    key_reset(key, 0);    key_reset(key, 0);
468  }  }
# Line 1437  char   *trip; Line 1148  char   *trip;
1148  unsigned char   *kind;  unsigned char   *kind;
1149  {  {
1150  #ifdef CHIN  #ifdef CHIN
1151      /* 強制的に検索 */
1152    if ( trip[0] == 'C' && trip[1] == 'h' && trip[2] == 'i' &&    if ( trip[0] == 'C' && trip[1] == 'h' && trip[2] == 'i' &&
1153         trip[3] == 'n' && trip[4] == 'k' && trip[5] == 'o' ) {         trip[3] == 'n' && trip[4] == 'k' && trip[5] == 'o' ) {
1154     strcpy( kind, "ち" );     strcpy( kind, "ち" );
# Line 1668  main(int argc, char *argv[]) Line 1380  main(int argc, char *argv[])
1380  #ifdef REON  #ifdef REON
1381    regExpStr[0] = '\0';    regExpStr[0] = '\0';
1382  #endif /* REON */  #endif /* REON */
1383    
1384    #ifdef MAKEY
1385    fprintf(stderr, "魔キー空間バージョンにつき、シロウトにはおすすめできない。\n");    fprintf(stderr, "魔キー空間バージョンにつき、シロウトにはおすすめできない。\n");
1386    #endif /* MAKEY */
1387    
1388    #ifdef ALLKEY
1389      fprintf(stderr, "キー全空間バージョンにつき、シロウトにはおすすめできない。\n");
1390    #endif /* MAKEY */
1391  /* MAKAI end */  /* MAKAI end */
1392    
1393    if (!cpuid_issupported())    if (!cpuid_issupported())
# Line 1683  main(int argc, char *argv[]) Line 1402  main(int argc, char *argv[])
1402    root_expr = expr_parse("target.txt");    root_expr = expr_parse("target.txt");
1403    
1404  /* MAKAI start */  /* MAKAI start */
1405    #ifdef CHIN
1406      special |= ST_CHIN;
1407    #endif /* CHIN */
1408    if ( verbose ) {    if ( verbose ) {
1409     printf( "特殊検索オプション : " );     printf( "特殊検索オプション : " );
1410     if ( special & ST_DOSU ) {     if ( special & ST_DOSU ) {
# Line 1767  main(int argc, char *argv[]) Line 1489  main(int argc, char *argv[])
1489      nThread = popcnt64( proc_mask );      nThread = popcnt64( proc_mask );
1490     }     }
1491    
1492     printf( "%d 個の検索スレッドを生成\n", nThread );     fprintf( stderr, "%d 個の検索スレッドを生成\n", nThread );
1493  /* MAKAI end */  /* MAKAI end */
1494    
1495    if (nThread == 1) /* MAKAI */    if (nThread == 1) /* MAKAI */
# Line 1810  main(int argc, char *argv[]) Line 1532  main(int argc, char *argv[])
1532    srand( seed );    srand( seed );
1533  /* MAKAI end */  /* MAKAI end */
1534    key_init(key);    key_init(key);
1535    
1536    #ifdef KEYCHK
1537    {
1538    /*
1539    ノーマル
1540     1, 4 0x01 - 0x7e 126 個
1541      1 に 0x05, 0x06 が出ない
1542      4 は全部出るが 0x05 と 0x06 がレア
1543     2, 3 0x20 - 0xfc 221 個
1544      2 抜けは 8 個 0x22 0x26 0x3c 0x3e 0x7f 0x80 0xef 0xf2
1545      3 抜けは 9 個 0x22 0x26 0x3c 0x3e 0x7f 0x80           0xf5 0xf7 0xf9
1546    */
1547      int   i;
1548    
1549      for ( i = 0; i < 2000; i++ ) {
1550       printf( "%02x %02x %02x %02x %02x %02x %02x %02x\n",
1551               key[0], key[1], key[2], key[3], key[4], key[5], key[6], key[7] );
1552       key_init(key);
1553      }
1554      exit( 0 );
1555    }
1556    #endif /* KEYCHK */
1557    
1558    set_salt(code, crypt64_descs[0], key);    set_salt(code, crypt64_descs[0], key);
1559    
1560    /* 演算パケットを作成 */    /* 演算パケットを作成 */

Legend:
Removed from v.218  
changed lines
  Added in v.222

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26