static int dat[5]; /* aux. data for format routine */
-char *scanl = 0; /* text of most recent scanline */
m_getfld_state_t gstate; /* for access by msh */
#define DIEWRERR() adios (scnmsg, "write error on")
*/
static int mh_fputs(char *, FILE *);
-#ifdef MULTIBYTE_SUPPORT
-#define SCAN_CHARWIDTH MB_CUR_MAX
-#else
-#define SCAN_CHARWIDTH 1
-#endif
-
int
scan (FILE *inb, int innum, int outnum, char *nfs, int width, int curflg,
- int unseen, char *folder, long size, int noisy)
+ int unseen, char *folder, long size, int noisy, charstring_t *scanl)
{
int i, compnum, encrypted, state;
- unsigned char *cp, *tmpbuf, *startbody;
- char **nxtbuf;
+ char *cp, *tmpbuf, *startbody, **nxtbuf;
char *saved_c_text = NULL;
struct comp *cptr;
struct comp **savecomp;
char name[NAMESZ];
int bufsz;
static int rlwidth, slwidth;
- static size_t scanl_size;
- /* first-time only initialization */
- if (!scanl) {
+ /* first-time only initialization, which will always happen the
+ way the code is now, with callers initializing *scanl to NULL.
+ scanl used to be a global. */
+ if (! *scanl) {
if (width == 0) {
if ((width = sc_width ()) < WIDTH/2)
width = WIDTH/2;
width = MAXSCANL;
}
dat[3] = slwidth = width;
- /* Arbitrarily allocate 20 * slwidth to provide room for lots
- of escape sequences. */
- scanl_size = SCAN_CHARWIDTH * (20 * slwidth + 2);
- scanl = (char *) mh_xmalloc (scanl_size);
+ *scanl = charstring_create (width);
if (outnum)
umask(~m_gmprot());
cptr->c_text = tmpbuf;
for (cp = tmpbuf + strlen (tmpbuf) - 1;
cp >= tmpbuf; cp--)
- if (isspace (*cp))
+ if (isspace ((unsigned char) *cp))
*cp = 0;
else
break;
case LENERR:
case FMTERR:
- fprintf (stderr,
- innum ? "??Format error (message %d) in "
- : "??Format error in ",
- outnum ? outnum : innum);
+ if (innum)
+ fprintf (stderr, "??Format error (message %d) in ",
+ outnum ? outnum : innum);
+ else
+ fprintf (stderr, "??Format error in ");
+
fprintf (stderr, "component %d\n", compnum);
if (outnum) {
}
}
- fmt_scan (fmt, scanl, scanl_size, slwidth, dat);
+ fmt_scan (fmt, *scanl, slwidth, dat, NULL);
if (bodycomp)
bodycomp->c_text = saved_c_text;
if (noisy)
- fputs (scanl, stdout);
+ fputs (charstring_buffer (*scanl), stdout);
cptr = fmt_findcomp ("encrypted");
encrypted = cptr && cptr->c_text;
m_unknown (&gstate, f);
}
-void
-scan_eom_action (int (*action)()) {
- m_eomsbr (gstate, action);
-}
-
void
scan_reset_m_getfld_state () {
m_getfld_state_reset (&gstate);