static bool remove_subj_leader(buffer_t *buf, size_t *start_pos, bool *is_reply_or_forward_r) { const char *data, *orig_data; bool ret = FALSE; /* subj-leader = (*subj-blob subj-refwd) / WSP subj-blob = "[" *BLOBCHAR "]" *WSP subj-refwd = ("re" / ("fw" ["d"])) *WSP [subj-blob] ":" BLOBCHAR = %x01-5a / %x5c / %x5e-7f ; any CHAR except '[' and ']' */ orig_data = buffer_get_data(buf, NULL); orig_data += *start_pos; data = orig_data; if (*data == ' ') { /* independent from checks below - always removed */ data++; orig_data++; *start_pos += 1; ret = TRUE; } while (*data == '[') { if (!remove_blob(&data)) return ret; } if (strncmp(data, "RE", 2) == 0) data += 2; else if (strncmp(data, "FWD", 3) == 0) data += 3; else if (strncmp(data, "FW", 2) == 0) data += 2; else return ret; if (*data == ' ') data++; if (*data == '[' && !remove_blob(&data)) return ret; if (*data != ':') return ret; data++; *start_pos += (size_t)(data - orig_data); if (is_reply_or_forward_r != NULL) *is_reply_or_forward_r = TRUE; return TRUE; }
static bool remove_blob_when_nonempty(buffer_t *buf, size_t *start_pos) { const char *data, *orig_data; orig_data = buffer_get_data(buf, NULL); orig_data += *start_pos; data = orig_data; if (*data == '[' && remove_blob(&data) && *data != '\0') { *start_pos += (size_t)(data - orig_data); return TRUE; } return FALSE; }