/* ======================== CopyString NOTE: never write over the memory CopyString returns because memory from a memstatic_t might be returned ======================== */ char *CopyString( const char *in ) { char *out; if (!in[0]) { return ((char *)&gEmptyString) + sizeof(zoneHeader_t); } else if (!in[1]) { if (in[0] >= '0' && in[0] <= '9') { return ((char *)&gNumberString[in[0]-'0']) + sizeof(zoneHeader_t); } } out = (char *) S_Malloc (strlen(in)+1); strcpy (out, in); Z_Label(out,in); return out; }
/* ============ Cmd_AddCommand ============ */ void Cmd_AddCommand( const char *cmd_name, xcommand_t function ) { cmd_function_t *cmd; // fail if the command already exists for ( cmd = cmd_functions ; cmd ; cmd=cmd->next ) { if ( !strcmp( cmd_name, cmd->name ) ) { // allow completion-only commands to be silently doubled if ( function != NULL ) { Com_Printf ("Cmd_AddCommand: %s already defined\n", cmd_name); } return; } } cmd = (struct cmd_function_s *) S_Malloc (sizeof(cmd_function_t)); cmd->name = CopyString( cmd_name ); cmd->function = function; cmd->next = cmd_functions; cmd_functions = cmd; Z_Label(cmd,cmd_name); }