/* central command parser */ void cmd_parser(char *buf) { CMD_STR* cmd = (CMD_STR*)buf; g_ans->command = cmd->command; g_ans->status = CMD_STATUS_OK; g_ans->size = 0; switch (cmd->command & CMD_GROUP_MASK) { case CMD_GROUP_COMM: cmd_comm(cmd, g_ans); break; case CMD_GROUP_TAP: cmd_tap(cmd, g_ans); break; case CMD_GROUP_JTAG: cmd_jtag(cmd, g_ans); break; case CMD_GROUP_AVR32_JTAG1: case CMD_GROUP_AVR32_JTAG2: cmd_avr32_jtag(cmd, g_ans); break; case CMD_GROUP_AVR32_BSR: cmd_avr32_bsr(cmd, g_ans); break; case CMD_GROUP_AVR32_EBI: cmd_avr32_ebi(cmd, g_ans); break; case CMD_GROUP_FLASH: cmd_flash(cmd, g_ans); break; default: cmd_answer_error(cmd->command, CMD_STATUS_UNKOWN_COMMAND, g_ans); break; } for (uint16_t i=g_ans->size; i<(CMD_ANSWER_BUF_LENGTH-4); i++) g_ans->data[i] = 0xAA; answer(g_ans->size + 4); }
RESULT select_loop(GameContext* pContext, GameEventContext* pEvent, const SelOption options[], int optnum, const char* strAlter, int* out_value) { int n; const char* s; const char* p; char buffer[1024]; int buflen; int v; while(1) { if(strAlter) MSG_OUT("%s\n", strAlter); for(n = 0; n < optnum; n++) { buflen = 0; buffer[0] = 0; buflen += sprintf(buffer + buflen, "("); s = options[n].input; if(*s == '\n' || *s == '\0') { buflen += sprintf(buffer + buflen, "%d", options[n].value); if(*s != 0) s++; } else { p = strchr_notnull(s, '\n'); strncpy(buffer + buflen, s, p - s); buflen += (p-s); if(*p == '\0') s = p; else s = p + 1; } while(*s != '\0' && *s != '\n' ) { p = strchr_notnull(s, '\n'); buffer[buflen++] = '/'; strncpy(buffer + buflen, s, p - s); buflen += (p-s); if(*p == 0) break; s = p + 1; } buflen += sprintf(buffer + buflen, ") %s", options[n].text); buffer[buflen] = 0; MSG_OUT(" %s\n", buffer); } if(NULL == get_cmd_line(pContext, pEvent, "[请选择] : ", buffer, sizeof(buffer))) return R_E_FAIL; strtrim(buffer); buflen = strlen(buffer); if(R_SUCC == to_int(buffer, &v)) { for(n = 0; n < optnum; n++) { if((options[n].input[0] == '\0' || options[n].input[0] == '\n') && v == options[n].value) { *out_value = options[n].value; return R_SUCC; } } } for(n = 0; n < optnum; n++) { s = options[n].input; if(*s == '\n') s++; while(*s != '\0' && *s != '\n') { p = strchr_notnull(s, '\n'); if(buflen == (p-s) && !strncasecmp(s, buffer, buflen)) { *out_value = options[n].value; return R_SUCC; } if(*p == 0) break; s = p + 1; } } // 没有找到匹配,看看是不是info 指令 ,是的话,执行info cmd_comm(pContext, pEvent, buffer); } return R_E_FAIL; }