93 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef NORCSID
 | |
| static char rcsid[] = "$Header$";
 | |
| #endif
 | |
| 
 | |
| #include "assert.h"
 | |
| #include "param.h"
 | |
| #include "tables.h"
 | |
| #include "types.h"
 | |
| #include <cg_pattern.h>
 | |
| #include "data.h"
 | |
| #include "result.h"
 | |
| #include "state.h"
 | |
| #include "extern.h"
 | |
| 
 | |
| /*
 | |
|  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | |
|  * See the copyright notice in the ACK home directory, in the file "Copyright".
 | |
|  *
 | |
|  * Author: Hans van Staveren
 | |
|  */
 | |
| 
 | |
| extern int nstab;	/* salloc.c */
 | |
| 
 | |
| #ifndef STONSTACK
 | |
| extern string myalloc();
 | |
| 
 | |
| state_p stlist=0;
 | |
| #endif
 | |
| 
 | |
| #ifdef STONSTACK
 | |
| savestatus(sp) register state_p sp; {
 | |
| #else
 | |
| state_p savestatus() {
 | |
| 	register state_p sp;
 | |
| 
 | |
| 	if ((sp=stlist)==0)
 | |
| 		sp = (state_p) myalloc( sizeof( *sp ) );
 | |
| 	else
 | |
| 		stlist=sp->st_next;
 | |
| #endif
 | |
| 	sp->st_sh = stackheight;
 | |
| 	bmove((short *)fakestack,(short *)sp->st_fs,stackheight*sizeof(token_t));
 | |
| 	sp->st_na = nallreg;
 | |
| 	bmove((short *)allreg,(short *)sp->st_ar,nallreg*sizeof(int));
 | |
| 	sp->st_ct = curtoken;
 | |
| 	bmove((short *)dollar,(short *)sp->st_do,LONGESTPATTERN*sizeof(result_t));
 | |
| 	bmove((short *)machregs,(short *)sp->st_mr,NREGS*sizeof(struct reginfo));
 | |
| 	sp->st_ne = nemlines;
 | |
| 	bmove((short *)emlines,(short *)sp->st_el,nemlines*sizeof(struct emline));
 | |
| 	sp->st_em = emp;
 | |
| 	sp->st_se = saveemp;
 | |
| 	sp->st_tl = tokpatlen;
 | |
| 	sp->st_ns = nstab;
 | |
| #ifndef STONSTACK
 | |
| 	return(sp);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| restorestatus(sp) register state_p sp; {
 | |
| 
 | |
| 	stackheight = sp->st_sh;
 | |
| 	bmove((short *)sp->st_fs,(short *)fakestack,stackheight*sizeof(token_t));
 | |
| 	nallreg = sp->st_na;
 | |
| 	bmove((short *)sp->st_ar,(short *)allreg,nallreg*sizeof(int));
 | |
| 	curtoken = sp->st_ct;
 | |
| 	bmove((short *)sp->st_do,(short *)dollar,LONGESTPATTERN*sizeof(result_t));
 | |
| 	bmove((short *)sp->st_mr,(short *)machregs,NREGS*sizeof(struct reginfo));
 | |
| 	nemlines = sp->st_ne;
 | |
| 	bmove((short *)sp->st_el,(short *)emlines,nemlines*sizeof(struct emline));
 | |
| 	emp = sp->st_em;
 | |
| 	saveemp = sp->st_se;
 | |
| 	tokpatlen = sp->st_tl;
 | |
| 	popstr(sp->st_ns);
 | |
| }
 | |
| 
 | |
| #ifndef STONSTACK
 | |
| freestatus(sp) state_p sp; {
 | |
| 
 | |
| 	sp->st_next = stlist;
 | |
| 	stlist = sp;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| bmove(from,to,nbytes) register short *from,*to; register nbytes; {
 | |
| 
 | |
| 	if (nbytes<=0)
 | |
| 		return;
 | |
| 	assert(sizeof(short)==2 && (nbytes&1)==0);
 | |
| 	nbytes>>=1;
 | |
| 	do
 | |
| 		*to++ = *from++;
 | |
| 	while (--nbytes);
 | |
| }
 |