]> granicus.if.org Git - file/commitdiff
Code (from who??) for masking and alignment.
authorIan Darwin <ian@darwinsys.com>
Wed, 3 Oct 1990 17:52:59 +0000 (17:52 +0000)
committerIan Darwin <ian@darwinsys.com>
Wed, 3 Oct 1990 17:52:59 +0000 (17:52 +0000)
src/apprentice.c
src/softmagic.c

index 3c81bd2e241535a017625d46d5c8b0472726d321..9a292a472e075a9e357d155724f64e0a6444d942 100644 (file)
@@ -31,7 +31,7 @@
 
 #ifndef        lint
 static char *moduleid = 
-       "@(#)$Header: /home/glen/git/file/cvs/file/src/apprentice.c,v 1.8 1987/11/06 21:14:34 ian Exp $";
+       "@(#)$Header: /home/glen/git/file/cvs/file/src/apprentice.c,v 1.9 1990/10/03 17:52:59 ian Exp $";
 #endif /* lint */
 
 #define MAXSTR         500
@@ -103,7 +103,7 @@ int *ndx, check;
        if (nd+1 >= MAXMAGIS){
                if (warned++ == 0)
                        warning(
-"magic table overflow - increase MAXMAGIS beyond %d in file/apprentice.c\n",
+"magic table overflow - increase MAXMAGIS beyond %d in file/file.h\n",
                        MAXMAGIS);
                return -1;
        }
@@ -143,9 +143,15 @@ int *ndx, check;
                warning("type %s invalid", l);
                return -1;
        }
+       if (*l == '&') {
+               ++l;
+               m->mask = strtol(l, &l, 0);
+       } else
+               m->mask = 0L;
        EATAB;
 
-       if (*l == '>' || *l == '<' || *l == '&' || *l == '=') {
+       if (*l == '>' || *l == '<' || *l == '='
+           || (m->type != STRING && (*l == '&' || *l == '^' || *l == 'x'))) {
                m->reln = *l;
                ++l;
        } else
@@ -156,28 +162,31 @@ int *ndx, check;
  * TODO finish this macro and start using it!
  * #define offsetcheck {if (offset > HOWMANY-1) warning("offset too big"); }
  */
-       switch(m->type) {
-       /*
-        * Do not remove the casts below.  They are vital.
-        * When later compared with the data, the sign extension must
-        * have happened.
-        */
-       case BYTE:
-               m->value.l = (char) strtol(l,&l,0);
-               break;
-       case SHORT:
-               m->value.l = (short) strtol(l,&l,0);
-               break;
-       case LONG:
-               m->value.l = (long) strtol(l,&l,0);
-               break;
-       case STRING:
+       if (m->type == STRING) {
                l = getstr(l, m->value.s, sizeof(m->value.s), &slen);
                m->vallen = slen;
-               break;
-       default:
-               warning("can't happen: m->type=%d\n", m->type);
-               return -1;
+       } else {
+               if (m->reln != 'x') {
+                       switch(m->type) {
+                       /*
+                        * Do not remove the casts below.  They are vital.
+                        * When later compared with the data, the sign
+                        * extension must have happened.
+                        */
+                       case BYTE:
+                               m->value.l = (char) strtol(l,&l,0);
+                               break;
+                       case SHORT:
+                               m->value.l = (short) strtol(l,&l,0);
+                               break;
+                       case LONG:
+                               m->value.l = (long) strtol(l,&l,0);
+                               break;
+                       default:
+                               warning("can't happen: m->type=%d\n", m->type);
+                               return -1;
+                       }
+               }
        }
 
        /*
@@ -208,11 +217,12 @@ int       plen, *slen;
 {
        char    *origs = s, *origp = p;
        char    *pmax = p + plen - 1;
-       register char   c;
+       register int    c;
        register int    val;
 
        while((c = *s++) != '\0') {
-               if (isspace(c)) break;
+               if (isspace(c))
+                       break;
                if (p >= pmax) {
                        fprintf(stderr, "String too long: %s\n", origs);
                        break;
index fd5aed3f4175290f13bfee9f61d7f1bb866370de..531c469b78d5cf466dcd13172b801686943d493c 100644 (file)
@@ -30,7 +30,7 @@
 
 #ifndef        lint
 static char *moduleid = 
-       "@(#)$Header: /home/glen/git/file/cvs/file/src/softmagic.c,v 1.7 1987/11/06 11:25:31 ian Exp $";
+       "@(#)$Header: /home/glen/git/file/cvs/file/src/softmagic.c,v 1.8 1990/10/03 17:53:10 ian Exp $";
 #endif /* lint */
 
 extern char *progname;
@@ -94,25 +94,28 @@ struct magic *m;
 char *s;
 {
        register union VALUETYPE *p = (union VALUETYPE *)(s+m->offset);
+       register long v;
        char *pp, *strchr();
 
-       switch (m->type) {
-       case BYTE:
-               (void) printf(m->desc, p->b);
-               break;
-       case SHORT:
-               (void) printf(m->desc, p->h);
-               break;
-       case LONG:
-               (void) printf(m->desc, p->l);
-               break;
-       case STRING:
+       if (m->type == STRING) {
                if ((pp=strchr(p->s, '\n')) != NULL)
                        *pp = '\0';
                (void) printf(m->desc, p->s);
-               break;
-       default:
-               warning("invalid m->type (%d) in mprint()", m->type);
+       } else {
+               switch (m->type) {
+               case BYTE:
+                       v = p->b; break;
+               case SHORT:
+                       v = p->h; break;
+               case LONG:
+                       v = p->l; break;
+               default:
+                       warning("invalid m->type (%d) in mprint()", m->type);
+                       v = 0L;
+               }
+               if (m->mask != 0)
+                       v &= m->mask;
+               (void) printf(m->desc, v);
        }
 }
 
@@ -158,6 +161,9 @@ struct magic *m;
                return 0;
        }
 
+       if (m->mask != 0L)
+               v &= m->mask;
+
        switch (m->reln) {
        case '=':
                return v == l;
@@ -166,7 +172,11 @@ struct magic *m;
        case '<':
                return v < l;
        case '&':
-               return v & l;
+               return (v & l) == l;
+       case '^':
+               return (v & l) != l;
+       case 'x':
+               return 1;
        default:
                warning("mcheck: can't happen: invalid relation %d", m->reln);
                return 0;