⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mhlsbr.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 3 页
字号:
	case 1: 	    global.c_flags |= BELL;	    break;	case -1: 	    global.c_flags &= ~BELL;	    break;    }    if (length)	global.c_length = length;    if (width)	global.c_width = width;    if (global.c_length < 5)	global.c_length = 10000;    if (global.c_width < 5)	global.c_width = 10000;}/*  */static  evalvar (c1)register struct mcomp *c1;{    char   *cp,            name[NAMESZ];    register struct triple *ap;    if (!*parptr)	return 0;    (void) strcpy (name, parse ());    if (uleq (name, "component")) {	if (ptos (name, &c1 -> c_text))	    return 1;	c1 -> c_flags &= ~NOCOMPONENT;	return 0;    }    if (uleq (name, "overflowtext"))	return ptos (name, &c1 -> c_ovtxt);    if (uleq (name, "formatfield")) {	if (ptos (name, &cp))	    return 1;	c1 -> c_nfs = getcpy (new_fs (NULLCP, NULLCP, cp));	c1 -> c_flags |= FORMAT;	return 0;    }    if (uleq (name, "offset"))	return ptoi (name, &c1 -> c_offset);    if (uleq (name, "overflowoffset"))	return ptoi (name, &c1 -> c_ovoff);    if (uleq (name, "width"))	return ptoi (name, &c1 -> c_width);    if (uleq (name, "compwidth"))	return ptoi (name, &c1 -> c_cwidth);    if (uleq (name, "length"))	return ptoi (name, &c1 -> c_length);    for (ap = triples; ap -> t_name; ap++)	if (uleq (ap -> t_name, name)) {	    c1 -> c_flags |= ap -> t_on;	    c1 -> c_flags &= ~ap -> t_off;	    return 0;	}    return 1;}/*  */static int  ptoi (name, i)register char  *name;register int   *i;{    char   *cp;    if (*parptr++ != '=' || !*(cp = parse ())) {	advise (NULLCP, "missing argument to variable %s", name);	return 1;    }    *i = atoi (cp);    return 0;}static int  ptos (name, s)register char  *name,	      **s;{    char    c,           *cp;    if (*parptr++ != '=') {	advise (NULLCP, "missing argument to variable %s", name);	return 1;    }    if (*parptr != '"')	for (cp = parptr;		*parptr && *parptr != ':' && *parptr != ',';		parptr++)	    continue;    else	for (cp = ++parptr; *parptr && *parptr != '"'; parptr++)	    if (*parptr == QUOTE)		if (!*++parptr)		    parptr--;    c = *parptr;    *parptr = NULL;    *s = getcpy (cp);    if ((*parptr = c) == '"')	parptr++;    return 0;}/*  */static char *parse () {    int     c;    register char   *cp;    static char result[NAMESZ];    for (cp = result; c = *parptr; parptr++)	if (isalnum (c)		|| c == '.'		|| c == '-'		|| c == '_'		|| c =='['		|| c == ']')	    *cp++ = c;	else	    break;    *cp = NULL;    return result;}/*  */static  process (folder, fname, ofilen, ofilec)char   *folder,       *fname;int	ofilen,	ofilec;{    char  *cp;    FILE  *fp;    struct mcomp  *c1;    switch (setjmp (env)) {	case OK: 	    if (fname) {		fp = mhl_action ? (*mhl_action) (fname) : fopen (fname, "r");		if (fp == NULL) {		    advise (fname, "unable to open");		    exitstat++;		    return;		}	    }	    else {		fname = "(stdin)";		fp = stdin;	    }	    cp = folder ? concat (folder, ":", fname, NULLCP) : getcpy (fname);	    if (ontty != PITTY)		(void) signal (SIGINT, intrser);	    mhlfile (fp, cp, ofilen, ofilec);/* fall */	default: 	    if (ontty != PITTY)		(void) signal (SIGINT, SIG_IGN);	    if (mhl_action == NULL && fp != stdin)		(void) fclose (fp);	    free (cp);	    if (holder.c_text) {		free (holder.c_text);		holder.c_text = NULL;	    }	    free_queue (&msghd, &msgtl);	    for (c1 = fmthd; c1; c1 = c1 -> c_next)		c1 -> c_flags &= ~HDROUTPUT;	    break;    }}/*  */static mhlfile (fp, mname, ofilen, ofilec)register FILE   *fp;register char   *mname;int	ofilen,	ofilec;{    int     state;    register struct mcomp  *c1,                           *c2,			   *c3;    register char **ip;    char    name[NAMESZ],            buf[BUFSIZ];    if (forwall) {	if (digest)	    printf ("%s", ofilen == 1 ? delim3 : delim4);	else {	    printf ("\n-------");	    if (ofilen == 1)		printf (" Forwarded Message%s", ofilec > 1 ? "s" : "");	    else		printf (" Message %d", ofilen);	    printf ("\n\n");	}    }    else	switch (ontty) {	    case PITTY: 		if (ofilec > 1) {		    if (ofilen > 1) {			if ((global.c_flags & CLEARSCR))			    clear_screen ();			else			    printf ("\n\n\n");		    }		    printf (">>> %s\n\n", mname);		}		break;	    case ISTTY: 		(void) strcpy (buf, "\n");		if (ofilec > 1) {		    if (SOprintf ("Press <return> to list \"%s\"...", mname)) {			if (ofilen > 1)			    printf ("\n\n\n");			printf ("Press <return> to list \"%s\"...", mname);		    }		    (void) fflush (stdout);		    buf[0] = NULL;		    (void) read (fileno (stdout), buf, sizeof buf);		}		if (index (buf, '\n')) {		    if ((global.c_flags & CLEARSCR))			clear_screen ();		}		else		    printf ("\n");		break;	    default: 		if (ofilec > 1) {		    if (ofilen > 1) {			printf ("\n\n\n");			if (clearflg > 0)			    clear_screen ();		    }		    printf (">>> %s\n\n", mname);		}		break;	}/*  */    for (state = FLD;;)	switch (state = m_getfld (state, name, buf, sizeof buf, fp)) {	    case FLD: 	    case FLDPLUS: 		for (ip = ignores; *ip; ip++)		    if (uleq (name, *ip)) {			while (state == FLDPLUS)			    state = m_getfld (state, name, buf, sizeof buf, fp);			break;		    }		if (*ip)		    continue;		for (c2 = fmthd; c2; c2 = c2 -> c_next)		    if (uleq (c2 -> c_name, name))			break;		c1 = NULL;		if (!((c3 = c2 ? c2 : &global) -> c_flags & SPLIT))		    for (c1 = msghd; c1; c1 = c1 -> c_next)			if (uleq (c1 -> c_name, c3 -> c_name)) {			    c1 -> c_text =				mcomp_add (c1 -> c_flags, buf, c1 -> c_text);			    break;			}		if (c1 == NULL)		    c1 = add_queue (&msghd, &msgtl, name, buf, 0);		while (state == FLDPLUS) {		    state = m_getfld (state, name, buf, sizeof buf, fp);		    c1 -> c_text = add (buf, c1 -> c_text);		}		if (c2 == NULL)		    c1 -> c_flags |= EXTRA;		continue;	    case BODY: 	    case FILEEOF: 		row = column = 0;		for (c1 = fmthd; c1; c1 = c1 -> c_next) {		    if (c1 -> c_flags & CLEARTEXT) {			putcomp (c1, c1, ONECOMP);			continue;		    }		    if (uleq (c1 -> c_name, "messagename")) {			holder.c_text = concat ("(Message ", mname, ")\n",					    NULLCP);			putcomp (c1, &holder, ONECOMP);			free (holder.c_text);			holder.c_text = NULL;			continue;		    }		    if (uleq (c1 -> c_name, "extras")) {			for (c2 = msghd; c2; c2 = c2 -> c_next)			    if (c2 -> c_flags & EXTRA)				putcomp (c1, c2, TWOCOMP);			continue;		    }		    if (uleq (c1 -> c_name, "body")) {			if ((holder.c_text = malloc (sizeof buf)) == NULL)			    adios (NULLCP, "unable to allocate buffer memory");			(void) strcpy (holder.c_text, buf);			while (state == BODY) {			    putcomp (c1, &holder, BODYCOMP);			    state = m_getfld (state, name, holder.c_text,					sizeof buf, fp);			}			free (holder.c_text);			holder.c_text = NULL;			continue;		    }		    for (c2 = msghd; c2; c2 = c2 -> c_next)			if (uleq (c2 -> c_name, c1 -> c_name)) {			    putcomp (c1, c2, ONECOMP);			    if (!(c1 -> c_flags & SPLIT))				break;			}		    if (faceproc && c2 == NULL && (c1 -> c_flags & FACEFMT))			for (c2 = msghd; c2; c2 = c2 -> c_next)			    if (c2 -> c_flags & FACEDFLT) {				if (c2 -> c_face == NULL)				    face_format (c2);				if (holder.c_text = c2 -> c_face) {				    putcomp (c1, &holder, ONECOMP);				    holder.c_text = NULL;				}				break;			    }		}		return;	    case LENERR: 	    case FMTERR: 		advise (NULLCP, "format error in message %s", mname);		exitstat++;		return;	    default: 		adios (NULLCP, "getfld() returned %d", state);	}}/*  */static int  mcomp_flags (name)register char   *name;{    register struct pair   *ap;    for (ap = pairs; ap -> p_name; ap++)	if (uleq (ap -> p_name, name))	    return (ap -> p_flags);    return NULL;}static char *mcomp_add (flags, s1, s2)long	flags;register char   *s1,		*s2;{    register char   *dp;    if (!(flags & ADDRFMT))	return add (s1, s2);    if (s2 && *(dp = s2 + strlen (s2) - 1) == '\n')	*dp = NULL;    return add (s1, add (",\n", s2));}/*  */struct pqpair {    char    *pq_text;    char    *pq_error;    struct pqpair *pq_next;};static mcomp_format (c1, c2)register struct mcomp *c1,		      *c2;{    int     dat[4];    register char  *ap,                   *cp;    char    buffer[BUFSIZ],            error[BUFSIZ];    register struct comp   *cptr;    register struct pqpair *p,                           *q;    struct pqpair   pq;    register struct mailname   *mp;    ap = c2 -> c_text;    c2 -> c_text = NULL;    dat[0] = dat[1] = dat[2] = 0;    dat[3] = sizeof buffer - 1;    (void) fmt_compile (c1 -> c_nfs, &c1 -> c_fmt);    if (!(c1 -> c_flags & ADDRFMT)) {	FINDCOMP (cptr, "text");	if (cptr)	    cptr -> c_text = ap;	(void) fmtscan (c1 -> c_fmt, buffer, sizeof buffer - 1, dat);	/* Don't need to append a newline, dctime() already did */	c2 -> c_text = getcpy (buffer);	free (ap);	return;    }    (q = &pq) -> pq_next = NULL;    while (cp = getname (ap)) {	if ((p = (struct pqpair *) calloc ((unsigned) 1, sizeof *p)) == NULL)	    adios (NULLCP, "unable to allocate pqpair memory");	if ((mp = getm (cp, NULLCP, 0, AD_NAME, error)) == NULL) {	    p -> pq_text = getcpy (cp);	    p -> pq_error = getcpy (error);	}	else {	    if ((c1 -> c_flags & FACEDFLT) && c2 -> c_face == NULL) {		char   *h, *o;		if ((h = mp -> m_host) == NULL)		    h = LocalName ();		if (o = OfficialName (h))		    h = o;		c2 -> c_face = concat ("address ", h, " ", mp -> m_mbox,				    NULLCP);	    }	    p -> pq_text = getcpy (mp -> m_text);	    mnfree (mp);	}	q = (q -> pq_next = p);    }    for (p = pq.pq_next; p; p = q) {	FINDCOMP (cptr, "text");	if (cptr)	    cptr -> c_text = p -> pq_text;	FINDCOMP (cptr, "error");	if (cptr)	    cptr -> c_text = p -> pq_error;	(void) fmtscan (c1 -> c_fmt, buffer, sizeof buffer - 1, dat);	if (*buffer) {	    if (c2 -> c_text)		c2 -> c_text = add (",\n", c2 -> c_text);	    if (*(cp = buffer + strlen (buffer) - 1) == '\n')		*cp = NULL;	    c2 -> c_text = add (buffer, c2 -> c_text);	}	free (p -> pq_text);	if (p -> pq_error)	    free (p -> pq_error);	q = p -> pq_next;	free ((char *) p);    }    c2 -> c_text = add ("\n", c2 -> c_text);    free (ap);}/*  */static struct mcomp *add_queue (head, tail, name, text, flags)register struct mcomp **head,		      **tail;register char   *name,		*text;int     flags;{    register struct mcomp  *c1;    if ((c1 = (struct mcomp *) calloc ((unsigned) 1, sizeof *c1)) == NULL)	adios (NULLCP, "unable to allocate comp memory");    c1 -> c_flags = flags & ~INIT;    if (c1 -> c_name = name ? getcpy (name) : NULL)	c1 -> c_flags |= mcomp_flags (c1 -> c_name);    c1 -> c_text = text ? getcpy (text) : NULL;    if (flags & INIT) {	if (global.c_ovtxt)	    c1 -> c_ovtxt = getcpy (global.c_ovtxt);	c1 -> c_offset = global.c_offset;	c1 -> c_ovoff = global. c_ovoff;	c1 -> c_width = c1 -> c_length = 0;	c1 -> c_cwidth = global.c_cwidth;	c1 -> c_flags |= global.c_flags & GFLAGS;    }    if (*head == NULL)	*head = c1;    if (*tail != NULL)	(*tail) -> c_next = c1;    *tail = c1;    return c1;}static  free_queue (head, tail)register struct mcomp **head,		      **tail;{    register struct mcomp *c1,			  *c2;    for (c1 = *head; c1; c1 = c2) {	c2 = c1 -> c_next;	if (c1 -> c_name)	    free (c1 -> c_name);	if (c1 -> c_text)	    free (c1 -> c_text);	if (c1 -> c_ovtxt)	    free (c1 -> c_ovtxt);	if (c1 -> c_nfs)	    free (c1 -> c_nfs);	if (c1 -> c_fmt)	    free ((char *) c1 -> c_fmt);	if (c1 -> c_face)	    free (c1 -> c_face);	free ((char *) c1);    }    *head = *tail = NULL;}/*  */static  putcomp (c1, c2, flag)register struct mcomp *c1,		      *c2;int     flag;{    int     count,            cchdr;    register char   *cp;    cchdr = 0;    lm = 0;    llim = c1 -> c_length ? c1 -> c_length : -1;    wid = c1 -> c_width ? c1 -> c_width : global.c_width;    ovoff = (c1 -> c_ovoff >= 0 ? c1 -> c_ovoff : global.c_ovoff)	+ c1 -> c_offset;    if ((ovtxt = c1 -> c_ovtxt ? c1 -> c_ovtxt : global.c_ovtxt) == NULL)	ovtxt = "";    if (wid < ovoff + strlen (ovtxt) + 5)	adios (NULLCP, "component: %s width(%d) too small for overflow(%d)",		c1 -> c_name, wid, ovoff + strlen (ovtxt) + 5);    onelp = NULL;    if (c1 -> c_flags & CLEARTEXT) {	putstr (c1 -> c_text);	putstr ("\n");	return;    }    if (c1 -> c_flags & FACEFMT)	switch (doface (c2)) {	    case NOTOK:		/* error */	    case OK:		/* async faceproc */		return;	    default:		/* sync faceproc */		break;	}    if (c1 -> c_nfs && (c1 -> c_flags & (ADDRFMT | DATEFMT | FORMAT)))	mcomp_format (c1, c2);    if (c1 -> c_flags & CENTER) {	count = (c1 -> c_width ? c1 -> c_width : global.c_width)	    - c1 -> c_offset - strlen (c2 -> c_text);	if (!(c1 -> c_flags & HDROUTPUT) && !(c1 -> c_flags & NOCOMPONENT))	    count -= strlen (c1 -> c_text ? c1 -> c_text : c1 -> c_name) + 2;	lm = c1 -> c_offset + (count / 2);    }    else	if (c1 -> c_offset)	    lm = c1 -> c_offset;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -