folder or messages. Each
.B scan
line contains the message number
-(name), the date, the \*(lqFrom:\*(rq field, the \*(lqSubject\*(rq field,
-and, if room allows, some of the body of the message. For example:
+(name), the date, the \*(lqFrom:\*(rq field and the \*(lqSubject\*(rq field.
+For example:
.PP
.RS 5
.nf
.ta \w'15+- 'u +\w'07/\|05x 'u +\w'Dcrocker 'u
-15+ 10/\|05 crocker nned\0\0<<Last week I asked some of
-16\- 10/\|05 crocker message id format\0\0\<<I recommend
+15+ 10/\|05 crocker nned
+16\- 10/\|05 crocker message id format
18 10/\|06 brien Re: Exit status from mkdir
19 10/\|07*brien \*(lqscan\*(rq listing format in nmh
.fi
The `*' on message 19 indicates that no \*(lqDate:\*(rq header was
present. The time of last modification of the message is given instead.
.PP
-If there is sufficient room left on the
-.B scan
-line after the
-subject, the line will be filled with text from the body, preceded by
-\*(lq<<\*(rq, and terminated by \*(lq>>\*(rq if the body is sufficiently short.
.B Scan
actually reads each of the specified messages and parses them to extract
the desired fields. During parsing, appropriate error messages will be
.nf
.ta \w'Dtimenow 'u +\w'Returns 'u
.I Escape Returns Description
-body string the (compressed) first part of the body
dtimenow date the current date
folder string the name of the current folder
.fi
/*
** Buffer size for content part of header fields. We want this
** to be large enough so that we don't do a lot of extra FLDPLUS
-** calls on m_getfld but small enough so that we don't snarf
-** the entire message body when we're only going to display 30
-** characters of it.
+** calls on m_getfld.
*/
#define SBUFSIZ 512
static struct format *fmt;
static struct comp *datecomp; /* pntr to "date" comp */
-static struct comp *bodycomp; /* pntr to "body" pseudo-comp (if referenced) */
static int ncomps = 0; /* # of interesting components */
static char **compbuffers = 0; /* buffers for component text */
static struct comp **used_buf = 0; /* stack for comp that use buffers */
int i, compnum, encrypted, state;
unsigned char *cp, *tmpbuf;
char **nxtbuf;
- char *saved_c_text = NULL;
struct comp *cptr;
struct comp **savecomp;
char *scnmsg = NULL;
FILE *scnout = NULL;
char name[NAMESZ];
- static int rlwidth, slwidth;
+ static int slwidth;
#ifdef RPATHS
char returnpath[BUFSIZ];
/* Compile format string */
ncomps = fmt_compile(nfs, &fmt) + 1;
- FINDCOMP(bodycomp, "body");
FINDCOMP(datecomp, "date");
FINDCOMP(cptr, "folder");
if (cptr && folder)
if (!cptr)
if ((cptr = (struct comp *)calloc(1, sizeof(*cptr)))) {
cptr->c_name = "encrypted";
- cptr->c_next = wantcomp[i = CHASH(cptr->c_name)];
+ cptr->c_next = wantcomp[i=CHASH(cptr->c_name)];
wantcomp[i] = cptr;
ncomps++;
}
if (used_buf == NULL)
adios(NULL, "unable to allocate component buffer stack");
used_buf += ncomps+1; *--used_buf = 0;
- rlwidth = bodycomp && (width > SBUFSIZ) ? width : SBUFSIZ;
for (i = ncomps; i--; )
- *nxtbuf++ = mh_xmalloc(rlwidth);
+ *nxtbuf++ = mh_xmalloc(SBUFSIZ);
}
/*
** Get the first field. If the message is non-empty
** and we're doing an "inc", open the output file.
*/
- if ((state = m_getfld(FLD, name, tmpbuf, rlwidth, inb)) == FILEEOF) {
+ if ((state = m_getfld(FLD, name, tmpbuf, SBUFSIZ, inb)) == FILEEOF) {
if (ferror(inb)) {
advise("read", "unable to"); /* "read error" */
return SCNFAT;
/* scan - main loop */
for (compnum = 1; ;
- state = m_getfld(state, name, tmpbuf, rlwidth, inb)) {
+ state = m_getfld(state, name, tmpbuf, SBUFSIZ, inb)) {
switch (state) {
case FLD:
case FLDPLUS:
}
while (state == FLDPLUS) {
- state = m_getfld(state, name, tmpbuf, rlwidth,
+ state = m_getfld(state, name, tmpbuf, SBUFSIZ,
inb);
if (outnum)
FPUTS(tmpbuf);
break;
case BODY:
- compnum = -1;
- if (! outnum) {
- state = FILEEOF; /* stop now if scan cmd */
- goto finished;
- }
- if (putc('\n', scnout) == EOF) DIEWRERR();
- FPUTS(tmpbuf);
- /*
- ** performance hack: some people like to run "inc"
- ** on things like net.sources or large digests.
- ** We do a copy directly into the output buffer
- ** rather than going through an intermediate buffer.
- **
- ** We need the amount of data m_getfld found &
- ** don't want to do a strlen on the long buffer so
- ** there's a hack in m_getfld to save the amount
- ** of data it returned in the global "msg_count".
- */
-body:;
- while (state == BODY) {
-#ifdef LINUX_STDIO
- if (scnout->_IO_write_ptr == scnout->_IO_write_end) {
-#elif defined(__DragonFly__)
- if (((struct __FILE_public *)scnout)->_w <= 0) {
-#else
- if (scnout->_cnt <= 0) {
-#endif
- if (fflush(scnout) == EOF)
- DIEWRERR();
- }
-#ifdef LINUX_STDIO
- state = m_getfld(state, name, scnout->_IO_write_ptr, (long)scnout->_IO_write_ptr-(long)scnout->_IO_write_end , inb);
- scnout->_IO_write_ptr += msg_count;
-#elif defined(__DragonFly__)
- state = m_getfld(state, name, ((struct __FILE_public *)scnout)->_p, -(((struct __FILE_public *)scnout)->_w), inb);
- ((struct __FILE_public *)scnout)->_w -= msg_count;
- ((struct __FILE_public *)scnout)->_p += msg_count;
-#else
- state = m_getfld( state, name, scnout->_ptr, -(scnout->_cnt), inb);
- scnout->_cnt -= msg_count;
- scnout->_ptr += msg_count;
-#endif
- }
+ state = FILEEOF;
goto finished;
case LENERR:
FPUTS(name);
if (putc('\n', scnout) == EOF)
DIEWRERR();
- state = BODY;
- goto body;
}
/* fall through */
return SCNFAT;
}
- /* Save and restore buffer so we don't trash our dynamic pool! */
- if (bodycomp) {
- saved_c_text = bodycomp->c_text;
- bodycomp->c_text = tmpbuf;
- }
-
if (size)
dat[2] = size;
else if (outnum > 0) {
fmt_scan(fmt, scanl, slwidth, dat);
- if (bodycomp)
- bodycomp->c_text = saved_c_text;
-
if (noisy)
fputs(scanl, stdout);