X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/2e768e3cc0ce768373d3320eca4cdd08b8cf646a..e38cc16e06bbbd80a0fc02585e736fbc3dee7221:/uip/fmttest.c diff --git a/uip/fmttest.c b/uip/fmttest.c index bdcf2d3c..2f45e7b5 100644 --- a/uip/fmttest.c +++ b/uip/fmttest.c @@ -21,13 +21,13 @@ X("raw", 0, RAWSW) \ X("date", 0, DATESW) \ X("message", 0, MESSAGESW) \ + X("file", 0, FILESW) \ + X("nofile", 0, NFILESW) \ X("-component-name component-text", 0, OTHERSW) \ X("dupaddrs", 0, DUPADDRSW) \ X("nodupaddrs", 0, NDUPADDRSW) \ X("ccme", 0, CCMESW) \ X("noccme", 0, NCCMESW) \ - X("normalize", 0, NORMSW) \ - X("nonormalize", 0, NNORMSW) \ X("outsize size-in-characters", 0, OUTSIZESW) \ X("bufsize size-in-bytes", 0, BUFSZSW) \ X("width column-width", 0, WIDTHSW) \ @@ -58,7 +58,7 @@ static struct format **lvec = NULL; static int lused = 0; static int lallocated = 0; -enum mode_t { MESSAGE, ADDRESS, RAW }; +enum mode_t { MESSAGE, ADDRESS, DATE, RAW }; #define DEFADDRFORMAT "%<{error}%{error}: %{text}%|%(putstr(proper{text}))%>" #define DEFDATEFORMAT "%<(nodate{text})error: %{text}%|%(putstr(pretty{text}))%>" @@ -86,12 +86,15 @@ static char *c_flagsstr(int); static void litputs(char *); static void litputc(char); static void process_addresses(struct format *, struct msgs_array *, char *, - int, int, int *, int, struct fmt_callbacks *); + int, int, int *, struct fmt_callbacks *); static void process_raw(struct format *, struct msgs_array *, char *, int, int, int *, struct fmt_callbacks *); static void process_messages(struct format *, struct msgs_array *, struct msgs_array *, char *, char *, int, - int, int *, struct fmt_callbacks *); + int, int, int *, struct fmt_callbacks *); +static void process_single_file(FILE *, struct msgs_array *, int *, int, + struct format *, char *, int, int, + struct fmt_callbacks *); static void test_trace(void *, struct format *, int, char *, char *); static char *test_formataddr(char *, char *); static char *test_concataddr(char *, char *); @@ -112,20 +115,13 @@ main (int argc, char **argv) struct comp *cptr; struct msgs_array msgs = { 0, 0, NULL }, compargs = { 0, 0, NULL}; int dump = 0, i; - int outputsize = 0, bufsize = 0, dupaddrs = 1, trace = 0; + int outputsize = 0, bufsize = 0, dupaddrs = 1, trace = 0, files = 0; int colwidth = -1, msgnum = -1, msgcur = -1, msgsize = -1, msgunseen = -1; - int normalize = AD_HOST; enum mode_t mode = MESSAGE; int dat[5]; struct fmt_callbacks cb, *cbp = NULL; -#ifdef LOCALE - setlocale(LC_ALL, ""); -#endif - invo_name = r1bindex (argv[0], '/'); - - /* read user profile/context */ - context_read(); + if (nmh_init(argv[0], 1)) { return 1; } arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -191,13 +187,6 @@ main (int argc, char **argv) form = NULL; continue; - case NORMSW: - normalize = AD_HOST; - continue; - case NNORMSW: - normalize = AD_NHST; - continue; - case TRACESW: trace++; continue; @@ -218,10 +207,17 @@ main (int argc, char **argv) dupaddrs = 0; continue; case DATESW: - mode = RAW; + mode = DATE; defformat = DEFDATEFORMAT; continue; + case FILESW: + files++; + continue; + case NFILESW: + files = 0; + continue; + case DUPADDRSW: dupaddrs++; continue; @@ -276,7 +272,7 @@ main (int argc, char **argv) * Only interpret as a folder if we're in message mode */ - if (mode == MESSAGE && (*cp == '+' || *cp == '@')) { + if (mode == MESSAGE && !files && (*cp == '+' || *cp == '@')) { if (folder) adios (NULL, "only one folder at a time!"); else @@ -380,7 +376,7 @@ main (int argc, char **argv) if (mode == MESSAGE) { process_messages(fmt, &compargs, &msgs, buffer, folder, bufsize, - outputsize, dat, cbp); + outputsize, files, dat, cbp); } else { if (compargs.size) { for (i = 0; i < compargs.size; i += 2) { @@ -391,10 +387,9 @@ main (int argc, char **argv) } if (mode == ADDRESS) { - fmt_norm = normalize; process_addresses(fmt, &msgs, buffer, bufsize, outputsize, - dat, normalize, cbp); - } else + dat, cbp); + } else /* Fall-through for RAW or DATE */ process_raw(fmt, &msgs, buffer, bufsize, outputsize, dat, cbp); } @@ -416,8 +411,7 @@ struct pqpair { static void process_addresses(struct format *fmt, struct msgs_array *addrs, char *buffer, - int bufsize, int outwidth, int *dat, int norm, - struct fmt_callbacks *cb) + int bufsize, int outwidth, int *dat, struct fmt_callbacks *cb) { int i; char *cp, error[BUFSIZ]; @@ -440,7 +434,7 @@ process_addresses(struct format *fmt, struct msgs_array *addrs, char *buffer, while ((cp = getname(addrs->msgs[i]))) { if ((p = (struct pqpair *) calloc ((size_t) 1, sizeof(*p))) == NULL) adios (NULL, "unable to allocate pqpair memory"); - if ((mp = getm(cp, NULL, 0, norm, error)) == NULL) { + if ((mp = getm(cp, NULL, 0, error, sizeof(error))) == NULL) { p->pq_text = getcpy(cp); p->pq_error = getcpy(error); } else { @@ -488,15 +482,34 @@ process_addresses(struct format *fmt, struct msgs_array *addrs, char *buffer, static void process_messages(struct format *fmt, struct msgs_array *comps, struct msgs_array *msgs, char *buffer, char *folder, - int bufsize, int outwidth, int *dat, struct fmt_callbacks *cb) + int bufsize, int outwidth, int files, int *dat, + struct fmt_callbacks *cb) { - int i, state, msgnum, msgsize = dat[2], num = dat[0], cur = dat[1]; - int num_unseen_seq = 0, seqnum[NUMATTRS]; - char *maildir, *cp, name[NAMESZ], rbuf[BUFSIZ]; + int i, msgnum, msgsize = dat[2], num = dat[0], cur = dat[1]; + int num_unseen_seq = 0; + ivector_t seqnum = ivector_create (0); + char *maildir, *cp; struct msgs *mp; - struct comp *c; FILE *in; + /* + * If 'files' is set, short-circuit everything else and just process + * everything now. + */ + + if (files) { + for (i = 0; i < msgs->size; i++) { + if ((in = fopen(cp = msgs->msgs[i], "r")) == NULL) { + admonish(cp, "unable to open file"); + continue; + } + process_single_file(in, comps, dat, msgsize, fmt, buffer, + bufsize, outwidth, cb); + } + + return; + } + if (! folder) folder = getfolder(1); @@ -505,7 +518,7 @@ process_messages(struct format *fmt, struct msgs_array *comps, if (chdir(maildir) < 0) adios(maildir, "unable to change directory to"); - if (!(mp = folder_read(folder))) + if (!(mp = folder_read(folder, 1))) adios(NULL, "unable to read folder %s", folder); if (mp->nummsg == 0) @@ -532,7 +545,7 @@ process_messages(struct format *fmt, struct msgs_array *comps, dp = getcpy(cp); ap = brkstring(dp, " ", "\n"); for (i = 0; ap && *ap; i++, ap++) - seqnum[i] = seq_getnum(mp, *ap); + ivector_push_back (seqnum, seq_getnum(mp, *ap)); num_unseen_seq = i; if (dp) @@ -555,26 +568,13 @@ process_messages(struct format *fmt, struct msgs_array *comps, if (cur == -1) dat[1] = msgnum == mp->curmsg; - /* - * Get our size if we didn't include one - */ - - if (msgsize == -1) { - struct stat st; - - if (fstat(fileno(in), &st) < 0) - dat[2] = 0; - else - dat[2] = st.st_size; - } - /* * Check to see if this is in the unseen sequence */ dat[4] = 0; for (i = 0; i < num_unseen_seq; i++) { - if (in_sequence(mp, seqnum[i], msgnum)) { + if (in_sequence(mp, ivector_at (seqnum, i), msgnum)) { dat[4] = 1; break; } @@ -584,63 +584,116 @@ process_messages(struct format *fmt, struct msgs_array *comps, * Read in the message and process the components */ - for (state = FLD;;) { - state = m_getfld(state, name, rbuf, sizeof(rbuf), in); - switch (state) { - case FLD: - case FLDPLUS: - i = fmt_addcomptext(name, rbuf); - if (i != -1) { - while (state == FLDPLUS) { - state = m_getfld(state, name, rbuf, - sizeof(rbuf), in); - fmt_appendcomp(i, name, rbuf); - } - } - - while (state == FLDPLUS) - state = m_getfld(state, name, rbuf, - sizeof(rbuf), in); - break; + process_single_file(in, comps, dat, msgsize, fmt, buffer, + bufsize, outwidth, cb); + } + } - case BODY: - if (fmt_findcomp("body")) { - if ((i = strlen(rbuf)) < outwidth) - state = m_getfld(state, name, rbuf + i, - outwidth - 1, in); + ivector_free (seqnum); + folder_free(mp); + return; +} + +/* + * Process a single file in message mode + */ + +static void +process_single_file(FILE *in, struct msgs_array *comps, int *dat, int msgsize, + struct format *fmt, char *buffer, int bufsize, + int outwidth, struct fmt_callbacks *cb) +{ + int i, state; + char name[NAMESZ], rbuf[BUFSIZ]; + m_getfld_state_t gstate = 0; + struct comp *c; + int bufsz; + + /* + * Get our size if we didn't include one + */ - fmt_addcomptext("body", rbuf); - } - /* fall through */ + if (msgsize == -1) { + struct stat st; - default: - goto finished; + if (fstat(fileno(in), &st) < 0) + dat[2] = 0; + else + dat[2] = st.st_size; + } + + /* + * Initialize everyting else + */ + + if (dat[0] == -1) + dat[0] = 0; + if (dat[1] == -1) + dat[1] = 0; + if (dat[4] == -1) + dat[4] = 0; + + /* + * Read in the message and process the components + */ + + for (state = FLD;;) { + bufsz = sizeof(rbuf); + state = m_getfld(&gstate, name, rbuf, &bufsz, in); + switch (state) { + case FLD: + case FLDPLUS: + i = fmt_addcomptext(name, rbuf); + if (i != -1) { + while (state == FLDPLUS) { + bufsz = sizeof(rbuf); + state = m_getfld(&gstate, name, rbuf, &bufsz, in); + fmt_appendcomp(i, name, rbuf); } } -finished: - fclose(in); - /* - * Do this now to override any components in the original message - */ - if (comps->size) { - for (i = 0; i < comps->size; i += 2) { - c = fmt_findcomp(comps->msgs[i]); - if (c) { - if (c->c_text) - free(c->c_text); - c->c_text = getcpy(comps->msgs[i + 1]); - } + while (state == FLDPLUS) { + bufsz = sizeof(rbuf); + state = m_getfld(&gstate, name, rbuf, &bufsz, in); + } + break; + + case BODY: + if (fmt_findcomp("body")) { + if ((i = strlen(rbuf)) < outwidth) { + bufsz = outwidth - 1; + state = m_getfld(&gstate, name, rbuf + i, + &bufsz, in); } + + fmt_addcomptext("body", rbuf); } - fmt_scan(fmt, buffer, bufsize, outwidth, dat, cb); - fputs(buffer, stdout); - mlistfree(); + /* fall through */ + + default: + goto finished; } } +finished: + fclose(in); + m_getfld_state_destroy(&gstate); - folder_free(mp); - return; + /* + * Do this now to override any components in the original message + */ + if (comps->size) { + for (i = 0; i < comps->size; i += 2) { + c = fmt_findcomp(comps->msgs[i]); + if (c) { + if (c->c_text) + free(c->c_text); + c->c_text = getcpy(comps->msgs[i + 1]); + } + } + } + fmt_scan(fmt, buffer, bufsize, outwidth, dat, cb); + fputs(buffer, stdout); + mlistfree(); } /* @@ -702,7 +755,8 @@ test_trace(void *context, struct format *fmt, int num, char *str, char *outbuf) if (str != ctx->str) { if (changed++) printf(" "); - printf("str=\"%s\"", str ? str : "NULL"); + printf("str="); + litputs(str); ctx->str = str; } @@ -710,7 +764,9 @@ test_trace(void *context, struct format *fmt, int num, char *str, char *outbuf) printf("\n"); if (strcmp(outbuf, ctx->outbuf) != 0) { - printf("outbuf=\"%s\"\n", outbuf); + printf("outbuf="); + litputs(outbuf); + putchar('\n'); free(ctx->outbuf); ctx->outbuf = getcpy(outbuf); } @@ -1033,6 +1089,7 @@ f_typestr(int t) case FT_LS_FRIENDLY: return("LS_FRIENDLY"); case FT_LV_HOSTTYPE: return("LV_HOSTTYPE"); case FT_LV_INGRPF: return("LV_INGRPF"); + case FT_LS_UNQUOTE: return("LS_UNQUOTE"); case FT_LV_NOHOSTF: return("LV_NOHOSTF"); case FT_LOCALDATE: return("LOCALDATE"); case FT_GMTDATE: return("GMTDATE"); @@ -1066,52 +1123,28 @@ f_typestr(int t) case FT_V_MATCH: return("V_MATCH"); case FT_V_AMATCH: return("V_AMATCH"); default: - printf(buf, "/* ??? #%d */", t); + snprintf(buf, sizeof(buf), "/* ??? #%d */", t); return(buf); } } -#define FNORD(v, s) if (t & (v)) { \ - if (i++ > 0) \ - strcat(buf, "|"); \ - strcat(buf, s); } - static char * c_typestr(int t) { - register int i; static char buf[64]; - buf[0] = '\0'; - if (t & ~(CT_ADDR|CT_DATE)) - printf(buf, "0x%x ", t); - strcat(buf, "<"); - i = 0; - FNORD(CT_ADDR, "ADDR"); - FNORD(CT_DATE, "DATE"); - strcat(buf, ">"); + snprintb(buf, sizeof(buf), t, CT_BITS); return(buf); } static char * c_flagsstr(int t) { - register int i; static char buf[64]; - buf[0] = '\0'; - if (t & ~(CF_TRUE|CF_PARSED|CF_DATEFAB|CF_TRIMMED)) - printf(buf, "0x%x ", t); - strcat(buf, "<"); - i = 0; - FNORD(CF_TRUE, "TRUE"); - FNORD(CF_PARSED, "PARSED"); - FNORD(CF_DATEFAB, "DATEFAB"); - FNORD(CF_TRIMMED, "TRIMMED"); - strcat(buf, ">"); + snprintb(buf, sizeof(buf), t, CF_BITS); return(buf); } -#undef FNORD static void litputs(char *s) @@ -1129,11 +1162,8 @@ static void litputc(char c) { if (c & ~ 0177) { - putc('M', stdout); - putc('-', stdout); - c &= 0177; - } - if (c < 0x20 || c == 0177) { + printf("\\x%02x", (unsigned char) c); + } else if (c < 0x20 || c == 0177) { if (c == '\b') { putc('\\', stdout); putc('b', stdout); @@ -1232,7 +1262,7 @@ test_formataddr (char *orig, char *str) /* concatenate all the new addresses onto 'buf' */ for (isgroup = 0; (cp = getname (str)); ) { - if ((mp = getm (cp, NULL, 0, AD_NAME, error)) == NULL) { + if ((mp = getm (cp, NULL, 0, error, sizeof(error))) == NULL) { fprintf(stderr, "bad address \"%s\" -- %s\n", cp, error); continue; } @@ -1293,8 +1323,10 @@ insert (struct mailname *np) return 0; for (mp = &mq; mp->m_next; mp = mp->m_next) { - if (!mh_strcasecmp (np->m_host, mp->m_next->m_host) - && !mh_strcasecmp (np->m_mbox, mp->m_next->m_mbox)) + if (!strcasecmp (np->m_host ? np->m_host : "", + mp->m_next->m_host ? mp->m_next->m_host : "") && + !strcasecmp (np->m_mbox ? np->m_mbox : "", + mp->m_next->m_mbox ? mp->m_next->m_mbox : "")) return 0; } if (!ccme && ismymbox (np))