1 #ifdef RCSID
2 static char RCSid[] =
3 "$Header: d:/cvsroot/tads/TADS2/VOCCOMP.C,v 1.2 1999/05/17 02:52:13 MJRoberts Exp $";
4 #endif
5 
6 /*
7  *   Copyright (c) 1992, 2002 Michael J. Roberts.  All Rights Reserved.
8  *
9  *   Please see the accompanying license file, LICENSE.TXT, for information
10  *   on using and copying this software.
11  */
12 /*
13 Name
14   voccomp.c - vocabulary routines not used in runtime
15 Function
16   some extra vocabulary routines not needed in runtime
17 Notes
18   removed from base voc.c to save space in runtime
19 Modified
20   12/18/92 MJRoberts     - creation
21 */
22 
23 #include "os.h"
24 #include "voc.h"
25 
26 /* delete all inherited vocabulary records */
vocdelinh(voccxdef * ctx)27 void vocdelinh(voccxdef *ctx)
28 {
29     int       i;
30     vocdef   *v;
31     vocdef   *prv;
32     vocdef   *nxt;
33     vocdef  **vp;
34     vocwdef  *vw;
35     vocwdef  *prvw;
36     vocwdef  *nxtw;
37     uint      idx;
38     uint      nxtidx;
39     int       deleted_vocdef;
40 
41     /* go through each hash value looking for matching words */
42     for (i = VOCHASHSIZ, vp = ctx->voccxhsh ; i ; ++vp, --i)
43     {
44         /* go through all words in this hash chain */
45         for (prv = (vocdef *)0, v = *vp ; v ; v = nxt)
46         {
47             nxt = v->vocnxt;
48             deleted_vocdef = FALSE;
49 
50             /* go through each vocwdef relation in the word's list */
51             for (prvw = 0, idx = v->vocwlst, vw = vocwget(ctx, idx) ; vw ;
52                  vw = nxtw, idx = nxtidx)
53             {
54                 /* remember the next item in the vocwdef list */
55                 nxtidx = vw->vocwnxt;
56                 nxtw = vocwget(ctx, nxtidx);
57 
58                 /* delete word if it's inherited */
59                 if (vw->vocwflg & VOCFINH)
60                 {
61                     /* unlink this vocwdef from the vocdef's list */
62                     if (prvw)
63                         prvw->vocwnxt = vw->vocwnxt;
64                     else
65                         v->vocwlst = vw->vocwnxt;
66 
67                     /* link the vocwdef into the vocwdef free list */
68                     vw->vocwnxt = ctx->voccxwfre;
69                     ctx->voccxwfre = idx;
70 
71                     /*
72                      *   if there's nothing left in the vocdef's list,
73                      *   delete the vocdef as well
74                      */
75                     if (v->vocwlst == VOCCXW_NONE)
76                     {
77                         /* unlink from hash chain */
78                         if (prv) prv->vocnxt = v->vocnxt;
79                         else *vp = v->vocnxt;
80 
81                         /* link into free chain */
82                         v->vocnxt = ctx->voccxfre;
83                         ctx->voccxfre = v;
84 
85                         /* note that it's been deleted */
86                         deleted_vocdef = TRUE;
87                     }
88                 }
89                 else
90                     prvw = vw;  /* this one is still in list - it's now prv */
91             }
92 
93             /* if we didn't delete this vocdef, advance prv onto it */
94             if (!deleted_vocdef)
95                 prv = v;
96         }
97     }
98 }
99 
100 /* renumber an object (used with 'modify') */
vociren(voccxdef * ctx,objnum oldnum,objnum newnum)101 void vociren(voccxdef *ctx, objnum oldnum, objnum newnum)
102 {
103     int       i;
104     vocdef   *v;
105     vocdef  **vp;
106     vocwdef  *vw;
107 
108 
109     /* make sure we have a page table entry for the original object */
110     vocialo(ctx, newnum);
111 
112     /* move the old object's inheritance record to the new slot */
113     vocinh(ctx, newnum) = vocinh(ctx, oldnum);
114     vocinh(ctx, oldnum) = 0;
115 
116     /* make the old object an honorary class object */
117     vocinh(ctx, newnum)->vociflg |= VOCIFCLASS;
118 
119     /*
120      *   Renumber any vocabulary associated with the old object to the new
121      *   object.
122      */
123     for (i = VOCHASHSIZ, vp = ctx->voccxhsh ; i != 0 ; ++vp, --i)
124     {
125         /* go through all words in this hash chain */
126         for (v = *vp ; v != 0 ; v = v->vocnxt)
127         {
128             /* go through all vocwdef's defined for this word */
129             for (vw = vocwget(ctx, v->vocwlst) ; vw ;
130                  vw = vocwget(ctx, vw->vocwnxt))
131             {
132                 /*
133                  *   renumber this word and mark it as being associated
134                  *   with a class if it's associated with the original
135                  *   object
136                  */
137                 if (vw->vocwobj == oldnum)
138                 {
139                     vw->vocwobj = newnum;
140                     vw->vocwflg |= VOCFCLASS;
141                 }
142             }
143         }
144     }
145 }
146 
147