| 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 |
|
|
| 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 |
| 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; |
| 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; |
| 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 |
{ |
{ |
| 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 (;;) |
| 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 |
} |
} |
| 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, "ち" ); |
| 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()) |
| 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 ) { |
| 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 */ |
| 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 |
/* 演算パケットを作成 */ |
/* 演算パケットを作成 */ |