Skip to content

Commit

Permalink
Console|libdoomsday: Regex-matching known words; added Console.listVa…
Browse files Browse the repository at this point in the history
…rs()
  • Loading branch information
skyjake committed Sep 17, 2015
1 parent e759db2 commit a08646f
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
Expand Up @@ -76,8 +76,9 @@ LIBDOOMSDAY_PUBLIC int Con_IterateKnownWords(char const *pattern, knownwordtype_
int (*callback)(knownword_t const *word, void *parameters), void *parameters);

enum KnownWordMatchMode {
KnownWordExactMatch, // case insensitive
KnownWordStartsWith // case insensitive
KnownWordExactMatch, // case insensitive
KnownWordStartsWith, // case insensitive
KnownWordRegex // case insensitive
};

LIBDOOMSDAY_PUBLIC int Con_IterateKnownWords(KnownWordMatchMode matchMode, char const *pattern,
Expand Down Expand Up @@ -109,4 +110,7 @@ LIBDOOMSDAY_PUBLIC de::String Con_AnnotatedConsoleTerms(QStringList terms);
*/
LIBDOOMSDAY_PUBLIC de::shell::Lexicon Con_Lexicon();

LIBDOOMSDAY_PUBLIC void Con_TermsRegex(de::StringList &terms, de::String const &pattern,
knownwordtype_t wordType);

#endif // LIBDOOMSDAY_CONSOLE_KNOWNWORD_H
14 changes: 14 additions & 0 deletions doomsday/apps/libdoomsday/src/console/exec.cpp
Expand Up @@ -248,6 +248,19 @@ static void PrepareCmdArgs(cmdargs_t *cargs, const char *lpCmdLine)
#undef IS_ESC_CHAR
}

static Value *Function_Console_ListVars(Context &, Function::ArgumentValues const &args)
{
StringList vars;
Con_TermsRegex(vars, args.at(0)->asText(), WT_CVAR);

std::unique_ptr<ArrayValue> result(new ArrayValue);
for(String v : vars)
{
*result << new TextValue(v);
}
return result.release();
}

dd_bool Con_Init(void)
{
if(ConsoleInited) return true;
Expand All @@ -259,6 +272,7 @@ dd_bool Con_Init(void)
/// DS records.
consoleBinder.initNew();
initVariableBindings(consoleBinder);
consoleBinder << DENG2_FUNC(Console_ListVars, "listVars", "pattern");
App::scriptSystem().addNativeModule("Console", consoleBinder.module());

exBuff = NULL;
Expand Down
21 changes: 21 additions & 0 deletions doomsday/apps/libdoomsday/src/console/knownword.cpp
Expand Up @@ -32,6 +32,7 @@
#include <de/c_wrapper.h>
#include <de/strutil.h>
#include <QList>
#include <QRegExp>

using namespace de;

Expand Down Expand Up @@ -211,6 +212,7 @@ int Con_IterateKnownWords(KnownWordMatchMode matchMode,
knownwordtype_t matchType = (VALID_KNOWNWORDTYPE(type)? type : WT_ANY);
size_t patternLength = (pattern? strlen(pattern) : 0);
int result = 0;
QRegExp const regex(matchMode == KnownWordRegex? pattern : "", Qt::CaseInsensitive);

updateKnownWords();

Expand All @@ -232,6 +234,11 @@ int Con_IterateKnownWords(KnownWordMatchMode matchMode,
if(strcasecmp(Str_Text(textString), pattern))
continue; // Didn't match.
}
else if(matchMode == KnownWordRegex)
{
if(!regex.exactMatch(Str_Text(textString)))
continue; // Didn't match.
}
}

result = callback(word, parameters);
Expand Down Expand Up @@ -422,3 +429,17 @@ void Con_SetApplicationKnownWordCallback(void (*callback)())
{
appWordsCallback = callback;
}

static int addToStringList(knownword_t const *word, void *parameters)
{
StringList *terms = reinterpret_cast<StringList *>(parameters);
terms->append(Str_Text(Con_KnownWordToString(word)));
return 0;
}

void Con_TermsRegex(StringList &terms, String const &pattern, knownwordtype_t wordType)
{
terms.clear();
Con_IterateKnownWords(KnownWordRegex, pattern.toUtf8(), wordType,
addToStringList, &terms);
}

0 comments on commit a08646f

Please sign in to comment.