diff options
Diffstat (limited to 'module/rfc822.m')
| -rw-r--r-- | module/rfc822.m | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/module/rfc822.m b/module/rfc822.m new file mode 100644 index 00000000..7e4c8897 --- /dev/null +++ b/module/rfc822.m @@ -0,0 +1,68 @@ +RFC822: module +{ + PATH: con "/dis/lib/rfc822.dis"; + + init: fn(b: Bufio); + + # TO DO: multipart ... + + # token values reserved to represent a word and a quoted string + Word, QString: con 1+iota; + + Maxrequest: con 16*1024; # more than enough for anything sensible + + Rfclex: adt { + fd: ref Bufio->Iobuf; # open on a single line + wordval: string; # text if Word or QString + tok: int; # last token seen + eof: int; # end of file (ignore subsequent ungetc) + + seen: list of (int, string); # pushback + + mk: fn(a: array of byte): ref Rfclex; + getc: fn(p: self ref Rfclex): int; + ungetc: fn(p: self ref Rfclex); + lex: fn(p: self ref Rfclex): int; + unlex: fn(p: self ref Rfclex); + skipws: fn(p: self ref Rfclex): int; + + line: fn(p: self ref Rfclex): string; + }; + + readheaders: fn(fd: ref Bufio->Iobuf, limit: int): array of (string, array of byte); + parseparams: fn(ps: ref Rfclex): list of (string, string); + parsecontent: fn(ps: ref Rfclex, multipart: int, head: list of ref Content): list of ref Content; + mimefields: fn(ps: ref Rfclex): list of (string, list of (string, string)); + # TO DO: parse addresses + + quotable: fn(s: string): int; + quote: fn(s: string): string; + + # convert an epoch time into http-formatted text + sec2date: fn(secs: int): string; + + # convert a date in http text format to seconds from epoch + date2sec: fn(s: string): int; + + # current time + now: fn(): int; + + # current time as a string + time: fn(): string; + + # + # mime-related things + # + Content: adt{ + generic: string; + specific: string; + params: list of (string, string); + + mk: fn(generic: string, specific: string, params: list of (string, string)): ref Content; + check: fn(c: self ref Content, oks: list of ref Content): int; + text: fn(c: self ref Content): string; + }; + + suffixclass: fn(name: string): (ref Content, ref Content); + dataclass: fn(a: array of byte): (ref Content, ref Content); +}; |
