#include "app_cmd_parser.h" #include #include static int parse_x_v_addr(const char *line, uint8_t *addr) { if (!line || !addr) return 0; if (!(line[0] == 'x' || line[0] == 'X')) return 0; if (!isdigit((unsigned char)line[1]) || !isdigit((unsigned char)line[2])) return 0; if (!(line[3] == 'v' || line[3] == 'V')) return 0; if (line[4] != '\0') return 0; *addr = (uint8_t)((line[1] - '0') * 10 + (line[2] - '0')); return 1; } static int find_payload_pos(const char *line) { const char *p = strchr(line, ':'); if (!p) return -1; return (int)(p - line + 1); } int app_cmd_parse_line(app_cmd_src_t src, const char *line, app_job_t *job) { uint8_t addr = 0; int payload_pos; if (!line || !job) return 0; memset(job, 0, sizeof(*job)); job->src = src; if (line[0] != 'x' && line[0] != 'X') { job->type = APP_JOB_LOCAL_EXEC; strncpy(job->line, line, sizeof(job->line) - 1); job->line[sizeof(job->line) - 1] = '\0'; return 1; } if (parse_x_v_addr(line, &addr)) { job->type = APP_JOB_SCAN_ADDR; job->addr = addr; strncpy(job->line, line, sizeof(job->line) - 1); job->line[sizeof(job->line) - 1] = '\0'; return 1; } payload_pos = find_payload_pos(line); if (payload_pos >= 0) { const char *payload = &line[payload_pos]; if ((payload[0] == 'o' || payload[0] == 'O') && (payload[1] == 'w' || payload[1] == 'W')) { job->type = APP_JOB_PROTO_OW; strncpy(job->line, line, sizeof(job->line) - 1); job->line[sizeof(job->line) - 1] = '\0'; return 1; } if ((payload[0] == 'o' || payload[0] == 'O') && (payload[1] == 'r' || payload[1] == 'R')) { job->type = APP_JOB_PROTO_OR; strncpy(job->line, line, sizeof(job->line) - 1); job->line[sizeof(job->line) - 1] = '\0'; return 1; } } job->type = APP_JOB_FORWARD_LINE; strncpy(job->line, line, sizeof(job->line) - 1); job->line[sizeof(job->line) - 1] = '\0'; return 1; }