Quake 3 源码分析(二)

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)或mainzone1024 * 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 )

{

       //所命令COPYcmd_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;

}

 

你可能感兴趣的:(源码分析)