mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2025-03-14 20:15:05 +00:00
169 lines
2.8 KiB
HolyC
Executable file
169 lines
2.8 KiB
HolyC
Executable file
//Simple and fancy way of searching
|
|
|
|
//See ::/Apps/Vocabulary/VocabQuiz.ZC
|
|
//for another example of dictionary usage.
|
|
|
|
#define ROWS_NUM 20
|
|
#define COLS_NUM 20
|
|
#define DIM_MAX MaxI64(ROWS_NUM, COLS_NUM)
|
|
|
|
U8 m[ROWS_NUM][COLS_NUM];
|
|
|
|
U0 Init()
|
|
{
|
|
I64 x, y;
|
|
|
|
for (y = 0; y < ROWS_NUM; y++)
|
|
for (x = 0; x < COLS_NUM; x++)
|
|
m[y][x] = 'A' + RandU16 % 26;
|
|
}
|
|
|
|
U0 Display()
|
|
{
|
|
I64 x, y;
|
|
|
|
for (y = 0; y < ROWS_NUM; y++)
|
|
{
|
|
for (x = 0; x < COLS_NUM; x++)
|
|
'' m[y][x];
|
|
'\n';
|
|
}
|
|
}
|
|
|
|
U0 GetWord(U8 *dst, I64 x, I64 y, I64 dx, I64 dy)
|
|
{
|
|
while (0 <= x < COLS_NUM && 0 <= y < ROWS_NUM)
|
|
{
|
|
*dst++ = m[y][x];
|
|
y += dy;
|
|
x += dx;
|
|
}
|
|
*dst = 0;
|
|
}
|
|
|
|
//************************************
|
|
U0 Search(I64 dx, I64 dy)
|
|
{
|
|
I64 x, y, i, n;
|
|
U8 buf[DIM_MAX + 1], *ptr;
|
|
|
|
for (y = 0; y < ROWS_NUM; y++)
|
|
for (x = 0; x < COLS_NUM; x++)
|
|
{
|
|
GetWord(buf, x, y, dx, dy);
|
|
n = StrLen(buf);
|
|
for (i = n; i > 2; i--)
|
|
{
|
|
buf[i] = 0;
|
|
if ((ptr = ACDWordPtAt(buf)) && *ptr++ == ACD_WORD_CHAR && !StrICompare(ptr, buf))
|
|
{
|
|
"%s ", buf;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
U0 SimpleWordSearch()
|
|
{
|
|
Search( 1, 0);
|
|
Search( 0, 1);
|
|
Search(-1, 0);
|
|
Search( 0, -1);
|
|
Search( 1, 1);
|
|
Search(-1, -1);
|
|
Search( 1, -1);
|
|
Search(-1, 1);
|
|
'\n';
|
|
}
|
|
|
|
//************************************
|
|
U8 words[ROWS_NUM * COLS_NUM * 8][DIM_MAX + 1];
|
|
U8 *word_ptrs[ROWS_NUM * COLS_NUM * 8];
|
|
|
|
U0 CollectWords(I64 dx, I64 dy, I64 *_n)
|
|
{
|
|
I64 x, y, n = *_n;
|
|
|
|
for (y = 0; y < ROWS_NUM; y++)
|
|
for (x = 0; x < COLS_NUM; x++)
|
|
{
|
|
GetWord(&words[n], x, y, dx, dy);
|
|
word_ptrs[n] = &words[n];
|
|
n++;
|
|
}
|
|
*_n = n;
|
|
}
|
|
|
|
I64 WordsCompare(U8 *e1, U8 *e2)
|
|
{
|
|
return StrCompare(e1, e2);
|
|
}
|
|
|
|
/*Format of word list entry:
|
|
U8 ACD_WORD_CHAR
|
|
U8 word[] with terminating zero
|
|
I16 block; //definition offset in ::/System/AutoComplete/ACDefs.DATA
|
|
*/
|
|
|
|
U0 DisplayWords(I64 n)
|
|
{
|
|
I64 i = 0, k;
|
|
U8 *w1, *w2, *dict = acd.word_list;
|
|
|
|
for (i = 0; i < n; i++)
|
|
while (*dict)
|
|
{
|
|
w1 = word_ptrs[i];
|
|
w2 = dict + 1;
|
|
while (*w2 && *w1 == ToUpper(*w2))
|
|
{
|
|
w1++;
|
|
w2++;
|
|
}
|
|
if (ToUpper(*w2) > *w1)
|
|
break;
|
|
if (!*w2)
|
|
{
|
|
if (StrLen(dict + 1) > 2)
|
|
{
|
|
k = i;
|
|
while (k < n && !StrNICompare(word_ptrs[k++], dict + 1, StrLen(dict + 1)))
|
|
"%s ", dict + 1;
|
|
}
|
|
w2 = dict + 1;
|
|
while (!StrICompare(w2, dict + 1))
|
|
dict += StrLen(dict + 1) + 4;
|
|
}
|
|
else
|
|
dict += StrLen(dict + 1) + 4;
|
|
}
|
|
}
|
|
|
|
U0 FancyWordSearch()
|
|
{
|
|
I64 n = 0;
|
|
|
|
CollectWords( 1, 0, &n);
|
|
CollectWords( 0, 1, &n);
|
|
CollectWords(-1, 0, &n);
|
|
CollectWords( 0, -1, &n);
|
|
CollectWords( 1, 1, &n);
|
|
CollectWords(-1, -1, &n);
|
|
CollectWords( 1, -1, &n);
|
|
CollectWords(-1, 1, &n);
|
|
QuickSortI64(word_ptrs, n, &WordsCompare);
|
|
DisplayWords(n);
|
|
'\n';
|
|
}
|
|
|
|
//************************************
|
|
U0 WordSearch()
|
|
{
|
|
Init;
|
|
Display;
|
|
'\n';
|
|
SimpleWordSearch;
|
|
FancyWordSearch;
|
|
}
|
|
|
|
WordSearch;
|