static bool EveEmailJsonArrayFromCommaList(JsonBuilder *js, const uint8_t *val, size_t len)
{
- char *savep = NULL;
- char *p;
- char *sp;
- char *to_line = BytesToString((uint8_t *)val, len);
- if (likely(to_line != NULL)) {
- p = strtok_r(to_line, ",", &savep);
- if (p == NULL) {
- SCFree(to_line);
- return false;
- }
- sp = SkipWhiteSpaceTill(p, savep);
- jb_append_string(js, sp);
- while ((p = strtok_r(NULL, ",", &savep)) != NULL) {
- sp = SkipWhiteSpaceTill(p, savep);
- jb_append_string(js, sp);
+ bool has_not_empty_field = false;
+ size_t start = 0;
+ int state = 0;
+
+ for (size_t i = 0; i < len; i++) {
+ switch (state) {
+ case 0:
+ if (val[i] == ' ' || val[i] == '\t') {
+ // skip leading space
+ start += 1;
+ } else if (val[i] == '"') {
+ // quoted state
+ state = 2;
+ } else {
+ // field
+ state = 1;
+ }
+ break;
+ case 1: // field
+ if (val[i] == ',') {
+ if (i > start) {
+ jb_append_string_from_bytes(js, val + start, i - start);
+ has_not_empty_field = true;
+ }
+ start = i + 1;
+ state = 0;
+ } else if (val[i] == '"') {
+ // quoted
+ state = 2;
+ }
+ break;
+ case 2: // quoted
+ if (val[i] == '"') {
+ // out of quotes, back to field
+ state = 1;
+ }
}
- } else {
- return false;
}
- SCFree(to_line);
- return true;
+ if (len > start) {
+ jb_append_string_from_bytes(js, val + start, len - start);
+ has_not_empty_field = true;
+ }
+ return has_not_empty_field;
}
static void EveEmailLogJSONMd5(OutputJsonEmailCtx *email_ctx, JsonBuilder *js, SMTPTransaction *tx)