-/* value.c 4.1 81/05/09 */
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)value.c 5.1 (Berkeley) %G%";
+#endif not lint
+
#include "tip.h"
#define MIDDLE 35
/*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;
}
- 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)
-register char *s;
+ register char *s;
{
register value_t *p;
static int
vtoken(s)
-register char *s;
+ register char *s;
{
register value_t *p;
register char *cp;
+ char *expand();
if (cp = index(s, '=')) {
*cp = '\0';
cp++;
if (p->v_type&NUMBER)
vassign(p, atoi(cp));
- else
+ else {
+ if (strcmp(s, "record") == 0)
+ cp = expand(cp);
vassign(p, cp);
+ }
return;
}
} else if (cp = index(s, '?')) {
static int
vprint(p)
-register value_t *p;
+ register value_t *p;
{
register char *cp;
extern char *interp(), *ctrl();
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++;
- 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;
static int
vaccess(mode, rw)
-register unsigned mode, rw;
+ register unsigned mode, rw;
{
if (mode & (rw<<PUBLIC))
- return(1);
+ return (1);
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)
-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)))
- return(p);
- return(NULL);
+ return (p);
+ return (NULL);
}
char *
vinterp(s, stop)
-register char *s;
-char stop;
+ register char *s;
+ char stop;
{
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;
default:
*p++ = c;
- }
+ }
*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);
}