[List.HybridLeet:new]
int i, j;
int c, p;
int totrots;
int length;
length = 0; while (word[length++]) ; --length;
if (req_minlen > length || (req_maxlen && req_maxlen < length ))
{
hybrid_total = 0;
return;
}
word_rot_count=0;
totrots = 1;
i=0;
while (i < length)
{
c = word[i];
j = 0;
while (j < rot_poslen)
{
p = rot_pos[j];
if (c == rot_chars[p] || c == rot_chars[p+1])
{
word_rot_idx[word_rot_count] = i;
word_rot_pos[word_rot_count] = j;
word_rotchars_pos[word_rot_count] = p;
word_rot_count++;
word[i] = rot_chars[p];
totrots = totrots * rot_len[j];
break;
}
j++;
}
i++;
}
hybrid_total = totrots;
word_rot_current = 0;
[List.External:HybridLeet]
int rot_chars[256];
int rot_charslen;
int rot_len[26];
int rot_pos[26];
int rot_poslen;
int word_rot_idx[128];
int word_rot_pos[128];
int word_rotchars_pos[128];
int word_rot_count;
int word_rot_current;
void init()
{
int rci;
int ri;
rot_charslen=0;
rci=0;
ri=0;
rot_pos[ri] = rci;
rot_chars[rci++] = 'a';
rot_chars[rci++] = 'A';
rot_chars[rci++] = '4';
rot_chars[rci++] = '@';
rot_chars[rci++] = '8';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'b';
rot_chars[rci++] = 'B';
rot_chars[rci++] = '8';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'c';
rot_chars[rci++] = 'C';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'd';
rot_chars[rci++] = 'D';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'e';
rot_chars[rci++] = 'E';
rot_chars[rci++] = '3';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'f';
rot_chars[rci++] = 'F';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'g';
rot_chars[rci++] = 'G';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'h';
rot_chars[rci++] = 'H';
rot_chars[rci++] = '#';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'i';
rot_chars[rci++] = 'I';
rot_chars[rci++] = '1';
rot_chars[rci++] = '!';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'j';
rot_chars[rci++] = 'J';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'k';
rot_chars[rci++] = 'K';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'l';
rot_chars[rci++] = 'L';
rot_chars[rci++] = '1';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'm';
rot_chars[rci++] = 'M';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'n';
rot_chars[rci++] = 'N';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'o';
rot_chars[rci++] = 'O';
rot_chars[rci++] = '0';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'p';
rot_chars[rci++] = 'P';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'q';
rot_chars[rci++] = 'Q';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'r';
rot_chars[rci++] = 'R';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 's';
rot_chars[rci++] = 'S';
rot_chars[rci++] = '$';
rot_chars[rci++] = '5';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 't';
rot_chars[rci++] = 'T';
rot_chars[rci++] = '+';
rot_chars[rci++] = '7';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'u';
rot_chars[rci++] = 'U';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'v';
rot_chars[rci++] = 'V';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'w';
rot_chars[rci++] = 'W';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'x';
rot_chars[rci++] = 'X';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'y';
rot_chars[rci++] = 'Y';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_pos[ri] = rci;
rot_chars[rci++] = 'z';
rot_chars[rci++] = 'Z';
rot_len[ri] = (rci - rot_pos[ri]);
ri++;
rot_charslen = rci;
rot_poslen = ri;
}
void new()
{
.include [List.HybridLeet:new]
}
void next()
{
int i, j;
if (word_rot_current == hybrid_total)
{
word[0] = 0;
return;
}
i=0;
while (i < word_rot_count)
{
word[word_rot_idx[i]] = rot_chars[word_rotchars_pos[i]];
i++;
}
i=0;
while (i < word_rot_count)
{
word_rotchars_pos[i]++;
j = word_rot_pos[i];
if (word_rotchars_pos[i] != (rot_pos[j] + rot_len[j]))
{
break;
}
word_rotchars_pos[i] = rot_pos[j];
i++;
}
word_rot_current++;
}
void restore()
{
int wrc;
.include [List.HybridLeet:new]
word_rot_current = hybrid_resume;
i=0;
wrc = word_rot_current;
while (i < word_rot_count)
{
j = word_rot_pos[i];
word_rotchars_pos[i] = rot_pos[j] + (wrc % rot_len[j]);
wrc = wrc / rot_len[j];
i++;
}
}