📄 picksbr.c
字号:
fprintf (stderr, "AND\n"); PRaction (n -> n_L_child, level + 1); PRaction (n -> n_R_child, level + 1); return; } if (n -> n_action == NOTaction) { fprintf (stderr, "NOT\n"); PRaction (n -> n_L_child, level + 1); return; } if (n -> n_action == GREPaction) { fprintf (stderr, "PATTERN(%s) %s\n", n -> n_header ? "header" : "body", n -> n_patbuf); return; } if (n -> n_action == TWSaction) { fprintf (stderr, "TEMPORAL(%s) %s: %s\n", n -> n_after ? "after" : "before", n -> n_datef, dasctime (&n -> n_tws, TW_NULL)); return; } fprintf (stderr, "UNKNOWN(0x%x)\n", (*n -> n_action));}/* */static int ORaction (params)plist{ if ((*n -> n_L_child -> n_action) (args (n -> n_L_child))) return 1; return (*n -> n_R_child -> n_action) (args (n -> n_R_child));}static int ANDaction (params)plist{ if (!(*n -> n_L_child -> n_action) (args (n -> n_L_child))) return 0; return (*n -> n_R_child -> n_action) (args (n -> n_R_child));}static int NOTaction (params)plist{ return (!(*n -> n_L_child -> n_action) (args (n -> n_L_child)));}/* */static int gcompile (n, astr)register struct nexus *n;register char *astr;{ register int c; int cclcnt; register char *ep, *dp, *sp, *lastep; dp = (ep = n -> n_expbuf) + sizeof n -> n_expbuf; sp = astr; if (*sp == '^') { n -> n_circf = 1; sp++; } else n -> n_circf = 0; for (;;) { if (ep >= dp) goto cerror; if ((c = *sp++) != '*') lastep = ep; switch (c) { case '\0': *ep++ = CEOF; return 1; case '.': *ep++ = CDOT; continue; case '*': if (lastep == 0) goto defchar; *lastep |= STAR; continue; case '$': if (*sp != '\0') goto defchar; *ep++ = CDOL; continue; case '[': *ep++ = CCL; *ep++ = 0; cclcnt = 1; if ((c = *sp++) == '^') { c = *sp++; ep[-2] = NCCL; } do { *ep++ = c; cclcnt++; if (c == '\0' || ep >= dp) goto cerror; } while ((c = *sp++) != ']'); lastep[1] = cclcnt; continue; case '\\': if ((c = *sp++) == '\0') goto cerror; defchar: default: *ep++ = CCHR; *ep++ = c; } }cerror: ; return 0;}/* *//* ARGSUSED */static int GREPaction (params)plist{ int c, body, lf; long pos = start; register char *p1, *p2, *ebp, *cbp; char ibuf[BUFSIZ]; (void) fseek (fp, start, 0); body = 0; ebp = cbp = ibuf; for (;;) { if (body && n -> n_header) return 0; p1 = linebuf; p2 = cbp; lf = 0; for (;;) { if (p2 >= ebp) { if (fgets (ibuf, sizeof ibuf, fp) == NULL || (stop && pos >= stop)) { if (lf) break; return 0; } pos += (long) strlen (ibuf); p2 = ibuf; ebp = ibuf + strlen (ibuf); } c = *p2++; if (lf && c != '\n') if (c != ' ' && c != '\t') { --p2; break; } else lf = 0; if (c == '\n') if (body) break; else { if (lf) { body++; break; } lf++; c = ' '; } if (c && p1 < &linebuf[LBSIZE - 1]) *p1++ = c; } *p1++ = 0; cbp = p2; p1 = linebuf; p2 = n -> n_expbuf; if (n -> n_circf) { if (advance (p1, p2)) return 1; continue; } if (*p2 == CCHR) { c = p2[1]; do { if (*p1 == c || cc[*p1] == c) if (advance (p1, p2)) return 1; } while (*p1++); continue; } do { if (advance (p1, p2)) return 1; } while (*p1++); }}/* */static int advance (alp, aep)register char *alp, *aep;{ register char *lp, *ep, *curlp; lp = alp; ep = aep; for (;;) switch (*ep++) { case CCHR: if (*ep++ == *lp++ || ep[-1] == cc[lp[-1]]) continue; return 0; case CDOT: if (*lp++) continue; return 0; case CDOL: if (*lp == 0) continue; return 0; case CEOF: return 1; case CCL: if (cclass (ep, *lp++, 1)) { ep += *ep; continue; } return 0; case NCCL: if (cclass (ep, *lp++, 0)) { ep += *ep; continue; } return 0; case CDOT | STAR: curlp = lp; while (*lp++) continue; goto star; case CCHR | STAR: curlp = lp; while (*lp++ == *ep || cc[lp[-1]] == *ep) continue; ep++; goto star; case CCL | STAR: case NCCL | STAR: curlp = lp; while (cclass (ep, *lp++, ep[-1] == (CCL | STAR))) continue; ep += *ep; goto star; star: do { lp--; if (advance (lp, ep)) return (1); } while (lp > curlp); return 0; default: admonish (NULLCP, "advance() botch -- you lose big"); return 0; }}/* */static int cclass (aset, ac, af)register char *aset;{ register int n; register char c, *set; set = aset; if ((c = ac) == 0) return (0); n = *set++; while (--n) if (*set++ == c) return (af); return (!af);}/* */static int tcompile (ap, tb, isafter)register char *ap;register struct tws *tb;int isafter;{ register struct tws *tw; if ((tw = tws_parse (ap, isafter)) == NULL) return 0; twscopy (tb, tw); return 1;}/* */static struct tws *tws_parse (ap, isafter)register char *ap;int isafter;{ char buffer[BUFSIZ]; register struct tws *tw, *ts; if ((tw = tws_special (ap)) != NULL) { tw -> tw_sec = tw -> tw_min = isafter ? 59 : 0; tw -> tw_hour = isafter ? 23 : 0; return tw; } if ((tw = dparsetime (ap)) != NULL) return tw; if ((ts = dtwstime ()) == NULL) return NULL; (void) sprintf (buffer, "%s %s", ap, dtwszone (ts)); if ((tw = dparsetime (buffer)) != NULL) return tw; (void) sprintf (buffer, "%s %02d:%02d:%02d %s", ap, ts -> tw_hour, ts -> tw_min, ts -> tw_sec, dtwszone (ts)); if ((tw = dparsetime (buffer)) != NULL) return tw; (void) sprintf (buffer, "%02d %s %04d %s", ts -> tw_mday, tw_moty[ts -> tw_mon], ts -> tw_year, ap); if ((tw = dparsetime (buffer)) != NULL) return tw; (void) sprintf (buffer, "%02d %s %04d %s %s", ts -> tw_mday, tw_moty[ts -> tw_mon], ts -> tw_year, ap, dtwszone (ts)); if ((tw = dparsetime (buffer)) != NULL) return tw; return NULL;}/* */static struct tws *tws_special (ap)register char *ap;{ int i; long clock; register struct tws *tw; (void) time (&clock); if (uleq (ap, "Today")) return dlocaltime (&clock); if (uleq (ap, "Yesterday")) { clock -= (long) (60 * 60 * 24); return dlocaltime (&clock); } if (uleq (ap, "Tomorrow")) { clock += (long) (60 * 60 * 24); return dlocaltime (&clock); } for (i = 0; tw_ldotw[i]; i++) if (uleq (ap, tw_ldotw[i])) break; if (tw_ldotw[i]) { if ((tw = dlocaltime (&clock)) == NULL) return NULL; if ((i -= tw -> tw_wday) > 0) i -= 7; } else if (*ap != '-') return NULL; else /* -ddd days ago */ i = atoi (ap); /* we should error check this */ clock += (long) ((60 * 60 * 24) * i); return dlocaltime (&clock);}/* *//* ARGSUSED */static int TWSaction (params)plist{ int state; register char *bp; char buf[BUFSIZ], name[NAMESZ]; register struct tws *tw; (void) fseek (fp, start, 0); for (state = FLD, bp = NULL;;) { switch (state = m_getfld (state, name, buf, sizeof buf, fp)) { case FLD: case FLDEOF: case FLDPLUS: if (bp != NULL) free (bp), bp = NULL; bp = add (buf, NULLCP); while (state == FLDPLUS) { state = m_getfld (state, name, buf, sizeof buf, fp); bp = add (buf, bp); } if (uleq (name, n -> n_datef)) break; if (state != FLDEOF) continue; case BODY: case BODYEOF: case FILEEOF: case LENERR: case FMTERR: if (state == LENERR || state == FMTERR) advise (NULLCP, "format error in message %d", msgnum); if (bp != NULL) free (bp); return 0; default: adios (NULLCP, "internal error -- you lose"); } break; }/* */ if ((tw = dparsetime (bp)) == NULL) advise (NULLCP, "unable to parse %s field in message %d, matching...", n -> n_datef, msgnum), state = 1; else state = n -> n_after ? (twsort (tw, &n -> n_tws) > 0) : (twsort (tw, &n -> n_tws) < 0); if (bp != NULL) free (bp); return state;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -