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

📄 lex.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
	 * if the :g modifier is followed by a newline, then error right away!	 * -strike	 */	int     gmodflag = 0, amodflag = 0;	do {	    *np++ = c, c = getC(DOEXCL);	    if (c == 'g' || c == 'a') {		if (c == 'g')		    gmodflag++;		else		    amodflag++;		*np++ = c; c = getC(DOEXCL);	    }	    if ((c == 'g' && !gmodflag) || (c == 'a' && !amodflag)) {		if (c == 'g')		    gmodflag++;		else		    amodflag++;		*np++ = c; c = getC(DOEXCL);	    }	    *np++ = c;	    /* scan s// [eichin:19910926.0512EST] */	    if (c == 's') {		int delimcnt = 2;		int delim = getC(0);		*np++ = delim;				if (!delim || letter(delim)		    || Isdigit(delim) || any(" \t\n", delim)) {		    seterror(ERR_BADSUBST);		    break;		}			while ((c = getC(0)) != (-1)) {		    *np++ = c;		    if(c == delim) delimcnt--;		    if(!delimcnt) break;		}		if(delimcnt) {		    seterror(ERR_BADSUBST);		    break;		}		c = 's';	    }	    if (!any("htrqxes", c)) {		if ((amodflag || gmodflag) && c == '\n')		    stderror(ERR_VARSYN);	/* strike */		seterror(ERR_VARMOD, c);		*np = 0;		addla(name);		return;	    }	}	while ((c = getC(DOEXCL)) == ':');	ungetD(c);    }    else	ungetD(c);    if (sc == '{') {	c = getC(DOEXCL);	if (c != '}') {	    ungetD(c);	    seterror(ERR_MISSING, '}');	    *np = 0;	    addla(name);	    return;	}	*np++ = c;    }    *np = 0;    addla(name);    return;}voidaddla(cp)    Char   *cp;{    Char    buf[BUFSIZ];    if (Strlen(cp) + (lap ? Strlen(lap) : 0) >=	(sizeof(labuf) - 4) / sizeof(Char)) {	seterror(ERR_EXPOVFL);	return;    }    if (lap)	(void) Strcpy(buf, lap);    (void) Strcpy(labuf, cp);    if (lap)	(void) Strcat(labuf, buf);    lap = labuf;}static Char lhsb[32];static Char slhs[32];static Char rhsb[64];static int quesarg;static voidgetexcl(sc)    int    sc;{    register struct wordent *hp, *ip;    int     left, right, dol;    register int c;    if (sc == 0) {	sc = getC(0);	if (sc != '{') {	    ungetC(sc);	    sc = 0;	}    }    quesarg = -1;    lastev = eventno;    hp = gethent(sc);    if (hp == 0)	return;    hadhist = 1;    dol = 0;    if (hp == alhistp)	for (ip = hp->next->next; ip != alhistt; ip = ip->next)	    dol++;    else	for (ip = hp->next->next; ip != hp->prev; ip = ip->next)	    dol++;    left = 0, right = dol;    if (sc == HISTSUB) {	ungetC('s'), unreadc(HISTSUB), c = ':';	goto subst;    }    c = getC(0);    if (!any(":^$*-%", c))	goto subst;    left = right = -1;    if (c == ':') {	c = getC(0);	unreadc(c);	if (letter(c) || c == '&') {	    c = ':';	    left = 0, right = dol;	    goto subst;	}    }    else	ungetC(c);    if (!getsel(&left, &right, dol))	return;    c = getC(0);    if (c == '*')	ungetC(c), c = '-';    if (c == '-') {	if (!getsel(&left, &right, dol))	    return;	c = getC(0);    }subst:    exclc = right - left + 1;    while (--left >= 0)	hp = hp->next;    if (sc == HISTSUB || c == ':') {	do {	    hp = getsub(hp);	    c = getC(0);	} while (c == ':');    }    unreadc(c);    if (sc == '{') {	c = getC(0);	if (c != '}')	    seterror(ERR_BADBANG);    }    exclnxt = hp;}static struct wordent *getsub(en)    struct wordent *en;{    register Char *cp;    int     delim;    register int c;    int     sc;    bool global;    Char    orhsb[sizeof(rhsb) / sizeof(Char)];    do {	exclnxt = 0;	global = 0;	sc = c = getC(0);	if (c == 'g' || c == 'a') {	    global |= (c == 'g') ? 1 : 2;	    sc = c = getC(0);	}	if (((c =='g') && !(global & 1)) || ((c == 'a') && !(global & 2))) {	    global |= (c == 'g') ? 1 : 2;	    sc = c = getC(0);	}	switch (c) {	case 'p':	    justpr++;	    return (en);	case 'x':	case 'q':	    global |= 1;	    /* fall into ... */	case 'h':	case 'r':	case 't':	case 'e':	    break;	case '&':	    if (slhs[0] == 0) {		seterror(ERR_NOSUBST);		return (en);	    }	    (void) Strcpy(lhsb, slhs);	    break;#ifdef notdef	case '~':	    if (lhsb[0] == 0)		goto badlhs;	    break;#endif	case 's':	    delim = getC(0);	    if (letter(delim) || Isdigit(delim) || any(" \t\n", delim)) {		unreadc(delim);		lhsb[0] = 0;		seterror(ERR_BADSUBST);		return (en);	    }	    cp = lhsb;	    for (;;) {		c = getC(0);		if (c == '\n') {		    unreadc(c);		    break;		}		if (c == delim)		    break;		if (cp > &lhsb[sizeof(lhsb) / sizeof(Char) - 2]) {		    lhsb[0] = 0;		    seterror(ERR_BADSUBST);		    return (en);		}		if (c == '\\') {		    c = getC(0);		    if (c != delim && c != '\\')			*cp++ = '\\';		}		*cp++ = c;	    }	    if (cp != lhsb)		*cp++ = 0;	    else if (lhsb[0] == 0) {		seterror(ERR_LHS);		return (en);	    }	    cp = rhsb;	    (void) Strcpy(orhsb, cp);	    for (;;) {		c = getC(0);		if (c == '\n') {		    unreadc(c);		    break;		}		if (c == delim)		    break;#ifdef notdef		if (c == '~') {		    if (&cp[Strlen(orhsb)] > &rhsb[sizeof(rhsb) /						   sizeof(Char) - 2])			goto toorhs;		    (void) Strcpy(cp, orhsb);		    cp = Strend(cp);		    continue;		}#endif		if (cp > &rhsb[sizeof(rhsb) / sizeof(Char) - 2]) {		    seterror(ERR_RHSLONG);		    return (en);		}		if (c == '\\') {		    c = getC(0);		    if (c != delim /* && c != '~' */ )			*cp++ = '\\';		}		*cp++ = c;	    }	    *cp++ = 0;	    break;	default:	    if (c == '\n')		unreadc(c);	    seterror(ERR_BADBANGMOD, c);	    return (en);	}	(void) Strcpy(slhs, lhsb);	if (exclc)	    en = dosub(sc, en, global);    }    while ((c = getC(0)) == ':');    unreadc(c);    return (en);}static struct wordent *dosub(sc, en, global)    int     sc;    struct wordent *en;    bool global;{    struct wordent lexi;    bool    didsub = 0, didone = 0;    struct wordent *hp = &lexi;    register struct wordent *wdp;    register int i = exclc;    wdp = hp;    while (--i >= 0) {	register struct wordent *new = 		(struct wordent *) xcalloc(1, sizeof *wdp);	new->word = 0;	new->prev = wdp;	new->next = hp;	wdp->next = new;	wdp = new;	en = en->next;	if (en->word) {	    Char *tword, *otword;	    if ((global & 1) || didsub == 0) {		tword = subword(en->word, sc, &didone);		if (didone)		    didsub = 1;		if (global & 2) {		    while (didone && tword != STRNULL) {			otword = tword;			tword = subword(otword, sc, &didone);			if (Strcmp(tword, otword) == 0) {			    xfree((ptr_t) otword);			    break;			}			else			    xfree((ptr_t) otword);		    }		}	    }	    else		tword = Strsave(en->word);	    wdp->word = tword;	}    }    if (didsub == 0)	seterror(ERR_MODFAIL);    hp->prev = wdp;    return (&enthist(-1000, &lexi, 0)->Hlex);}static Char *subword(cp, type, adid)    Char   *cp;    int     type;    bool   *adid;{    Char    wbuf[BUFSIZ];    register Char *wp, *mp, *np;    register int i;    *adid = 0;    switch (type) {    case 'r':    case 'e':    case 'h':    case 't':    case 'q':    case 'x':	wp = domod(cp, type);	if (wp == 0)	    return (Strsave(cp));	*adid = 1;	return (wp);    default:	wp = wbuf;	i = BUFSIZ - 4;	for (mp = cp; *mp; mp++)	    if (matchs(mp, lhsb)) {		for (np = cp; np < mp;)		    *wp++ = *np++, --i;		for (np = rhsb; *np; np++)		    switch (*np) {		    case '\\':			if (np[1] == '&')			    np++;			/* fall into ... */		    default:			if (--i < 0) {			    seterror(ERR_SUBOVFL);			    return (STRNULL);			}			*wp++ = *np;			continue;		    case '&':			i -= Strlen(lhsb);			if (i < 0) {			    seterror(ERR_SUBOVFL);			    return (STRNULL);			}			*wp = 0;			(void) Strcat(wp, lhsb);			wp = Strend(wp);			continue;		    }		mp += Strlen(lhsb);		i -= Strlen(mp);		if (i < 0) {		    seterror(ERR_SUBOVFL);		    return (STRNULL);		}		*wp = 0;		(void) Strcat(wp, mp);		*adid = 1;		return (Strsave(wbuf));	    }	return (Strsave(cp));    }}Char   *domod(cp, type)    Char   *cp;    int     type;{    register Char *wp, *xp;    register int c;    switch (type) {    case 'x':    case 'q':	wp = Strsave(cp);	for (xp = wp; (c = *xp) != '\0'; xp++)	    if ((c != ' ' && c != '\t') || type == 'q')		*xp |= QUOTE;	return (wp);    case 'h':    case 't':	if (!any(short2str(cp), '/'))	    return (type == 't' ? Strsave(cp) : 0);	wp = Strend(cp);	while (*--wp != '/')	    continue;	if (type == 'h')	    xp = Strsave(cp), xp[wp - cp] = 0;	else	    xp = Strsave(wp + 1);	return (xp);    case 'e':    case 'r':	wp = Strend(cp);	for (wp--; wp >= cp && *wp != '/'; wp--)	    if (*wp == '.') {		if (type == 'e')		    xp = Strsave(wp + 1);		else		    xp = Strsave(cp), xp[wp - cp] = 0;		return (xp);	    }	return (Strsave(type == 'e' ? STRNULL : cp));    default:	break;    }    return (0);}static intmatchs(str, pat)    register Char *str, *pat;{    while (*str && *pat && *str == *pat)	str++, pat++;    return (*pat == 0);}static intgetsel(al, ar, dol)    register int *al, *ar;    int     dol;{    register int c = getC(0);    register int i;    bool    first = *al < 0;    switch (c) {    case '%':	if (quesarg == -1) {	    seterror(ERR_BADBANGARG);	    return (0);	}	if (*al < 0)	    *al = quesarg;	*ar = quesarg;	break;    case '-':	if (*al < 0) {	    *al = 0;	    *ar = dol - 1;	    unreadc(c);	}	return (1);    case '^':	if (*al < 0)	    *al = 1;	*ar = 1;	break;    case '$':	if (*al < 0)	    *al = dol;	*ar = dol;	break;    case '*':	if (*al < 0)	    *al = 1;	*ar = dol;

⌨️ 快捷键说明

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