BSD 4_3_Reno release
[unix-history] / usr / src / usr.bin / tip / value.c
index 161a47d..2c74aae 100644 (file)
@@ -1,4 +1,26 @@
-/*     value.c 4.1     81/05/09        */
+/*
+ * Copyright (c) 1983 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)value.c    5.3 (Berkeley) 6/1/90";
+#endif /* not lint */
+
 #include "tip.h"
 
 #define MIDDLE 35
 #include "tip.h"
 
 #define MIDDLE 35
@@ -49,51 +71,51 @@ vinit()
 
 /*VARARGS1*/
 vassign(p, v)
 
 /*VARARGS1*/
 vassign(p, v)
-register value_t *p;
-char *v;
+       register value_t *p;
+       char *v;
 {
 
        if (!vaccess(p->v_access, WRITE)) {
                printf("access denied\r\n");
                return;
        }
 {
 
        if (!vaccess(p->v_access, WRITE)) {
                printf("access denied\r\n");
                return;
        }
-       switch(p->v_type&TMASK) {
-
-               case STRING:
-                       if (equal(p->v_value, v))
-                               return;
-                       if (!(p->v_type&(ENVIRON|INIT)))
-                               free(p->v_value);
-                       if ((p->v_value = malloc(size(v)+1)) == NOSTR) {
-                               printf("out of core\r\n");
-                               return;
-                       }
-                       p->v_type &= ~(ENVIRON|INIT);
-                       strcpy(p->v_value, v);
-                       break;
+       switch (p->v_type&TMASK) {
 
 
-               case NUMBER:
-                       if (number(p->v_value) == number(v))
-                               return;
-                       number(p->v_value) = number(v);
-                       break;
+       case STRING:
+               if (equal(p->v_value, v))
+                       return;
+               if (!(p->v_type&(ENVIRON|INIT)))
+                       free(p->v_value);
+               if ((p->v_value = malloc(size(v)+1)) == NOSTR) {
+                       printf("out of core\r\n");
+                       return;
+               }
+               p->v_type &= ~(ENVIRON|INIT);
+               strcpy(p->v_value, v);
+               break;
 
 
-               case BOOL:
-                       if (boolean(p->v_value) == (*v != '!'))
-                               return;
-                       boolean(p->v_value) = (*v != '!');
-                       break;
+       case NUMBER:
+               if (number(p->v_value) == number(v))
+                       return;
+               number(p->v_value) = number(v);
+               break;
+
+       case BOOL:
+               if (boolean(p->v_value) == (*v != '!'))
+                       return;
+               boolean(p->v_value) = (*v != '!');
+               break;
 
 
-               case CHAR:
-                       if (character(p->v_value) == *v)
-                               return;
-                       character(p->v_value) = *v;
+       case CHAR:
+               if (character(p->v_value) == *v)
+                       return;
+               character(p->v_value) = *v;
        }
        p->v_access |= CHANGED;
 }
 
 vlex(s)
        }
        p->v_access |= CHANGED;
 }
 
 vlex(s)
-register char *s;
+       register char *s;
 {
        register value_t *p;
 
 {
        register value_t *p;
 
@@ -119,10 +141,11 @@ register char *s;
 
 static int
 vtoken(s)
 
 static int
 vtoken(s)
-register char *s;
+       register char *s;
 {
        register value_t *p;
        register char *cp;
 {
        register value_t *p;
        register char *cp;
+       char *expand();
 
        if (cp = index(s, '=')) {
                *cp = '\0';
 
        if (cp = index(s, '=')) {
                *cp = '\0';
@@ -130,8 +153,11 @@ register char *s;
                        cp++;
                        if (p->v_type&NUMBER)
                                vassign(p, atoi(cp));
                        cp++;
                        if (p->v_type&NUMBER)
                                vassign(p, atoi(cp));
-                       else
+                       else {
+                               if (strcmp(s, "record") == 0)
+                                       cp = expand(cp);
                                vassign(p, cp);
                                vassign(p, cp);
+                       }
                        return;
                }
        } else if (cp = index(s, '?')) {
                        return;
                }
        } else if (cp = index(s, '?')) {
@@ -155,7 +181,7 @@ register char *s;
 
 static int
 vprint(p)
 
 static int
 vprint(p)
-register value_t *p;
+       register value_t *p;
 {
        register char *cp;
        extern char *interp(), *ctrl();
 {
        register char *cp;
        extern char *interp(), *ctrl();
@@ -164,37 +190,40 @@ register value_t *p;
                while (col++ < MIDDLE)
                        putchar(' ');
        col += size(p->v_name);
                while (col++ < MIDDLE)
                        putchar(' ');
        col += size(p->v_name);
-       switch(p->v_type&TMASK)
-       {
-               case BOOL:
-                       if (boolean(p->v_value) == FALSE) {
-                               col++;
-                               putchar('!');
-                       }
-                       printf("%s", p->v_name);
-                       break;
-               case STRING:
-                       printf("%s=", p->v_name);
-                       col++;
-                       if (p->v_value) {
-                               cp = interp(p->v_value);
-                               col += size(cp);
-                               printf("%s", cp);
-                       }
-                       break;
-               case NUMBER:
-                       col += 6;
-                       printf("%s=%-5d", p->v_name, number(p->v_value));
-                       break;
-               case CHAR:
-                       printf("%s=", p->v_name);
+       switch (p->v_type&TMASK) {
+
+       case BOOL:
+               if (boolean(p->v_value) == FALSE) {
                        col++;
                        col++;
-                       if (p->v_value) {
-                               cp = ctrl(character(p->v_value));
-                               col += size(cp);
-                               printf("%s", cp);
-                       }
-                       break;
+                       putchar('!');
+               }
+               printf("%s", p->v_name);
+               break;
+
+       case STRING:
+               printf("%s=", p->v_name);
+               col++;
+               if (p->v_value) {
+                       cp = interp(p->v_value, NULL);
+                       col += size(cp);
+                       printf("%s", cp);
+               }
+               break;
+
+       case NUMBER:
+               col += 6;
+               printf("%s=%-5d", p->v_name, number(p->v_value));
+               break;
+
+       case CHAR:
+               printf("%s=", p->v_name);
+               col++;
+               if (p->v_value) {
+                       cp = ctrl(character(p->v_value));
+                       col += size(cp);
+                       printf("%s", cp);
+               }
+               break;
        }
        if (col >= MIDDLE) {
                col = 0;
        }
        if (col >= MIDDLE) {
                col = 0;
@@ -206,37 +235,38 @@ register value_t *p;
 
 static int
 vaccess(mode, rw)
 
 static int
 vaccess(mode, rw)
-register unsigned mode, rw;
+       register unsigned mode, rw;
 {
        if (mode & (rw<<PUBLIC))
 {
        if (mode & (rw<<PUBLIC))
-               return(1);
+               return (1);
        if (mode & (rw<<PRIVATE))
        if (mode & (rw<<PRIVATE))
-               return(1);
-       return((mode & (rw<<ROOT)) && getuid() == 0);
+               return (1);
+       return ((mode & (rw<<ROOT)) && getuid() == 0);
 }
 
 static value_t *
 vlookup(s)
 }
 
 static value_t *
 vlookup(s)
-register char *s;
+       register char *s;
 {
        register value_t *p;
 
        for (p = vtable; p->v_name; p++)
                if (equal(p->v_name, s) || (p->v_abrev && equal(p->v_abrev, s)))
 {
        register value_t *p;
 
        for (p = vtable; p->v_name; p++)
                if (equal(p->v_name, s) || (p->v_abrev && equal(p->v_abrev, s)))
-                       return(p);
-       return(NULL);
+                       return (p);
+       return (NULL);
 }
 
 char *
 vinterp(s, stop)
 }
 
 char *
 vinterp(s, stop)
-register char *s;
-char stop;
+       register char *s;
+       char stop;
 {
        register char *p = s, c;
        int num;
 
 {
        register char *p = s, c;
        int num;
 
-       while ((c = *s++) && c != stop) switch(c)
-       {
+       while ((c = *s++) && c != stop)
+               switch (c) {
+
                case '^':
                        if (*s)
                                *p++ = *s++ - 0100;
                case '^':
                        if (*s)
                                *p++ = *s++ - 0100;
@@ -274,7 +304,31 @@ char stop;
 
                default:
                        *p++ = c;
 
                default:
                        *p++ = c;
-       }
+               }
        *p = '\0';
        *p = '\0';
-       return(c == stop ? s-1 : NULL);
+       return (c == stop ? s-1 : NULL);
+}
+
+/*
+ * assign variable s with value v (for NUMBER or STRING or CHAR types)
+ */
+
+vstring(s,v)
+       register char *s;
+       register char *v;
+{
+       register value_t *p;
+       char *expand();
+
+       p = vlookup(s); 
+       if (p == 0)
+               return (1);
+       if (p->v_type&NUMBER)
+               vassign(p, atoi(v));
+       else {
+               if (strcmp(s, "record") == 0)
+                       v = expand(v);
+               vassign(p, v);
+       }
+       return (0);
 }
 }