/* * pop a block handling special variables */ void popblock() { register struct block *l = e.loc; register struct tbl *vp, **vpp = l->vars.tbls; register int i; e.loc = l->next; /* pop block */ for (i = l->vars.size; --i >= 0; ) if ((vp = *vpp++) != NULL && (vp->flag&SPECIAL)) setspec(global(vp->name)); afreeall(&l->area); }
/* convert variable vq to integer variable, setting its value to num */ void setint_n(struct tbl *vq, mksh_ari_t num, int newbase) { if (!(vq->flag & INTEGER) && (vq->flag & ALLOC)) { vq->flag &= ~ALLOC; vq->type = 0; afree(vq->val.s, vq->areap); } vq->val.i = num; if (newbase != 0) vq->type = newbase; vq->flag |= ISSET|INTEGER; if (vq->flag&SPECIAL) setspec(vq); }
/* set variable to string value */ int setstr(struct tbl *vq, const char *s, int error_ok) { char *salloc = NULL; bool no_ro_check = tobool(error_ok & 0x4); error_ok &= ~0x4; if ((vq->flag & RDONLY) && !no_ro_check) { warningf(true, "read-only: %s", vq->name); if (!error_ok) errorfxz(2); return (0); } if (!(vq->flag&INTEGER)) { /* string dest */ if ((vq->flag&ALLOC)) { #ifndef MKSH_SMALL /* debugging */ if (s >= vq->val.s && s <= vq->val.s + strlen(vq->val.s)) { internal_errorf( "setstr: %s=%s: assigning to self", vq->name, s); } #endif afree(vq->val.s, vq->areap); } vq->flag &= ~(ISSET|ALLOC); vq->type = 0; if (s && (vq->flag & (UCASEV_AL|LCASEV|LJUST|RJUST))) s = salloc = formatstr(vq, s); if ((vq->flag&EXPORT)) exportprep(vq, s); else { strdupx(vq->val.s, s, vq->areap); vq->flag |= ALLOC; } } else { /* integer dest */ if (!v_evaluate(vq, s, error_ok, true)) return (0); } vq->flag |= ISSET; if ((vq->flag&SPECIAL)) setspec(vq); afree(salloc, ATEMP); return (1); }
/* set variable to integer */ void setint(struct tbl *vq, mksh_ari_t n) { if (!(vq->flag&INTEGER)) { vtemp->flag = (ISSET|INTEGER); vtemp->type = 0; vtemp->areap = ATEMP; vtemp->val.i = n; /* setstr can't fail here */ setstr(vq, str_val(vtemp), KSH_RETURN_ERROR); } else vq->val.i = n; vq->flag |= ISSET; if ((vq->flag&SPECIAL)) setspec(vq); }
/* * pop a block handling special variables */ void popblock() { register struct block *l = e->loc; register struct tbl *vp, **vpp = l->vars.tbls, *vq; register int i; e->loc = l->next; /* pop block */ for (i = l->vars.size; --i >= 0; ) if ((vp = *vpp++) != NULL && (vp->flag&SPECIAL)) if ((vq = global(vp->name))->flag & ISSET) setspec(vq); else unsetspec(vq); if (l->flags & BF_DOGETOPTS) user_opt = l->getopts_state; afreeall(&l->area); afree(l, ATEMP); }
/* * pop a block handling special variables */ void popblock(void) { ssize_t i; struct block *l = e->loc; struct tbl *vp, **vpp = l->vars.tbls, *vq; /* pop block */ e->loc = l->next; i = 1 << (l->vars.tshift); while (--i >= 0) if ((vp = *vpp++) != NULL && (vp->flag&SPECIAL)) { if ((vq = global(vp->name))->flag & ISSET) setspec(vq); else unsetspec(vq); } if (l->flags & BF_DOGETOPTS) user_opt = l->getopts_state; afreeall(&l->area); afree(l, ATEMP); }