xref: /plan9/sys/src/cmd/spin/vars.c (revision 00d970127b9d44d2b22f4f656717a212dec1f1d2)
1219b2ee8SDavid du Colombier /***** spin: vars.c *****/
2219b2ee8SDavid du Colombier 
3312a1df1SDavid du Colombier /* Copyright (c) 1989-2003 by Lucent Technologies, Bell Laboratories.     */
47dd7cddfSDavid du Colombier /* All Rights Reserved.  This software is for educational purposes only.  */
5312a1df1SDavid du Colombier /* No guarantee whatsoever is expressed or implied by the distribution of */
6312a1df1SDavid du Colombier /* this code.  Permission is given to distribute this code provided that  */
7312a1df1SDavid du Colombier /* this introductory message is not removed and no monies are exchanged.  */
8312a1df1SDavid du Colombier /* Software written by Gerard J. Holzmann.  For tool documentation see:   */
9312a1df1SDavid du Colombier /*             http://spinroot.com/                                       */
10312a1df1SDavid du Colombier /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
11219b2ee8SDavid du Colombier 
12219b2ee8SDavid du Colombier #include "spin.h"
13219b2ee8SDavid du Colombier #include "y.tab.h"
14219b2ee8SDavid du Colombier 
157dd7cddfSDavid du Colombier extern Ordered	*all_names;
16219b2ee8SDavid du Colombier extern RunList	*X, *LastX;
17219b2ee8SDavid du Colombier extern Symbol	*Fname;
187dd7cddfSDavid du Colombier extern char	Buf[];
197dd7cddfSDavid du Colombier extern int	lineno, depth, verbose, xspin, limited_vis;
207dd7cddfSDavid du Colombier extern int	analyze, jumpsteps, nproc, nstop, columns;
21312a1df1SDavid du Colombier extern short	no_arrays, Have_claim;
227dd7cddfSDavid du Colombier extern void	sr_mesg(FILE *, int, int);
237dd7cddfSDavid du Colombier extern void	sr_buf(int, int);
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier static int	getglobal(Lextok *);
267dd7cddfSDavid du Colombier static int	setglobal(Lextok *, int);
277dd7cddfSDavid du Colombier static int	maxcolnr = 1;
28219b2ee8SDavid du Colombier 
29219b2ee8SDavid du Colombier int
getval(Lextok * sn)30219b2ee8SDavid du Colombier getval(Lextok *sn)
31219b2ee8SDavid du Colombier {	Symbol *s = sn->sym;
32219b2ee8SDavid du Colombier 
337dd7cddfSDavid du Colombier 	if (strcmp(s->name, "_") == 0)
347dd7cddfSDavid du Colombier 	{	non_fatal("attempt to read value of '_'", 0);
357dd7cddfSDavid du Colombier 		return 0;
367dd7cddfSDavid du Colombier 	}
37219b2ee8SDavid du Colombier 	if (strcmp(s->name, "_last") == 0)
38219b2ee8SDavid du Colombier 		return (LastX)?LastX->pid:0;
39219b2ee8SDavid du Colombier 	if (strcmp(s->name, "_p") == 0)
40219b2ee8SDavid du Colombier 		return (X && X->pc)?X->pc->seqno:0;
41219b2ee8SDavid du Colombier 	if (strcmp(s->name, "_pid") == 0)
42219b2ee8SDavid du Colombier 	{	if (!X) return 0;
437dd7cddfSDavid du Colombier 		return X->pid - Have_claim;
44219b2ee8SDavid du Colombier 	}
457dd7cddfSDavid du Colombier 	if (strcmp(s->name, "_nr_pr") == 0)
467dd7cddfSDavid du Colombier 		return nproc-nstop;	/* new 3.3.10 */
477dd7cddfSDavid du Colombier 
48219b2ee8SDavid du Colombier 	if (s->context && s->type)
49219b2ee8SDavid du Colombier 		return getlocal(sn);
50219b2ee8SDavid du Colombier 
51219b2ee8SDavid du Colombier 	if (!s->type)	/* not declared locally */
52219b2ee8SDavid du Colombier 	{	s = lookup(s->name); /* try global */
53219b2ee8SDavid du Colombier 		sn->sym = s;	/* fix it */
54219b2ee8SDavid du Colombier 	}
55219b2ee8SDavid du Colombier 	return getglobal(sn);
56219b2ee8SDavid du Colombier }
57219b2ee8SDavid du Colombier 
58219b2ee8SDavid du Colombier int
setval(Lextok * v,int n)59219b2ee8SDavid du Colombier setval(Lextok *v, int n)
60219b2ee8SDavid du Colombier {
61219b2ee8SDavid du Colombier 	if (v->sym->context && v->sym->type)
62219b2ee8SDavid du Colombier 		return setlocal(v, n);
63219b2ee8SDavid du Colombier 	if (!v->sym->type)
64219b2ee8SDavid du Colombier 		v->sym = lookup(v->sym->name);
65219b2ee8SDavid du Colombier 	return setglobal(v, n);
66219b2ee8SDavid du Colombier }
67219b2ee8SDavid du Colombier 
687dd7cddfSDavid du Colombier void
rm_selfrefs(Symbol * s,Lextok * i)697dd7cddfSDavid du Colombier rm_selfrefs(Symbol *s, Lextok *i)
707dd7cddfSDavid du Colombier {
717dd7cddfSDavid du Colombier 	if (!i) return;
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier 	if (i->ntyp == NAME
747dd7cddfSDavid du Colombier 	&&  strcmp(i->sym->name, s->name) == 0
757dd7cddfSDavid du Colombier 	&& (	(!i->sym->context && !s->context)
767dd7cddfSDavid du Colombier 	   ||	( i->sym->context &&  s->context
777dd7cddfSDavid du Colombier 		&& strcmp(i->sym->context->name, s->context->name) == 0)))
787dd7cddfSDavid du Colombier 	{	lineno  = i->ln;
797dd7cddfSDavid du Colombier 		Fname   = i->fn;
807dd7cddfSDavid du Colombier 		non_fatal("self-reference initializing '%s'", s->name);
817dd7cddfSDavid du Colombier 		i->ntyp = CONST;
827dd7cddfSDavid du Colombier 		i->val  = 0;
837dd7cddfSDavid du Colombier 	} else
847dd7cddfSDavid du Colombier 	{	rm_selfrefs(s, i->lft);
857dd7cddfSDavid du Colombier 		rm_selfrefs(s, i->rgt);
867dd7cddfSDavid du Colombier 	}
877dd7cddfSDavid du Colombier }
887dd7cddfSDavid du Colombier 
89219b2ee8SDavid du Colombier int
checkvar(Symbol * s,int n)90219b2ee8SDavid du Colombier checkvar(Symbol *s, int n)
917dd7cddfSDavid du Colombier {	int	i, oln = lineno;	/* calls on eval() change it */
927dd7cddfSDavid du Colombier 	Symbol	*ofnm = Fname;
93219b2ee8SDavid du Colombier 
94312a1df1SDavid du Colombier 	if (!in_bound(s, n))
95219b2ee8SDavid du Colombier 		return 0;
96312a1df1SDavid du Colombier 
97219b2ee8SDavid du Colombier 	if (s->type == 0)
987dd7cddfSDavid du Colombier 	{	non_fatal("undecl var %s (assuming int)", s->name);
99219b2ee8SDavid du Colombier 		s->type = INT;
100219b2ee8SDavid du Colombier 	}
1017dd7cddfSDavid du Colombier 	/* not a STRUCT */
102219b2ee8SDavid du Colombier 	if (s->val == (int *) 0)	/* uninitialized */
103219b2ee8SDavid du Colombier 	{	s->val = (int *) emalloc(s->nel*sizeof(int));
104219b2ee8SDavid du Colombier 		for (i = 0; i < s->nel; i++)
105219b2ee8SDavid du Colombier 		{	if (s->type != CHAN)
1067dd7cddfSDavid du Colombier 			{	rm_selfrefs(s, s->ini);
107219b2ee8SDavid du Colombier 				s->val[i] = eval(s->ini);
1087dd7cddfSDavid du Colombier 			} else if (!analyze)
109219b2ee8SDavid du Colombier 				s->val[i] = qmake(s);
110219b2ee8SDavid du Colombier 	}	}
1117dd7cddfSDavid du Colombier 	lineno = oln;
1127dd7cddfSDavid du Colombier 	Fname  = ofnm;
113*00d97012SDavid du Colombier 
114219b2ee8SDavid du Colombier 	return 1;
115219b2ee8SDavid du Colombier }
116219b2ee8SDavid du Colombier 
1177dd7cddfSDavid du Colombier static int
getglobal(Lextok * sn)118219b2ee8SDavid du Colombier getglobal(Lextok *sn)
119219b2ee8SDavid du Colombier {	Symbol *s = sn->sym;
1207dd7cddfSDavid du Colombier 	int i, n = eval(sn->lft);
121219b2ee8SDavid du Colombier 
1227dd7cddfSDavid du Colombier 	if (s->type == 0 && X && (i = find_lab(s, X->n, 0)))
123219b2ee8SDavid du Colombier 	{	printf("findlab through getglobal on %s\n", s->name);
124219b2ee8SDavid du Colombier 		return i;	/* can this happen? */
125219b2ee8SDavid du Colombier 	}
126219b2ee8SDavid du Colombier 	if (s->type == STRUCT)
127219b2ee8SDavid du Colombier 		return Rval_struct(sn, s, 1); /* 1 = check init */
128219b2ee8SDavid du Colombier 	if (checkvar(s, n))
1297dd7cddfSDavid du Colombier 		return cast_val(s->type, s->val[n], s->nbits);
130219b2ee8SDavid du Colombier 	return 0;
131219b2ee8SDavid du Colombier }
132219b2ee8SDavid du Colombier 
133219b2ee8SDavid du Colombier int
cast_val(int t,int v,int w)1347dd7cddfSDavid du Colombier cast_val(int t, int v, int w)
135312a1df1SDavid du Colombier {	int i=0; short s=0; unsigned int u=0;
136219b2ee8SDavid du Colombier 
137312a1df1SDavid du Colombier 	if (t == PREDEF || t == INT || t == CHAN) i = v;	/* predef means _ */
138219b2ee8SDavid du Colombier 	else if (t == SHORT) s = (short) v;
139219b2ee8SDavid du Colombier 	else if (t == BYTE || t == MTYPE)  u = (unsigned char)v;
140219b2ee8SDavid du Colombier 	else if (t == BIT)   u = (unsigned char)(v&1);
1417dd7cddfSDavid du Colombier 	else if (t == UNSIGNED)
1427dd7cddfSDavid du Colombier 	{	if (w == 0)
1437dd7cddfSDavid du Colombier 			fatal("cannot happen, cast_val", (char *)0);
144312a1df1SDavid du Colombier 	/*	u = (unsigned)(v& ((1<<w)-1));		problem when w=32	*/
145312a1df1SDavid du Colombier 		u = (unsigned)(v& (~0u>>(8*sizeof(unsigned)-w)));	/* doug */
1467dd7cddfSDavid du Colombier 	}
147219b2ee8SDavid du Colombier 
148312a1df1SDavid du Colombier 	if (v != i+s+ (int) u)
149*00d97012SDavid du Colombier 	{	char buf[64]; sprintf(buf, "%d->%d (%d)", v, i+s+u, t);
150219b2ee8SDavid du Colombier 		non_fatal("value (%s) truncated in assignment", buf);
151219b2ee8SDavid du Colombier 	}
152219b2ee8SDavid du Colombier 	return (int)(i+s+u);
153219b2ee8SDavid du Colombier }
154219b2ee8SDavid du Colombier 
1557dd7cddfSDavid du Colombier static int
setglobal(Lextok * v,int m)156219b2ee8SDavid du Colombier setglobal(Lextok *v, int m)
157219b2ee8SDavid du Colombier {
158219b2ee8SDavid du Colombier 	if (v->sym->type == STRUCT)
159219b2ee8SDavid du Colombier 		(void) Lval_struct(v, v->sym, 1, m);
160219b2ee8SDavid du Colombier 	else
161219b2ee8SDavid du Colombier 	{	int n = eval(v->lft);
162219b2ee8SDavid du Colombier 		if (checkvar(v->sym, n))
163*00d97012SDavid du Colombier 		{	int oval = v->sym->val[n];
164*00d97012SDavid du Colombier 			int nval = cast_val(v->sym->type, m, v->sym->nbits);
165*00d97012SDavid du Colombier 			v->sym->val[n] = nval;
166*00d97012SDavid du Colombier 			if (oval != nval)
167*00d97012SDavid du Colombier 			{	v->sym->setat = depth;
168*00d97012SDavid du Colombier 	}	}	}
169219b2ee8SDavid du Colombier 	return 1;
170219b2ee8SDavid du Colombier }
171219b2ee8SDavid du Colombier 
172219b2ee8SDavid du Colombier void
dumpclaims(FILE * fd,int pid,char * s)173219b2ee8SDavid du Colombier dumpclaims(FILE *fd, int pid, char *s)
1747dd7cddfSDavid du Colombier {	extern Lextok *Xu_List; extern int Pid;
1757dd7cddfSDavid du Colombier 	extern short terse;
176219b2ee8SDavid du Colombier 	Lextok *m; int cnt = 0; int oPid = Pid;
177219b2ee8SDavid du Colombier 
178219b2ee8SDavid du Colombier 	for (m = Xu_List; m; m = m->rgt)
179219b2ee8SDavid du Colombier 		if (strcmp(m->sym->name, s) == 0)
180219b2ee8SDavid du Colombier 		{	cnt=1;
181219b2ee8SDavid du Colombier 			break;
182219b2ee8SDavid du Colombier 		}
183219b2ee8SDavid du Colombier 	if (cnt == 0) return;
184219b2ee8SDavid du Colombier 
185219b2ee8SDavid du Colombier 	Pid = pid;
186219b2ee8SDavid du Colombier 	fprintf(fd, "#ifndef XUSAFE\n");
187219b2ee8SDavid du Colombier 	for (m = Xu_List; m; m = m->rgt)
188219b2ee8SDavid du Colombier 	{	if (strcmp(m->sym->name, s) != 0)
189219b2ee8SDavid du Colombier 			continue;
190219b2ee8SDavid du Colombier 		no_arrays = 1;
191219b2ee8SDavid du Colombier 		putname(fd, "\t\tsetq_claim(", m->lft, 0, "");
192219b2ee8SDavid du Colombier 		no_arrays = 0;
193219b2ee8SDavid du Colombier 		fprintf(fd, ", %d, ", m->val);
194219b2ee8SDavid du Colombier 		terse = 1;
195219b2ee8SDavid du Colombier 		putname(fd, "\"", m->lft, 0, "\", h, ");
196219b2ee8SDavid du Colombier 		terse = 0;
197219b2ee8SDavid du Colombier 		fprintf(fd, "\"%s\");\n", s);
198219b2ee8SDavid du Colombier 	}
199219b2ee8SDavid du Colombier 	fprintf(fd, "#endif\n");
200219b2ee8SDavid du Colombier 	Pid = oPid;
201219b2ee8SDavid du Colombier }
202219b2ee8SDavid du Colombier 
203219b2ee8SDavid du Colombier void
dumpglobals(void)204219b2ee8SDavid du Colombier dumpglobals(void)
2057dd7cddfSDavid du Colombier {	Ordered *walk;
206312a1df1SDavid du Colombier 	static Lextok *dummy = ZN;
207219b2ee8SDavid du Colombier 	Symbol *sp;
2087dd7cddfSDavid du Colombier 	int j;
209219b2ee8SDavid du Colombier 
210312a1df1SDavid du Colombier 	if (!dummy)
211312a1df1SDavid du Colombier 		dummy = nn(ZN, NAME, nn(ZN,CONST,ZN,ZN), ZN);
212312a1df1SDavid du Colombier 
2137dd7cddfSDavid du Colombier 	for (walk = all_names; walk; walk = walk->next)
2147dd7cddfSDavid du Colombier 	{	sp = walk->entry;
2157dd7cddfSDavid du Colombier 		if (!sp->type || sp->context || sp->owner
2167dd7cddfSDavid du Colombier 		||  sp->type == PROCTYPE  || sp->type == PREDEF
217312a1df1SDavid du Colombier 		||  sp->type == CODE_FRAG || sp->type == CODE_DECL
2187dd7cddfSDavid du Colombier 		||  (sp->type == MTYPE && ismtype(sp->name)))
219219b2ee8SDavid du Colombier 			continue;
2207dd7cddfSDavid du Colombier 
221219b2ee8SDavid du Colombier 		if (sp->type == STRUCT)
222*00d97012SDavid du Colombier 		{	if ((verbose&4) && !(verbose&64)
223*00d97012SDavid du Colombier 			&&  (sp->setat < depth
224*00d97012SDavid du Colombier 			&&   jumpsteps != depth))
225*00d97012SDavid du Colombier 			{	continue;
226*00d97012SDavid du Colombier 			}
227*00d97012SDavid du Colombier 			dump_struct(sp, sp->name, 0);
2287dd7cddfSDavid du Colombier 			continue;
2297dd7cddfSDavid du Colombier 		}
230219b2ee8SDavid du Colombier 		for (j = 0; j < sp->nel; j++)
2317dd7cddfSDavid du Colombier 		{	int prefetch;
2327dd7cddfSDavid du Colombier 			if (sp->type == CHAN)
233219b2ee8SDavid du Colombier 			{	doq(sp, j, 0);
234219b2ee8SDavid du Colombier 				continue;
2357dd7cddfSDavid du Colombier 			}
2367dd7cddfSDavid du Colombier 			if ((verbose&4) && !(verbose&64)
2377dd7cddfSDavid du Colombier 			&&  (sp->setat < depth
2387dd7cddfSDavid du Colombier 			&&   jumpsteps != depth))
239*00d97012SDavid du Colombier 			{	continue;
240*00d97012SDavid du Colombier 			}
241*00d97012SDavid du Colombier 
242219b2ee8SDavid du Colombier 			dummy->sym = sp;
243219b2ee8SDavid du Colombier 			dummy->lft->val = j;
2447dd7cddfSDavid du Colombier 			/* in case of cast_val warnings, do this first: */
2457dd7cddfSDavid du Colombier 			prefetch = getglobal(dummy);
246219b2ee8SDavid du Colombier 			printf("\t\t%s", sp->name);
247*00d97012SDavid du Colombier 			if (sp->nel > 1 || sp->isarray) printf("[%d]", j);
2487dd7cddfSDavid du Colombier 			printf(" = ");
2497dd7cddfSDavid du Colombier 			sr_mesg(stdout, prefetch,
2507dd7cddfSDavid du Colombier 				sp->type == MTYPE);
2517dd7cddfSDavid du Colombier 			printf("\n");
2527dd7cddfSDavid du Colombier 			if (limited_vis && (sp->hidden&2))
2537dd7cddfSDavid du Colombier 			{	int colpos;
2547dd7cddfSDavid du Colombier 				Buf[0] = '\0';
2557dd7cddfSDavid du Colombier 				if (!xspin)
2567dd7cddfSDavid du Colombier 				{	if (columns == 2)
2577dd7cddfSDavid du Colombier 					sprintf(Buf, "~G%s = ", sp->name);
2587dd7cddfSDavid du Colombier 					else
2597dd7cddfSDavid du Colombier 					sprintf(Buf, "%s = ", sp->name);
2607dd7cddfSDavid du Colombier 				}
2617dd7cddfSDavid du Colombier 				sr_buf(prefetch, sp->type == MTYPE);
2627dd7cddfSDavid du Colombier 				if (sp->colnr == 0)
2637dd7cddfSDavid du Colombier 				{	sp->colnr = maxcolnr;
2647dd7cddfSDavid du Colombier 					maxcolnr = 1+(maxcolnr%10);
2657dd7cddfSDavid du Colombier 				}
2667dd7cddfSDavid du Colombier 				colpos = nproc+sp->colnr-1;
2677dd7cddfSDavid du Colombier 				if (columns == 2)
2687dd7cddfSDavid du Colombier 				{	pstext(colpos, Buf);
2697dd7cddfSDavid du Colombier 					continue;
2707dd7cddfSDavid du Colombier 				}
2717dd7cddfSDavid du Colombier 				if (!xspin)
2727dd7cddfSDavid du Colombier 				{	printf("\t\t%s\n", Buf);
2737dd7cddfSDavid du Colombier 					continue;
2747dd7cddfSDavid du Colombier 				}
2757dd7cddfSDavid du Colombier 				printf("MSC: ~G %s %s\n", sp->name, Buf);
2767dd7cddfSDavid du Colombier 				printf("%3d:\tproc %3d (TRACK) line   1 \"var\" ",
2777dd7cddfSDavid du Colombier 					depth, colpos);
2787dd7cddfSDavid du Colombier 				printf("(state 0)\t[printf('MSC: globvar\\\\n')]\n");
2797dd7cddfSDavid du Colombier 				printf("\t\t%s", sp->name);
280*00d97012SDavid du Colombier 				if (sp->nel > 1 || sp->isarray) printf("[%d]", j);
2817dd7cddfSDavid du Colombier 				printf(" = %s\n", Buf);
282219b2ee8SDavid du Colombier 	}	}	}
283219b2ee8SDavid du Colombier }
284219b2ee8SDavid du Colombier 
285219b2ee8SDavid du Colombier void
dumplocal(RunList * r)286219b2ee8SDavid du Colombier dumplocal(RunList *r)
287312a1df1SDavid du Colombier {	static Lextok *dummy = ZN;
288f3793cddSDavid du Colombier 	Symbol *z, *s;
289219b2ee8SDavid du Colombier 	int i;
290219b2ee8SDavid du Colombier 
291f3793cddSDavid du Colombier 	if (!r) return;
292f3793cddSDavid du Colombier 
293f3793cddSDavid du Colombier 	s = r->symtab;
294f3793cddSDavid du Colombier 
295312a1df1SDavid du Colombier 	if (!dummy)
296312a1df1SDavid du Colombier 		dummy = nn(ZN, NAME, nn(ZN,CONST,ZN,ZN), ZN);
297312a1df1SDavid du Colombier 
298219b2ee8SDavid du Colombier 	for (z = s; z; z = z->next)
299219b2ee8SDavid du Colombier 	{	if (z->type == STRUCT)
3007dd7cddfSDavid du Colombier 		{	dump_struct(z, z->name, r);
3017dd7cddfSDavid du Colombier 			continue;
3027dd7cddfSDavid du Colombier 		}
303219b2ee8SDavid du Colombier 		for (i = 0; i < z->nel; i++)
304219b2ee8SDavid du Colombier 		{	if (z->type == CHAN)
3057dd7cddfSDavid du Colombier 			{	doq(z, i, r);
306219b2ee8SDavid du Colombier 				continue;
3077dd7cddfSDavid du Colombier 			}
3087dd7cddfSDavid du Colombier 			if ((verbose&4) && !(verbose&64)
3097dd7cddfSDavid du Colombier 			&&  (z->setat < depth
3107dd7cddfSDavid du Colombier 			&&   jumpsteps != depth))
3117dd7cddfSDavid du Colombier 				continue;
3127dd7cddfSDavid du Colombier 
313219b2ee8SDavid du Colombier 			dummy->sym = z;
314219b2ee8SDavid du Colombier 			dummy->lft->val = i;
3157dd7cddfSDavid du Colombier 
316219b2ee8SDavid du Colombier 			printf("\t\t%s(%d):%s",
317*00d97012SDavid du Colombier 				r->n->name, r->pid - Have_claim, z->name);
318*00d97012SDavid du Colombier 			if (z->nel > 1 || z->isarray) printf("[%d]", i);
3197dd7cddfSDavid du Colombier 			printf(" = ");
320312a1df1SDavid du Colombier 			sr_mesg(stdout, getval(dummy), z->type == MTYPE);
3217dd7cddfSDavid du Colombier 			printf("\n");
3227dd7cddfSDavid du Colombier 			if (limited_vis && (z->hidden&2))
3237dd7cddfSDavid du Colombier 			{	int colpos;
3247dd7cddfSDavid du Colombier 				Buf[0] = '\0';
3257dd7cddfSDavid du Colombier 				if (!xspin)
3267dd7cddfSDavid du Colombier 				{	if (columns == 2)
3277dd7cddfSDavid du Colombier 					sprintf(Buf, "~G%s(%d):%s = ",
3287dd7cddfSDavid du Colombier 					r->n->name, r->pid, z->name);
3297dd7cddfSDavid du Colombier 					else
3307dd7cddfSDavid du Colombier 					sprintf(Buf, "%s(%d):%s = ",
3317dd7cddfSDavid du Colombier 					r->n->name, r->pid, z->name);
3327dd7cddfSDavid du Colombier 				}
3337dd7cddfSDavid du Colombier 				sr_buf(getval(dummy), z->type==MTYPE);
3347dd7cddfSDavid du Colombier 				if (z->colnr == 0)
3357dd7cddfSDavid du Colombier 				{	z->colnr = maxcolnr;
3367dd7cddfSDavid du Colombier 					maxcolnr = 1+(maxcolnr%10);
3377dd7cddfSDavid du Colombier 				}
3387dd7cddfSDavid du Colombier 				colpos = nproc+z->colnr-1;
3397dd7cddfSDavid du Colombier 				if (columns == 2)
3407dd7cddfSDavid du Colombier 				{	pstext(colpos, Buf);
3417dd7cddfSDavid du Colombier 					continue;
3427dd7cddfSDavid du Colombier 				}
3437dd7cddfSDavid du Colombier 				if (!xspin)
3447dd7cddfSDavid du Colombier 				{	printf("\t\t%s\n", Buf);
3457dd7cddfSDavid du Colombier 					continue;
3467dd7cddfSDavid du Colombier 				}
3477dd7cddfSDavid du Colombier 				printf("MSC: ~G %s(%d):%s %s\n",
3487dd7cddfSDavid du Colombier 					r->n->name, r->pid, z->name, Buf);
3497dd7cddfSDavid du Colombier 
3507dd7cddfSDavid du Colombier 				printf("%3d:\tproc %3d (TRACK) line   1 \"var\" ",
3517dd7cddfSDavid du Colombier 					depth, colpos);
3527dd7cddfSDavid du Colombier 				printf("(state 0)\t[printf('MSC: locvar\\\\n')]\n");
3537dd7cddfSDavid du Colombier 				printf("\t\t%s(%d):%s",
3547dd7cddfSDavid du Colombier 					r->n->name, r->pid, z->name);
355*00d97012SDavid du Colombier 				if (z->nel > 1 || z->isarray) printf("[%d]", i);
3567dd7cddfSDavid du Colombier 				printf(" = %s\n", Buf);
357219b2ee8SDavid du Colombier 	}	}	}
358219b2ee8SDavid du Colombier }
359