home *** CD-ROM | disk | FTP | other *** search
- #include "ConsoleCCmds.h"
- #include "CVar.h"
- #include "CAlias.h"
- #include "ConsoleFrontEnd.h"
- #include "Tokenizer.h"
- #include "Gui.h" // fⁿr echo
-
-
- /*
- This ccmd registers a ccvar. After registering the cvar can be used by the console.
- */
- CCmdRegister::CCmdRegister():CCmd("register"){
- usageStr="register [variable] <initial value>";
- infoStr="registers a variable (so it can be used)";
- }
- CCmdRegister::~CCmdRegister(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
-
- bool CCmdRegister::exec(int argc, char* argv[]){
- if(argc==1){
- CVarString* cVar = new CVarString(newString(argv[0]), "<empty>");
- cVar->flags = CON_FLAG_USER;
- return console->registerCVar(cVar);
-
- }else if(argc==2){
- CVarString* cVar = new CVarString(newString(argv[0]), argv[1]);
- cVar->flags = CON_FLAG_USER;
- return console->registerCVar(cVar);
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
- /*
- The counterpart to register.
- */
- CCmdUnregister::CCmdUnregister():CCmd("unregister"){
- usageStr="unregister [variable]";
- infoStr="unregisters a variable";
- }
- CCmdUnregister::~CCmdUnregister(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
-
- bool CCmdUnregister::exec(int argc, char* argv[]){
- if(argc==1){
- CVar* cVar=console->getCVar(argv[0]);
- if(cVar==NULL){
- console->print("No cvar with name '%s' found.\n",argv[0]);
- return false;
- }else{
- if( (cVar->flags & CON_FLAG_USER) != 0 ){
- return console->unregisterCVar(cVar); // always true... or isn't it...
- }else{
- console->print("'%s' is not an user-defined variable.\n", cVar->name);
- return false;
- }
- }
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- This sets a cvar to a specific value
- */
-
- CCmdSet::CCmdSet():CCmd("set"){
- usageStr="set [variable] [value]";
- infoStr="sets a variable to a given value";
- }
- CCmdSet::~CCmdSet(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
-
- bool CCmdSet::exec(int argc, char* argv[]){
- char buff[CON_MAX_STRING_LENGTH];
-
- if(argc==2){
- CVar* cVar=console->getCVar(argv[0]);
- if(cVar==NULL){
- console->print("No cvar with name '%s' found.\n",argv[0]);
- return false;
- }else{
- if( (cVar->flags & CON_FLAG_READ_ONLY) == 0 ){
- if(cVar->valStrIsValid(argv[1])){
- cVar->setValStr(argv[1]);
- console->print("'%s' set to '%s' %s\n", cVar->name, cVar->getValStr(buff), cVar->changeStr);
- return true;
- }else{
- console->print("'%s' is not a valid value for '%s'\n", argv[1], cVar->name);
- return false;
- }
- }else{
- console->print("'%s' is read-only.\n", cVar->name);
- return false;
- }
- }
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- This shows the value of a cvar in the console window
- */
- CCmdVal::CCmdVal():CCmd("val"){
- usageStr="val [variable]";
- infoStr="displays the current value of a variable";
- }
- CCmdVal::~CCmdVal(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdVal::exec(int argc, char* argv[]){
- char val[CON_MAX_STRING_LENGTH];
- char varVal[CON_MAX_STRING_LENGTH];
-
- if(argc==1){
- CVar* cVar=console->getCVar(argv[0]);
- if(cVar!=NULL){
- if( true /*console->hasAccessToCVar(cVar, CON_FLAG_READ)*/){
- cVar->getValStr(val);
- cVar->getVarValStr(varVal);
- if(streq(val, varVal))
- console->print("value of '%s': %s\n", cVar->name, val);
- else
- console->print("value of '%s': %s (internal value: %s)\n", cVar->name, val, varVal);
- return true;
- }else{
- console->print("'%s': read access denied\n", cVar->name);
- return false;
- }
- }else{
- console->print("No cvar with name '%s' found.\n",argv[0]);
- return false;
- }
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- This shows a short help-message.
- */
- CCmdHelp::CCmdHelp():CCmd("help"){
- usageStr="help";
- infoStr="displays a short help message on how to use the console";
- }
- CCmdHelp::~CCmdHelp(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdHelp::exec(int argc, char* argv[]){
- console->print("^3This is the FWP command console.\n");
- console->print("^3Type 'info [command/variable]' to get information on a special command/variable.\n");
- console->print("^3The commands 'ccmdlist' and 'cvarlist' list all console commands/variables.\n");
- return true;
- }
-
- /*
- This shows some more or less usefull information about a cvar (such as value, access, val-range,...).
- */
- CCmdInfo::CCmdInfo():CCmd("info"){
- usageStr="info [variable/command]";
-
- infoStr="displays some information about a variable or a command";
- }
- CCmdInfo::~CCmdInfo(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdInfo::exec(int argc, char* argv[]){
- char val[CON_MAX_STRING_LENGTH];
- char varVal[CON_MAX_STRING_LENGTH];
- char type[CON_MAX_STRING_LENGTH];
- char valRange[CON_MAX_STRING_LENGTH];
- char flags[CON_MAX_STRING_LENGTH];
-
- if(argc==1){
- CCmd* cCmd=console->getCCmd(argv[0]);
- if(cCmd!=NULL){
- if( true /*console->hasAccessToCCmd(cCmd, CON_FLAG_READ)*/){
- // print flags
- console->print("%s: %s\n", cCmd->name, cCmd->infoStr);
- console->print("usage: %s\n",cCmd->usageStr);
- return true;
- }else{
- console->print("'%s': read access denied\n", cCmd->name);
- return false;
- }
- }else{
- CVar* cVar=console->getCVar(argv[0]);
- if(cVar!=NULL){
- if( true /*console->hasAccessToCVar(cVar, CON_FLAG_READ)*/){
- cVar->getTypeStr(type);
- cVar->getValStr(val);
- cVar->getVarValStr(varVal);
- cVar->getFlagsStr(flags);
- cVar->getValRangeStr(valRange);
-
-
- console->print("%s: %s\n", cVar->name, cVar->infoStr);
- console->print("type: %s | value: %s (internal value: %s) | valRange: %s\n", type, val, varVal, valRange);
- console->print("access flags: %s\n", flags);
- return true;
- }else{
- console->print("'%s': read access denied\n", cVar->name);
- return false;
- }
-
- }else{
- console->print("No cvar/ccmd with name '%s' found.\n",argv[0]);
- return false;
- }
- }
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
- /*
- displays the 'usage'-string of a ccmd in the console window
- */
- CCmdUsage::CCmdUsage():CCmd("usage"){
- usageStr="usage [command]";
- infoStr="shows how to use a specific command";
- }
- CCmdUsage::~CCmdUsage(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdUsage::exec(int argc, char* argv[]){
- if(argc==1){
- CCmd* cCmd=console->getCCmd(argv[0]);
- if(cCmd!=NULL){
- if( true /*console->hasAccessToCCmd(cCmd, CON_FLAG_READ)*/){
- console->print("usage: %s\n",cCmd->usageStr);
- return true;
- }else{
- console->print("'%s': read access denied\n", cCmd->name);
- return false;
- }
- }else{
- console->print("no ccmd with name '%s' found.\n",argv[0]);
- return false;
- }
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- Cycles through all valid values for a specific cvar
- */
- CCmdToggle::CCmdToggle():CCmd("toggle"){
- usageStr="toggle [variable]";
- infoStr="cycles through all valid values for a variable";
- }
- CCmdToggle::~CCmdToggle(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdToggle::exec(int argc, char* argv[]){
- char buff[CON_MAX_STRING_LENGTH];
-
- if(argc==1){
- CVar* cVar=console->getCVar(argv[0]);
- if(cVar==NULL){
- console->print("No cvar with name '%s' found.\n",argv[0]);
- return false;
- }else{
- if( (cVar->flags & CON_FLAG_READ_ONLY) == 0 ){
- if(cVar->toggle()){
- console->print("'%s' set to %s %s\n", cVar->name, cVar->getValStr(buff), cVar->changeStr);
- return true;
- }else{
- console->print("couldn't toggle '%s'\n", cVar->name);
- return false;
- }
- }else{
- console->print("'%s' is read-only.\n", cVar->name);
- return false;
- }
- }
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- This 'executes' a cvar, i.e. the commands stored in it are executed by the console.
- (Of course this only makes sense for string-cvars)
- */
- CCmdExecCVar::CCmdExecCVar():CCmd("execCVar"){
- usageStr="execCVar [variable]";
- infoStr="executes the commands stored in a variable";
- }
- CCmdExecCVar::~CCmdExecCVar(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdExecCVar::exec(int argc, char* argv[]){
- char buff[CON_MAX_STRING_LENGTH];
-
- if(argc==1){
- CVar* cVar=console->getCVar(argv[0]);
- if(cVar==NULL){
- console->print("No cvar with name '%s' found.\n",argv[0]);
- return false;
- }else{
- if( true /*console->hasAccessToCVar(cVar, CON_FLAG_EXECUTE)*/){
- if(console->parse(cVar->getValStr(buff))){
- console->print("finished execution of '%s'\n", cVar->name);
- return true;
- }else{
- console->print("error while parsing '%s'\n", cVar->name);
- return false;
- }
- }else{
- console->print("'s': execute access denied\n", cVar->name);
- return false;
- }
- }
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
- /*
- Executes the commands stored in a file
- */
- CCmdExecFile::CCmdExecFile():CCmd("execFile"){
- usageStr="execFile [filename]";
- infoStr="executes the commands stored in a file";
- }
- CCmdExecFile::~CCmdExecFile(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdExecFile::exec(int argc, char* argv[]){
- char buff[CON_MAX_STRING_LENGTH];
- FILE *f;
- int i;
-
- if(argc==1){
- f=fopen(argv[0], "rt");
- if(f==NULL){
- console->print("couldn't open file '%s'.\n",argv[0]);
-
- return false;
- }else{
- while(!feof(f)){
- if(fgets(buff, CON_MAX_STRING_LENGTH, f)){ // THINKABOUTME: %nc benutzen??? (ⁿberlauf!!) && '\r' fⁿr linux && sgets() benutzen?
- // printf("--> file: %s : %i\n", buff, strlen(buff));
- for(i=0;i<(signed int)strlen(buff);i++){ // should be strlen-1 but we only read i+1, so no problem
- if(buff[i]=='/' && buff[i+1]=='/'){ // remove comments // FIXME: comments in "" drinlassen!!
- buff[i]='\0';
- break;
- }
- if(buff[i]=='\r' || buff[i]=='\n'){
- buff[i]='\0';
- break;
- }
- }
- if(strlen(buff)>0)
- console->parse(buff);
- // console->print("<-- parsed line: %s\n", buff);
- }else{
- // printf("EOF\n");
- // fgetc(f); // \n weglesen??
- }
-
- }
- fclose(f);
- return true;
- }
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- Executes the commands stored in a cvar OR, if no matching cvar is found, in a file
- */
- CCmdExec::CCmdExec():CCmd("exec"){
- usageStr="exec [cvarname/filename]";
- infoStr="executes the commands stored in a cvar or in a file";
- }
- CCmdExec::~CCmdExec(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdExec::exec(int argc, char* argv[]){
- char buff[CON_MAX_STRING_LENGTH];
- FILE *f;
- int i;
-
- if(argc==1){
- CVar* cVar=console->getCVar(argv[0]);
- if(cVar!=NULL){
- if( true /*console->hasAccessToCVar(cVar, CON_FLAG_EXECUTE)*/){
- if(console->parse(cVar->getValStr(buff))){
- console->print("finished execution of '%s'\n", cVar->name);
- return true;
- }else{
- console->print("error while parsing '%s'\n", cVar->name);
- return false;
- }
- }else{
- console->print("'%s': execute access denied\n", cVar->name);
- return false;
- }
- }else{ // search for a file
- f=fopen(argv[0], "rt");
- if(f==NULL){
- console->print("no cvar or file with name '%s' found.\n",argv[0]);
- return false;
- }else{
- while(!feof(f)){
- if(fgets(buff, CON_MAX_STRING_LENGTH, f)){ // THINKABOUTME: %nc benutzen??? (ⁿberlauf!!) && '\r' fⁿr linux && sgets() benutzen?
- // printf("--> file: %s : %i\n", buff, strlen(buff));
- for(i=0;i<(signed int)strlen(buff);i++){
- if(buff[i]=='/' && buff[i+1]=='/'){ // remove comments
- buff[i]='\0';
- break;
- }
- if(buff[i]=='\r' || buff[i]=='\n'){
- buff[i]='\0';
- break;
- }
- } //for
- if(strlen(buff)>0)
- console->parse(buff);
- // console->print("<-- parsed line: %s\n", buff);
- }else{
- // printf("EOF\n");
- // fgetc(f); // \n weglesen??
- } //if
-
- } //while
- fclose(f);
- return true;
- }
- }// if cVar!=NULL
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
- /*
- lists all cvars currently registered to the console
- */
- CCmdCVarList::CCmdCVarList():CCmd("cvarlist"){
- usageStr="cvarlist <pattern>";
- infoStr="lists all console-variables";
- }
- CCmdCVarList::~CCmdCVarList(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdCVarList::exec(int argc, char* argv[]){
- int i;
- char val[CON_MAX_STRING_LENGTH];
- char varVal[CON_MAX_STRING_LENGTH];
- char flags[CON_MAX_STRING_LENGTH];
-
- if(argc==0){
- for(i=0;i<CON_MAX_CVARS;i++){
- if( console->cVars[i]!=NULL && true /*console->hasAccessToCVar(console->cVars[i], CON_FLAG_READ)*/){
- console->print(" %s %s: %s (int.:%s) %s\n"
- , console->cVars[i]->getFlagsStr(flags), console->cVars[i]->name, console->cVars[i]->getValStr(val),console->cVars[i]->getVarValStr(varVal), console->cVars[i]->infoStr);
- }
- }
- return true;
- }else if(argc==1){// pattern search
- int count=0;
- for(i=0;i<CON_MAX_CVARS;i++){
- if(console->cVars[i]!=NULL && !strncmp(argv[0], console->cVars[i]->name, strlen(argv[0])) && true /*console->hasAccessToCVar(console->cVars[i], CON_FLAG_READ)*/){
- console->print(" %s %s: %s (int.:%s) %s\n"
- , console->cVars[i]->getFlagsStr(flags), console->cVars[i]->name, console->cVars[i]->getValStr(val),console->cVars[i]->getVarValStr(varVal), console->cVars[i]->infoStr);
- count++;
- }
- }
- if(count==0){
- console->print("No cvars beginning with '%s' found.\n",argv[0]);
- }else{
- console->print("%i cvars beginning with '%s' found.\n",count, argv[0]);
- }
- return true;
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- Lists all ccmds that are currently registered
- */
- CCmdCCmdList::CCmdCCmdList():CCmd("ccmdlist"){
- usageStr="ccmdlist <pattern>";
- infoStr="lists all console-commands";
- }
- CCmdCCmdList::~CCmdCCmdList(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdCCmdList::exec(int argc, char* argv[]){
- int i;
- char flags[CON_MAX_STRING_LENGTH];
-
- if(argc==0){
- for(i=0;i<CON_MAX_CCMDS;i++){
- if( console->cCmds[i]!=NULL && true /*console->hasAccessToCCmd(console->cCmds[i], CON_FLAG_READ)*/){
- console->print(" %s %s (%s)\n"
- , console->cCmds[i]->getFlagsStr(flags), console->cCmds[i]->name, console->cCmds[i]->infoStr);
- }
- }
- return true;
- }else if(argc==1){
- int count=0;
- for(i=0;i<CON_MAX_CCMDS;i++){
- if(console->cCmds[i]!=NULL && !strncmp(argv[0], console->cCmds[i]->name, strlen(argv[0]))){
- console->print(" %s %s (%s)\n"
- , console->cCmds[i]->getFlagsStr(flags), console->cCmds[i]->name, console->cCmds[i]->infoStr);
- count++;
- }
- }
- if(count==0){
- console->print("No ccmds beginning with '%s' found.\n",argv[0]);
- }else{
- console->print("%i ccmds beginning with '%s' found.\n",count, argv[0]);
- }
- return true;
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
- /*
- prints a string to the consoles output window
- */
- CCmdEcho::CCmdEcho():CCmd("echo"){
- usageStr="echo [string]";
- infoStr="prints a string to the console window";
- }
- CCmdEcho::~CCmdEcho(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdEcho::exec(int argc, char* argv[]){
-
- if(argc==1){
- int length=strlen(argv[0])+2;
- char *buff=new char[length]; // create buffer to add newline to argv[0]
- strcpy(buff, argv[0]);
- buff[length-2]='\n'; // append newline
- buff[length-1]='\0'; // and NULL
- console->print(buff);
- if(Gui::hud!=NULL && Gui::hud->messagebox!=NULL)
- Gui::hud->messagebox->addMessage(new Message(buff)); // THINKABOUTME
- delete[] buff;
- return true;
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- registers a string under a new alias
- */
- CCmdAlias::CCmdAlias():CCmd("alias"){
- usageStr="alias [name] [string]";
- infoStr="registers a string under a new alias";
- }
- CCmdAlias::~CCmdAlias(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdAlias::exec(int argc, char* argv[]){
-
- if(argc==2){
- CAlias* alias=new CAlias(argv[0], argv[1]);
- return console->registerAlias(alias);
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- deletes an alias
- */
- CCmdDeleteAlias::CCmdDeleteAlias():CCmd("deleteAlias"){
- usageStr="deleteAlias [name]";
- infoStr="deletes an alias";
- }
- CCmdDeleteAlias::~CCmdDeleteAlias(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdDeleteAlias::exec(int argc, char* argv[]){
-
- if(argc==1){
- CAlias* alias=console->getAlias(argv[0]);
- if(alias!=NULL){
- return console->deleteAlias(alias);
- }else{
- console->print("No alias with name '%s' found.\n", argv[0]);
- return false;
- }
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- /*
- lists all registered aliases
- */
-
-
- CCmdAliasList::CCmdAliasList():CCmd("aliaslist"){
- usageStr="aliasist <pattern>";
- infoStr="lists all registered alias";
- }
- CCmdAliasList::~CCmdAliasList(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
- bool CCmdAliasList::exec(int argc, char* argv[]){
- int i;
-
- if(argc==0){
- for(i=0;i<CON_MAX_ALIASES;i++){
- if(console->aliases[i]!=NULL){
- console->print(" %s '%s'\n", console->aliases[i]->name, console->aliases[i]->string);
- }
- }
- return true;
- }else if(argc==1){
-
- // pattern search
- console->print("Pattern search not implemented yet. Sorry.");
- return false;
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- CCmdConsoleToggle::CCmdConsoleToggle():CCmd("console.toggle"){
-
- usageStr="console.toggle";
- infoStr="toggles console";
- }
-
- CCmdConsoleToggle::~CCmdConsoleToggle(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
-
- bool CCmdConsoleToggle::exec(int argc, char* argv[]){
- if(argc==0){
- if(consoleFrontEnd->isActive)
- consoleFrontEnd->deactivate();
- else
- consoleFrontEnd->activate();
-
- return true;
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- CCmdConsoleClear::CCmdConsoleClear():CCmd("console.clear"){
-
- usageStr="console.clear";
- infoStr="clears all console output";
- }
-
- CCmdConsoleClear::~CCmdConsoleClear(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
-
- bool CCmdConsoleClear::exec(int argc, char* argv[]){
- if(argc==0){
- console->clear();
- return true;
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- CCmdConsoleStartLog::CCmdConsoleStartLog():CCmd("console.startLog"){
- usageStr="console.startLog <filename>";
- infoStr="logs all console output to a file (default: 'console.log')";
- }
-
- CCmdConsoleStartLog::~CCmdConsoleStartLog(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
-
- bool CCmdConsoleStartLog::exec(int argc, char* argv[]){
- if(argc==0){
- console->startLog("console.log");
- return true;
- }else if(argc==1){
- console->startLog(argv[0]);
- return true;
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
- CCmdConsoleEndLog::CCmdConsoleEndLog():CCmd("console.endLog"){
- usageStr="console.endLog";
- infoStr="stops logging console output";
- }
-
- CCmdConsoleEndLog::~CCmdConsoleEndLog(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
-
- bool CCmdConsoleEndLog::exec(int argc, char* argv[]){
- if(argc==0){
- console->endLog();
- return true;
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
- CCmdConsoleRestart::CCmdConsoleRestart():CCmd("console.restart"){
- usageStr="console.restart";
- infoStr="restart the console subsystem";
- }
-
- CCmdConsoleRestart::~CCmdConsoleRestart(){
- if(console!=NULL)
- console->unregisterCCmd(this);
- }
-
- bool CCmdConsoleRestart::exec(int argc, char* argv[]){
- if(argc==0){
- console->print("This does not work well (yet...). Sorry.\n"); // FIXME:
- return true;
-
- //shutdownConsoleFE();
- //shutdownConsole();
- //return initConsoleFE();
- }else{
- console->print("usage: %s\n", usageStr);
- return false;
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-