aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/ds/arm9/source/wordcompletion.cpp
blob: a73656ea6185b196ea92f51a76f20ea5f57515e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "wordcompletion.h"
#include "engines/agi/agi.h"
#include "osystem_ds.h"

#ifndef DISABLE_AGI

namespace DS {

void findWordCompletions(char* input) {
	int start = 0;
	for (int r = strlen(input) - 1; r>0; r--) {
		if (input[r] == ' ') {
			start = r + 1;
			break;
		}
	}

	char word[32];
	strcpy(word, &input[start]);

	int fchr = word[0] - 'a';
	int len = strlen(word);

	OSystem_DS* system = (OSystem_DS *) g_system;
	system->clearAutoComplete();
	system->setCharactersEntered(strlen(word));

	if (strlen(word) == 0) {
		return;
	}		

	uint8 *wordList = Agi::AgiEngine::getWordsData();
	uint8 *wordListEnd = Agi::AgiEngine::getWordsData() + Agi::AgiEngine::getWordsDataSize();

	/* Get the offset to the first word beginning with the
	 * right character
	 */
	wordList += READ_BE_UINT16(wordList + 2 * fchr);

	char currentWord[32];

	
	while (wordList < wordListEnd) {
		int pos = *wordList++;		// Number of chars to keep from previous word

		if (wordList == wordListEnd)
			break;

		char c;
		do {
			c = *wordList++;
			currentWord[pos++] =  (~c) & 0x7F;
		} while ((c & 0x80) == 0);		// Top bit indicates end of word
		currentWord[pos++] = '\0';

		if (!strncmp(currentWord, word, strlen(word))) {
			system->addAutoComplete(currentWord);
		}

		wordList += 2;	// Skip the two byte word id.

	}

}

}
#endif