📄 formatsbr.c
字号:
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 + -