~ubuntu-branches/ubuntu/utopic/9base/utopic

« back to all changes in this revision

Viewing changes to test/test.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2009-08-20 17:34:06 UTC
  • mfrom: (6.2.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090820173406-xpwqa9ruyevvc0ut
* Updating maintainer field.
* Updating vcs fields.
* Updating package to standards version 3.8.3.
* Updatin variables writing in rules to consistent style.

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
 * Plan 9 additions:
7
7
 *      -A file exists and is append-only
8
8
 *      -L file exists and is exclusive-use
 
9
 *      -T file exists and is temporary
9
10
 */
10
11
 
11
12
#include <u.h>
12
13
#include <libc.h>
 
14
 
 
15
#define isatty plan9_isatty
 
16
 
13
17
#define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0))
14
18
 
15
 
extern int isatty(int); /* <unistd.h> */
16
 
 
17
19
int     ap;
18
20
int     ac;
19
21
char    **av;
23
25
int     fsizep(char *);
24
26
int     isdir(char *);
25
27
int     isreg(char *);
 
28
int     isatty(int);
26
29
int     isint(char *, int *);
 
30
int     isolder(char *, char *);
 
31
int     isolderthan(char *, char *);
 
32
int     isnewerthan(char *, char *);
27
33
int     hasmode(char *, ulong);
28
34
int     tio(char *, int);
29
35
int     e(void), e1(void), e2(void), e3(void);
 
36
char    *nxtarg(int);
30
37
 
31
38
void
32
39
main(int argc, char *argv[])
33
40
{
 
41
        int r;
 
42
        char *c;
34
43
 
35
44
        ac = argc; av = argv; ap = 1;
36
45
        if(EQ(argv[0],"[")) {
38
47
                        synbad("] missing","");
39
48
        }
40
49
        argv[ac] = 0;
41
 
        if (ac<=1) exits("usage");
42
 
        exits(e()?0:"false");
 
50
        if (ac<=1)
 
51
                exits("usage");
 
52
        r = e();
 
53
        /*
 
54
         * nice idea but short-circuit -o and -a operators may have
 
55
         * not consumed their right-hand sides.
 
56
         */
 
57
        if(0 && (c = nxtarg(1)) != nil)
 
58
                synbad("unexpected operator/operand: ", c);
 
59
        exits(r?0:"false");
43
60
}
44
61
 
45
62
char *
66
83
}
67
84
 
68
85
int
69
 
e(void) {
 
86
e(void)
 
87
{
70
88
        int p1;
71
89
 
72
90
        p1 = e1();
73
 
        if (EQ(nxtarg(1), "-o")) return(p1 || e());
 
91
        if (EQ(nxtarg(1), "-o"))
 
92
                return(p1 || e());
74
93
        ap--;
75
94
        return(p1);
76
95
}
77
96
 
78
97
int
79
 
e1(void) {
 
98
e1(void)
 
99
{
80
100
        int p1;
81
101
 
82
102
        p1 = e2();
83
 
        if (EQ(nxtarg(1), "-a")) return (p1 && e1());
 
103
        if (EQ(nxtarg(1), "-a"))
 
104
                return (p1 && e1());
84
105
        ap--;
85
106
        return(p1);
86
107
}
87
108
 
88
109
int
89
 
e2(void) {
 
110
e2(void)
 
111
{
90
112
        if (EQ(nxtarg(0), "!"))
91
113
                return(!e2());
92
114
        ap--;
94
116
}
95
117
 
96
118
int
97
 
e3(void) {
98
 
        int p1;
99
 
        char *a;
100
 
        char *p2;
101
 
        int int1, int2;
 
119
e3(void)
 
120
{
 
121
        int p1, int1, int2;
 
122
        char *a, *p2;
102
123
 
103
124
        a = nxtarg(0);
104
125
        if(EQ(a, "(")) {
105
126
                p1 = e();
106
 
                if(!EQ(nxtarg(0), ")")) synbad(") expected","");
 
127
                if(!EQ(nxtarg(0), ")"))
 
128
                        synbad(") expected","");
107
129
                return(p1);
108
130
        }
109
131
 
113
135
        if(EQ(a, "-L"))
114
136
                return(hasmode(nxtarg(0), DMEXCL));
115
137
 
 
138
        if(EQ(a, "-T"))
 
139
                return(hasmode(nxtarg(0), DMTMP));
 
140
 
116
141
        if(EQ(a, "-f"))
117
142
                return(isreg(nxtarg(0)));
118
143
 
147
172
                return(fsizep(nxtarg(0)));
148
173
 
149
174
        if(EQ(a, "-t"))
150
 
                if(ap>=ac || !nxtintarg(&int1))
 
175
                if(ap>=ac)
151
176
                        return(isatty(1));
 
177
                else if(nxtintarg(&int1))
 
178
                        return(isatty(int1));
152
179
                else
153
 
                        return(isatty(int1));
 
180
                        synbad("not a valid file descriptor number ", "");
154
181
 
155
182
        if(EQ(a, "-n"))
156
183
                return(!EQ(nxtarg(0), ""));
166
193
        if(EQ(p2, "!="))
167
194
                return(!EQ(nxtarg(0), a));
168
195
 
 
196
        if(EQ(p2, "-older"))
 
197
                return(isolder(nxtarg(0), a));
 
198
 
 
199
        if(EQ(p2, "-ot"))
 
200
                return(isolderthan(nxtarg(0), a));
 
201
 
 
202
        if(EQ(p2, "-nt"))
 
203
                return(isnewerthan(nxtarg(0), a));
 
204
 
169
205
        if(!isint(a, &int1))
170
 
                return(!EQ(a,""));
 
206
                synbad("unexpected operator/operand: ", p2);
171
207
 
172
208
        if(nxtintarg(&int2)){
173
209
                if(EQ(p2, "-eq"))
201
237
        Dir *d;
202
238
 
203
239
        d = dirstat(f);
204
 
        if(d == 0)
 
240
        if(d == nil)
205
241
                return(-1);
206
242
        *dir = *d;
 
243
        free(d);
207
244
        dir->name = 0;
208
245
        dir->uid = 0;
209
246
        dir->gid = 0;
218
255
        Dir *d;
219
256
 
220
257
        d = dirfstat(f);
221
 
        if(d == 0)
 
258
        if(d == nil)
222
259
                return(-1);
223
260
        *dir = *d;
 
261
        free(d);
224
262
        dir->name = 0;
225
263
        dir->uid = 0;
226
264
        dir->gid = 0;
259
297
}
260
298
 
261
299
int
 
300
isatty(int fd)
 
301
{
 
302
        Dir d1, d2;
 
303
 
 
304
        if(localfstat(fd, &d1) < 0)
 
305
                return 0;
 
306
        if(localstat("/dev/cons", &d2) < 0)
 
307
                return 0;
 
308
        return d1.type==d2.type && d1.dev==d2.dev && d1.qid.path==d2.qid.path;
 
309
}
 
310
 
 
311
int
262
312
fsizep(char *f)
263
313
{
264
314
        Dir dir;
290
340
        *pans = strtol(s, &ep, 0);
291
341
        return (*ep == 0);
292
342
}
 
343
 
 
344
int
 
345
isolder(char *pin, char *f)
 
346
{
 
347
        char *p = pin;
 
348
        ulong n, m;
 
349
        Dir dir;
 
350
 
 
351
        if(localstat(f,&dir)<0)
 
352
                return(0);
 
353
 
 
354
        /* parse time */
 
355
        n = 0;
 
356
        while(*p){
 
357
                m = strtoul(p, &p, 0);
 
358
                switch(*p){
 
359
                case 0:
 
360
                        n = m;
 
361
                        break;
 
362
                case 'y':
 
363
                        m *= 12;
 
364
                        /* fall through */
 
365
                case 'M':
 
366
                        m *= 30;
 
367
                        /* fall through */
 
368
                case 'd':
 
369
                        m *= 24;
 
370
                        /* fall through */
 
371
                case 'h':
 
372
                        m *= 60;
 
373
                        /* fall through */
 
374
                case 'm':
 
375
                        m *= 60;
 
376
                        /* fall through */
 
377
                case 's':
 
378
                        n += m;
 
379
                        p++;
 
380
                        break;
 
381
                default:
 
382
                        synbad("bad time syntax, ", pin);
 
383
                }
 
384
        }
 
385
 
 
386
        return(dir.mtime+n < time(0));
 
387
}
 
388
 
 
389
int
 
390
isolderthan(char *a, char *b)
 
391
{
 
392
        Dir ad, bd;
 
393
 
 
394
        if(localstat(a, &ad)<0)
 
395
                return(0);
 
396
        if(localstat(b, &bd)<0)
 
397
                return(0);
 
398
        return ad.mtime > bd.mtime;
 
399
}
 
400
 
 
401
int
 
402
isnewerthan(char *a, char *b)
 
403
{
 
404
        Dir ad, bd;
 
405
 
 
406
        if(localstat(a, &ad)<0)
 
407
                return(0);
 
408
        if(localstat(b, &bd)<0)
 
409
                return(0);
 
410
        return ad.mtime < bd.mtime;
 
411
}