You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.1 KiB

1 month ago
#include "app_cmd_parser.h"
#include <string.h>
#include <ctype.h>
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;
}