|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <ctype.h> | 
|  | #include <String.h> | 
|  | #include "message.h" | 
|  |  | 
|  | Message *root; | 
|  |  | 
|  | void | 
|  | prindent(int i) | 
|  | { | 
|  | for(; i > 0; i--) | 
|  | print(" "); | 
|  | } | 
|  |  | 
|  | void | 
|  | prstring(int indent, char *tag, String *s) | 
|  | { | 
|  | if(s == nil) | 
|  | return; | 
|  | prindent(indent+1); | 
|  | print("%s %s\n", tag, s_to_c(s)); | 
|  | } | 
|  |  | 
|  | void | 
|  | info(int indent, int mno, Message *m) | 
|  | { | 
|  | int i; | 
|  | Message *nm; | 
|  |  | 
|  | prindent(indent); | 
|  | print("%d%c %d ", mno, m->allocated?'*':' ', m->end - m->start); | 
|  | if(m->unixfrom != nil) | 
|  | print("uf %s ", s_to_c(m->unixfrom)); | 
|  | if(m->unixdate != nil) | 
|  | print("ud %s ", s_to_c(m->unixdate)); | 
|  | print("\n"); | 
|  | prstring(indent, "from:", m->from822); | 
|  | prstring(indent, "sender:", m->sender822); | 
|  | prstring(indent, "to:", m->to822); | 
|  | prstring(indent, "cc:", m->cc822); | 
|  | prstring(indent, "reply-to:", m->replyto822); | 
|  | prstring(indent, "subject:", m->subject822); | 
|  | prstring(indent, "date:", m->date822); | 
|  | prstring(indent, "filename:", m->filename); | 
|  | prstring(indent, "type:", m->type); | 
|  | prstring(indent, "charset:", m->charset); | 
|  |  | 
|  | i = 1; | 
|  | for(nm = m->part; nm != nil; nm = nm->next){ | 
|  | info(indent+1, i++, nm); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | void | 
|  | main(int argc, char **argv) | 
|  | { | 
|  | char *err; | 
|  | char *mboxfile; | 
|  |  | 
|  | ARGBEGIN{ | 
|  | }ARGEND; | 
|  |  | 
|  | if(argc > 0) | 
|  | mboxfile = argv[0]; | 
|  | else | 
|  | mboxfile = "./mbox"; | 
|  |  | 
|  | root = newmessage(nil); | 
|  |  | 
|  | err = readmbox(mboxfile, &root->part); | 
|  | if(err != nil){ | 
|  | fprint(2, "boom: %s\n", err); | 
|  | exits(0); | 
|  | } | 
|  |  | 
|  | info(0, 1, root); | 
|  |  | 
|  | exits(0); | 
|  | } |