Pristine Ack-5.5
[Ack-5.5.git] / mach / proto / cg / state.c
1 #ifndef NORCSID
2 static char rcsid[] = "$Id: state.c,v 2.3 1994/06/24 13:24:21 ceriel Exp $";
3 #endif
4
5 #include "assert.h"
6 #include "param.h"
7 #include "tables.h"
8 #include "types.h"
9 #include <cg_pattern.h>
10 #include "data.h"
11 #include "result.h"
12 #include "state.h"
13 #include "extern.h"
14
15 /*
16  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
17  * See the copyright notice in the ACK home directory, in the file "Copyright".
18  *
19  * Author: Hans van Staveren
20  */
21
22 extern int nstab;       /* salloc.c */
23
24 #ifndef STONSTACK
25 extern string myalloc();
26
27 state_p stlist=0;
28 #endif
29
30 #ifdef STONSTACK
31 savestatus(sp) register state_p sp; {
32 #else
33 state_p savestatus() {
34         register state_p sp;
35
36         if ((sp=stlist)==0)
37                 sp = (state_p) myalloc( sizeof( *sp ) );
38         else
39                 stlist=sp->st_next;
40 #endif
41         sp->st_sh = stackheight;
42         bmove((short *)fakestack,(short *)sp->st_fs,stackheight*sizeof(token_t));
43         sp->st_na = nallreg;
44         bmove((short *)allreg,(short *)sp->st_ar,nallreg*sizeof(int));
45         sp->st_ct = curtoken;
46         bmove((short *)dollar,(short *)sp->st_do,LONGESTPATTERN*sizeof(result_t));
47         bmove((short *)machregs,(short *)sp->st_mr,NREGS*sizeof(struct reginfo));
48         sp->st_ne = nemlines;
49         bmove((short *)emlines,(short *)sp->st_el,nemlines*sizeof(struct emline));
50         sp->st_em = emp;
51         sp->st_se = saveemp;
52         sp->st_tl = tokpatlen;
53         sp->st_ns = nstab;
54 #ifndef STONSTACK
55         return(sp);
56 #endif
57 }
58
59 restorestatus(sp) register state_p sp; {
60
61         stackheight = sp->st_sh;
62         bmove((short *)sp->st_fs,(short *)fakestack,stackheight*sizeof(token_t));
63         nallreg = sp->st_na;
64         bmove((short *)sp->st_ar,(short *)allreg,nallreg*sizeof(int));
65         curtoken = sp->st_ct;
66         bmove((short *)sp->st_do,(short *)dollar,LONGESTPATTERN*sizeof(result_t));
67         bmove((short *)sp->st_mr,(short *)machregs,NREGS*sizeof(struct reginfo));
68         nemlines = sp->st_ne;
69         bmove((short *)sp->st_el,(short *)emlines,nemlines*sizeof(struct emline));
70         emp = sp->st_em;
71         saveemp = sp->st_se;
72         tokpatlen = sp->st_tl;
73         popstr(sp->st_ns);
74 }
75
76 #ifndef STONSTACK
77 freestatus(sp) state_p sp; {
78
79         sp->st_next = stlist;
80         stlist = sp;
81 }
82 #endif
83
84 bmove(from,to,nbytes) register short *from,*to; register nbytes; {
85
86         if (nbytes<=0)
87                 return;
88         assert(sizeof(short)==2 && (nbytes&1)==0);
89         nbytes>>=1;
90         do
91                 *to++ = *from++;
92         while (--nbytes);
93 }