* complete copyright information.
*/
-#include <h/mh.h>
-#include <h/tws.h>
-#include <h/picksbr.h>
-#include <h/utils.h>
+#include "h/mh.h"
+#include "sbr/fmt_rfc2047.h"
+#include "sbr/brkstring.h"
+#include "sbr/ambigsw.h"
+#include "sbr/error.h"
+#include "h/tws.h"
+#include "h/picksbr.h"
+#include "h/utils.h"
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#define STAR 01
-#define LBSIZE 1024
+#define LBSIZE NMH_BUFSIZ
#define ESIZE 1024
#define pinform if (!talked++) inform
struct nexus {
- int (*n_action)();
+ int (*n_action)(struct nexus *n, FILE *fp, int msgnum, long start, long stop);
union {
/* for {OR,AND,NOT}action */
static struct nexus *nexp1(void);
static struct nexus *nexp2(void);
static struct nexus *nexp3(void);
-static struct nexus *newnexus(int (*)());
+static struct nexus *newnexus(int (*action)(struct nexus *n,
+ FILE *fp, int msgnum, long start, long stop));
-static int ORaction();
-static int ANDaction();
-static int NOTaction();
-static int GREPaction();
-static int TWSaction();
+static int ORaction(struct nexus *n, FILE *fp, int msgnum,
+ long start, long stop);
+static int ANDaction(struct nexus *n, FILE *fp, int msgnum,
+ long start, long stop);
+static int NOTaction(struct nexus *n, FILE *fp, int msgnum,
+ long start, long stop);
+static int GREPaction(struct nexus *n, FILE *fp, int msgnum,
+ long start, long stop);
+static int TWSaction(struct nexus *n, FILE *fp, int msgnum,
+ long start, long stop);
int
talked = 0;
if ((head = parse ()) == NULL)
- return (talked ? 0 : 1);
+ return !talked;
if (*argp) {
inform("%s unexpected", *argp);
static struct nexus *
-newnexus (int (*action)())
+newnexus(int (*action)(struct nexus *n, FILE *fp, int msgnum,
+ long start, long stop))
{
struct nexus *p;
}
-#define args(a) a, fp, msgnum, start, stop
-#define params args (n)
-#define plist \
- struct nexus *n; \
- FILE *fp; \
- int msgnum; \
- long start, \
- stop;
-
int
pmatches (FILE *fp, int msgnum, long start, long stop, int debug)
{
if (!talked++ && debug)
PRaction (head, 0);
- return (*head->n_action) (args (head));
+ return (*head->n_action)(head, fp, msgnum, start, stop);
}
dasctime (&n->n_tws, TW_NULL));
return;
}
- fprintf (stderr, "UNKNOWN(0x%x)\n",
- (unsigned int)(unsigned long) (*n->n_action));
+
+ generic_pointer gp;
+ gp.f = (void (*)(void))n->n_action;
+ fprintf(stderr, "UNKNOWN(%p)\n", gp.v);
}
static int
-ORaction (params)
-plist
+ORaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
{
- if ((*n->n_L_child->n_action) (args (n->n_L_child)))
+ if ((*n->n_L_child->n_action)(n->n_L_child, fp, msgnum, start, stop))
return 1;
- return (*n->n_R_child->n_action) (args (n->n_R_child));
+ return (*n->n_R_child->n_action)(n->n_R_child, fp, msgnum, start, stop);
}
static int
-ANDaction (params)
-plist
+ANDaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
{
- if (!(*n->n_L_child->n_action) (args (n->n_L_child)))
+ if (!(*n->n_L_child->n_action)(n->n_L_child, fp, msgnum, start, stop))
return 0;
- return (*n->n_R_child->n_action) (args (n->n_R_child));
+ return (*n->n_R_child->n_action)(n->n_R_child, fp, msgnum, start, stop);
}
static int
-NOTaction (params)
-plist
+NOTaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
{
- return (!(*n->n_L_child->n_action) (args (n->n_L_child)));
+ return (!(*n->n_L_child->n_action)(n->n_L_child, fp, msgnum, start, stop));
}
static int
-GREPaction (params)
-plist
+GREPaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
{
- int c, body, lf;
+ int c;
+ bool body;
+ bool lf;
long pos = start;
char *p1, *p2, *ebp, *cbp;
char ibuf[BUFSIZ];
NMH_UNUSED (msgnum);
fseek (fp, start, SEEK_SET);
- body = 0;
+ body = false;
ebp = cbp = ibuf;
for (;;) {
if (body && n->n_header)
return 0;
p1 = linebuf;
p2 = cbp;
- lf = 0;
+ lf = false;
for (;;) {
if (p2 >= ebp) {
if (fgets (ibuf, sizeof ibuf, fp) == NULL
--p2;
break;
}
- lf = 0;
+ lf = false;
}
if (c == '\n') {
if (body)
break;
if (lf) {
- body++;
+ body = true;
break;
}
- lf++;
+ lf = true;
/* Unfold by skipping the newline. */
c = 0;
}
/* Attempt to decode as a MIME header. If it's the last header,
body will be 1 and lf will be at least 1. */
- if ((body == 0 || lf > 0) &&
+ if ((!body || lf) &&
decode_rfc2047 (linebuf, decoded_linebuf, sizeof decoded_linebuf)) {
p1 = decoded_linebuf;
}
do {
lp--;
if (advance ((char *) lp, (char *) ep))
- return (1);
+ return 1;
} while (lp > curlp);
return 0;
set = aset;
if ((c = ac) == 0)
- return (0);
+ return 0;
n = *set++;
while (n--)
if (*set++ == c || set[-1] == cc[c])
- return (af);
+ return af;
- return (!af);
+ return !af;
}
static int
-TWSaction (params)
-plist
+TWSaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
{
int state;
char *bp;
- char buf[BUFSIZ], name[NAMESZ];
+ char buf[NMH_BUFSIZ], name[NAMESZ];
struct tws *tw;
- m_getfld_state_t gstate = 0;
+ m_getfld_state_t gstate;
NMH_UNUSED (stop);
fseek (fp, start, SEEK_SET);
+ gstate = m_getfld_state_init(fp);
for (bp = NULL;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (&gstate, name, buf, &bufsz, fp)) {
+ switch (state = m_getfld2(&gstate, name, buf, &bufsz)) {
case FLD:
case FLDPLUS:
- mh_xfree(bp);
+ free(bp);
bp = mh_xstrdup(buf);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (&gstate, name, buf, &bufsz, fp);
+ state = m_getfld2(&gstate, name, buf, &bufsz);
bp = add (buf, bp);
}
if (!strcasecmp (name, n->n_datef))
case FMTERR:
if (state == LENERR || state == FMTERR)
inform("format error in message %d", msgnum);
- mh_xfree(bp);
+ free(bp);
return 0;
default:
- adios (NULL, "internal error -- you lose");
+ die("internal error -- you lose");
}
break;
}
state = n->n_after ? (twsort (tw, &n->n_tws) > 0)
: (twsort (tw, &n->n_tws) < 0);
- mh_xfree(bp);
+ free(bp);
return state;
}