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

📄 formatsbr.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
	    value = dat[fmt->f_value];	    break;	case FT_LV_STRLEN:	    value = strlen(str);	    break;	case FT_LV_CHAR_LEFT:	    value = width - (cp - scanl);	    break;	case FT_LV_PLUS_L:	    value += fmt->f_value;	    break;	case FT_LV_MINUS_L:	    value = fmt->f_value - value;	    break;	case FT_LV_DIVIDE_L:	    if (fmt->f_value)		value = value / fmt->f_value;	    else		value = 0;	    break;	case FT_SAVESTR:	    savestr = str;	    break;	case FT_LV_SEC:	    value = fmt->f_comp->c_tws->tw_sec;	    break;	case FT_LV_MIN:	    value = fmt->f_comp->c_tws->tw_min;	    break;	case FT_LV_HOUR:	    value = fmt->f_comp->c_tws->tw_hour;	    break;	case FT_LV_MDAY:	    value = fmt->f_comp->c_tws->tw_mday;	    break;	case FT_LV_MON:	    value = fmt->f_comp->c_tws->tw_mon + 1;	    break;	case FT_LS_MONTH:	    str = tw_moty[fmt->f_comp->c_tws->tw_mon];	    break;	case FT_LS_LMONTH:	    str = lmonth[fmt->f_comp->c_tws->tw_mon];	    break;	case FT_LS_ZONE:	    str = dtwszone (fmt->f_comp->c_tws);	    break;	case FT_LV_YEAR:	    value = fmt->f_comp->c_tws->tw_year;	    break;	case FT_LV_WDAY:	    if (!(((tws = fmt->f_comp->c_tws)->tw_flags) & (TW_SEXP|TW_SIMP)))		set_dotw (tws);	    value = tws->tw_wday;	    break;	case FT_LS_DAY:	    if (!(((tws = fmt->f_comp->c_tws)->tw_flags) & (TW_SEXP|TW_SIMP)))		set_dotw (tws);	    str = tw_dotw[tws->tw_wday];	    break;	case FT_LS_WEEKDAY:	    if (!(((tws = fmt->f_comp->c_tws)->tw_flags) & (TW_SEXP|TW_SIMP)))		set_dotw (tws);	    str = tw_ldotw[tws->tw_wday];	    break;	case FT_LV_YDAY:	    value = fmt->f_comp->c_tws->tw_yday;	    break;	case FT_LV_ZONE:	    value = fmt->f_comp->c_tws->tw_zone;	    break;	case FT_LV_CLOCK:	    if ((value = fmt->f_comp->c_tws->tw_clock) == 0)		value = twclock(fmt->f_comp->c_tws);	    break;	case FT_LV_RCLOCK:	    if ((value = fmt->f_comp->c_tws->tw_clock) == 0)		value = twclock(fmt->f_comp->c_tws);	    value = time((long *) 0) - value;	    break;	case FT_LV_DAYF:	    if (!(((tws = fmt->f_comp->c_tws)->tw_flags) & (TW_SEXP|TW_SIMP)))		set_dotw (tws);	    switch (fmt->f_comp->c_tws->tw_flags & TW_SDAY) {		case TW_SEXP:		    value = 1; break;		case TW_SIMP:		    value = 0; break;		default:		    value = -1; break;	    }	case FT_LV_ZONEF:	    if ((fmt->f_comp->c_tws->tw_flags & TW_SZONE) == TW_SZEXP)		    value = 1;	    else		    value = -1;	    break;	case FT_LV_DST:	    value = fmt->f_comp->c_tws->tw_flags & TW_DST;	    break;	case FT_LS_822DATE:	    str = dasctime ( fmt->f_comp->c_tws , TW_ZONE);	    break;	case FT_LS_PRETTY:	    str = dasctime ( fmt->f_comp->c_tws, TW_NULL);	    break;	case FT_LS_PERS:	    str = fmt->f_comp->c_mn->m_pers;	    break;	case FT_LS_MBOX:	    str = fmt->f_comp->c_mn->m_mbox;	    break;	case FT_LS_HOST:	    str = fmt->f_comp->c_mn->m_host;	    break;	case FT_LS_PATH:	    str = fmt->f_comp->c_mn->m_path;	    break;	case FT_LS_GNAME:	    str = fmt->f_comp->c_mn->m_gname;	    break;	case FT_LS_NOTE:	    str = fmt->f_comp->c_mn->m_note;	    break;	case FT_LS_822ADDR:	    str = adrformat( fmt->f_comp->c_mn );	    break;	case FT_LV_HOSTTYPE:	    value = fmt->f_comp->c_mn->m_type;	    break;	case FT_LV_INGRPF:	    value = fmt->f_comp->c_mn->m_ingrp;	    break;	case FT_LV_NOHOSTF:	    value = fmt->f_comp->c_mn->m_nohost;	    break;	case FT_LS_FRIENDLY:#ifdef BERK	    str = fmt->f_comp->c_mn->m_mbox;#else not BERK	    if ((mn = fmt -> f_comp -> c_mn) == &fmt_mnull) {		str = fmt -> f_comp -> c_text;		break;	    }	    if ((str = mn -> m_pers) == NULL)	        if ((str = mn -> m_note)) {	            (void) strcpy (buffer, str);	            str = buffer;	            if (*str == '(')	            	str++;	            sp = str + strlen(str) - 1;	            if (*sp == ')') {	            	*sp-- = '\0';	        	while (sp >= str)	            	    if (*sp == ' ')	            		*sp-- = '\0';	            	    else	            		break;	            }	        } else		switch (mn -> m_type) {		    case LOCALHOST:			str = mn -> m_mbox;			break;		    case UUCPHOST:			(void) sprintf (buffer, "%s!%s",					mn -> m_host, mn -> m_mbox);			str = buffer;			break;		    default:			if (mn -> m_mbox) {			    (void) sprintf (buffer, "%s@%s",					    mn -> m_mbox, mn -> m_host);			    str= buffer;			}			else			    str = mn -> m_text;			break;		}#endif BERK	    break;	case FT_LOCALDATE:	    comp = fmt->f_comp;	    if ((l = comp->c_tws->tw_clock) == 0)		l = twclock(comp->c_tws);	    tws = dlocaltime(&l);	    *comp->c_tws = *tws;	    break;	case FT_GMTDATE:	    comp = fmt->f_comp;	    if ((l = comp->c_tws->tw_clock) == 0)		l = twclock(comp->c_tws);	    tws = dgmtime(&l);	    *comp->c_tws = *tws;	    break;	case FT_PARSEDATE:	    comp = fmt->f_comp;	    if ((sp = comp->c_text) && (tws = dparsetime(sp))) {		*comp->c_tws = *tws;		comp->c_flags = 0;	    } else if (comp->c_flags >= 0) {		bzero ((char *) comp -> c_tws, sizeof *comp -> c_tws);		comp->c_flags = 1;	    }	    break;	case FT_FORMATADDR:	    /* hook for custom address list formatting (see replsbr.c) */	    str = formataddr (savestr, str);	    break;	case FT_PUTADDR:	    /* output the str register as an address component,	     * splitting it into multiple lines if necessary.  The	     * value reg. contains the max line length.  The lit.	     * field may contain a string to prepend to the result	     * (e.g., "To: ")	     */	    {	    register char *lp = str;	    register int indent;	    register int wid = value;	    register int len = strlen (str);	    register char *lastb;	    sp = fmt->f_text;	    indent = strlen (sp);	    wid -= indent;	    while( (c = *sp++) && cp < ep)		*cp++ = c;#ifdef DOSPLIT	    while (len > wid) {		/* try to break at a comma; failing that, break at a		 * space, failing that, just split the line.		 */		lastb = 0; sp = lp + wid;		while (sp > lp && (c = *--sp) != ',') {		    if (! lastb && isspace(c))			lastb = sp - 1;		}		if (sp == lp)		    if (! (sp = lastb))			sp = lp + wid - 1;		len -= sp - lp + 1;		while (cp < ep && lp <= sp)		    *cp++ = *lp++;		*cp++ = '\n';		for (i=indent; cp < ep && i > 0; i--)		    *cp++ = ' ';		while (isspace(*lp))		    lp++, len--;	    }#else DONTSPLIT            while (len > wid) {                if ((sp = address_break_point (lp, len, wid)) == NULLCP)/* no break points found */                        break;                while (sp > lp && isspace (*sp))                        sp--;                len -= sp - lp + 1;                while (cp < ep && lp <= sp)                    *cp++ = *lp++;                *cp++ = '\n';                for (i=indent; cp < ep && i > 0; i--)                    *cp++ = ' ';                while (isspace(*lp))                    lp++, len--;            }#endif DOSPLIT	    PUTS (cp, lp);	    }	    break;	case FT_PARSEADDR:	    comp = fmt->f_comp;	    if (comp->c_mn != &fmt_mnull)		mnfree (comp->c_mn);	    if ((sp = comp->c_text) && (sp = getname(sp)) &&		(mn = getm (sp, NULLCP, 0, fmt_norm, NULLCP))) {		comp->c_mn = mn;		while (getname(""))		    ;	    } else {		while (getname(""))		/* XXX */		    ;		comp->c_mn = &fmt_mnull;	    }	    break;	    	case FT_MYMBOX:	    /*	     * if there's no component, we say true.  Otherwise we	     * say "true" only if we can parse the address and it	     * matches one of our addresses.	     */	    comp = fmt->f_comp;	    if (comp->c_mn != &fmt_mnull)		mnfree (comp->c_mn);	    if ((sp = comp->c_text) && (sp = getname(sp)) &&		(mn = getm (sp, NULLCP, 0, AD_NAME, NULLCP))) {		comp->c_mn = mn;		comp->c_flags = ismymbox(mn);		while (sp = getname(sp))		    if (comp->c_flags == 0 &&			(mn = getm (sp, NULLCP, 0, AD_NAME, NULLCP)))			comp->c_flags |= ismymbox(mn);	    } else {		while (getname(""))		/* XXX */		    ;		comp->c_flags = (comp->c_text == 0);		comp->c_mn = &fmt_mnull;	    }	    break;#ifdef	VAN	case FT_ADDTOSEQ:	    /* If we're working on a folder (as opposed to a file), add the	     * current msg to sequence given in literal field.  Don't	     * disturb string or value registers.	     */	    if (fmt_current_folder)		    (void)m_seqadd(fmt_current_folder, fmt->f_text, dat[0], -1);	    break;#endif	}	fmt++;    }    finished:;    if (cp[-1] != '\n')	*cp++ = '\n';    *cp   = NULL;    return (value);}/* * break the address (lp) at a comma or, failing that, a space.  If there is no space or comma, DO NOT * break the address.  It would be possible to break the address at a carefully selected subset of * address meta-characters (eg angle-brackets, comment delimters, quoted string delimeters), but * somewhat difficult and not really worth the effort. * * We do not use a space or comma as a break point if it is between angle-brackets or parentheses or, * in the case of a space, if it is adjacent to a quote or has a neighbouring space adjancent to a * quote. */static char *address_break_point (lp, len, wid)char *lp;int len, wid;{	register char *sp;	char in_brackets = 0;	/* set to the matching bracket symbol */	char in_quotes = 0;	/* a boolean */	int late_break = 0;	char *last_comma = NULLCP, *last_space = NULLCP;					sp = lp - 1;	for (;;) {		while (++sp < lp+len || (late_break && sp < lp+wid)) {			if (sp >= lp+wid && (last_comma != NULLCP || last_space != NULLCP))				break;            if (in_brackets != '\0') {                if (*sp == '\\')                    sp++;                else if (*sp == in_brackets)                    in_brackets = 0;            }            else {                switch (*sp) {                case '"':                    in_brackets = '"';                    break;                case '(':                    in_brackets = '(';                    break;                case '>':                    in_brackets = '>';                    break;                case ',':                    if (!late_break || sp >= lp+wid)                        last_comma = sp;                    break;                case ' ':                case '\t':                    if ((!late_break || sp >= lp+wid) && isspace (*sp)) {                        char *ptr;                        last_space = sp;/* PDW: UMC version : 							 *//* 		for (ptr = sp; last_space != NULLCP && ptr >= lp; ptr--) */                        for (ptr = sp; last_space != NULLCP && ptr >= lp; )                            if (*ptr-- == '"')                                last_space = NULLCP;                        for (ptr = sp; last_space != NULLCP && ptr <= lp+len; )                            if (*ptr++ == '"')                                last_space = NULLCP;                    }                    break;                }            }        }        if (last_comma != NULLCP)            return last_comma;        else if (last_space != NULLCP)            return last_space;        else {            if (late_break)                return NULLCP;    /* tried to find a late break point and failed */            else {                sp = lp - 1;                late_break = 1;            }        }    }    /* NOTREACHED */}

⌨️ 快捷键说明

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