1 /***** spin: pangen3.h *****/
3 /* Copyright (c) 1989-2003 by Lucent Technologies, Bell Laboratories. */
4 /* All Rights Reserved. This software is for educational purposes only. */
5 /* No guarantee whatsoever is expressed or implied by the distribution of */
6 /* this code. Permission is given to distribute this code provided that */
7 /* this introductory message is not removed and no monies are exchanged. */
8 /* Software written by Gerard J. Holzmann. For tool documentation see: */
9 /* http://spinroot.com/ */
10 /* Send all bug-reports and/or questions to: bugs@spinroot.com */
11 /* (c) 2007: small additions for V5.0 to support multi-core verifications */
13 static char *Head0
[] = {
14 "#if defined(BFS) && defined(REACH)",
15 "#undef REACH", /* redundant with bfs */
22 "typedef struct Trans {",
23 " short atom; /* if &2 = atomic trans; if &8 local */",
25 " short escp[HAS_UNLESS]; /* lists the escape states */",
26 " short e_trans; /* if set, this is an escp-trans */",
28 " short tpe[2]; /* class of operation (for reduction) */",
29 " short qu[6]; /* for conditional selections: qid's */",
30 " uchar ty[6]; /* ditto: type's */",
32 " short om; /* completion status of preselects */",
34 " char *tp; /* src txt of statement */",
35 " int st; /* the nextstate */",
36 " int t_id; /* transition id, unique within proc */",
37 " int forw; /* index forward transition */",
38 " int back; /* index return transition */",
39 " struct Trans *nxt;",
41 "#define qptr(x) (((uchar *)&now)+(int)q_offset[x])",
42 "#define pptr(x) (((uchar *)&now)+(int)proc_offset[x])",
43 /* "#define Pptr(x) ((proc_offset[x])?pptr(x):noptr)", */
44 "extern uchar *Pptr(int);",
46 "#define q_sz(x) (((Q0 *)qptr(x))->Qlen)\n",
48 "#define VECTORSZ 1024 /* sv size in bytes */",
53 static char *Header
[] = {
71 "#if !defined(SAFETY) && !defined(MA)",
76 "#if defined(SAFETY) && !defined(HASH64)",
89 "#if !defined(LC) && defined(SC)",
93 "#if defined(COLLAPSE2) || defined(COLLAPSE3) || defined(COLLAPSE4)",
94 "/* accept the above for backward compatibility */",
101 "#ifdef HC0", /* 32 bits */
104 "#ifdef HC1", /* 32+8 bits */
107 "#ifdef HC2", /* 32+16 bits */
110 "#ifdef HC3", /* 32+24 bits */
113 "#ifdef HC4", /* 32+32 bits - combine with -DMA=8 */
117 "#if NCORE>1 && !defined(SEP_STATE)",
118 "unsigned long *ncomps; /* in shared memory */",
120 "unsigned long ncomps[256+2];",
125 "#define MAXPROC 255",
126 "#define WS sizeof(void *) /* word size in bytes */",
127 "typedef struct Stack { /* for queues and processes */",
128 "#if VECTORSZ>32000",
144 " struct Stack *nxt;",
145 " struct Stack *lst;",
147 "typedef struct Svtack { /* for complete state vector */",
148 "#if VECTORSZ>32000",
152 " short o_delta; /* current size of frame */",
153 " short m_delta; /* maximum size of frame */",
161 static char *Header0
[] = {
163 " struct Svtack *nxt;",
164 " struct Svtack *lst;",
166 "Trans ***trans; /* 1 ptr per state per proctype */\n",
167 "struct H_el *Lstate;",
168 "int depthfound = -1; /* loop detection */",
169 "#if VECTORSZ>32000",
170 "int proc_offset[MAXPROC];",
171 "int q_offset[MAXQ];",
173 "short proc_offset[MAXPROC];",
174 "short q_offset[MAXQ];",
176 "uchar proc_skip[MAXPROC];",
177 "uchar q_skip[MAXQ];",
178 "unsigned long vsize; /* vector size in bytes */",
180 "int vprefix=0, svfd; /* runtime option -pN */",
182 "char *tprefix = \"trail\"; /* runtime option -tsuffix */",
183 "short boq = -1; /* blocked_on_queue status */",
187 static char *Head1
[] = {
188 "typedef struct State {",
191 " uchar _a_t; /* cycle detection */",
193 in _a_t
: bits
0,4, and 5 =(1|16|32) are set during a
2nd dfs
194 bit
1 is used as the A
-bit
for fairness
195 bit
7 (128) is the proviso bit
, for reduced
2nd
dfs (acceptance
)
198 " uchar _cnt[NFAIR]; /* counters, weak fairness */",
205 * noticed alignment problems with some Solaris
206 * compilers, if widest field isn't wordsized
209 "#if VECTORSZ<65536",
211 " unsigned short _vsz;",
213 " unsigned long _vsz;",
217 "#ifdef HAS_LAST", /* cannot go before _cnt - see hstore() */
218 " uchar _last; /* pid executed in last step */",
220 "#ifdef EVENT_TRACE",
221 "#if nstates_event<256",
224 " unsigned short _event;",
230 static char *Addp0
[] = {
231 /* addproc(....parlist... */ ")",
232 "{ int j, h = now._nr_pr;",
236 " uchar *o_this = this;\n",
238 " if (TstOnly) return (h < MAXPROC);",
240 "#ifndef NOBOUNDCHECK",
241 "/* redefine Index only within this procedure */",
243 "#define Index(x, y) Boundcheck(x, y, 0, 0, 0)",
245 " if (h >= MAXPROC)",
246 " Uerror(\"too many processes\");",
248 " case 0: j = sizeof(P0); break;",
252 static char *Addp1
[] = {
253 " default: Uerror(\"bad proc - addproc\");",
256 " proc_skip[h] = WS-(vsize%%WS);",
258 " proc_skip[h] = 0;",
260 " for (k = vsize + (int) proc_skip[h]; k > vsize; k--)",
261 " Mask[k-1] = 1; /* align */",
263 " vsize += (int) proc_skip[h];",
264 " proc_offset[h] = vsize;",
268 " write(svfd, (uchar *) &dummy, sizeof(int)); /* mark */",
269 " write(svfd, (uchar *) &h, sizeof(int));",
270 " write(svfd, (uchar *) &n, sizeof(int));",
271 "#if VECTORSZ>32000",
272 " write(svfd, (uchar *) &proc_offset[h], sizeof(int));",
274 " write(svfd, (uchar *) &proc_offset[h], sizeof(short));",
276 " write(svfd, (uchar *) &now, vprefix-4*sizeof(int)); /* padd */",
280 " if (fairness && ((int) now._nr_pr + 1 >= (8*NFAIR)/2))",
281 " { printf(\"pan: error: too many processes -- current\");",
282 " printf(\" max is %%d procs (-DNFAIR=%%d)\\n\",",
283 " (8*NFAIR)/2 - 2, NFAIR);",
284 " printf(\"\\trecompile with -DNFAIR=%%d\\n\",",
291 " now._vsz = vsize;",
294 " for (k = 1; k <= Air[n]; k++)",
295 " Mask[vsize - k] = 1; /* pad */",
296 " Mask[vsize-j] = 1; /* _pid */",
298 " hmax = max(hmax, vsize);",
299 " if (vsize >= VECTORSZ)",
300 " { printf(\"pan: error, VECTORSZ too small, recompile pan.c\");",
301 " printf(\" with -DVECTORSZ=N with N>%%d\\n\", (int) vsize);",
302 " Uerror(\"aborting\");",
304 " memset((char *)pptr(h), 0, j);",
306 " if (BASE > 0 && h > 0)",
307 " ((P0 *)this)->_pid = h-BASE;",
309 " ((P0 *)this)->_pid = h;",
314 static char *Addq0
[] = {
316 "addqueue(int n, int is_rv)",
317 "{ int j=0, i = now._nr_qs;",
322 " Uerror(\"too many queues\");",
327 static char *Addq1
[] = {
328 " default: Uerror(\"bad queue - addqueue\");",
331 " q_skip[i] = WS-(vsize%%WS);",
337 " if (is_rv) k += j;",
339 " for (k += (int) q_skip[i]; k > vsize; k--)",
342 " vsize += (int) q_skip[i];",
343 " q_offset[i] = vsize;",
347 " now._vsz = vsize;",
349 " hmax = max(hmax, vsize);",
350 " if (vsize >= VECTORSZ)",
351 " Uerror(\"VECTORSZ is too small, edit pan.h\");",
352 " memset((char *)qptr(i), 0, j);",
353 " ((Q0 *)qptr(i))->_t = n;",
359 static char *Addq11
[] = {
360 "{ int j; uchar *z;\n",
365 " uerror(\"ref to uninitialized chan name (sending)\");",
366 " if (into >= (int) now._nr_qs || into < 0)",
367 " Uerror(\"qsend bad queue#\");",
369 " j = ((Q0 *)qptr(into))->Qlen;",
370 " switch (((Q0 *)qptr(into))->_t) {",
374 static char *Addq2
[] = {
375 " case 0: printf(\"queue %%d was deleted\\n\", into+1);",
376 " default: Uerror(\"bad queue - qsend\");",
378 "#ifdef EVENT_TRACE",
379 " if (in_s_scope(into+1))",
380 " require('s', into);",
388 " { uerror(\"ref to uninitialized chan name (q_zero)\");",
391 " switch(((Q0 *)qptr(from))->_t) {",
395 static char *Addq3
[] = {
396 " case 0: printf(\"queue %%d was deleted\\n\", from+1);",
398 " Uerror(\"bad queue q-zero\");",
403 "{ if (q_zero(from))",
404 " { printf(\"==>> a test of the contents of a rv \");",
405 " printf(\"channel always returns FALSE\\n\");",
406 " uerror(\"error to poll rendezvous channel\");",
413 "setq_claim(int x, int m, char *s, int y, char *p)",
415 " uerror(\"x[rs] claim on uninitialized channel\");",
416 " if (x < 0 || x > MAXQ)",
417 " Uerror(\"cannot happen setq_claim\");",
421 " if (m&2) q_S_check(x, y);",
422 " if (m&1) q_R_check(x, y);",
424 "short q_sender[MAXQ+1];",
426 "q_S_check(int x, int who)",
427 "{ if (!q_sender[x])",
428 " { q_sender[x] = who+1;",
431 " { printf(\"chan %%s (%%d), \",",
433 " printf(\"sndr proc %%s (%%d)\\n\",",
434 " p_name[who], who);",
435 " uerror(\"xs chans cannot be used for rv\");",
439 " if (q_sender[x] != who+1)",
440 " { printf(\"pan: xs assertion violated: \");",
441 " printf(\"access to chan <%%s> (%%d)\\npan: by \",",
443 " if (q_sender[x] > 0 && p_name[q_sender[x]-1])",
444 " printf(\"%%s (proc %%d) and by \",",
445 " p_name[q_sender[x]-1], q_sender[x]-1);",
446 " printf(\"%%s (proc %%d)\\n\",",
447 " p_name[who], who);",
448 " uerror(\"error, partial order reduction invalid\");",
452 "short q_recver[MAXQ+1];",
454 "q_R_check(int x, int who)",
455 "{ if (!q_recver[x])",
456 " { q_recver[x] = who+1;",
459 " { printf(\"chan %%s (%%d), \",",
461 " printf(\"recv proc %%s (%%d)\\n\",",
462 " p_name[who], who);",
463 " uerror(\"xr chans cannot be used for rv\");",
467 " if (q_recver[x] != who+1)",
468 " { printf(\"pan: xr assertion violated: \");",
469 " printf(\"access to chan %%s (%%d)\\npan: \",",
471 " if (q_recver[x] > 0 && p_name[q_recver[x]-1])",
472 " printf(\"by %%s (proc %%d) and \",",
473 " p_name[q_recver[x]-1], q_recver[x]-1);",
474 " printf(\"by %%s (proc %%d)\\n\",",
475 " p_name[who], who);",
476 " uerror(\"error, partial order reduction invalid\");",
484 " uerror(\"ref to uninitialized chan name (len)\");",
485 " return ((Q0 *)qptr(x))->Qlen;",
490 " uerror(\"ref to uninitialized chan name (qfull)\");",
491 " switch(((Q0 *)qptr(from))->_t) {",
495 static char *Addq4
[] = {
496 " case 0: printf(\"queue %%d was deleted\\n\", from+1);",
498 " Uerror(\"bad queue - q_full\");",
504 "{ /* empty or full */",
505 " return !q_len(from) || q_full(from);",
510 "qrecv(int from, int slot, int fld, int done)",
514 " uerror(\"ref to uninitialized chan name (receiving)\");",
515 " if (from >= (int) now._nr_qs || from < 0)",
516 " Uerror(\"qrecv bad queue#\");",
518 "#ifdef EVENT_TRACE",
519 " if (done && (in_r_scope(from+1)))",
520 " require('r', from);",
522 " switch (((Q0 *)qptr(from))->_t) {",
526 static char *Addq5
[] = {
527 " case 0: printf(\"queue %%d was deleted\\n\", from+1);",
528 " default: Uerror(\"bad queue - qrecv\");",
536 "col_q(int i, char *z)",
539 " Q0 *ptr = (Q0 *) qptr(i);",
540 " switch (ptr->_t) {",
544 static char *Code0
[] = {
548 " memset((char *)&now, 0, sizeof(State));",
549 " vsize = (unsigned long) (sizeof(State) - VECTORSZ);",
551 " now._vsz = vsize;",
553 "/* optional provisioning statements, e.g. to */",
554 "/* set hidden variables, used as constants */",
562 static char *R0
[] = {
563 " Maxbody = max(Maxbody, ((int) sizeof(P%d)));",
564 " reached[%d] = reached%d;",
565 " accpstate[%d] = (uchar *) emalloc(nstates%d);",
566 " progstate[%d] = (uchar *) emalloc(nstates%d);",
567 " loopstate%d = loopstate[%d] = (uchar *) emalloc(nstates%d);",
568 " stopstate[%d] = (uchar *) emalloc(nstates%d);",
569 " visstate[%d] = (uchar *) emalloc(nstates%d);",
570 " mapstate[%d] = (short *) emalloc(nstates%d * sizeof(short));",
572 " NrStates[%d] = nstates%d;",
574 " stopstate[%d][endstate%d] = 1;",
578 static char *R0a
[] = {
579 " retrans(%d, nstates%d, start%d, src_ln%d, reached%d, loopstate%d);",
582 static char *R0b
[] = {
583 " if (state_tables)",
584 " { printf(\"\\nTransition Type: \");",
585 " printf(\"A=atomic; D=d_step; L=local; G=global\\n\");",
586 " printf(\"Source-State Labels: \");",
587 " printf(\"p=progress; e=end; a=accept;\\n\");",
589 " printf(\"Note: statement merging was used. Only the first\\n\");",
590 " printf(\" stmnt executed in each merge sequence is shown\\n\");",
591 " printf(\" (use spin -a -o3 to disable statement merging)\\n\");",
598 static char *Code1
[] = {
600 " #define ACCEPT_LAB 1 /* at least 1 in np_ */",
602 " #define ACCEPT_LAB %d /* user-defined accept labels */",
606 " #warning -DMEMLIM takes precedence over -DMEMCNT",
610 " #warning using minimal value -DMEMCNT=20 (=1MB)",
611 " #define MEMLIM (1)",
615 " #define MEMLIM (1)",
619 " #error excessive value for MEMCNT",
621 " #define MEMLIM (1<<(MEMCNT-20))",
628 "#if NCORE>1 && !defined(MEMLIM)",
629 " #define MEMLIM (2048) /* need a default, using 2 GB */",
634 static char *Code3
[] = {
635 "#define PROG_LAB %d /* progress labels */",
639 static char *R2
[] = {
640 "uchar *accpstate[%d];",
641 "uchar *progstate[%d];",
642 "uchar *loopstate[%d];",
643 "uchar *reached[%d];",
644 "uchar *stopstate[%d];",
645 "uchar *visstate[%d];",
646 "short *mapstate[%d];",
652 static char *R3
[] = {
653 " Maxbody = max(Maxbody, ((int) sizeof(Q%d)));",
656 static char *R4
[] = {
657 " r_ck(reached%d, nstates%d, %d, src_ln%d, src_file%d);",
660 static char *R5
[] = {
661 " case %d: j = sizeof(P%d); break;",
664 static char *R6
[] = {
668 "#ifndef NOBOUNDCHECK",
670 "#define Index(x, y) Boundcheck(x, y, II, tt, t)",
673 "#if defined(BITSTATE) && defined(COLLAPSE)",
674 "/* just to allow compilation, to generate the error */",
675 "long col_p(int i, char *z) { return 0; }",
676 "long col_q(int i, char *z) { return 0; }",
681 "col_p(int i, char *z)",
682 "{ int j, k; unsigned long ordinal(char *, long, short);",
684 " P0 *ptr = (P0 *) pptr(i);",
685 " switch (ptr->_t) {",
686 " case 0: j = sizeof(P0); break;",
689 static char *R8a
[] = {
690 " default: Uerror(\"bad proctype - collapse\");",
692 " if (z) x = z; else x = scratch;",
693 " y = (char *) ptr; k = proc_offset[i];",
695 " for ( ; j > 0; j--, y++)",
696 " if (!Mask[k++]) *x++ = *y;",
698 " for (j = 0; j < WS-1; j++)",
701 " if (z) return (long) (x - z);",
702 " return ordinal(scratch, x-scratch, (short) (2+ptr->_t));",
708 static char *R8b
[] = {
709 " default: Uerror(\"bad qtype - collapse\");",
711 " if (z) x = z; else x = scratch;",
712 " y = (char *) ptr; k = q_offset[i];",
714 " /* no need to store the empty slots at the end */",
715 " j -= (q_max[ptr->_t] - ptr->Qlen) * ((j - 2)/q_max[ptr->_t]);",
717 " for ( ; j > 0; j--, y++)",
718 " if (!Mask[k++]) *x++ = *y;",
720 " for (j = 0; j < WS-1; j++)",
723 " if (z) return (long) (x - z);",
724 " return ordinal(scratch, x-scratch, 1); /* chan */",
731 static char *R12
[] = {
732 "\t\tcase %d: r = ((Q%d *)z)->contents[slot].fld%d; break;",
738 "{ int _m=0, j; uchar *z;\n",
743 " uerror(\"ref to uninitialized chan (unsend)\");",
745 " j = ((Q0 *)z)->Qlen;",
746 " ((Q0 *)z)->Qlen = --j;",
747 " switch (((Q0 *)qptr(into))->_t) {",
751 " default: Uerror(\"bad queue - unsend\");",
756 "unrecv(int from, int slot, int fld, int fldvar, int strt)",
757 "{ int j; uchar *z;\n",
759 " uerror(\"ref to uninitialized chan (unrecv)\");",
761 " j = ((Q0 *)z)->Qlen;",
762 " if (strt) ((Q0 *)z)->Qlen = j+1;",
763 " switch (((Q0 *)qptr(from))->_t) {",
767 " default: Uerror(\"bad queue - qrecv\");",
772 static char *Proto
[] = {
774 "/** function prototypes **/",
775 "char *emalloc(unsigned long);",
776 "char *Malloc(unsigned long);",
777 "int Boundcheck(int, int, int, int, Trans *);",
778 "int addqueue(int, int);",
779 "/* int atoi(char *); */",
780 "/* int abort(void); */",
781 "int close(int);", /* should probably remove this */
784 "int creat(char *, unsigned short);",
785 "int write(int, void *, unsigned);",
788 "int delproc(int, int);",
789 "int endstate(void);",
790 "int hstore(char *, int);",
792 "int gstore(char *, int, uchar);",
794 "int q_cond(short, Trans *);",
798 "int qrecv(int, int, int, int);",
800 "/* void *sbrk(int); */",
801 "void Uerror(char *);",
802 "void assert(int, char *, int, int, Trans *);",
803 "void c_chandump(int);",
804 "void c_globals(void);",
805 "void c_locals(int, int);",
806 "void checkcycles(void);",
807 "void crack(int, int, Trans *, short *);",
808 "void d_sfh(const char *, int);",
809 "void sfh(const char *, int);",
810 "void d_hash(uchar *, int);",
811 "void s_hash(uchar *, int);",
812 "void r_hash(uchar *, int);",
814 "void do_reach(void);",
815 "void pan_exit(int);",
818 "void imed(Trans *, int, int, int);",
819 "void new_state(void);",
820 "void p_restor(int);",
821 "void putpeg(int, int);",
822 "void putrail(void);",
823 "void q_restor(void);",
824 "void retrans(int, int, int, short *, uchar *, uchar *);",
825 "void settable(void);",
826 "void setq_claim(int, int, char *, int, char *);",
827 "void sv_restor(void);",
828 "void sv_save(void);",
829 "void tagtable(int, int, int, short *, uchar *);",
830 "void do_dfs(int, int, int, short *, uchar *, uchar *);",
831 "void uerror(char *);",
832 "void unrecv(int, int, int, int, int);",
833 "void usage(FILE *);",
834 "void wrap_stats(void);",
835 "#if defined(FULLSTACK) && defined(BITSTATE)",
836 "int onstack_now(void);",
837 "void onstack_init(void);",
838 "void onstack_put(void);",
839 "void onstack_zap(void);",
842 "int q_S_check(int, int);",
843 "int q_R_check(int, int);",
844 "uchar q_claim[MAXQ+1];",
845 "char *q_name[MAXQ+1];",
846 "char *p_name[MAXPROC+1];",
851 static char *SvMap
[] = {
854 "{ char ctd[1024], carg[64];",
856 " strcpy(ctd, \"-DBITSTATE \");",
858 " strcpy(ctd, \"\");",
861 " strcat(ctd, \"-DNOVSZ \");",
864 " strcat(ctd, \"-DREVERSE \");",
867 " strcat(ctd, \"-DT_REVERSE \");",
871 " sprintf(carg, \"-DRANDOMIZE=%%d \", RANDOMIZE);",
872 " strcat(ctd, carg);",
874 " strcat(ctd, \"-DRANDOMIZE \");",
878 " sprintf(carg, \"-DSCHED=%%d \", SCHED);",
879 " strcat(ctd, carg);",
882 " strcat(ctd, \"-DBFS \");",
885 " sprintf(carg, \"-DMEMLIM=%%d \", MEMLIM);",
886 " strcat(ctd, carg);",
889 " sprintf(carg, \"-DMEMCNT=%%d \", MEMCNT);",
890 " strcat(ctd, carg);",
894 " strcat(ctd, \"-DNOCLAIM \");",
897 " strcat(ctd, \"-DSAFETY \");",
900 " strcat(ctd, \"-DNOFAIR \");",
904 " { sprintf(carg, \"-DNFAIR=%%d \", NFAIR);",
905 " strcat(ctd, carg);",
911 " strcat(ctd, \"-DNOREDUCE \");",
914 " strcat(ctd, \"-DXUSAFE \");",
918 " strcat(ctd, \"-DNP \");",
921 " strcat(ctd, \"-DPEG \");",
924 " strcat(ctd, \"-DVAR_RANGES \");",
927 " strcat(ctd, \"-DHC0 \");",
930 " strcat(ctd, \"-DHC1 \");",
933 " strcat(ctd, \"-DHC2 \");",
936 " strcat(ctd, \"-DHC3 \");",
939 " strcat(ctd, \"-DHC4 \");",
942 " strcat(ctd, \"-DCHECK \");",
945 " strcat(ctd, \"-DCTL \");",
948 " strcat(ctd, \"-DNIBIS \");",
950 "#ifdef NOBOUNDCHECK",
951 " strcat(ctd, \"-DNOBOUNDCHECK \");",
954 " strcat(ctd, \"-DNOSTUTTER \");",
957 " strcat(ctd, \"-DREACH \");",
960 " strcat(ctd, \"-DPRINTF \");",
963 " strcat(ctd, \"-DOTIM \");",
966 " strcat(ctd, \"-DCOLLAPSE \");",
969 " sprintf(carg, \"-DMA=%%d \", MA);",
970 " strcat(ctd, carg);",
973 " strcat(ctd, \"-DSVDUMP \");",
976 " if (VECTORSZ != 1024)",
977 " { sprintf(carg, \"-DVECTORSZ=%%d \", VECTORSZ);",
978 " strcat(ctd, carg);",
982 " strcat(ctd, \"-DVERBOSE \");",
985 " strcat(ctd, \"-DCHECK \");",
988 " strcat(ctd, \"-DSDUMP \");",
991 " sprintf(carg, \"-DNCORE=%%d \", NCORE);",
992 " strcat(ctd, carg);",
995 " sprintf(carg, \"-DSFH \");",
996 " strcat(ctd, carg);",
1000 " { sprintf(carg, \"-DVMAX=%%d \", VMAX);",
1001 " strcat(ctd, carg);",
1006 " { sprintf(carg, \"-DPMAX=%%d \", PMAX);",
1007 " strcat(ctd, carg);",
1012 " { sprintf(carg, \"-DQMAX=%%d \", QMAX);",
1013 " strcat(ctd, carg);",
1016 "#ifdef SET_WQ_SIZE",
1017 " sprintf(carg, \"-DSET_WQ_SIZE=%%d \", SET_WQ_SIZE);",
1018 " strcat(ctd, carg);",
1020 " printf(\"Compiled as: cc -o pan %%span.c\\n\", ctd);",
This page took 0.090228 seconds and 4 git commands to generate.