|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 4880 (0x1310) Types: TextFile Notes: UNIX file Names: »var.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─⟦this⟧ »cmd/rsh/var.c« └─⟦this⟧ »cmd/sh/var.c«
#include "sh.h" VAR *vnode(); /* * Initial variable list. */ /* * Initialize variables. * Clear the list, if any; reset initial values, and initialize * the environment. */ initvar(envp) char **envp; { register char **nvp; static struct initvals { int i_flag; char *i_name; } initvals[] = { VSET, "IFS= \t\n", VRDO, VERSION, VSET, "PS2=> ", VSET, "PS1=$ ", VSET, "MAIL=", VSET, "PATH=:/bin:/usr/bin", VSET, "HOME=", 0, NULL }; static char lasterror[] = "LASTERROR"; if (varp) { register VAR *vp, *tvp; for (vp = varp; tvp = vp; ) { vp = vp->v_next; sfree(tvp->v_strp); sfree(tvp); } varp = NULL; } { register struct initvals *ivp; for (ivp=initvals; ivp->i_name != NULL; ivp+=1) flagvar(ivp->i_name, ivp->i_flag); } if (senvp != NULL) { vfree(senvp); } senvp = envp; for (nvp = senvp; nvp && *nvp != NULL; ) setsvar(*nvp++); if (findvar(lasterror) == NULL) flagvar(lasterror, VEXP); } /* * Make sure the given variable name is valid. * Only user settable names are accepted. */ namevar(np) char *np; { register int c; register char *cp; cp = np; if (class(*cp, MBVAR)) { do c = *cp++; while (class(c, MRVAR)); if (c=='\0' || c=='=') return (1); } return (0); } /* * Return a pointer to the given variable. */ VAR * findvar(cp) register char *cp; { register VAR *vp; for (vp=varp; vp; vp=vp->v_next) if (vareq(cp, vp->v_strp)) break; return (vp); } /* * Given a variable pointer, return a pointer to a string * containing the value. */ char * convvar(vp) register VAR *vp; { register char *cp; cp = vp->v_strp; for (;;) { if (*cp == '\0') return (NULL); if (*cp++ == '=') return (cp); } } /* * Assign a value to the given shell variable. */ VAR * assnvar(np, cp) char *np; char *cp; { strt[0] = '\0'; strcat(strt, np); strcat(strt, "="); strcat(strt, cp); return (setsvar(strt)); } /* * Set the given shell variable. */ VAR * setsvar(cp) register char *cp; { register VAR *vp; #ifdef VERBOSE if (xflag) prints("<%d> setsvar(%s)\n", getpid(), cp); #endif if ((vp=findvar(cp)) == NULL) vp = varp = vnode(0, NULL, varp); if (vp->v_flag & VRDO) { printe("Can't set %s", cp); return (NULL); } sfree(vp->v_strp); vp->v_strp = duplstr(cp, 1); if (vp->v_flag & VSET) setsint(vp->v_strp); return (vp); } /* * Set the internal variable to the shell variable. */ setsint(np) register char *np; { register char *cp; static struct intsvals { char *j_name; char **j_save; } intsvals[] = { "HOME", &vhome, "IFS", &vifs, "MAIL", &vmail, "PATH", &vpath, "PS1", &vps1, "PS2", &vps2, NULL, NULL }; register struct intsvals *ivp; cp = np; while (*cp != '\0') if (*cp++ == '=') break; for (ivp=intsvals; ivp->j_name != NULL; ivp+=1) if (vareq(ivp->j_name, np)) { *ivp->j_save = cp; break; } } /* * Set flags in the shell variable. */ VAR * flagvar(cp, f) register char *cp; { register VAR *vp; if ((vp=findvar(cp)) == NULL) vp = varp = vnode(f, duplstr(cp, 1), varp); else if (index(cp, '=') != NULL && (vp = setsvar(cp)) == NULL) return (NULL); vp->v_flag |= f; if (f & VEXP) setsexp(vp->v_strp); if (f & VSET) setsint(vp->v_strp); return (vp); } setsexp(np) register char *np; { register char **envp; /* New export values supersede inherited ones */ for (envp=senvp; envp && *envp; envp+=1) if (vareq(np, *envp)) { do envp[0]=envp[1]; while (*envp++ != NULL); break; } } /* * See if two variable names are equal. */ vareq(cp1, cp2) register char *cp1; register char *cp2; { int c2; register int c1; for (;;) { if ((c1=*cp1++) == '\0') c1 = '='; if ((c2=*cp2++) == '\0') c2 = '='; if (c1 != c2) return (0); if (c1 == '=') return (1); } } /* * Report function for variables. */ tellvar(f) { register VAR *vp; register char **evp; if (f==VEXP) for (evp=senvp; evp && *evp; ) prints("%s\n", *evp++); for (vp=varp; vp; vp=vp->v_next) if (f==0 || (vp->v_flag&f)) prints("%s\n", vp->v_strp); } /* * Scan the varlist for exportables. * If an exportable matches a variable already in envp, forget it. */ char ** envlvar(envp) char **envp; { register char **enpp; register char **oenvp; register VAR *vp; for (oenvp=senvp; oenvp && *oenvp; oenvp+=1) { for (enpp=envp; ; enpp+=1) if (*enpp==NULL || vareq(*oenvp, *enpp)) break; if (*enpp==NULL) envp = addargl(envp, duplstr(*oenvp, 0)); } for (vp=varp; vp; vp=vp->v_next) { if (vp->v_flag&VEXP) { for (enpp=envp; ; enpp+=1) if (*enpp==NULL || vareq(*enpp, vp->v_strp)) break; if (*enpp==NULL) envp = addargl(envp, duplstr(vp->v_strp, 0)); } } return (envp); } VAR * vnode(f, s, n) char *s; VAR *n; { register VAR *vp; vp = (VAR *)salloc(sizeof *vp); vp->v_flag = f; vp->v_strp = s; vp->v_next = n; return (vp); }