int GetIntVariable(const string& key) { string v = GetVariable(key); return atoi(v.c_str()); }
/* ================ idInterpreter::GetRegisterValue Returns a string representation of the value of the register. This is used primarily for the debugger and debugging //FIXME: This is pretty much wrong. won't access data in most situations. ================ */ bool idInterpreter::GetRegisterValue( const char *name, idStr &out, int scopeDepth ) { varEval_t reg; idVarDef *d; char funcObject[ 1024 ]; char *funcName; const idVarDef *scope; const idTypeDef *field; const idScriptObject *obj; const function_t *func; out.Empty(); if ( scopeDepth == -1 ) { scopeDepth = callStackDepth; } if ( scopeDepth == callStackDepth ) { func = currentFunction; } else { func = callStack[ scopeDepth ].f; } if ( !func ) { return false; } idStr::Copynz( funcObject, func->Name(), sizeof( funcObject ) ); funcName = strstr( funcObject, "::" ); if ( funcName ) { *funcName = '\0'; scope = gameLocal.program.GetDef( NULL, funcObject, &def_namespace ); funcName += 2; } else { funcName = funcObject; scope = &def_namespace; } // Get the function from the object d = gameLocal.program.GetDef( NULL, funcName, scope ); if ( !d ) { return false; } // Get the variable itself and check various namespaces d = gameLocal.program.GetDef( NULL, name, d ); if ( !d ) { if ( scope == &def_namespace ) { return false; } d = gameLocal.program.GetDef( NULL, name, scope ); if ( !d ) { d = gameLocal.program.GetDef( NULL, name, &def_namespace ); if ( !d ) { return false; } } } reg = GetVariable( d ); switch( d->Type() ) { case ev_float: if ( reg.floatPtr ) { out = va("%g", *reg.floatPtr ); } else { out = "0"; } return true; break; case ev_vector: if ( reg.vectorPtr ) { out = va( "%g,%g,%g", reg.vectorPtr->x, reg.vectorPtr->y, reg.vectorPtr->z ); } else { out = "0,0,0"; } return true; break; case ev_boolean: if ( reg.intPtr ) { out = va( "%d", *reg.intPtr ); } else { out = "0"; } return true; break; case ev_field: if ( scope == &def_namespace ) { // should never happen, but handle it safely anyway return false; } field = scope->TypeDef()->GetParmType( reg.ptrOffset )->FieldType(); obj = *reinterpret_cast<const idScriptObject **>( &localstack[ callStack[ callStackDepth ].stackbase ] ); if ( !field || !obj ) { return false; } switch ( field->Type() ) { case ev_boolean: out = va( "%d", *( reinterpret_cast<int *>( &obj->data[ reg.ptrOffset ] ) ) ); return true; case ev_float: out = va( "%g", *( reinterpret_cast<float *>( &obj->data[ reg.ptrOffset ] ) ) ); return true; default: return false; } break; case ev_string: if ( reg.stringPtr ) { out = "\""; out += reg.stringPtr; out += "\""; } else { out = "\"\""; } return true; default: return false; } }
char * get_prompt(promptStatus_t status) { #define MAX_PROMPT_SIZE 256 static char destination[MAX_PROMPT_SIZE + 1]; char buf[MAX_PROMPT_SIZE + 1]; bool esc = false; const char *p; const char *prompt_string = "? "; const char *prompt_name = NULL; switch (status) { case PROMPT_READY: prompt_name = "PROMPT1"; break; case PROMPT_CONTINUE: case PROMPT_SINGLEQUOTE: case PROMPT_DOUBLEQUOTE: case PROMPT_DOLLARQUOTE: case PROMPT_COMMENT: case PROMPT_PAREN: prompt_name = "PROMPT2"; break; case PROMPT_COPY: prompt_name = "PROMPT3"; break; } if (prompt_name) prompt_string = GetVariable(pset.vars, prompt_name); destination[0] = '\0'; for (p = prompt_string; p && *p && strlen(destination) < MAX_PROMPT_SIZE; p++) { memset(buf, 0, MAX_PROMPT_SIZE + 1); if (esc) { switch (*p) { /* Current database */ case '/': if (pset.db) strncpy(buf, PQdb(pset.db), MAX_PROMPT_SIZE); break; case '~': if (pset.db) { const char *var; if (strcmp(PQdb(pset.db), PQuser(pset.db)) == 0 || ((var = getenv("PGDATABASE")) && strcmp(var, PQdb(pset.db)) == 0)) strcpy(buf, "~"); else strncpy(buf, PQdb(pset.db), MAX_PROMPT_SIZE); } break; /* DB server hostname (long/short) */ case 'M': case 'm': if (pset.db) { const char *host = PQhost(pset.db); /* INET socket */ if (host && host[0] && !is_absolute_path(host)) { strncpy(buf, host, MAX_PROMPT_SIZE); if (*p == 'm') buf[strcspn(buf, ".")] = '\0'; } #ifdef HAVE_UNIX_SOCKETS /* UNIX socket */ else { if (!host || strcmp(host, DEFAULT_PGSOCKET_DIR) == 0 || *p == 'm') strncpy(buf, "[local]", MAX_PROMPT_SIZE); else snprintf(buf, MAX_PROMPT_SIZE, "[local:%s]", host); } #endif } break; /* DB server port number */ case '>': if (pset.db && PQport(pset.db)) strncpy(buf, PQport(pset.db), MAX_PROMPT_SIZE); break; /* DB server user name */ case 'n': if (pset.db) strncpy(buf, session_username(), MAX_PROMPT_SIZE); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': *buf = (char) strtol(p, (char **) &p, 8); --p; break; case 'R': switch (status) { case PROMPT_READY: if (!pset.db) buf[0] = '!'; else if (!GetVariableBool(pset.vars, "SINGLELINE")) buf[0] = '='; else buf[0] = '^'; break; case PROMPT_CONTINUE: buf[0] = '-'; break; case PROMPT_SINGLEQUOTE: buf[0] = '\''; break; case PROMPT_DOUBLEQUOTE: buf[0] = '"'; break; case PROMPT_DOLLARQUOTE: buf[0] = '$'; break; case PROMPT_COMMENT: buf[0] = '*'; break; case PROMPT_PAREN: buf[0] = '('; break; default: buf[0] = '\0'; break; } break; case 'x': if (!pset.db) buf[0] = '?'; else switch (PQtransactionStatus(pset.db)) { case PQTRANS_IDLE: buf[0] = '\0'; break; case PQTRANS_ACTIVE: case PQTRANS_INTRANS: buf[0] = '*'; break; case PQTRANS_INERROR: buf[0] = '!'; break; default: buf[0] = '?'; break; } break; case '?': /* not here yet */ break; case '#': if (is_superuser()) buf[0] = '#'; else buf[0] = '>'; break; /* execute command */ case '`': { FILE *fd = NULL; char *file = pg_strdup(p + 1); int cmdend; cmdend = strcspn(file, "`"); file[cmdend] = '\0'; if (file) fd = popen(file, "r"); if (fd) { fgets(buf, MAX_PROMPT_SIZE - 1, fd); pclose(fd); } if (strlen(buf) > 0 && buf[strlen(buf) - 1] == '\n') buf[strlen(buf) - 1] = '\0'; free(file); p += cmdend + 1; break; } /* interpolate variable */ case ':': { char *name; const char *val; int nameend; name = pg_strdup(p + 1); nameend = strcspn(name, ":"); name[nameend] = '\0'; val = GetVariable(pset.vars, name); if (val) strncpy(buf, val, MAX_PROMPT_SIZE); free(name); p += nameend + 1; break; } case '[': case ']': #if defined(USE_READLINE) && defined(RL_PROMPT_START_IGNORE) /* * readline >=4.0 undocumented feature: non-printing * characters in prompt strings must be marked as such, in * order to properly display the line during editing. */ buf[0] = (*p == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE; buf[1] = '\0'; #endif /* USE_READLINE */ break; default: buf[0] = *p; buf[1] = '\0'; break; } esc = false; } else if (*p == '%') esc = true; else { buf[0] = *p; buf[1] = '\0'; esc = false; } if (!esc) strncat(destination, buf, MAX_PROMPT_SIZE - strlen(destination)); } destination[MAX_PROMPT_SIZE] = '\0'; return destination; }