/** * Loads console commands list * See CP_DEF_C, CP_DEF_C2, CP_DEF_S, CP_DEF **/ void console_load_defaults(void) { struct { char *name; CParseFunc func; char *connect; struct CParseEntry *self; } default_list[] = { CP_DEF(help), /** * Server related commands **/ CP_DEF_C(server), CP_DEF_S(ers_report,server), CP_DEF_S(mem_report,server), CP_DEF_S(malloc_usage,server), CP_DEF_S(exit,server), /** * Sql related commands **/ CP_DEF_C(sql), CP_DEF_C2(update,sql), CP_DEF_S(skip,update), }; unsigned int i, len = ARRAYLENGTH(default_list); struct CParseEntry *cmd; RECREATE(console->input->cmds,struct CParseEntry *, len); for(i = 0; i < len; i++) { CREATE(cmd, struct CParseEntry, 1); safestrncpy(cmd->cmd, default_list[i].name, CP_CMD_LENGTH); if( default_list[i].func ) cmd->u.func = default_list[i].func; else cmd->u.next = NULL; cmd->next_count = 0; console->input->cmd_count++; console->input->cmds[i] = cmd; default_list[i].self = cmd; if( !default_list[i].connect ) { RECREATE(console->input->cmd_list,struct CParseEntry *, ++console->input->cmd_list_count); console->input->cmd_list[console->input->cmd_list_count - 1] = cmd; } }
/** * Loads console commands list **/ void console_load_defaults(void) { /** * Defines a main category. * * Categories can't be used as commands! * E.G. * - sql update skip * 'sql' is the main category * CP_DEF_C(category) **/ #define CP_DEF_C(x) { #x , CPET_CATEGORY, NULL , NULL, NULL } /** * Defines a sub-category. * * Sub-categories can't be used as commands! * E.G. * - sql update skip * 'update' is a sub-category * CP_DEF_C2(command, category) **/ #define CP_DEF_C2(x,y) { #x , CPET_CATEGORY, NULL , #y, NULL } /** * Defines a command that is inside a category or sub-category * CP_DEF_S(command, category/sub-category) **/ #define CP_DEF_S(x,y) { #x, CPET_FUNCTION, CPCMD_C_A(x,y), #y, NULL } /** * Defines a command that is _not_ inside any category * CP_DEF_S(command) **/ #define CP_DEF(x) { #x , CPET_FUNCTION, CPCMD_A(x), NULL, NULL } struct { char *name; int type; CParseFunc func; char *connect; struct CParseEntry *self; } default_list[] = { CP_DEF(help), /** * Server related commands **/ CP_DEF_C(server), CP_DEF_S(ers_report,server), CP_DEF_S(mem_report,server), CP_DEF_S(malloc_usage,server), CP_DEF_S(exit,server), /** * Sql related commands **/ CP_DEF_C(sql), CP_DEF_C2(update,sql), CP_DEF_S(skip,update), }; int len = ARRAYLENGTH(default_list); struct CParseEntry *cmd; int i; VECTOR_ENSURE(console->input->commands, len, 1); for(i = 0; i < len; i++) { CREATE(cmd, struct CParseEntry, 1); safestrncpy(cmd->cmd, default_list[i].name, CP_CMD_LENGTH); cmd->type = default_list[i].type; switch (cmd->type) { case CPET_FUNCTION: cmd->u.func = default_list[i].func; break; case CPET_CATEGORY: VECTOR_INIT(cmd->u.children); break; case CPET_UNKNOWN: break; } VECTOR_PUSH(console->input->commands, cmd); default_list[i].self = cmd; if (!default_list[i].connect) { VECTOR_ENSURE(console->input->command_list, 1, 1); VECTOR_PUSH(console->input->command_list, cmd); } } for (i = 0; i < len; i++) { int k; if (!default_list[i].connect) continue; ARR_FIND(0, VECTOR_LENGTH(console->input->commands), k, strcmpi(default_list[i].connect, VECTOR_INDEX(console->input->commands, k)->cmd) == 0); if (k != VECTOR_LENGTH(console->input->commands)) { struct CParseEntry *parent = VECTOR_INDEX(console->input->commands, k); Assert_retb(parent->type == CPET_CATEGORY); cmd = default_list[i].self; VECTOR_ENSURE(parent->u.children, 1, 1); VECTOR_PUSH(parent->u.children, cmd); } } #undef CP_DEF_C #undef CP_DEF_C2 #undef CP_DEF_S #undef CP_DEF }