|
|
1.1 ! root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ ! 2: ! 3: /* ! 4: $Header: b3env.c,v 1.4 85/08/22 16:57:42 timo Exp $ ! 5: */ ! 6: ! 7: /* Environments */ ! 8: ! 9: #include "b.h" ! 10: #include "b1obj.h" ! 11: #include "b3err.h" /*for curline, curlino*/ ! 12: ! 13: Visible envtab prmnvtab; ! 14: Visible envchain prmnvchain; ! 15: Visible env prmnv; ! 16: ! 17: /* context: */ ! 18: /* The bound tags for the current environment are stored in *bndtgs */ ! 19: /* A new bound tag list is created on evaluating a refined test or expression */ ! 20: ! 21: Visible env curnv; ! 22: Visible value *bndtgs; ! 23: Hidden value bndtglist; ! 24: Visible literal cntxt, resexp; ! 25: Visible value uname= Vnil; ! 26: Visible intlet lino; ! 27: Visible intlet f_lino; ! 28: ! 29: Visible context read_context; ! 30: ! 31: Visible Procedure sv_context(sc) context *sc; { ! 32: sc->curnv= curnv; ! 33: sc->bndtgs= bndtgs; ! 34: sc->cntxt= cntxt; ! 35: sc->resexp= resexp; ! 36: sc->uname= copy(uname); ! 37: sc->cur_line= curline; ! 38: sc->cur_lino= curlino; ! 39: } ! 40: ! 41: Visible Procedure set_context(sc) context *sc; { ! 42: curnv= sc->curnv; ! 43: bndtgs= sc->bndtgs; ! 44: cntxt= sc->cntxt; ! 45: resexp= sc->resexp; ! 46: release(uname); uname= sc->uname; ! 47: curline= sc->cur_line; ! 48: curlino= sc->cur_lino; ! 49: } ! 50: ! 51: Visible Procedure initenv() { ! 52: /* The following invariant must be maintained: ! 53: EITHER: ! 54: the original permanent-environment table resides in prmnv->tab ! 55: and prmnvtab == Vnil ! 56: OR: ! 57: the original permanent-environment table resides in prmnvtab ! 58: and prmnv->tab contains a scratch-pad copy. ! 59: */ ! 60: prmnv= &prmnvchain; ! 61: prmnv->tab= mk_elt(); prmnvtab= Vnil; ! 62: prmnv->inv_env= Enil; ! 63: bndtglist= mk_elt(); ! 64: } ! 65: ! 66: Visible Procedure endenv() { ! 67: release(prmnv->tab); prmnv->tab= Vnil; ! 68: release(bndtglist); bndtglist= Vnil; ! 69: release(uname); uname= Vnil; ! 70: release(erruname); erruname= Vnil; ! 71: } ! 72: ! 73: Visible Procedure re_env() { ! 74: setprmnv(); bndtgs= &bndtglist; ! 75: } ! 76: ! 77: Visible Procedure setprmnv() { ! 78: /* the current and permanent environment are reset ! 79: to the original permanent environment */ ! 80: if (prmnvtab != Vnil) { ! 81: prmnv->tab= prmnvtab; ! 82: prmnvtab= Vnil; ! 83: } ! 84: curnv= prmnv; ! 85: } ! 86: ! 87: Visible Procedure e_replace(v, t, k) value v, *t, k; { ! 88: if (Is_compound(*t)) { ! 89: int n= SmallIntVal(k); ! 90: uniql(t); ! 91: if (*Field(*t, n) != Vnil) release(*Field(*t, n)); ! 92: *Field(*t, n)= copy(v); ! 93: } ! 94: else if (!Is_table(*t)) syserr(MESS(2900, "replacing in non-environment")); ! 95: else replace(v, t, k); ! 96: } ! 97: ! 98: Visible Procedure e_delete(t, k) value *t, k; { ! 99: if (Is_compound(*t) && IsSmallInt(k)) { ! 100: int n= SmallIntVal(k); ! 101: if (*Field(*t, n) != Vnil) { ! 102: uniql(t); release(*Field(*t, n)); ! 103: *Field(*t, n)= Vnil; ! 104: } ! 105: } ! 106: else if (!Is_table(*t)) syserr(MESS(2901, "deleting from non-environment")); ! 107: else if (in_keys(k, *t)) delete(t, k); ! 108: } ! 109: ! 110: Visible value* envassoc(t, ke) value t, ke; { ! 111: if (Is_compound(t) && IsSmallInt(ke)) { ! 112: int n= SmallIntVal(ke); ! 113: if (*Field(t, n) == Vnil) return Pnil; ! 114: return Field(t, n); ! 115: } ! 116: if (!Is_table(t)) syserr(MESS(2902, "selection on non-environment")); ! 117: return adrassoc(t, ke); ! 118: } ! 119: ! 120: Visible bool in_env(tab, ke, aa) value tab, ke, **aa; { ! 121: /* IF ke in keys tab: ! 122: PUT tab[ke] IN aa ! 123: SUCCEED ! 124: FAIL ! 125: */ ! 126: *aa= envassoc(tab, ke); ! 127: return (*aa != Pnil); ! 128: } ! 129: ! 130: Visible Procedure extbnd_tags(btl, et) value btl; envtab et; { ! 131: /* Copy bound targets to the invoking environment */ ! 132: /* FOR tag IN btl: \ btl is the bound tag list ! 133: IF tag in keys et: \ et is the environment we're just leaving ! 134: PUT et[tag] IN curnv[tag] \ curnv is the invoking environment ! 135: */ ! 136: value *aa, tag; ! 137: int len= length(btl), k; ! 138: for (k= 1; k <= len; k++) { ! 139: tag= thof(k, btl); ! 140: if (in_env(et, tag, &aa)) { ! 141: e_replace(*aa, &(curnv->tab), tag); ! 142: if (*bndtgs != Vnil) insert(tag, bndtgs); ! 143: } ! 144: release(tag); ! 145: } ! 146: } ! 147: ! 148: Visible Procedure lst_ttgs() { ! 149: int k, len; ! 150: len= length(prmnv->tab); ! 151: k_Over_len { ! 152: writ(*key(prmnv->tab, k)); ! 153: wri_space(); ! 154: } ! 155: newline(); ! 156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.