int parseRawFormatAirmar(char * msg, RawMessage * m, bool showJson) { unsigned int prio, pgn, dst, src, len, i; char * p; unsigned int id; p = findFirstOccurrence(msg, ' '); if(!p) { return 1; } memcpy(m->timestamp, msg, p - msg - 1); m->timestamp[p - msg - 1] = 0; p += 3; /* Moronic Windows does not support %hh<type> so we use intermediate variables */ pgn = strtoul(p, &p, 10); if (*p == ' ') { id = strtoul(++p, &p, 16); } if (*p != ' ') { logError("Error reading message, scanned %zu bytes from %s", p - msg, msg); if (!showJson) fprintf(stdout, "%s", msg); return 2; } getISO11783BitsFromCanId(id, &prio, &pgn, &src, &dst); p++; len = strlen(p) / 2; for (i = 0; i < len; i++) { if (scanHex(&p, &m->data[i])) { logError("Error reading message, scanned %zu bytes from %s/%s, index %u", p - msg, msg, p, i); if (!showJson) fprintf(stdout, "%s", msg); return 2; } if (i < len) { if (*p != ',' && *p != ' ') { logError("Error reading message, scanned %zu bytes from %s", p - msg, msg); if (!showJson) fprintf(stdout, "%s", msg); return 2; } p++; } } return setParsedValues(m, prio, pgn, dst, src, len); }
int parseRawFormatChetco(char * msg, RawMessage * m, bool showJson) { unsigned int pgn, src, i; unsigned int tstamp; time_t t; struct tm tm; char * p; if (*msg == 0 || *msg == '\n') { return 1; } if (sscanf(msg, "$PCDIN,%x,%x,%x,", &pgn, &tstamp, &src) < 3) { logError("Error reading Chetco message: %s", msg); if (!showJson) fprintf(stdout, "%s", msg); return 2; } t = (time_t) tstamp / 1000; localtime_r(&t, &tm); strftime(m->timestamp, sizeof(m->timestamp), "%Y-%m-%d-%H:%M:%S", &tm); sprintf(m->timestamp + strlen(m->timestamp), ",%u", tstamp % 1000); p = msg + STRSIZE("$PCDIN,01FD07,089C77D!,03,"); // Fixed length where data bytes start; for (i = 0; *p != '*'; i++) { if (scanHex(&p, &m->data[i])) { logError("Error reading message, scanned %zu bytes from %s/%s, index %u", p - msg, msg, p, i); if (!showJson) fprintf(stdout, "%s", msg); return 2; } } return setParsedValues(m, 0, pgn, 255, src, i + 1); }
extern "C" int simple_sscanf(const char* input, const char* format, ...) { va_list ap; int result = 0; const char* next = input; va_start(ap, format); while (*format) { if (*format == '%') { format++; int max = 0; while (isdigit(*format)) { max = (max * 10) + (*format - '0'); format++; } bool err = false; switch (*format++) { case 'c': err = scanChar(&next, &ap); break; case 'd': case 'u': err = scanInt(&next, &ap, max); break; case 'x': err = scanHex(&next, &ap); break; case 's': err = scanString(&next, &ap); break; case '[': // assume %[^c] if ('^' != *format) { err = true; } else { format++; if (*format && *(format+1) == ']') { err = scanStringUntil(&next, &ap, *format); format += 2; } else { err = true; } } break; default: err = true; break; } if (err) { break; } else { result++; } } else if (*format++ != *next++) { // match input break; } } va_end(ap); return result; }
int parseRawFormatFast(char * msg, RawMessage * m, bool showJson) { unsigned int prio, pgn, dst, src, len, r, i; char * p; p = findFirstOccurrence(msg, ','); if(!p) { return 1; } memcpy(m->timestamp, msg, p - msg); m->timestamp[p - msg] = 0; /* Moronic Windows does not support %hh<type> so we use intermediate variables */ r = sscanf( p , ",%u,%u,%u,%u,%u " , &prio , &pgn , &src , &dst , &len ); if (r < 5) { logError("Error reading message, scanned %u from %s", r, msg); if (!showJson) fprintf(stdout, "%s", msg); return 2; } for (i = 0; *p && i < 5;) { if (*++p == ',') { i++; } } if (!p) { logError("Error reading message, scanned %zu bytes from %s", p - msg, msg); if (!showJson) fprintf(stdout, "%s", msg); return 2; } p++; for (i = 0; i < len; i++) { if (scanHex(&p, &m->data[i])) { logError("Error reading message, scanned %zu bytes from %s/%s, index %u", p - msg, msg, p, i); if (!showJson) fprintf(stdout, "%s", msg); return 2; } if (i < len) { if (*p != ',' && !isspace(*p)) { logError("Error reading message, scanned %zu bytes from %s", p - msg, msg); if (!showJson) fprintf(stdout, "%s", msg); return 2; } p++; } } return setParsedValues(m, prio, pgn, dst, src, len); }