📄 console.cc
字号:
bool removeVariable(const char *name)
{
name = StringTable->lookup(prependDollar(name));
return name!=0 && gEvalState.globalVars.removeVariable(name);
}
//---------------------------------------------------------------------------
void addCommand(const char *nsName, const char *name,StringCallback cb, const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace *ns = lookupNamespace(nsName);
ns->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
void addCommand(const char *nsName, const char *name,VoidCallback cb, const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace *ns = lookupNamespace(nsName);
ns->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
void addCommand(const char *nsName, const char *name,IntCallback cb, const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace *ns = lookupNamespace(nsName);
ns->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
void addCommand(const char *nsName, const char *name,FloatCallback cb, const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace *ns = lookupNamespace(nsName);
ns->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
void addCommand(const char *nsName, const char *name,BoolCallback cb, const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace *ns = lookupNamespace(nsName);
ns->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
void markCommandGroup(const char * nsName, const char *name, const char* usage)
{
Namespace *ns = lookupNamespace(nsName);
ns->markGroup(name,usage);
}
void beginCommandGroup(const char * nsName, const char *name, const char* usage)
{
markCommandGroup(nsName, name, usage);
}
void endCommandGroup(const char * nsName, const char *name)
{
markCommandGroup(nsName, name, NULL);
}
void addOverload(const char * nsName, const char * name, const char * altUsage)
{
Namespace *ns = lookupNamespace(nsName);
ns->addOverload(name,altUsage);
}
void addCommand(const char *name,StringCallback cb,const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace::global()->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
void addCommand(const char *name,VoidCallback cb,const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace::global()->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
void addCommand(const char *name,IntCallback cb,const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace::global()->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
void addCommand(const char *name,FloatCallback cb,const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace::global()->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
void addCommand(const char *name,BoolCallback cb,const char *usage, S32 minArgs, S32 maxArgs)
{
Namespace::global()->addCommand(StringTable->insert(name), cb, usage, minArgs, maxArgs);
}
bool expandScriptFilename(char *filename, U32 size, const char *src)
{
const StringTableEntry cbName = CodeBlock::getCurrentCodeBlockName();
if (!cbName)
{
dStrcpy(filename, src);
return true;
}
U32 uOffset = 1;
const char *slash;
/// "~/" 或 "//" 表示当前mod根点;
/// "/"表示本工作盘根目录
// tilde path means load from current codeblock/mod root
if (dStrncmp(src, "~/", 2) == 0 || dStrncmp(src, "//", 2) == 0)
slash = dStrchr(cbName, '/');
/// TGE_String
/// . 表当前目录,N个点表向上N-1层目录,直到Mod根目录为止
/// ./ ../ .../ ..../
else
{
U32 numDot = 0;
for(;src[numDot] == '.';numDot++); //搜索 .数量
if(numDot && src[numDot] != '/') //如果非 ../ 格式,则不处理
numDot = 0;
/// 从参考路径中,以numDot去掉相应数量层数,直到mod根点
if(numDot)
{
char *slash2=0;
dStrcpy(filename, cbName);
for(U32 num = numDot; num >0; num--)
{
slash2 = dStrrchr(filename, '/');
if(slash2 == 0)
{
slash = filename;
numDot++; /// 加上 .../ 数量,作为新的uOffset
break;
}
slash = slash2;
slash2[0] = 0;
}
slash = slash-filename + cbName;
uOffset = numDot;
}
//else if (dStrncmp(src, "./", 2) == 0)
// // dot path means load from current codeblock/mod path
// slash = dStrrchr(cbName, '/');
else
{
// otherwise path must be fully specified
if (dStrlen(src) > size)
{
Con::errorf("Buffer overflow attempting to expand filename: %s", src);
*filename = 0;
return false;
}
dStrcpy(filename, src);
return true;
}
}
if (slash == NULL)
{
Con::errorf("Illegal CodeBlock path detected (no mod directory): %s", cbName);
*filename = 0;
return false;
}
U32 length = slash-cbName;
if ((length+dStrlen(src)) > size)
{
Con::errorf("Buffer overflow attempting to expand filename: %s", src);
*filename = 0;
return false;
}
dStrncpy(filename, cbName, length);
dStrcpy(filename+length, src+uOffset);
return true;
}
const char *evaluate(const char* string, bool echo, const char *fileName)
{
if (echo)
Con::printf("%s%s", getVariable( "$Con::Prompt" ), string);
if(fileName)
fileName = StringTable->insert(fileName);
CodeBlock *newCodeBlock = new CodeBlock();
return newCodeBlock->compileExec(fileName, string, false, fileName ? -1 : 0);
}
//------------------------------------------------------------------------------
const char *evaluatef(const char* string, ...)
{
char buffer[4096];
va_list args;
va_start(args, string);
dVsprintf(buffer, sizeof(buffer), string, args);
CodeBlock *newCodeBlock = new CodeBlock();
return newCodeBlock->compileExec(NULL, buffer, false, 0);
}
const char *execute(S32 argc, const char *argv[])
{
#ifdef TORQUE_MULTITHREAD
if(isMainThread())
{
#endif
Namespace::Entry *ent;
StringTableEntry funcName = StringTable->insert(argv[0]);
ent = Namespace::global()->lookup(funcName);
if(!ent)
{
warnf(ConsoleLogEntry::Script, "%s: Unknown command.", argv[0]);
// Clean up arg buffers, if any.
STR.clearFunctionOffset();
return "";
}
return ent->execute(argc, argv, &gEvalState);
#ifdef TORQUE_MULTITHREAD
}
else
{
SimConsoleThreadExecCallback cb;
SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(argc, argv, false, &cb);
Sim::postEvent(Sim::getRootGroup(), evt, Sim::getCurrentTime());
return cb.waitForResult();
}
#endif
}
#ifdef TGE_RPG
BOOL checkScriptMethod(SimObject *object,StringTableEntry funcName)
{
if(object == NULL)
return Namespace::global()->lookup(funcName) != NULL;
if(object->getNamespace())
{
return object->getNamespace()->lookup(funcName) != NULL;
}
return FALSE;
}
#endif
//------------------------------------------------------------------------------
const char *execute(SimObject *object, S32 argc, const char *argv[])
{
static char idBuf[16];
if(argc < 2)
return "";
if(object->getNamespace())
{
dSprintf(idBuf, sizeof(idBuf), "%d", object->getId());
argv[1] = idBuf;
StringTableEntry funcName = StringTable->insert(argv[0]);
Namespace::Entry *ent = object->getNamespace()->lookup(funcName);
if(!ent)
{
//warnf(ConsoleLogEntry::Script, "%s: undefined for object '%s' - id %d", funcName, object->getName(), object->getId());
// Clean up arg buffers, if any.
STR.clearFunctionOffset();
return "";
}
else
{
SimObject *save = gEvalState.thisObject;
gEvalState.thisObject = object;
const char *ret = ent->execute(argc, argv, &gEvalState);
gEvalState.thisObject = save;
return ret;
}
}
warnf(ConsoleLogEntry::Script, "Con::execute - %d has no namespace: %s", object->getId(), argv[0]);
return "";
}
const char *executef(SimObject *object, S32 argc, ...)
{
const char *argv[128];
va_list args;
va_start(args, argc);
for(S32 i = 0; i < argc; i++)
argv[i+1] = va_arg(args, const char *);
va_end(args);
argv[0] = argv[1];
argc++;
return execute(object, argc, argv);
}
//------------------------------------------------------------------------------
const char *executef(S32 argc, ...)
{
const char *argv[128];
va_list args;
va_start(args, argc);
for(S32 i = 0; i < argc; i++)
argv[i] = va_arg(args, const char *);
va_end(args);
return execute(argc, argv);
}
//------------------------------------------------------------------------------
bool isFunction(const char *fn)
{
const char *string = StringTable->lookup(fn);
if(!string)
return false;
else
return Namespace::global()->lookup(string) != NULL;
}
//------------------------------------------------------------------------------
void setLogMode(S32 newMode)
{
if ((newMode & 0x3) != (consoleLogMode & 0x3)) {
if (newMode && !consoleLogMode) {
// Enabling logging when it was previously disabled.
newLogFile = true;
}
if ((consoleLogMode & 0x3) == 2) {
// Changing away from mode 2, must close logfile.
consoleLogFile.close();
}
else if ((newMode & 0x3) == 2) {
// Starting mode 2, must open logfile.
consoleLogFile.open(defLogFileName, FileStream::Write);
}
consoleLogMode = newMode;
}
}
Namespace *lookupNamespace(const char *ns)
{
if(!ns)
return Namespace::global();
return Namespace::find(StringTable->insert(ns));
}
bool linkNamespaces(const char *parent, const char *child)
{
Namespace *pns = lookupNamespace(parent);
Namespace *cns = lookupNamespace(child);
if(pns && cns)
return cns->classLinkTo(pns);
return false;
}
bool classLinkNamespaces(Namespace *parent, Namespace *child)
{
if(parent && child)
return child->classLinkTo(parent);
return false;
}
void setData(S32 type, void *dptr, S32 index, S32 argc, const char **argv, EnumTable *tbl, BitSet32 flag)
{
ConsoleBaseType *cbt = ConsoleBaseType::getType(type);
AssertFatal(cbt, "Con::setData - could not resolve type ID!");
cbt->setData((void *) (((const char *)dptr) + index * cbt->getTypeSize()),argc, argv, tbl, flag);
}
const char *getData(S32 type, void *dptr, S32 index, EnumTable *tbl, BitSet32 flag)
{
ConsoleBaseType *cbt = ConsoleBaseType::getType(type);
AssertFatal(cbt, "Con::getData - could not resolve type ID!");
return cbt->getData((void *) (((const char *)dptr) + index * cbt->getTypeSize()), tbl, flag);
}
} // end of Console namespace
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -