home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / z / zsh220.zip / zsh2.2 / src / cond.c < prev    next >
C/C++ Source or Header  |  1992-05-07  |  4KB  |  157 lines

  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.  
  23. int evalcond(c) /**/
  24. Cond c;
  25. {
  26. struct 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.  
  103. int doaccess(s,c) /**/
  104. char *s;int c;
  105. {
  106.     return !access(s,c);
  107. }
  108.  
  109. static struct stat st;
  110.  
  111. struct stat *getstat(s) /**/
  112. char *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.  
  124. unsigned short dostat(s) /**/
  125. char *s;
  126. {
  127. struct 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.  
  136. unsigned short dolstat(s) /**/
  137. char *s;
  138. {
  139.     if (lstat(s, &st) < 0)
  140.         return 0;
  141.     return st.st_mode;
  142. }
  143.  
  144. int optison(s) /**/
  145. char *s;
  146. {
  147. int 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.  
  157.