summaryrefslogtreecommitdiff
path: root/usr/src/cmd/fmli/sys/expr.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/fmli/sys/expr.c')
-rw-r--r--usr/src/cmd/fmli/sys/expr.c439
1 files changed, 0 insertions, 439 deletions
diff --git a/usr/src/cmd/fmli/sys/expr.c b/usr/src/cmd/fmli/sys/expr.c
deleted file mode 100644
index 43672ea41f..0000000000
--- a/usr/src/cmd/fmli/sys/expr.c
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
-/* All Rights Reserved */
-
-
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#include <stdio.h>
-/*
- * FMLI begin
- */
-#include <setjmp.h>
-#include "wish.h"
-/* #include "message.h" */
-#include "eval.h"
-
-static jmp_buf Jumpenv;
-/*
- * FMLI end
- */
-
-# define A_STRING 258
-# define NOARG 259
-# define OR 260
-# define AND 261
-# define EQ 262
-# define LT 263
-# define GT 264
-# define GEQ 265
-# define LEQ 266
-# define NEQ 267
-# define ADD 268
-# define SUBT 269
-# define MULT 270
-# define DIV 271
-# define REM 272
-# define MCH 273
-# define MATCH 274
-
-#define ESIZE 256
-#define EQL(x,y) !strcmp(x,y)
-
-long atol();
-char *strcpy(), *strncpy();
-static char **Av;
-static char *buf;
-static int Ac;
-static int Argi;
-static int noarg;
-static int paren;
-
-static char Mstring[1][128];
-
-static char *ltoa(long l);
-static int ematch(char *s, char *p);
-static int yyerror(char *s);
-
-extern int nbra;
-
-static char *operator[] = {
- "|", "&", "+", "-", "*", "/", "%", ":",
- "=", "==", "<", "<=", ">", ">=", "!=",
- "match", "\0" };
-static int op[] = {
- OR, AND, ADD, SUBT, MULT, DIV, REM, MCH,
- EQ, EQ, LT, LEQ, GT, GEQ, NEQ,
- MATCH };
-static int pri[] = {
- 1,2,3,3,3,3,3,3,4,4,5,5,5,6,7};
-
-int
-yylex() {
- char *p;
- int i;
-
- if(Argi >= Ac) return NOARG;
-
- p = Av[Argi];
-
- if((*p == '(' || *p == ')') && p[1] == '\0' )
- return (int)*p;
- for(i = 0; *operator[i]; ++i)
- if(EQL(operator[i], p))
- return op[i];
-
-
- return A_STRING;
-}
-
-static char *
-rel(oper, r1, r2)
-char *r1, *r2;
-{
- long i;
-
- if(ematch(r1, "-\\{0,1\\}[0-9]*$") && ematch(r2, "-\\{0,1\\}[0-9]*$"))
- i = atol(r1) - atol(r2);
- else
- i = strcmp(r1, r2);
- switch(oper) {
- case EQ:
- i = i==0;
- break;
- case GT:
- i = i>0;
- break;
- case GEQ:
- i = i>=0;
- break;
- case LT:
- i = i<0;
- break;
- case LEQ:
- i = i<=0;
- break;
- case NEQ:
- i = i!=0;
- break;
- }
- return i? "1": "0";
-}
-
-static char *
-arith(oper, r1, r2)
-char *r1, *r2;
-{
- long i1, i2;
- char *rv;
-
- if(!(ematch(r1, "-\\{0,1\\}[0-9]*$") && ematch(r2, "-\\{0,1\\}[0-9]*$")))
- yyerror("non-numeric argument");
- i1 = atol(r1);
- i2 = atol(r2);
-
- switch(oper) {
- case ADD:
- i1 = i1 + i2;
- break;
- case SUBT:
- i1 = i1 - i2;
- break;
- case MULT:
- i1 = i1 * i2;
- break;
- case DIV:
- if (i2 == 0)
- yyerror("division by zero");
- i1 = i1 / i2;
- break;
- case REM:
- if (i2 == 0)
- yyerror("division by zero");
- i1 = i1 % i2;
- break;
- }
- rv = malloc(16);
- (void) strcpy(rv, ltoa(i1));
- return rv;
-}
-static char *
-conj(oper, r1, r2) char *r1, *r2;
-{
- char *rv;
-
- switch(oper) {
-
- case OR:
- if(EQL(r1, "0")
- || EQL(r1, ""))
- if(EQL(r2, "0")
- || EQL(r2, ""))
- rv = "0";
- else
- rv = r2;
- else
- rv = r1;
- break;
- case AND:
- if(EQL(r1, "0")
- || EQL(r1, ""))
- rv = "0";
- else if(EQL(r2, "0")
- || EQL(r2, ""))
- rv = "0";
- else
- rv = r1;
- break;
- }
- return rv;
-}
-
-static char *
-match(s, p)
-char *s, *p;
-{
- char *rv;
-
- (void) strcpy(rv=malloc(8), ltoa((long)ematch(s, p)));
- if(nbra) {
- rv = malloc((unsigned) strlen(Mstring[0]) + 1);
- (void) strcpy(rv, Mstring[0]);
- }
- return rv;
-}
-
-static int
-ematch(char *s, char *p)
-{
- static char expbuf[ESIZE];
- void errxx();
- int num;
- extern char *braslist[], *braelist[], *loc2;
-
- compile(p, expbuf, &expbuf[512], 0, errxx);
- if(nbra > 1)
- yyerror("Too many '\\('s");
- if(advance(s, expbuf)) {
- if(nbra == 1) {
- p = braslist[0];
- num = braelist[0] - p;
- if ((num > 127) || (num < 0)) yyerror("Paren problem");
- (void) strncpy(Mstring[0], p, num);
- Mstring[0][num] = '\0';
- }
- return(loc2-s);
- }
- return(0);
-}
-
-void
-errxx()
-{
- yyerror("RE error");
-}
-
-static int
-yyerror(char *s)
-{
- char tmpbuf[BUFSIZ];
-
- /*
- * Changed the expr prefix to fmlexpr. mek
- */
- sprintf(tmpbuf, "fmlexpr: %s\n", s);
- mess_temp(tmpbuf);
- mess_flash(tmpbuf);
- doupdate();
- longjmp(Jumpenv, 1);
- /*NOTREACHED*/
-}
-
-static char *
-ltoa(long l)
-{
- static int str[20];
- char *sp = (char *) &str[18]; /*u370*/
- int i;
- int neg = 0;
-
- if(l == 0x80000000L)
- return "-2147483648";
- if(l < 0)
- ++neg, l = -l;
- str[19] = '\0';
- do {
- i = l % 10;
- *sp-- = '0' + i;
- l /= 10;
- }
- while(l);
- if(neg)
- *sp-- = '-';
- return ++sp;
-}
-
-static char *
-expres(prior,par) int prior, par;
-{
- int ylex, temp, op1;
- char *r1, *ra, *rb;
- ylex = yylex();
- if (ylex >= NOARG && ylex < MATCH) {
- yyerror("syntax error");
- }
- if (ylex == A_STRING) {
- r1 = Av[Argi++];
- temp = Argi;
- }
- else {
- if (ylex == '(') {
- paren++;
- Argi++;
- r1 = expres(0,Argi);
- Argi--;
- }
- }
-lop:
- ylex = yylex();
- if (ylex > NOARG && ylex < MATCH) {
- op1 = ylex;
- Argi++;
- if (pri[op1-OR] <= prior )
- return r1;
- else {
- switch(op1) {
- case OR:
- case AND:
- r1 = conj(op1,r1,expres(pri[op1-OR],0));
- break;
- case EQ:
- case LT:
- case GT:
- case LEQ:
- case GEQ:
- case NEQ:
- r1=rel(op1,r1,expres(pri[op1-OR],0));
- break;
- case ADD:
- case SUBT:
- case MULT:
- case DIV:
- case REM:
- r1=arith(op1,r1,expres(pri[op1-OR],0));
- break;
- case MCH:
- r1=match(r1,expres(pri[op1-OR],0));
- break;
- }
- if(noarg == 1) {
- return r1;
- }
- Argi--;
- goto lop;
- }
- }
- ylex = yylex();
- if(ylex == ')') {
- if(par == Argi) {
- yyerror("syntax error");
- }
- if(par != 0) {
- paren--;
- Argi++;
- }
- Argi++;
- return r1;
- }
- ylex = yylex();
- if(ylex > MCH && ylex <= MATCH) {
- if (Argi == temp) {
- return r1;
- }
- op1 = ylex;
- Argi++;
- switch(op1) {
- case MATCH:
- rb = expres(pri[op1-OR],0);
- ra = expres(pri[op1-OR],0);
- }
- switch(op1) {
- case MATCH:
- r1 = match(rb,ra);
- break;
- }
- if(noarg == 1) {
- return r1;
- }
- Argi--;
- goto lop;
- }
- ylex = yylex();
- if (ylex == NOARG) {
- noarg = 1;
- }
- return r1;
-}
-
-int
-cmd_expr(argc, argv, instr, outstr)
-int argc;
-char **argv;
-IOSTRUCT *instr;
-IOSTRUCT *outstr;
-{
- Ac = argc;
- Argi = 1;
- noarg = 0;
- paren = 0;
- Av = argv;
- buf = NULL;
-
- Mstring[0][0] = '\0';
-
- /*
- * FMLI: return FAIL if setjmp returns a non-zero value
- * (i.e., called by longjmp() in yyerror())
- */
- if (setjmp(Jumpenv) != 0)
- return(FAIL);
-
- buf = expres(0,1);
- if(Ac != Argi || paren != 0) {
- yyerror("syntax error");
- }
-
- /*
- * use FMLI output routines
- */
- (void) putastr(buf, outstr);
- (void) putastr("\n", outstr);
- return((!strcmp(buf, "0") || !buf[0])? FAIL: SUCCESS);
-}