386BSD 0.1 development
[unix-history] / usr / othersrc / public / zsh-2.2 / src / cond.c
CommitLineData
dbf02a84
WJ
1/*
2 *
3 * cond.c - evaluate conditional expressions
4 *
5 * This file is part of zsh, the Z shell.
6 *
7 * This software is Copyright 1992 by Paul Falstad
8 *
9 * Permission is hereby granted to copy, reproduce, redistribute or otherwise
10 * use this software as long as: there is no monetary profit gained
11 * specifically from the use or reproduction of this software, it is not
12 * sold, rented, traded or otherwise marketed, and this copyright notice is
13 * included prominently in any copy made.
14 *
15 * The author make no claims as to the fitness or correctness of this software
16 * for any use whatsoever, and it is provided as is. Any use of this software
17 * is at the user's own risk.
18 *
19 */
20
21#include "zsh.h"
22
23int evalcond(c) /**/
24Cond c;
25{
26struct stat *st;
27
28 switch (c->type)
29 {
30 case COND_NOT: return !evalcond(c->left);
31 case COND_AND: return evalcond(c->left) && evalcond(c->right);
32 case COND_OR: return evalcond(c->left) || evalcond(c->right);
33 }
34 singsub((char **) &c->left);
35 untokenize(c->left);
36 if (c->right)
37 {
38 singsub((char **) &c->right);
39 if (c->type != COND_STREQ && c->type != COND_STRNEQ)
40 untokenize(c->right);
41 }
42 switch (c->type)
43 {
44 case COND_STREQ: return matchpat(c->left,c->right);
45 case COND_STRNEQ: return !matchpat(c->left,c->right);
46 case COND_STRLT: return strcmp(c->left,c->right) < 0;
47 case COND_STRGTR: return strcmp(c->left,c->right) > 0;
48 case 'e': case 'a': return(doaccess(c->left,F_OK));
49 case 'b': return(S_ISBLK(dostat(c->left)));
50 case 'c': return(S_ISCHR(dostat(c->left)));
51 case 'd': return(S_ISDIR(dostat(c->left)));
52 case 'f': return(S_ISREG(dostat(c->left)));
53 case 'g': return(!!(dostat(c->left) & S_ISGID));
54 case 'k': return(!!(dostat(c->left) & S_ISVTX));
55 case 'n': return(!!strlen(c->left));
56 case 'o': return(optison(c->left));
57 case 'p': return(S_ISFIFO(dostat(c->left)));
58 case 'r': return(doaccess(c->left,R_OK));
59 case 's': return((st = getstat(c->left)) && !!(st->st_size));
60 case 'S': return(S_ISSOCK(dostat(c->left)));
61 case 'u': return(!!(dostat(c->left) & S_ISUID));
62 case 'w': return(doaccess(c->left,W_OK));
63 case 'x': return(doaccess(c->left,X_OK));
64 case 'z': return(!strlen(c->left));
65 case 'h': case 'L': return(S_ISLNK(dolstat(c->left)));
66 case 'O': return((st = getstat(c->left)) && st->st_uid == geteuid());
67 case 'G': return((st = getstat(c->left)) && st->st_gid == getegid());
68 case 't': return isatty(matheval(c->left));
69 case COND_EQ: return matheval(c->left) == matheval(c->right);
70 case COND_NE: return matheval(c->left) != matheval(c->right);
71 case COND_LT: return matheval(c->left) < matheval(c->right);
72 case COND_GT: return matheval(c->left) > matheval(c->right);
73 case COND_LE: return matheval(c->left) <= matheval(c->right);
74 case COND_GE: return matheval(c->left) >= matheval(c->right);
75 case COND_NT: case COND_OT:
76 {
77 time_t a;
78 if (!(st = getstat(c->left)))
79 return 0;
80 a = st->st_mtime;
81 if (!(st = getstat(c->right)))
82 return 0;
83 return (c->type == COND_NT) ? a > st->st_mtime : a < st->st_mtime;
84 }
85 case COND_EF:
86 {
87 dev_t d;
88 ino_t i;
89
90 if (!(st = getstat(c->left)))
91 return 0;
92 d = st->st_dev;
93 i = st->st_ino;
94 if (!(st = getstat(c->right)))
95 return 0;
96 return d == st->st_dev && i == st->st_ino;
97 }
98 default: zerr("bad cond structure",NULL,0);
99 }
100 return 0;
101}
102
103int doaccess(s,c) /**/
104char *s;int c;
105{
106 return !access(s,c);
107}
108
109static struct stat st;
110
111struct stat *getstat(s) /**/
112char *s;
113{
114 if (!strncmp(s,"/dev/fd/",8))
115 {
116 if (fstat(atoi(s+8),&st))
117 return NULL;
118 }
119 else if (stat(s,&st))
120 return NULL;
121 return &st;
122}
123
124unsigned short dostat(s) /**/
125char *s;
126{
127struct stat *st;
128
129 if (!(st = getstat(s)))
130 return 0;
131 return st->st_mode;
132}
133
134/* pem@aaii.oz; needed since dostat now uses "stat" */
135
136unsigned short dolstat(s) /**/
137char *s;
138{
139 if (lstat(s, &st) < 0)
140 return 0;
141 return st.st_mode;
142}
143
144int optison(s) /**/
145char *s;
146{
147int i;
148
149 if (strlen(s) == 1)
150 return opts[*s];
151 if ((i = optlookup(s)) != -1)
152 return opts[i];
153 zerr("no such option: %s",s,0);
154 return 0;
155}
156