#include "hfield.h" static char *(hname[]) = { "unknown-header", "sender", "from", "reply-to", "to", "cc", "bcc", "date", "message-id", "subject", "resent-sender", "resent-from", "resent-reply-to", "resent-to", "resent-cc", "resent-bcc", "resent-date", "resent-message-id", "return-receipt-to", "errors-to", "apparently-to", "received", "return-path", "delivered-to", "content-length", "content-type", "content-transfer-encoding", "notice-requested-upon-delivery-to", "mail-followup-to", 0}; static int hmatch(char *s, int len, char *t) { int i; char ch; for (i = 0; (ch = t[i]); ++i) { if (i >= len) return 0; if (ch != s[i]) { if (ch == '-') return 0; if (ch - 32 != s[i]) return 0; } } for (;;) { if (i >= len) return 0; ch = s[i]; if (ch == ':') return 1; if ((ch != ' ') && (ch != '\t')) return 0; ++i; } } int hfield_known(char *s, int len) { int i; char *t; for (i = 1; (t = hname[i]); ++i) if (hmatch(s, len, t)) return i; return 0; } int hfield_valid(char *s, int len) { int i; int j; char ch; for (j = 0; j < len; ++j) if (s[j] == ':') break; if (j >= len) return 0; while (j) { ch = s[j - 1]; if ((ch != ' ') && (ch != '\t')) break; --j; } if (!j) return 0; for (i = 0; i < j; ++i) { ch = s[i]; if (ch <= 32) return 0; if (ch >= 127) return 0; } return 1; } unsigned int hfield_skipname(char *s, int len) { int i; char ch; for (i = 0; i < len; ++i) if (s[i] == ':') break; if (i < len) ++i; while (i < len) { ch = s[i]; if ((ch != '\t') && (ch != '\n') && (ch != '\r') && (ch != ' ')) break; ++i; } return i; }