1*4963Ssam /* value.c 4.2 81/11/20 */ 23700Sroot #include "tip.h" 33700Sroot 43700Sroot #define MIDDLE 35 53700Sroot 63700Sroot static value_t *vlookup(); 73700Sroot static int col = 0; 83700Sroot 93700Sroot /* 103700Sroot * Variable manipulation 113700Sroot */ 123700Sroot vinit() 133700Sroot { 143700Sroot register value_t *p; 153700Sroot register char *cp; 163700Sroot FILE *f; 173700Sroot char file[256]; 183700Sroot 193700Sroot for (p = vtable; p->v_name != NULL; p++) { 203700Sroot if (p->v_type&ENVIRON) 213700Sroot if (cp = getenv(p->v_name)) 223700Sroot p->v_value = cp; 233700Sroot if (p->v_type&IREMOTE) 243700Sroot number(p->v_value) = *address(p->v_value); 253700Sroot } 263700Sroot /* 273700Sroot * Read the .tiprc file in the HOME directory 283700Sroot * for sets 293700Sroot */ 303700Sroot strcpy(file, value(HOME)); 313700Sroot strcat(file, "/.tiprc"); 323700Sroot if ((f = fopen(file, "r")) != NULL) { 333700Sroot register char *tp; 343700Sroot 353700Sroot while (fgets(file, sizeof(file)-1, f) != NULL) { 363700Sroot if (vflag) 373700Sroot printf("set %s", file); 383700Sroot if (tp = rindex(file, '\n')) 393700Sroot *tp = '\0'; 403700Sroot vlex(file); 413700Sroot } 423700Sroot fclose(f); 433700Sroot } 443700Sroot /* 453700Sroot * To allow definition of exception prior to fork 463700Sroot */ 473700Sroot vtable[EXCEPTIONS].v_access &= ~(WRITE<<PUBLIC); 483700Sroot } 493700Sroot 503700Sroot /*VARARGS1*/ 513700Sroot vassign(p, v) 52*4963Ssam register value_t *p; 53*4963Ssam char *v; 543700Sroot { 553700Sroot 563700Sroot if (!vaccess(p->v_access, WRITE)) { 573700Sroot printf("access denied\r\n"); 583700Sroot return; 593700Sroot } 603700Sroot switch(p->v_type&TMASK) { 613700Sroot 623700Sroot case STRING: 633700Sroot if (equal(p->v_value, v)) 643700Sroot return; 653700Sroot if (!(p->v_type&(ENVIRON|INIT))) 663700Sroot free(p->v_value); 673700Sroot if ((p->v_value = malloc(size(v)+1)) == NOSTR) { 683700Sroot printf("out of core\r\n"); 693700Sroot return; 703700Sroot } 713700Sroot p->v_type &= ~(ENVIRON|INIT); 723700Sroot strcpy(p->v_value, v); 733700Sroot break; 743700Sroot 753700Sroot case NUMBER: 763700Sroot if (number(p->v_value) == number(v)) 773700Sroot return; 783700Sroot number(p->v_value) = number(v); 793700Sroot break; 803700Sroot 813700Sroot case BOOL: 823700Sroot if (boolean(p->v_value) == (*v != '!')) 833700Sroot return; 843700Sroot boolean(p->v_value) = (*v != '!'); 853700Sroot break; 863700Sroot 873700Sroot case CHAR: 883700Sroot if (character(p->v_value) == *v) 893700Sroot return; 903700Sroot character(p->v_value) = *v; 913700Sroot } 923700Sroot p->v_access |= CHANGED; 933700Sroot } 943700Sroot 953700Sroot vlex(s) 96*4963Ssam register char *s; 973700Sroot { 983700Sroot register value_t *p; 993700Sroot 1003700Sroot if (equal(s, "all")) { 1013700Sroot for (p = vtable; p->v_name; p++) 1023700Sroot if (vaccess(p->v_access, READ)) 1033700Sroot vprint(p); 1043700Sroot } else { 1053700Sroot register char *cp; 1063700Sroot 1073700Sroot do { 1083700Sroot if (cp = vinterp(s, ' ')) 1093700Sroot cp++; 1103700Sroot vtoken(s); 1113700Sroot s = cp; 1123700Sroot } while (s); 1133700Sroot } 1143700Sroot if (col > 0) { 1153700Sroot printf("\r\n"); 1163700Sroot col = 0; 1173700Sroot } 1183700Sroot } 1193700Sroot 1203700Sroot static int 1213700Sroot vtoken(s) 122*4963Ssam register char *s; 1233700Sroot { 1243700Sroot register value_t *p; 1253700Sroot register char *cp; 1263700Sroot 1273700Sroot if (cp = index(s, '=')) { 1283700Sroot *cp = '\0'; 1293700Sroot if (p = vlookup(s)) { 1303700Sroot cp++; 1313700Sroot if (p->v_type&NUMBER) 1323700Sroot vassign(p, atoi(cp)); 1333700Sroot else 1343700Sroot vassign(p, cp); 1353700Sroot return; 1363700Sroot } 1373700Sroot } else if (cp = index(s, '?')) { 1383700Sroot *cp = '\0'; 1393700Sroot if ((p = vlookup(s)) && vaccess(p->v_access, READ)) { 1403700Sroot vprint(p); 1413700Sroot return; 1423700Sroot } 1433700Sroot } else { 1443700Sroot if (*s != '!') 1453700Sroot p = vlookup(s); 1463700Sroot else 1473700Sroot p = vlookup(s+1); 1483700Sroot if (p != NOVAL) { 1493700Sroot vassign(p, s); 1503700Sroot return; 1513700Sroot } 1523700Sroot } 1533700Sroot printf("%s: unknown variable\r\n", s); 1543700Sroot } 1553700Sroot 1563700Sroot static int 1573700Sroot vprint(p) 158*4963Ssam register value_t *p; 1593700Sroot { 1603700Sroot register char *cp; 1613700Sroot extern char *interp(), *ctrl(); 1623700Sroot 1633700Sroot if (col > 0 && col < MIDDLE) 1643700Sroot while (col++ < MIDDLE) 1653700Sroot putchar(' '); 1663700Sroot col += size(p->v_name); 1673700Sroot switch(p->v_type&TMASK) 1683700Sroot { 1693700Sroot case BOOL: 1703700Sroot if (boolean(p->v_value) == FALSE) { 1713700Sroot col++; 1723700Sroot putchar('!'); 1733700Sroot } 1743700Sroot printf("%s", p->v_name); 1753700Sroot break; 1763700Sroot case STRING: 1773700Sroot printf("%s=", p->v_name); 1783700Sroot col++; 1793700Sroot if (p->v_value) { 1803700Sroot cp = interp(p->v_value); 1813700Sroot col += size(cp); 1823700Sroot printf("%s", cp); 1833700Sroot } 1843700Sroot break; 1853700Sroot case NUMBER: 1863700Sroot col += 6; 1873700Sroot printf("%s=%-5d", p->v_name, number(p->v_value)); 1883700Sroot break; 1893700Sroot case CHAR: 1903700Sroot printf("%s=", p->v_name); 1913700Sroot col++; 1923700Sroot if (p->v_value) { 1933700Sroot cp = ctrl(character(p->v_value)); 1943700Sroot col += size(cp); 1953700Sroot printf("%s", cp); 1963700Sroot } 1973700Sroot break; 1983700Sroot } 1993700Sroot if (col >= MIDDLE) { 2003700Sroot col = 0; 2013700Sroot printf("\r\n"); 2023700Sroot return; 2033700Sroot } 2043700Sroot } 2053700Sroot 2063700Sroot 2073700Sroot static int 2083700Sroot vaccess(mode, rw) 209*4963Ssam register unsigned mode, rw; 2103700Sroot { 2113700Sroot if (mode & (rw<<PUBLIC)) 2123700Sroot return(1); 2133700Sroot if (mode & (rw<<PRIVATE)) 2143700Sroot return(1); 2153700Sroot return((mode & (rw<<ROOT)) && getuid() == 0); 2163700Sroot } 2173700Sroot 2183700Sroot static value_t * 2193700Sroot vlookup(s) 220*4963Ssam register char *s; 2213700Sroot { 2223700Sroot register value_t *p; 2233700Sroot 2243700Sroot for (p = vtable; p->v_name; p++) 2253700Sroot if (equal(p->v_name, s) || (p->v_abrev && equal(p->v_abrev, s))) 2263700Sroot return(p); 2273700Sroot return(NULL); 2283700Sroot } 2293700Sroot 2303700Sroot char * 2313700Sroot vinterp(s, stop) 232*4963Ssam register char *s; 2333700Sroot char stop; 2343700Sroot { 2353700Sroot register char *p = s, c; 2363700Sroot int num; 2373700Sroot 2383700Sroot while ((c = *s++) && c != stop) switch(c) 2393700Sroot { 2403700Sroot case '^': 2413700Sroot if (*s) 2423700Sroot *p++ = *s++ - 0100; 2433700Sroot else 2443700Sroot *p++ = c; 2453700Sroot break; 2463700Sroot 2473700Sroot case '\\': 2483700Sroot num = 0; 2493700Sroot c = *s++; 2503700Sroot if (c >= '0' && c <= '7') 2513700Sroot num = (num<<3)+(c-'0'); 2523700Sroot else { 2533700Sroot register char *q = "n\nr\rt\tb\bf\f"; 2543700Sroot 2553700Sroot for (; *q; q++) 2563700Sroot if (c == *q++) { 2573700Sroot *p++ = *q; 2583700Sroot goto cont; 2593700Sroot } 2603700Sroot *p++ = c; 2613700Sroot cont: 2623700Sroot break; 2633700Sroot } 2643700Sroot if ((c = *s++) >= '0' && c <= '7') { 2653700Sroot num = (num<<3)+(c-'0'); 2663700Sroot if ((c = *s++) >= '0' && c <= '7') 2673700Sroot num = (num<<3)+(c-'0'); 2683700Sroot else 2693700Sroot s--; 2703700Sroot } else 2713700Sroot s--; 2723700Sroot *p++ = num; 2733700Sroot break; 2743700Sroot 2753700Sroot default: 2763700Sroot *p++ = c; 2773700Sroot } 2783700Sroot *p = '\0'; 2793700Sroot return(c == stop ? s-1 : NULL); 2803700Sroot } 281