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 %}
24032624d5Sbasabi /*
25032624d5Sbasabi * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
26032624d5Sbasabi * Use is subject to license terms.
27032624d5Sbasabi */
28032624d5Sbasabi
297c478bd9Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
307c478bd9Sstevel@tonic-gate /* All Rights Reserved */
317c478bd9Sstevel@tonic-gate
327c478bd9Sstevel@tonic-gate /* Yacc productions for "expr" command: */
337c478bd9Sstevel@tonic-gate
347c478bd9Sstevel@tonic-gate %{
357c478bd9Sstevel@tonic-gate typedef char *yystype;
367c478bd9Sstevel@tonic-gate #define YYSTYPE yystype
377c478bd9Sstevel@tonic-gate %}
387c478bd9Sstevel@tonic-gate
397c478bd9Sstevel@tonic-gate %token OR AND ADD SUBT MULT DIV REM EQ GT GEQ LT LEQ NEQ
407c478bd9Sstevel@tonic-gate %token A_STRING SUBSTR LENGTH INDEX NOARG MATCH
417c478bd9Sstevel@tonic-gate
427c478bd9Sstevel@tonic-gate /* operators listed below in increasing precedence: */
437c478bd9Sstevel@tonic-gate %left OR
447c478bd9Sstevel@tonic-gate %left AND
457c478bd9Sstevel@tonic-gate %left EQ LT GT GEQ LEQ NEQ
467c478bd9Sstevel@tonic-gate %left ADD SUBT
477c478bd9Sstevel@tonic-gate %left MULT DIV REM
487c478bd9Sstevel@tonic-gate %left MCH
497c478bd9Sstevel@tonic-gate %left MATCH
507c478bd9Sstevel@tonic-gate %left SUBSTR
517c478bd9Sstevel@tonic-gate %left LENGTH INDEX
527c478bd9Sstevel@tonic-gate %%
537c478bd9Sstevel@tonic-gate
547c478bd9Sstevel@tonic-gate /* a single `expression' is evaluated and printed: */
557c478bd9Sstevel@tonic-gate
56724c5febSToomas Soome expression: expr NOARG {
577c478bd9Sstevel@tonic-gate printf("%s\n", $1);
587c478bd9Sstevel@tonic-gate exit((!strcmp($1,"0")||!strcmp($1,"\0"))? 1: 0);
597c478bd9Sstevel@tonic-gate }
607c478bd9Sstevel@tonic-gate ;
617c478bd9Sstevel@tonic-gate
627c478bd9Sstevel@tonic-gate
63724c5febSToomas Soome expr: '(' expr ')' { $$ = $2; }
64724c5febSToomas Soome | expr OR expr { $$ = conj(OR, $1, $3); }
65724c5febSToomas Soome | expr AND expr { $$ = conj(AND, $1, $3); }
66724c5febSToomas Soome | expr EQ expr { $$ = rel(EQ, $1, $3); }
67724c5febSToomas Soome | expr GT expr { $$ = rel(GT, $1, $3); }
68724c5febSToomas Soome | expr GEQ expr { $$ = rel(GEQ, $1, $3); }
69724c5febSToomas Soome | expr LT expr { $$ = rel(LT, $1, $3); }
70724c5febSToomas Soome | expr LEQ expr { $$ = rel(LEQ, $1, $3); }
71724c5febSToomas Soome | expr NEQ expr { $$ = rel(NEQ, $1, $3); }
72724c5febSToomas Soome | expr ADD expr { $$ = arith(ADD, $1, $3); }
73724c5febSToomas Soome | expr SUBT expr { $$ = arith(SUBT, $1, $3); }
74724c5febSToomas Soome | expr MULT expr { $$ = arith(MULT, $1, $3); }
75724c5febSToomas Soome | expr DIV expr { $$ = arith(DIV, $1, $3); }
76724c5febSToomas Soome | expr REM expr { $$ = arith(REM, $1, $3); }
77724c5febSToomas Soome | expr MCH expr { $$ = match($1, $3); }
78724c5febSToomas Soome | MATCH expr expr { $$ = match($2, $3); }
79724c5febSToomas Soome | SUBSTR expr expr expr { $$ = substr($2, $3, $4); }
80724c5febSToomas Soome | LENGTH expr { $$ = length($2); }
81724c5febSToomas Soome | INDEX expr expr { $$ = index($2, $3); }
827c478bd9Sstevel@tonic-gate | A_STRING
837c478bd9Sstevel@tonic-gate ;
847c478bd9Sstevel@tonic-gate %%
857c478bd9Sstevel@tonic-gate
867c478bd9Sstevel@tonic-gate #define ESIZE 256
877c478bd9Sstevel@tonic-gate #define EQL(x,y) !strcmp(x,y)
887c478bd9Sstevel@tonic-gate
89032624d5Sbasabi #define INIT char *sp = instring;
907c478bd9Sstevel@tonic-gate #define GETC() (*sp++)
917c478bd9Sstevel@tonic-gate #define PEEKC() (*sp)
927c478bd9Sstevel@tonic-gate #define UNGETC(c) (--sp)
93032624d5Sbasabi #define RETURN(c) return(c)
947c478bd9Sstevel@tonic-gate #define ERROR(c) errxx(c)
957c478bd9Sstevel@tonic-gate #include <regexp.h>
967c478bd9Sstevel@tonic-gate #include <malloc.h>
97032624d5Sbasabi #include <stdlib.h>
987c478bd9Sstevel@tonic-gate
997c478bd9Sstevel@tonic-gate char **Av;
1007c478bd9Sstevel@tonic-gate int Ac;
1017c478bd9Sstevel@tonic-gate int Argi;
1027c478bd9Sstevel@tonic-gate
103032624d5Sbasabi char *ltoa(long l);
104032624d5Sbasabi
1057c478bd9Sstevel@tonic-gate char Mstring[1][128];
1067c478bd9Sstevel@tonic-gate
1077c478bd9Sstevel@tonic-gate
1087c478bd9Sstevel@tonic-gate char *operator[] = {
1097c478bd9Sstevel@tonic-gate "|", "&", "+", "-", "*", "/", "%", ":",
1107c478bd9Sstevel@tonic-gate "=", "==", "<", "<=", ">", ">=", "!=",
1117c478bd9Sstevel@tonic-gate "match", "substr", "length", "index", "\0" };
1127c478bd9Sstevel@tonic-gate int op[] = {
1137c478bd9Sstevel@tonic-gate OR, AND, ADD, SUBT, MULT, DIV, REM, MCH,
1147c478bd9Sstevel@tonic-gate EQ, EQ, LT, LEQ, GT, GEQ, NEQ,
1157c478bd9Sstevel@tonic-gate MATCH, SUBSTR, LENGTH, INDEX };
116032624d5Sbasabi int
yylex(void)117032624d5Sbasabi yylex(void)
118032624d5Sbasabi {
119032624d5Sbasabi char *p;
120032624d5Sbasabi int i;
1217c478bd9Sstevel@tonic-gate
1227c478bd9Sstevel@tonic-gate if(Argi >= Ac) return NOARG;
1237c478bd9Sstevel@tonic-gate
1247c478bd9Sstevel@tonic-gate p = Av[Argi++];
1257c478bd9Sstevel@tonic-gate
1267c478bd9Sstevel@tonic-gate if((*p == '(' || *p == ')') && p[1] == '\0' )
1277c478bd9Sstevel@tonic-gate return (int)*p;
1287c478bd9Sstevel@tonic-gate for(i = 0; *operator[i]; ++i)
1297c478bd9Sstevel@tonic-gate if(EQL(operator[i], p))
1307c478bd9Sstevel@tonic-gate return op[i];
1317c478bd9Sstevel@tonic-gate
1327c478bd9Sstevel@tonic-gate yylval = p;
1337c478bd9Sstevel@tonic-gate return A_STRING;
1347c478bd9Sstevel@tonic-gate }
1357c478bd9Sstevel@tonic-gate
136032624d5Sbasabi char *
rel(int oper,char * r1,char * r2)137032624d5Sbasabi rel(int oper, char *r1, char *r2)
1387c478bd9Sstevel@tonic-gate {
139032624d5Sbasabi long i;
1407c478bd9Sstevel@tonic-gate
1417c478bd9Sstevel@tonic-gate if(ematch(r1, "-\\{0,1\\}[0-9]*$") && ematch(r2, "-\\{0,1\\}[0-9]*$"))
1427c478bd9Sstevel@tonic-gate i = atol(r1) - atol(r2);
1437c478bd9Sstevel@tonic-gate else
1447c478bd9Sstevel@tonic-gate i = strcmp(r1, r2);
1457c478bd9Sstevel@tonic-gate switch(oper) {
1467c478bd9Sstevel@tonic-gate case EQ:
1477c478bd9Sstevel@tonic-gate i = i==0;
1487c478bd9Sstevel@tonic-gate break;
1497c478bd9Sstevel@tonic-gate case GT:
1507c478bd9Sstevel@tonic-gate i = i>0;
1517c478bd9Sstevel@tonic-gate break;
1527c478bd9Sstevel@tonic-gate case GEQ:
1537c478bd9Sstevel@tonic-gate i = i>=0;
1547c478bd9Sstevel@tonic-gate break;
1557c478bd9Sstevel@tonic-gate case LT:
1567c478bd9Sstevel@tonic-gate i = i<0;
1577c478bd9Sstevel@tonic-gate break;
1587c478bd9Sstevel@tonic-gate case LEQ:
1597c478bd9Sstevel@tonic-gate i = i<=0;
1607c478bd9Sstevel@tonic-gate break;
1617c478bd9Sstevel@tonic-gate case NEQ:
1627c478bd9Sstevel@tonic-gate i = i!=0;
1637c478bd9Sstevel@tonic-gate break;
1647c478bd9Sstevel@tonic-gate }
1657c478bd9Sstevel@tonic-gate return i? "1": "0";
1667c478bd9Sstevel@tonic-gate }
1677c478bd9Sstevel@tonic-gate
arith(int oper,char * r1,char * r2)168da7fc762SToomas Soome char *arith(int oper, char *r1, char *r2)
1697c478bd9Sstevel@tonic-gate {
1707c478bd9Sstevel@tonic-gate long i1, i2;
171032624d5Sbasabi char *rv;
1727c478bd9Sstevel@tonic-gate
1737c478bd9Sstevel@tonic-gate if(!(ematch(r1, "-\\{0,1\\}[0-9]*$") && ematch(r2, "-\\{0,1\\}[0-9]*$")))
1747c478bd9Sstevel@tonic-gate yyerror("non-numeric argument");
1757c478bd9Sstevel@tonic-gate i1 = atol(r1);
1767c478bd9Sstevel@tonic-gate i2 = atol(r2);
1777c478bd9Sstevel@tonic-gate
1787c478bd9Sstevel@tonic-gate switch(oper) {
1797c478bd9Sstevel@tonic-gate case ADD:
1807c478bd9Sstevel@tonic-gate i1 = i1 + i2;
1817c478bd9Sstevel@tonic-gate break;
1827c478bd9Sstevel@tonic-gate case SUBT:
1837c478bd9Sstevel@tonic-gate i1 = i1 - i2;
1847c478bd9Sstevel@tonic-gate break;
1857c478bd9Sstevel@tonic-gate case MULT:
1867c478bd9Sstevel@tonic-gate i1 = i1 * i2;
1877c478bd9Sstevel@tonic-gate break;
1887c478bd9Sstevel@tonic-gate case DIV:
1897c478bd9Sstevel@tonic-gate if (i2 == 0)
1907c478bd9Sstevel@tonic-gate yyerror("division by zero");
1917c478bd9Sstevel@tonic-gate i1 = i1 / i2;
1927c478bd9Sstevel@tonic-gate break;
1937c478bd9Sstevel@tonic-gate case REM:
1947c478bd9Sstevel@tonic-gate if (i2 == 0)
1957c478bd9Sstevel@tonic-gate yyerror("division by zero");
1967c478bd9Sstevel@tonic-gate i1 = i1 % i2;
1977c478bd9Sstevel@tonic-gate break;
1987c478bd9Sstevel@tonic-gate }
1997c478bd9Sstevel@tonic-gate rv = malloc(16);
2007c478bd9Sstevel@tonic-gate (void) strcpy(rv, ltoa(i1));
2017c478bd9Sstevel@tonic-gate return rv;
2027c478bd9Sstevel@tonic-gate }
conj(int oper,char * r1,char * r2)203da7fc762SToomas Soome char *conj(int oper, char *r1, char *r2)
2047c478bd9Sstevel@tonic-gate {
205032624d5Sbasabi char *rv;
2067c478bd9Sstevel@tonic-gate
2077c478bd9Sstevel@tonic-gate switch(oper) {
2087c478bd9Sstevel@tonic-gate
2097c478bd9Sstevel@tonic-gate case OR:
2107c478bd9Sstevel@tonic-gate if(EQL(r1, "0")
2117c478bd9Sstevel@tonic-gate || EQL(r1, ""))
2127c478bd9Sstevel@tonic-gate if(EQL(r2, "0")
2137c478bd9Sstevel@tonic-gate || EQL(r2, ""))
2147c478bd9Sstevel@tonic-gate rv = "0";
2157c478bd9Sstevel@tonic-gate else
2167c478bd9Sstevel@tonic-gate rv = r2;
2177c478bd9Sstevel@tonic-gate else
2187c478bd9Sstevel@tonic-gate rv = r1;
2197c478bd9Sstevel@tonic-gate break;
2207c478bd9Sstevel@tonic-gate case AND:
2217c478bd9Sstevel@tonic-gate if(EQL(r1, "0")
2227c478bd9Sstevel@tonic-gate || EQL(r1, ""))
2237c478bd9Sstevel@tonic-gate rv = "0";
2247c478bd9Sstevel@tonic-gate else if(EQL(r2, "0")
2257c478bd9Sstevel@tonic-gate || EQL(r2, ""))
2267c478bd9Sstevel@tonic-gate rv = "0";
2277c478bd9Sstevel@tonic-gate else
2287c478bd9Sstevel@tonic-gate rv = r1;
2297c478bd9Sstevel@tonic-gate break;
2307c478bd9Sstevel@tonic-gate }
2317c478bd9Sstevel@tonic-gate return rv;
2327c478bd9Sstevel@tonic-gate }
2337c478bd9Sstevel@tonic-gate
234032624d5Sbasabi char *
substr(char * v,char * s,char * w)235032624d5Sbasabi substr(char *v, char *s, char *w)
236032624d5Sbasabi {
237032624d5Sbasabi int si, wi;
238032624d5Sbasabi char *res;
2397c478bd9Sstevel@tonic-gate
2407c478bd9Sstevel@tonic-gate si = atol(s);
2417c478bd9Sstevel@tonic-gate wi = atol(w);
2427c478bd9Sstevel@tonic-gate while(--si) if(*v) ++v;
2437c478bd9Sstevel@tonic-gate
2447c478bd9Sstevel@tonic-gate res = v;
2457c478bd9Sstevel@tonic-gate
2467c478bd9Sstevel@tonic-gate while(wi--) if(*v) ++v;
2477c478bd9Sstevel@tonic-gate
2487c478bd9Sstevel@tonic-gate *v = '\0';
2497c478bd9Sstevel@tonic-gate return res;
2507c478bd9Sstevel@tonic-gate }
2517c478bd9Sstevel@tonic-gate
252032624d5Sbasabi char *
index(char * s,char * t)253032624d5Sbasabi index(char *s, char *t)
254032624d5Sbasabi {
255032624d5Sbasabi long i, j;
256032624d5Sbasabi char *rv;
2577c478bd9Sstevel@tonic-gate
2587c478bd9Sstevel@tonic-gate for(i = 0; s[i] ; ++i)
2597c478bd9Sstevel@tonic-gate for(j = 0; t[j] ; ++j)
2607c478bd9Sstevel@tonic-gate if(s[i]==t[j]) {
2617c478bd9Sstevel@tonic-gate (void) strcpy(rv = malloc(8), ltoa(++i));
2627c478bd9Sstevel@tonic-gate return rv;
2637c478bd9Sstevel@tonic-gate }
2647c478bd9Sstevel@tonic-gate return "0";
2657c478bd9Sstevel@tonic-gate }
2667c478bd9Sstevel@tonic-gate
267032624d5Sbasabi char *
length(char * s)268032624d5Sbasabi length(char *s)
269032624d5Sbasabi {
270032624d5Sbasabi long i = 0;
271032624d5Sbasabi char *rv;
2727c478bd9Sstevel@tonic-gate
2737c478bd9Sstevel@tonic-gate while(*s++) ++i;
2747c478bd9Sstevel@tonic-gate
2757c478bd9Sstevel@tonic-gate rv = malloc(8);
2767c478bd9Sstevel@tonic-gate (void) strcpy(rv, ltoa(i));
2777c478bd9Sstevel@tonic-gate return rv;
2787c478bd9Sstevel@tonic-gate }
2797c478bd9Sstevel@tonic-gate
280032624d5Sbasabi char *
match(char * s,char * p)281032624d5Sbasabi match(char *s, char *p)
2827c478bd9Sstevel@tonic-gate {
283032624d5Sbasabi char *rv;
2847c478bd9Sstevel@tonic-gate
2857c478bd9Sstevel@tonic-gate (void) strcpy(rv=malloc(8), ltoa((long)ematch(s, p)));
2867c478bd9Sstevel@tonic-gate if(nbra) {
2877c478bd9Sstevel@tonic-gate rv = malloc((unsigned) strlen(Mstring[0]) + 1);
2887c478bd9Sstevel@tonic-gate (void) strcpy(rv, Mstring[0]);
2897c478bd9Sstevel@tonic-gate }
2907c478bd9Sstevel@tonic-gate return rv;
2917c478bd9Sstevel@tonic-gate }
2927c478bd9Sstevel@tonic-gate
293032624d5Sbasabi int
ematch(char * s,char * p)294032624d5Sbasabi ematch(char *s, char *p)
2957c478bd9Sstevel@tonic-gate {
2967c478bd9Sstevel@tonic-gate static char expbuf[ESIZE];
2977c478bd9Sstevel@tonic-gate char *compile();
298032624d5Sbasabi int num;
2997c478bd9Sstevel@tonic-gate extern char *braslist[], *braelist[], *loc2;
3007c478bd9Sstevel@tonic-gate
3017c478bd9Sstevel@tonic-gate compile(p, expbuf, &expbuf[ESIZE], 0);
3027c478bd9Sstevel@tonic-gate if(nbra > 1)
3037c478bd9Sstevel@tonic-gate yyerror("Too many '\\('s");
3047c478bd9Sstevel@tonic-gate if(advance(s, expbuf)) {
3057c478bd9Sstevel@tonic-gate if(nbra == 1) {
3067c478bd9Sstevel@tonic-gate p = braslist[0];
3077c478bd9Sstevel@tonic-gate num = braelist[0] - p;
3087c478bd9Sstevel@tonic-gate if ((num > 127) || (num < 0)) yyerror("Paren problem");
3097c478bd9Sstevel@tonic-gate (void) strncpy(Mstring[0], p, num);
3107c478bd9Sstevel@tonic-gate Mstring[0][num] = '\0';
3117c478bd9Sstevel@tonic-gate }
3127c478bd9Sstevel@tonic-gate return(loc2-s);
3137c478bd9Sstevel@tonic-gate }
3147c478bd9Sstevel@tonic-gate return(0);
3157c478bd9Sstevel@tonic-gate }
3167c478bd9Sstevel@tonic-gate
317032624d5Sbasabi int
errxx(int err)318032624d5Sbasabi errxx(int err)
3197c478bd9Sstevel@tonic-gate {
320032624d5Sbasabi char *message;
3217c478bd9Sstevel@tonic-gate
3227c478bd9Sstevel@tonic-gate switch(err) {
3237c478bd9Sstevel@tonic-gate case 11:
3247c478bd9Sstevel@tonic-gate message = "Range endpoint too large";
3257c478bd9Sstevel@tonic-gate break;
3267c478bd9Sstevel@tonic-gate case 16:
3277c478bd9Sstevel@tonic-gate message = "Bad number";
3287c478bd9Sstevel@tonic-gate break;
3297c478bd9Sstevel@tonic-gate case 25:
3307c478bd9Sstevel@tonic-gate message = "``\\digit'' out of range";
3317c478bd9Sstevel@tonic-gate break;
3327c478bd9Sstevel@tonic-gate case 36:
3337c478bd9Sstevel@tonic-gate message = "Illegal or missing delimiter";
3347c478bd9Sstevel@tonic-gate break;
3357c478bd9Sstevel@tonic-gate case 41:
3367c478bd9Sstevel@tonic-gate message = "No remembered search string";
3377c478bd9Sstevel@tonic-gate break;
3387c478bd9Sstevel@tonic-gate case 42:
3397c478bd9Sstevel@tonic-gate message = "\\( \\) imbalance";
3407c478bd9Sstevel@tonic-gate break;
3417c478bd9Sstevel@tonic-gate case 43:
3427c478bd9Sstevel@tonic-gate message = "Too many \\(";
3437c478bd9Sstevel@tonic-gate break;
3447c478bd9Sstevel@tonic-gate case 44:
3457c478bd9Sstevel@tonic-gate message = "More than 2 numbers given in \\{ \\}";
3467c478bd9Sstevel@tonic-gate break;
3477c478bd9Sstevel@tonic-gate case 45:
3487c478bd9Sstevel@tonic-gate message = "} expected after \\";
3497c478bd9Sstevel@tonic-gate break;
3507c478bd9Sstevel@tonic-gate case 46:
3517c478bd9Sstevel@tonic-gate message = "First number exceeds second in \\{ \\}";
3527c478bd9Sstevel@tonic-gate break;
3537c478bd9Sstevel@tonic-gate case 49:
3547c478bd9Sstevel@tonic-gate message = "[ ] imbalance";
3557c478bd9Sstevel@tonic-gate break;
3567c478bd9Sstevel@tonic-gate case 50:
3577c478bd9Sstevel@tonic-gate message = "Regular expression too long";
3587c478bd9Sstevel@tonic-gate break;
3597c478bd9Sstevel@tonic-gate default:
3607c478bd9Sstevel@tonic-gate message = "Unknown regexp error code!!";
3617c478bd9Sstevel@tonic-gate break;
3627c478bd9Sstevel@tonic-gate }
3637c478bd9Sstevel@tonic-gate yyerror(message);
364032624d5Sbasabi /* NOTREACHED */
365032624d5Sbasabi return (0);
3667c478bd9Sstevel@tonic-gate }
3677c478bd9Sstevel@tonic-gate
368032624d5Sbasabi int
yyerror(const char * s)369*1a90c98dSToomas Soome yyerror(const char *s)
3707c478bd9Sstevel@tonic-gate {
3717c478bd9Sstevel@tonic-gate (void) write(2, "expr: ", 6);
3727c478bd9Sstevel@tonic-gate (void) write(2, s, (unsigned) strlen(s));
3737c478bd9Sstevel@tonic-gate (void) write(2, "\n", 1);
3747c478bd9Sstevel@tonic-gate exit(2);
375032624d5Sbasabi /* NOTREACHED */
376032624d5Sbasabi return (0);
3777c478bd9Sstevel@tonic-gate }
3787c478bd9Sstevel@tonic-gate
379032624d5Sbasabi char *
ltoa(long l)380032624d5Sbasabi ltoa(long l)
3817c478bd9Sstevel@tonic-gate {
3827c478bd9Sstevel@tonic-gate static char str[20];
383032624d5Sbasabi char *sp;
384032624d5Sbasabi int i;
385032624d5Sbasabi int neg;
3867c478bd9Sstevel@tonic-gate
3877c478bd9Sstevel@tonic-gate if(l == 0x80000000L)
3887c478bd9Sstevel@tonic-gate return "-2147483648";
3897c478bd9Sstevel@tonic-gate neg = 0;
3907c478bd9Sstevel@tonic-gate if(l < 0)
3917c478bd9Sstevel@tonic-gate ++neg, l = -l;
3927c478bd9Sstevel@tonic-gate sp = &str[20];
3937c478bd9Sstevel@tonic-gate *--sp = '\0';
3947c478bd9Sstevel@tonic-gate do {
3957c478bd9Sstevel@tonic-gate i = l % 10;
3967c478bd9Sstevel@tonic-gate *--sp = '0' + i;
3977c478bd9Sstevel@tonic-gate l /= 10;
3987c478bd9Sstevel@tonic-gate }
3997c478bd9Sstevel@tonic-gate while(l);
4007c478bd9Sstevel@tonic-gate if(neg)
4017c478bd9Sstevel@tonic-gate *--sp = '-';
4027c478bd9Sstevel@tonic-gate return sp;
4037c478bd9Sstevel@tonic-gate }
4047c478bd9Sstevel@tonic-gate
405032624d5Sbasabi int
main(int argc,char ** argv)406032624d5Sbasabi main(int argc, char **argv)
4077c478bd9Sstevel@tonic-gate {
4087c478bd9Sstevel@tonic-gate Ac = argc;
4097c478bd9Sstevel@tonic-gate Argi = 1;
4107c478bd9Sstevel@tonic-gate Av = argv;
4117c478bd9Sstevel@tonic-gate yyparse();
412032624d5Sbasabi return (0);
4137c478bd9Sstevel@tonic-gate }
414