1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1986-2011 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                                                                      *
19*b30d1939SAndy Fiddaman ***********************************************************************/
20*b30d1939SAndy Fiddaman #pragma prototyped
21*b30d1939SAndy Fiddaman /*
22*b30d1939SAndy Fiddaman  * Glenn Fowler
23*b30d1939SAndy Fiddaman  * AT&T Research
24*b30d1939SAndy Fiddaman  *
25*b30d1939SAndy Fiddaman  * preprocessor context switch
26*b30d1939SAndy Fiddaman  *
27*b30d1939SAndy Fiddaman  *	args		op				return
28*b30d1939SAndy Fiddaman  *	(0,0)		free current context		0
29*b30d1939SAndy Fiddaman  *	(0,1)		save current context		current
30*b30d1939SAndy Fiddaman  *	(p,0)		free context p			0
31*b30d1939SAndy Fiddaman  *	(p,1)		make p current context		previous
32*b30d1939SAndy Fiddaman  */
33*b30d1939SAndy Fiddaman 
34*b30d1939SAndy Fiddaman #include "pplib.h"
35*b30d1939SAndy Fiddaman 
36*b30d1939SAndy Fiddaman void*
ppcontext(void * context,int flags)37*b30d1939SAndy Fiddaman ppcontext(void* context, int flags)
38*b30d1939SAndy Fiddaman {
39*b30d1939SAndy Fiddaman 	struct ppcontext*	np = (struct ppcontext*)context;
40*b30d1939SAndy Fiddaman 	struct ppcontext*	op;
41*b30d1939SAndy Fiddaman 
42*b30d1939SAndy Fiddaman 	if (flags & 01)
43*b30d1939SAndy Fiddaman 	{
44*b30d1939SAndy Fiddaman 		if (!(op = pp.context)) op = pp.context = newof(0, struct ppcontext, 1, 0);
45*b30d1939SAndy Fiddaman 		memcpy(op, _PP_CONTEXT_BASE_, sizeof(struct ppcontext));
46*b30d1939SAndy Fiddaman 	}
47*b30d1939SAndy Fiddaman 	else
48*b30d1939SAndy Fiddaman 	{
49*b30d1939SAndy Fiddaman 		if (!(op = np)) op = (struct ppcontext*)_PP_CONTEXT_BASE_;
50*b30d1939SAndy Fiddaman 		if (op->filtab) hashfree(op->filtab);
51*b30d1939SAndy Fiddaman 		if (op->prdtab) hashfree(op->prdtab);
52*b30d1939SAndy Fiddaman 		if (op->symtab) hashfree(op->symtab);
53*b30d1939SAndy Fiddaman 		if (op->date) free(op->date);
54*b30d1939SAndy Fiddaman 		if (op->time) free(op->time);
55*b30d1939SAndy Fiddaman 		if (np)
56*b30d1939SAndy Fiddaman 		{
57*b30d1939SAndy Fiddaman 			free(np);
58*b30d1939SAndy Fiddaman 			np = 0;
59*b30d1939SAndy Fiddaman 		}
60*b30d1939SAndy Fiddaman 		memzero(op, sizeof(struct ppcontext));
61*b30d1939SAndy Fiddaman 		op = 0;
62*b30d1939SAndy Fiddaman 	}
63*b30d1939SAndy Fiddaman 	if (np) memcpy(_PP_CONTEXT_BASE_, np, sizeof(struct ppcontext));
64*b30d1939SAndy Fiddaman 	return((void*)op);
65*b30d1939SAndy Fiddaman }
66