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

📄 picksbr.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -