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 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 * 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 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 } 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 * 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 * 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 * 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 * 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 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 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 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 * 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 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