xref: /titanic_44/usr/src/ucbcmd/expr/expr.y (revision 032624d56c174c5c55126582b32e314a6af15522)
17c478bd9Sstevel@tonic-gate %{
27c478bd9Sstevel@tonic-gate /*
37c478bd9Sstevel@tonic-gate  * CDDL HEADER START
47c478bd9Sstevel@tonic-gate  *
57c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
67c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
77c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
87c478bd9Sstevel@tonic-gate  * with the License.
97c478bd9Sstevel@tonic-gate  *
107c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
117c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
127c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
137c478bd9Sstevel@tonic-gate  * and limitations under the License.
147c478bd9Sstevel@tonic-gate  *
157c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
167c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
177c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
187c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
197c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
207c478bd9Sstevel@tonic-gate  *
217c478bd9Sstevel@tonic-gate  * CDDL HEADER END
227c478bd9Sstevel@tonic-gate  */
237c478bd9Sstevel@tonic-gate %}
24*032624d5Sbasabi /*
25*032624d5Sbasabi  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
26*032624d5Sbasabi  * Use is subject to license terms.
27*032624d5Sbasabi  */
28*032624d5Sbasabi 
297c478bd9Sstevel@tonic-gate /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
307c478bd9Sstevel@tonic-gate /*	  All Rights Reserved	*/
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate %{
337c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
347c478bd9Sstevel@tonic-gate %}
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate /* Yacc productions for "expr" command: */
377c478bd9Sstevel@tonic-gate 
387c478bd9Sstevel@tonic-gate %{
397c478bd9Sstevel@tonic-gate typedef	char *yystype;
407c478bd9Sstevel@tonic-gate #define	YYSTYPE	yystype
417c478bd9Sstevel@tonic-gate %}
427c478bd9Sstevel@tonic-gate 
437c478bd9Sstevel@tonic-gate %token OR AND ADD SUBT MULT DIV REM EQ GT GEQ LT LEQ NEQ
447c478bd9Sstevel@tonic-gate %token A_STRING SUBSTR LENGTH INDEX NOARG MATCH
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate /* operators listed below in increasing precedence: */
477c478bd9Sstevel@tonic-gate %left OR
487c478bd9Sstevel@tonic-gate %left AND
497c478bd9Sstevel@tonic-gate %left EQ LT GT GEQ LEQ NEQ
507c478bd9Sstevel@tonic-gate %left ADD SUBT
517c478bd9Sstevel@tonic-gate %left MULT DIV REM
527c478bd9Sstevel@tonic-gate %left MCH
537c478bd9Sstevel@tonic-gate %left MATCH
547c478bd9Sstevel@tonic-gate %left SUBSTR
557c478bd9Sstevel@tonic-gate %left LENGTH INDEX
567c478bd9Sstevel@tonic-gate %%
577c478bd9Sstevel@tonic-gate 
587c478bd9Sstevel@tonic-gate /* a single `expression' is evaluated and printed: */
597c478bd9Sstevel@tonic-gate 
607c478bd9Sstevel@tonic-gate expression:	expr NOARG = {
617c478bd9Sstevel@tonic-gate 			printf("%s\n", $1);
627c478bd9Sstevel@tonic-gate 			exit((!strcmp($1,"0")||!strcmp($1,"\0"))? 1: 0);
637c478bd9Sstevel@tonic-gate 			}
647c478bd9Sstevel@tonic-gate 	;
657c478bd9Sstevel@tonic-gate 
667c478bd9Sstevel@tonic-gate 
677c478bd9Sstevel@tonic-gate expr:	'(' expr ')' = { $$ = $2; }
687c478bd9Sstevel@tonic-gate 	| expr OR expr   = { $$ = conj(OR, $1, $3); }
697c478bd9Sstevel@tonic-gate 	| expr AND expr   = { $$ = conj(AND, $1, $3); }
707c478bd9Sstevel@tonic-gate 	| expr EQ expr   = { $$ = rel(EQ, $1, $3); }
717c478bd9Sstevel@tonic-gate 	| expr GT expr   = { $$ = rel(GT, $1, $3); }
727c478bd9Sstevel@tonic-gate 	| expr GEQ expr   = { $$ = rel(GEQ, $1, $3); }
737c478bd9Sstevel@tonic-gate 	| expr LT expr   = { $$ = rel(LT, $1, $3); }
747c478bd9Sstevel@tonic-gate 	| expr LEQ expr   = { $$ = rel(LEQ, $1, $3); }
757c478bd9Sstevel@tonic-gate 	| expr NEQ expr   = { $$ = rel(NEQ, $1, $3); }
767c478bd9Sstevel@tonic-gate 	| expr ADD expr   = { $$ = arith(ADD, $1, $3); }
777c478bd9Sstevel@tonic-gate 	| expr SUBT expr   = { $$ = arith(SUBT, $1, $3); }
787c478bd9Sstevel@tonic-gate 	| expr MULT expr   = { $$ = arith(MULT, $1, $3); }
797c478bd9Sstevel@tonic-gate 	| expr DIV expr   = { $$ = arith(DIV, $1, $3); }
807c478bd9Sstevel@tonic-gate 	| expr REM expr   = { $$ = arith(REM, $1, $3); }
817c478bd9Sstevel@tonic-gate 	| expr MCH expr	 = { $$ = match($1, $3); }
827c478bd9Sstevel@tonic-gate 	| MATCH expr expr = { $$ = match($2, $3); }
837c478bd9Sstevel@tonic-gate 	| SUBSTR expr expr expr = { $$ = substr($2, $3, $4); }
847c478bd9Sstevel@tonic-gate 	| LENGTH expr       = { $$ = length($2); }
857c478bd9Sstevel@tonic-gate 	| INDEX expr expr = { $$ = index($2, $3); }
867c478bd9Sstevel@tonic-gate 	| A_STRING
877c478bd9Sstevel@tonic-gate 	;
887c478bd9Sstevel@tonic-gate %%
897c478bd9Sstevel@tonic-gate 
907c478bd9Sstevel@tonic-gate #define ESIZE	256
917c478bd9Sstevel@tonic-gate #define EQL(x,y) !strcmp(x,y)
927c478bd9Sstevel@tonic-gate 
93*032624d5Sbasabi #define INIT	char *sp = instring;
947c478bd9Sstevel@tonic-gate #define GETC()		(*sp++)
957c478bd9Sstevel@tonic-gate #define PEEKC()		(*sp)
967c478bd9Sstevel@tonic-gate #define UNGETC(c)	(--sp)
97*032624d5Sbasabi #define RETURN(c)	return(c)
987c478bd9Sstevel@tonic-gate #define ERROR(c)	errxx(c)
997c478bd9Sstevel@tonic-gate #include  <regexp.h>
1007c478bd9Sstevel@tonic-gate #include  <malloc.h>
101*032624d5Sbasabi #include  <stdlib.h>
1027c478bd9Sstevel@tonic-gate 
1037c478bd9Sstevel@tonic-gate char	**Av;
1047c478bd9Sstevel@tonic-gate int	Ac;
1057c478bd9Sstevel@tonic-gate int	Argi;
1067c478bd9Sstevel@tonic-gate 
107*032624d5Sbasabi char *ltoa(long l);
108*032624d5Sbasabi 
1097c478bd9Sstevel@tonic-gate char Mstring[1][128];
1107c478bd9Sstevel@tonic-gate 
1117c478bd9Sstevel@tonic-gate 
1127c478bd9Sstevel@tonic-gate char *operator[] = {
1137c478bd9Sstevel@tonic-gate 	"|", "&", "+", "-", "*", "/", "%", ":",
1147c478bd9Sstevel@tonic-gate 	"=", "==", "<", "<=", ">", ">=", "!=",
1157c478bd9Sstevel@tonic-gate 	"match", "substr", "length", "index", "\0" };
1167c478bd9Sstevel@tonic-gate int op[] = {
1177c478bd9Sstevel@tonic-gate 	OR, AND, ADD,  SUBT, MULT, DIV, REM, MCH,
1187c478bd9Sstevel@tonic-gate 	EQ, EQ, LT, LEQ, GT, GEQ, NEQ,
1197c478bd9Sstevel@tonic-gate 	MATCH, SUBSTR, LENGTH, INDEX };
120*032624d5Sbasabi int
yylex(void)121*032624d5Sbasabi yylex(void)
122*032624d5Sbasabi {
123*032624d5Sbasabi 	char *p;
124*032624d5Sbasabi 	int i;
1257c478bd9Sstevel@tonic-gate 
1267c478bd9Sstevel@tonic-gate 	if(Argi >= Ac) return NOARG;
1277c478bd9Sstevel@tonic-gate 
1287c478bd9Sstevel@tonic-gate 	p = Av[Argi++];
1297c478bd9Sstevel@tonic-gate 
1307c478bd9Sstevel@tonic-gate 	if((*p == '(' || *p == ')') && p[1] == '\0' )
1317c478bd9Sstevel@tonic-gate 		return (int)*p;
1327c478bd9Sstevel@tonic-gate 	for(i = 0; *operator[i]; ++i)
1337c478bd9Sstevel@tonic-gate 		if(EQL(operator[i], p))
1347c478bd9Sstevel@tonic-gate 			return op[i];
1357c478bd9Sstevel@tonic-gate 
1367c478bd9Sstevel@tonic-gate 	yylval = p;
1377c478bd9Sstevel@tonic-gate 	return A_STRING;
1387c478bd9Sstevel@tonic-gate }
1397c478bd9Sstevel@tonic-gate 
140*032624d5Sbasabi char *
rel(int oper,char * r1,char * r2)141*032624d5Sbasabi rel(int oper, char *r1, char *r2)
1427c478bd9Sstevel@tonic-gate {
143*032624d5Sbasabi 	long i;
1447c478bd9Sstevel@tonic-gate 
1457c478bd9Sstevel@tonic-gate 	if(ematch(r1, "-\\{0,1\\}[0-9]*$") && ematch(r2, "-\\{0,1\\}[0-9]*$"))
1467c478bd9Sstevel@tonic-gate 		i = atol(r1) - atol(r2);
1477c478bd9Sstevel@tonic-gate 	else
1487c478bd9Sstevel@tonic-gate 		i = strcmp(r1, r2);
1497c478bd9Sstevel@tonic-gate 	switch(oper) {
1507c478bd9Sstevel@tonic-gate 	case EQ:
1517c478bd9Sstevel@tonic-gate 		i = i==0;
1527c478bd9Sstevel@tonic-gate 		break;
1537c478bd9Sstevel@tonic-gate 	case GT:
1547c478bd9Sstevel@tonic-gate 		i = i>0;
1557c478bd9Sstevel@tonic-gate 		break;
1567c478bd9Sstevel@tonic-gate 	case GEQ:
1577c478bd9Sstevel@tonic-gate 		i = i>=0;
1587c478bd9Sstevel@tonic-gate 		break;
1597c478bd9Sstevel@tonic-gate 	case LT:
1607c478bd9Sstevel@tonic-gate 		i = i<0;
1617c478bd9Sstevel@tonic-gate 		break;
1627c478bd9Sstevel@tonic-gate 	case LEQ:
1637c478bd9Sstevel@tonic-gate 		i = i<=0;
1647c478bd9Sstevel@tonic-gate 		break;
1657c478bd9Sstevel@tonic-gate 	case NEQ:
1667c478bd9Sstevel@tonic-gate 		i = i!=0;
1677c478bd9Sstevel@tonic-gate 		break;
1687c478bd9Sstevel@tonic-gate 	}
1697c478bd9Sstevel@tonic-gate 	return i? "1": "0";
1707c478bd9Sstevel@tonic-gate }
1717c478bd9Sstevel@tonic-gate 
arith(oper,r1,r2)1727c478bd9Sstevel@tonic-gate char *arith(oper, r1, r2) char *r1, *r2;
1737c478bd9Sstevel@tonic-gate {
1747c478bd9Sstevel@tonic-gate 	long i1, i2;
175*032624d5Sbasabi 	char *rv;
1767c478bd9Sstevel@tonic-gate 
1777c478bd9Sstevel@tonic-gate 	if(!(ematch(r1, "-\\{0,1\\}[0-9]*$") && ematch(r2, "-\\{0,1\\}[0-9]*$")))
1787c478bd9Sstevel@tonic-gate 		yyerror("non-numeric argument");
1797c478bd9Sstevel@tonic-gate 	i1 = atol(r1);
1807c478bd9Sstevel@tonic-gate 	i2 = atol(r2);
1817c478bd9Sstevel@tonic-gate 
1827c478bd9Sstevel@tonic-gate 	switch(oper) {
1837c478bd9Sstevel@tonic-gate 	case ADD:
1847c478bd9Sstevel@tonic-gate 		i1 = i1 + i2;
1857c478bd9Sstevel@tonic-gate 		break;
1867c478bd9Sstevel@tonic-gate 	case SUBT:
1877c478bd9Sstevel@tonic-gate 		i1 = i1 - i2;
1887c478bd9Sstevel@tonic-gate 		break;
1897c478bd9Sstevel@tonic-gate 	case MULT:
1907c478bd9Sstevel@tonic-gate 		i1 = i1 * i2;
1917c478bd9Sstevel@tonic-gate 		break;
1927c478bd9Sstevel@tonic-gate 	case DIV:
1937c478bd9Sstevel@tonic-gate 		if (i2 == 0)
1947c478bd9Sstevel@tonic-gate 			yyerror("division by zero");
1957c478bd9Sstevel@tonic-gate 		i1 = i1 / i2;
1967c478bd9Sstevel@tonic-gate 		break;
1977c478bd9Sstevel@tonic-gate 	case REM:
1987c478bd9Sstevel@tonic-gate 		if (i2 == 0)
1997c478bd9Sstevel@tonic-gate 			yyerror("division by zero");
2007c478bd9Sstevel@tonic-gate 		i1 = i1 % i2;
2017c478bd9Sstevel@tonic-gate 		break;
2027c478bd9Sstevel@tonic-gate 	}
2037c478bd9Sstevel@tonic-gate 	rv = malloc(16);
2047c478bd9Sstevel@tonic-gate 	(void) strcpy(rv, ltoa(i1));
2057c478bd9Sstevel@tonic-gate 	return rv;
2067c478bd9Sstevel@tonic-gate }
conj(oper,r1,r2)2077c478bd9Sstevel@tonic-gate char *conj(oper, r1, r2) char *r1, *r2;
2087c478bd9Sstevel@tonic-gate {
209*032624d5Sbasabi 	char *rv;
2107c478bd9Sstevel@tonic-gate 
2117c478bd9Sstevel@tonic-gate 	switch(oper) {
2127c478bd9Sstevel@tonic-gate 
2137c478bd9Sstevel@tonic-gate 	case OR:
2147c478bd9Sstevel@tonic-gate 		if(EQL(r1, "0")
2157c478bd9Sstevel@tonic-gate 		    || EQL(r1, ""))
2167c478bd9Sstevel@tonic-gate 			if(EQL(r2, "0")
2177c478bd9Sstevel@tonic-gate 			    || EQL(r2, ""))
2187c478bd9Sstevel@tonic-gate 				rv = "0";
2197c478bd9Sstevel@tonic-gate 			else
2207c478bd9Sstevel@tonic-gate 				rv = r2;
2217c478bd9Sstevel@tonic-gate 		else
2227c478bd9Sstevel@tonic-gate 			rv = r1;
2237c478bd9Sstevel@tonic-gate 		break;
2247c478bd9Sstevel@tonic-gate 	case AND:
2257c478bd9Sstevel@tonic-gate 		if(EQL(r1, "0")
2267c478bd9Sstevel@tonic-gate 		    || EQL(r1, ""))
2277c478bd9Sstevel@tonic-gate 			rv = "0";
2287c478bd9Sstevel@tonic-gate 		else if(EQL(r2, "0")
2297c478bd9Sstevel@tonic-gate 		    || EQL(r2, ""))
2307c478bd9Sstevel@tonic-gate 			rv = "0";
2317c478bd9Sstevel@tonic-gate 		else
2327c478bd9Sstevel@tonic-gate 			rv = r1;
2337c478bd9Sstevel@tonic-gate 		break;
2347c478bd9Sstevel@tonic-gate 	}
2357c478bd9Sstevel@tonic-gate 	return rv;
2367c478bd9Sstevel@tonic-gate }
2377c478bd9Sstevel@tonic-gate 
238*032624d5Sbasabi char *
substr(char * v,char * s,char * w)239*032624d5Sbasabi substr(char *v, char *s, char *w)
240*032624d5Sbasabi {
241*032624d5Sbasabi 	int si, wi;
242*032624d5Sbasabi 	char *res;
2437c478bd9Sstevel@tonic-gate 
2447c478bd9Sstevel@tonic-gate 	si = atol(s);
2457c478bd9Sstevel@tonic-gate 	wi = atol(w);
2467c478bd9Sstevel@tonic-gate 	while(--si) if(*v) ++v;
2477c478bd9Sstevel@tonic-gate 
2487c478bd9Sstevel@tonic-gate 	res = v;
2497c478bd9Sstevel@tonic-gate 
2507c478bd9Sstevel@tonic-gate 	while(wi--) if(*v) ++v;
2517c478bd9Sstevel@tonic-gate 
2527c478bd9Sstevel@tonic-gate 	*v = '\0';
2537c478bd9Sstevel@tonic-gate 	return res;
2547c478bd9Sstevel@tonic-gate }
2557c478bd9Sstevel@tonic-gate 
256*032624d5Sbasabi char *
index(char * s,char * t)257*032624d5Sbasabi index(char *s, char *t)
258*032624d5Sbasabi {
259*032624d5Sbasabi 	long i, j;
260*032624d5Sbasabi 	char *rv;
2617c478bd9Sstevel@tonic-gate 
2627c478bd9Sstevel@tonic-gate 	for(i = 0; s[i] ; ++i)
2637c478bd9Sstevel@tonic-gate 		for(j = 0; t[j] ; ++j)
2647c478bd9Sstevel@tonic-gate 			if(s[i]==t[j]) {
2657c478bd9Sstevel@tonic-gate 				(void) strcpy(rv = malloc(8), ltoa(++i));
2667c478bd9Sstevel@tonic-gate 				return rv;
2677c478bd9Sstevel@tonic-gate 			}
2687c478bd9Sstevel@tonic-gate 	return "0";
2697c478bd9Sstevel@tonic-gate }
2707c478bd9Sstevel@tonic-gate 
271*032624d5Sbasabi char *
length(char * s)272*032624d5Sbasabi length(char *s)
273*032624d5Sbasabi {
274*032624d5Sbasabi 	long i = 0;
275*032624d5Sbasabi 	char *rv;
2767c478bd9Sstevel@tonic-gate 
2777c478bd9Sstevel@tonic-gate 	while(*s++) ++i;
2787c478bd9Sstevel@tonic-gate 
2797c478bd9Sstevel@tonic-gate 	rv = malloc(8);
2807c478bd9Sstevel@tonic-gate 	(void) strcpy(rv, ltoa(i));
2817c478bd9Sstevel@tonic-gate 	return rv;
2827c478bd9Sstevel@tonic-gate }
2837c478bd9Sstevel@tonic-gate 
284*032624d5Sbasabi char *
match(char * s,char * p)285*032624d5Sbasabi match(char *s, char *p)
2867c478bd9Sstevel@tonic-gate {
287*032624d5Sbasabi 	char *rv;
2887c478bd9Sstevel@tonic-gate 
2897c478bd9Sstevel@tonic-gate 	(void) strcpy(rv=malloc(8), ltoa((long)ematch(s, p)));
2907c478bd9Sstevel@tonic-gate 	if(nbra) {
2917c478bd9Sstevel@tonic-gate 		rv = malloc((unsigned) strlen(Mstring[0]) + 1);
2927c478bd9Sstevel@tonic-gate 		(void) strcpy(rv, Mstring[0]);
2937c478bd9Sstevel@tonic-gate 	}
2947c478bd9Sstevel@tonic-gate 	return rv;
2957c478bd9Sstevel@tonic-gate }
2967c478bd9Sstevel@tonic-gate 
297*032624d5Sbasabi int
ematch(char * s,char * p)298*032624d5Sbasabi ematch(char *s, char *p)
2997c478bd9Sstevel@tonic-gate {
3007c478bd9Sstevel@tonic-gate 	static char expbuf[ESIZE];
3017c478bd9Sstevel@tonic-gate 	char *compile();
302*032624d5Sbasabi 	int num;
3037c478bd9Sstevel@tonic-gate 	extern char *braslist[], *braelist[], *loc2;
3047c478bd9Sstevel@tonic-gate 
3057c478bd9Sstevel@tonic-gate 	compile(p, expbuf, &expbuf[ESIZE], 0);
3067c478bd9Sstevel@tonic-gate 	if(nbra > 1)
3077c478bd9Sstevel@tonic-gate 		yyerror("Too many '\\('s");
3087c478bd9Sstevel@tonic-gate 	if(advance(s, expbuf)) {
3097c478bd9Sstevel@tonic-gate 		if(nbra == 1) {
3107c478bd9Sstevel@tonic-gate 			p = braslist[0];
3117c478bd9Sstevel@tonic-gate 			num = braelist[0] - p;
3127c478bd9Sstevel@tonic-gate 			if ((num > 127) || (num < 0)) yyerror("Paren problem");
3137c478bd9Sstevel@tonic-gate 			(void) strncpy(Mstring[0], p, num);
3147c478bd9Sstevel@tonic-gate 			Mstring[0][num] = '\0';
3157c478bd9Sstevel@tonic-gate 		}
3167c478bd9Sstevel@tonic-gate 		return(loc2-s);
3177c478bd9Sstevel@tonic-gate 	}
3187c478bd9Sstevel@tonic-gate 	return(0);
3197c478bd9Sstevel@tonic-gate }
3207c478bd9Sstevel@tonic-gate 
321*032624d5Sbasabi int
errxx(int err)322*032624d5Sbasabi errxx(int err)
3237c478bd9Sstevel@tonic-gate {
324*032624d5Sbasabi 	char *message;
3257c478bd9Sstevel@tonic-gate 
3267c478bd9Sstevel@tonic-gate 	switch(err) {
3277c478bd9Sstevel@tonic-gate 		case 11:
3287c478bd9Sstevel@tonic-gate 			message = "Range endpoint too large";
3297c478bd9Sstevel@tonic-gate 			break;
3307c478bd9Sstevel@tonic-gate 		case 16:
3317c478bd9Sstevel@tonic-gate 			message = "Bad number";
3327c478bd9Sstevel@tonic-gate 			break;
3337c478bd9Sstevel@tonic-gate 		case 25:
3347c478bd9Sstevel@tonic-gate 			message = "``\\digit'' out of range";
3357c478bd9Sstevel@tonic-gate 			break;
3367c478bd9Sstevel@tonic-gate 		case 36:
3377c478bd9Sstevel@tonic-gate 			message = "Illegal or missing delimiter";
3387c478bd9Sstevel@tonic-gate 			break;
3397c478bd9Sstevel@tonic-gate 		case 41:
3407c478bd9Sstevel@tonic-gate 			message = "No remembered search string";
3417c478bd9Sstevel@tonic-gate 			break;
3427c478bd9Sstevel@tonic-gate 		case 42:
3437c478bd9Sstevel@tonic-gate 			message = "\\( \\) imbalance";
3447c478bd9Sstevel@tonic-gate 			break;
3457c478bd9Sstevel@tonic-gate 		case 43:
3467c478bd9Sstevel@tonic-gate 			message = "Too many \\(";
3477c478bd9Sstevel@tonic-gate 			break;
3487c478bd9Sstevel@tonic-gate 		case 44:
3497c478bd9Sstevel@tonic-gate 			message = "More than 2 numbers given in \\{ \\}";
3507c478bd9Sstevel@tonic-gate 			break;
3517c478bd9Sstevel@tonic-gate 		case 45:
3527c478bd9Sstevel@tonic-gate 			message = "} expected after \\";
3537c478bd9Sstevel@tonic-gate 			break;
3547c478bd9Sstevel@tonic-gate 		case 46:
3557c478bd9Sstevel@tonic-gate 			message = "First number exceeds second in \\{ \\}";
3567c478bd9Sstevel@tonic-gate 			break;
3577c478bd9Sstevel@tonic-gate 		case 49:
3587c478bd9Sstevel@tonic-gate 			message = "[ ] imbalance";
3597c478bd9Sstevel@tonic-gate 			break;
3607c478bd9Sstevel@tonic-gate 		case 50:
3617c478bd9Sstevel@tonic-gate 			message = "Regular expression too long";
3627c478bd9Sstevel@tonic-gate 			break;
3637c478bd9Sstevel@tonic-gate 		default:
3647c478bd9Sstevel@tonic-gate 			message = "Unknown regexp error code!!";
3657c478bd9Sstevel@tonic-gate 			break;
3667c478bd9Sstevel@tonic-gate 	}
3677c478bd9Sstevel@tonic-gate 	yyerror(message);
368*032624d5Sbasabi 	/* NOTREACHED */
369*032624d5Sbasabi 	return (0);
3707c478bd9Sstevel@tonic-gate }
3717c478bd9Sstevel@tonic-gate 
372*032624d5Sbasabi int
yyerror(char * s)373*032624d5Sbasabi yyerror(char *s)
3747c478bd9Sstevel@tonic-gate {
3757c478bd9Sstevel@tonic-gate 	(void) write(2, "expr: ", 6);
3767c478bd9Sstevel@tonic-gate 	(void) write(2, s, (unsigned) strlen(s));
3777c478bd9Sstevel@tonic-gate 	(void) write(2, "\n", 1);
3787c478bd9Sstevel@tonic-gate 	exit(2);
379*032624d5Sbasabi 	/* NOTREACHED */
380*032624d5Sbasabi 	return (0);
3817c478bd9Sstevel@tonic-gate }
3827c478bd9Sstevel@tonic-gate 
383*032624d5Sbasabi char *
ltoa(long l)384*032624d5Sbasabi ltoa(long l)
3857c478bd9Sstevel@tonic-gate {
3867c478bd9Sstevel@tonic-gate 	static char str[20];
387*032624d5Sbasabi 	char *sp;
388*032624d5Sbasabi 	int i;
389*032624d5Sbasabi 	int neg;
3907c478bd9Sstevel@tonic-gate 
3917c478bd9Sstevel@tonic-gate 	if(l == 0x80000000L)
3927c478bd9Sstevel@tonic-gate 		return "-2147483648";
3937c478bd9Sstevel@tonic-gate 	neg = 0;
3947c478bd9Sstevel@tonic-gate 	if(l < 0)
3957c478bd9Sstevel@tonic-gate 		++neg, l = -l;
3967c478bd9Sstevel@tonic-gate 	sp = &str[20];
3977c478bd9Sstevel@tonic-gate 	*--sp = '\0';
3987c478bd9Sstevel@tonic-gate 	do {
3997c478bd9Sstevel@tonic-gate 		i = l % 10;
4007c478bd9Sstevel@tonic-gate 		*--sp = '0' + i;
4017c478bd9Sstevel@tonic-gate 		l /= 10;
4027c478bd9Sstevel@tonic-gate 	}
4037c478bd9Sstevel@tonic-gate 	while(l);
4047c478bd9Sstevel@tonic-gate 	if(neg)
4057c478bd9Sstevel@tonic-gate 		*--sp = '-';
4067c478bd9Sstevel@tonic-gate 	return sp;
4077c478bd9Sstevel@tonic-gate }
4087c478bd9Sstevel@tonic-gate 
409*032624d5Sbasabi int
main(int argc,char ** argv)410*032624d5Sbasabi main(int argc, char **argv)
4117c478bd9Sstevel@tonic-gate {
4127c478bd9Sstevel@tonic-gate 	Ac = argc;
4137c478bd9Sstevel@tonic-gate 	Argi = 1;
4147c478bd9Sstevel@tonic-gate 	Av = argv;
4157c478bd9Sstevel@tonic-gate 	yyparse();
416*032624d5Sbasabi 	return (0);
4177c478bd9Sstevel@tonic-gate }
418