Quake 3 源码分析(二)
--命令与实现
1. void Cvar_Init (void)
{
Cvar_Get("sv_cheats", "1", CVAR_ROM | CVAR_SYSTEMINFO );
Cmd_AddCommand( const char *cmd_name, xcommand_t function )//将命令(命令名及对应的函数)增加到cmd_functions链上去,内存分配使用smallzone(内存池初始大小512 * 1024)或mainzone(1024 * 1024 * 24,在Com_InitZoneMemory()中初始化);
}
2 .cvar_t *Cvar_Get( const char *var_name, const char *var_value, int flags )
{
Cvar_FindVar (var_name)//在hash表中查找
If(找到)
{
//根据flags的值重设var_value值
}
Eles //没有找到
{
var = &cvar_indexes[cvar_numIndexes];//在全局数组中得到空间
var->next = cvar_vars;
cvar_vars = var;//加入链表
hash = generateHashValue(var_name);//使用hash算法生成hash值
var->hashNext = hashTable[hash];(#define FILE_HASH_SIZE 1024
static shader_t* hashTable[FILE_HASH_SIZE];)
hashTable[hash] = var;//加入hash表
}
}
/////////////////////////////////////////////////////////////////////////////////////////
static long generateHashValue( const char *fname ) {
int i;
long hash;
char letter;
hash = 0;
i = 0;
while (fname[i] != '/0') {
letter = tolower(fname[i]);
hash+=(long)(letter)*(i+119);
i++;
}
hash &= (FILE_HASH_SIZE-1);
return hash;
}
typedef struct cvar_s {
char *name;
char *string;
char *resetString; // cvar_restart will reset to this value
char *latchedString; // for CVAR_LATCH vars
int flags;
qboolean modified; // set each time the cvar is changed
int modificationCount; // incremented each time the cvar is changed
float value; // atof( string )
int integer; // atoi( string )
struct cvar_s *next;
struct cvar_s *hashNext;
} cvar_t;
3.void Cbuf_AddText( const char *text ) { //text如” exec default.cfg/n”
int l;
l = strlen (text);
if (cmd_text.cursize + l >= cmd_text.maxsize) // cmd_t cmd_text;
{
Com_Printf ("Cbuf_AddText: overflow/n");
return;
}
Com_Memcpy(&cmd_text.data[cmd_text.cursize], text, l);
cmd_text.cursize += l;
}
typedef struct {
byte *data;// àbyte cmd_text_buf[16384]
int maxsize;
int cursize;
} cmd_t;
4.void Cbuf_Execute (void)
{
While(cmd_text.cursize)
{
//以”/n”or”;”为分隔符,解析上一条命令
//把解析出的命令从cmd_text移出
// Cmd_ExecuteString (line)
}
}
void Cmd_ExecuteString( const char *text )
{
//所命令COPY到cmd_cmd[]中
//检查注册的命令函数(cmd_functions,在Cmd_AddCommand中加入了注册的命令)
//根据命令名从cmd_functions链表中查找,找到后调用对应的命令函数(cmd->function ())
//把这个项加在cmd_functions的最前面,加速下次查找
//如果没找到(Cvar_FindVar),调用Cvar_Set2函数加入hashTable[]中
}
void Cmd_Exec_f( void ) {//” exec default.cfg/n” àexec命令的执行函数
{
len = FS_ReadFile( filename, (void **)&f);//读入文件(default.cfg)内容到缓冲
Cbuf_InsertText (f);//把内容加入到cmd_text中
FS_FreeFile (f);// 释放缓冲
}
void Cbuf_InsertText( const char *text )
{
// move the existing command text
for ( i = cmd_text.cursize - 1 ; i >= 0 ; i-- ) {
cmd_text.data[ i + len ] = cmd_text.data[ i ];
}
// copy the new text in
Com_Memcpy( cmd_text.data, text, len - 1 );
// add a /n
cmd_text.data[ len - 1 ] = '/n';
cmd_text.cursize += len;
}