// r1: bumped to 256k. void EXPORT FS_Read (void *buffer, int len, FILE *f) { int block, remaining; size_t read; byte *buf; #ifdef CD_AUDIO int tries = 0; #endif Q_assert (len != 0); buf = (byte *)buffer; // read in chunks for progress bar remaining = len; while (remaining) { block = remaining; if (block > MAX_READ) block = MAX_READ; read = fread (buf, block, 1, f); if (read == 0) { // we might have been trying to read from a CD #ifdef CD_AUDIO if (!tries) { tries = 1; CDAudio_Stop(); } else #endif { if (ferror (f)) { Com_Error (ERR_FATAL, "FS_Read(%d): Read error on '%s'. Did you forget to empty the filesystem cache after modifying a file?", len, current_filename); } else { Com_Printf ("WARNING: Incomplete read of %d bytes from '%s'. Did you forget to empty the filesystem cache after modifying a file?\n", LOG_WARNING, len, current_filename); return; } } } // do some progress bar thing here... remaining -= block; buf += block; } }
/* ============ Cvar_VariableValue ============ */ float Cvar_VariableValue (const char *var_name) { const cvar_t *var; Q_assert (var_name != NULL); var = Cvar_FindVar (var_name); if (!var) return 0; return var->value; }
int Cvar_IntValue (const char *var_name) { const cvar_t *var; Q_assert (var_name != NULL); var = Cvar_FindVar (var_name); if (!var) return 0; return var->intvalue; }
/* ============ Cvar_VariableString ============ */ const char *Cvar_VariableString (const char *var_name) { const char *metavar; const cvar_t *var; Q_assert (var_name != NULL); metavar = Cvar_GetMetaVar (var_name); if (metavar) return metavar; var = Cvar_FindVar (var_name); if (var) return var->string; return ""; }
/* ============ Cvar_Get If the variable already exists, the value will not be set The flags will be or'ed in if the variable exists. ============ */ cvar_t * EXPORT Cvar_Get (const char *var_name, const char *var_value, int flags) { cvar_t *var; Q_assert (var_name != NULL); if (flags & (CVAR_USERINFO | CVAR_SERVERINFO)) { if (!Cvar_InfoValidate (var_name)) { Com_Printf("invalid info cvar name\n", LOG_GENERAL); return NULL; } } var = Cvar_FindVar (var_name); if (var) { var->flags |= flags; return var; } if (!var_value) return NULL; if (flags & (CVAR_USERINFO | CVAR_SERVERINFO)) { if (!Cvar_InfoValidate (var_value)) { Com_Printf("invalid info cvar value\n", LOG_GENERAL); return NULL; } } return Cvar_Add (var_name, var_value, flags); }
/* ============ Cvar_CompleteVariable ============ */ const char *Cvar_CompleteVariable (const char *partial) { const cvar_t *cvar; int len; Q_assert (partial != NULL); len = (int)strlen(partial); if (!len) return NULL; // check exact match (note, don't use rbtree since we want some kind of order here) for (cvar=cvar_vars ; cvar ; cvar=cvar->next) if (!strcmp (partial,cvar->name)) return cvar->name; // check partial match for (cvar=cvar_vars ; cvar ; cvar=cvar->next) if (!strncmp (partial,cvar->name, len)) return cvar->name; return NULL; }
/* ============ Cvar_Set2 ============ */ static cvar_t *Cvar_Set2 (const char *var_name, const char *value, qboolean force) { cvar_t *var; char *old_string; Q_assert (var_name != NULL); Q_assert (value != NULL); if (var_name[0] == '$' && !force) { Com_Printf ("%s is write protected.\n", LOG_GENERAL, var_name); return NULL; } var = Cvar_FindVar (var_name); if (!var) { // create it return Cvar_Get (var_name, value, 0); } if (var->flags & (CVAR_USERINFO | CVAR_SERVERINFO)) { if (!Cvar_InfoValidate (value)) { Com_Printf("invalid info cvar value\n", LOG_GENERAL); return var; } } if (!force) { #ifdef _DEBUG if (var->flags & CVAR_NOSET && !Cvar_IntValue ("developer")) #else if (var->flags & CVAR_NOSET) #endif { Com_Printf ("%s is write protected.\n", LOG_GENERAL, var_name); return var; } if (var->flags & CVAR_LATCH) { if (var->latched_string) { if (strcmp(value, var->latched_string) == 0) return var; Z_Free (var->latched_string); } else { if (strcmp(value, var->string) == 0) return var; } if (Com_ServerState()) { Com_Printf ("%s will be changed for next map.\n", LOG_GENERAL, var_name); var->latched_string = CopyString(value, TAGMALLOC_CVAR); } else { //memleak fix, thanks Maniac- Z_Free (var->string); var->string = CopyString(value, TAGMALLOC_CVAR); var->value = (float)atof (var->string); var->intvalue = (int)var->value; //r1: fix 0 case if (!var->intvalue && FLOAT_NE_ZERO(var->value)) var->intvalue = 1; if (!strcmp(var->name, "game")) { FS_SetGamedir (var->string); if (!Cvar_IntValue ("dedicated")) FS_ExecConfig ("autoexec.cfg"); } } return var; } } else { if (var->latched_string) { Z_Free (var->latched_string); var->latched_string = NULL; } } if (!strcmp(value, var->string)) return var; // not changed old_string = var->string; var->string = CopyString(value, TAGMALLOC_CVAR); var->value = (float)atof (var->string); var->intvalue = (int)var->value; //r1: fix 0 case if (!var->intvalue && FLOAT_NE_ZERO(var->value)) var->intvalue = 1; var->modified = true; if (var->changed) var->changed (var, old_string, var->string); if (var->flags & CVAR_USERINFO) userinfo_modified = true; // transmit at next oportunity Z_Free (old_string); // free the old value string return var; }