// File: /workspace/github_c_makefile_star2_O0/nimble-code[P]gh_cpp/Src/gh_cpp1.c
// Function: expand_macro
static TS *
expand_macro(TS *s, MD *m)
{	TS *ni;
	ML *mp;
#ifdef RECURSE
	TS  *li, *hold_start, *hold_last;
	ARL *sa, *hold_saa;
	MD *mm;
#endif
	ni = prelude(s, m);
	if (ni) return ni;

	if (debugging)
	{	Enesting++; nested("");
		printf("Expand %s\n", m->nm);
	}

#ifdef RECURSE
	/* preserve copy of original actual params */
	/* to be used for formals preceded by # or ## in macro body */

	for (sa = saa; sa; sa = sa->nxt)
		sa->oal = cpy_orig(sa->al);

	/* expand actual params */
	hold_start = start;
	hold_saa   = saa;
	hold_last  = last;
	for (sa = saa; sa; sa = sa->nxt)	/* for each actual param */
	for (ni = sa->al; ni; ni = ni->nxt)	/* check token sequence  */
	{	if (ni->tok == NAME		/* for macro names */
		&& (mm = is_macro(ni->name)) != NULL)
		{
			if (debugging)
			{	nested("expanding macro ");
				printf("%s, pre-expand actual param %s\n",
					m->nm, ni->name);
				nested("Before: "); prep_line(start); printf("%s\n", lbuf);
				nested("Fragmt: "); prep_line(ni); printf("%s\n", lbuf);
			}
			start = ni;
			li = expand_macro(ni, mm);

			if (debugging)
			{	nested("Expnd : "); prep_line(start); printf("%s\n", lbuf);
				nested("LI    : "); prep_line(li); printf("%s\n", lbuf);
			}

			if (start != ni)
			{	if (ni->prv)
				{	ni->prv->nxt = start;
					if (start) start->prv = ni->prv;
				} else
				{	sa->al = start;
				}
				ni = li;
			}	/* else: macro not replaced - e.g., no params */

			start = hold_start;
			saa   = hold_saa;
			last  = hold_last;

			if (debugging)
			{	ARL *na;
				nested("new actual param list:\n");
				for (na = saa; na; na = na->nxt)
				{	prep_line(na->al);
					nested(""); printf("\t%s\n", lbuf);
					printf("\n"); fflush(stdout);
	}	}	}	}
#endif
	frst = lst = (TS *) 0;

	if (debugging && !m->body) printf("	empty body\n");

	purge_body(s, last, m, m->body);

	if (debugging)
	{	nested("PostPurge: ");
		prep_line(frst);
		printf("%s\n", lbuf);
	}

	token_pasting();

	if (debugging)
	{	nested("PostPaste: ");
		prep_line(frst);
		printf("%s\n", lbuf);
	}

	for (ni = frst; ni; ni = ni->nxt)		/* tag new TS seq with macro   */
	{	add_tag(ni, m);
		if (debugging)
		{	nested("");
			printf("tag expansion of %p with %s\t", ni, m->nm);
			tokfull(ni, stdout);
			printf("\n");
		}
		inherit_tags(s, last, ni);
	}

	if (frst)	/* replace macro s..last with expansion frst..lst */
	{	frst->space = s->space;
		if (!s->prv)
		{	start = frst;
			if (debugging) nested("new start\n");
		} else
		{	s->prv->nxt = frst;
			frst->prv = s->prv;
		}
	
		if (last && last->nxt)
		{	last->nxt->prv = lst;
			lst->nxt = last->nxt;
		}
	} else
	{	if (!s->prv)
		{	/* start = s->nxt; */
			start = last?last->nxt:last;
			if (debugging) nested("new start - no frst\n");
		} else
			s->prv->nxt = s->nxt;
	}
	if (debugging)
	{	nested("Done Expanding"); printf(" %s\n\n", m->nm);
		nested("PostAll: "); prep_line(start); printf("%s\n", lbuf);
	
		for (ni = start; ni; ni = ni->nxt)
		{	if (!ni->ml) continue;
			nested(""); printf("tags on %p ", ni);
			tokfull(ni, stdout);
			printf("are: ");
			for (mp = ni->ml; mp; mp = mp->nxt)
				printf(" %s,", mp->m->nm);
			printf("\n");
		}
		printf("\n");
		Enesting--;
	}

	return last;	/* point in parse string now reached */
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x8530
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x7e45
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x851d
cmpl $0x0, 0xe594(%rip)      # 0x163e0
je 0x7e7e
movl 0xf5ec(%rip), %eax      # 0x17440
addl $0x1, %eax
movl %eax, 0xf5e3(%rip)      # 0x17440
leaq 0x99b7(%rip), %rdi      # 0x1181b
callq 0x8840
movq -0x18(%rbp), %rax
movq (%rax), %rsi
leaq 0x90ad(%rip), %rdi      # 0x10f24
movb $0x0, %al
callq 0x40a0
movq 0xf5c3(%rip), %rax      # 0x17448
movq %rax, -0x48(%rbp)
cmpq $0x0, -0x48(%rbp)
je 0x7eb5
movq -0x48(%rbp), %rax
movq (%rax), %rdi
callq 0x8890
movq %rax, %rcx
movq -0x48(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x48(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x48(%rbp)
jmp 0x7e89
movq 0xe50c(%rip), %rax      # 0x163c8
movq %rax, -0x38(%rbp)
movq 0xf581(%rip), %rax      # 0x17448
movq %rax, -0x50(%rbp)
movq 0xf57e(%rip), %rax      # 0x17450
movq %rax, -0x40(%rbp)
movq 0xf56b(%rip), %rax      # 0x17448
movq %rax, -0x48(%rbp)
cmpq $0x0, -0x48(%rbp)
je 0x815d
movq -0x48(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x814a
movq -0x20(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x8137
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x7130
movq %rax, -0x58(%rbp)
cmpq $0x0, %rax
je 0x8137
cmpl $0x0, 0xe4af(%rip)      # 0x163e0
je 0x7fb7
leaq 0x8ff1(%rip), %rdi      # 0x10f2f
callq 0x8840
movq -0x18(%rbp), %rax
movq (%rax), %rsi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rdx
leaq 0x8fe7(%rip), %rdi      # 0x10f40
movb $0x0, %al
callq 0x40a0
leaq 0x8ff9(%rip), %rdi      # 0x10f60
callq 0x8840
movq 0xe455(%rip), %rdi      # 0x163c8
callq 0x4830
leaq 0x901e(%rip), %rdi      # 0x10f9d
leaq 0xd02a(%rip), %rsi      # 0x14fb0
movb $0x0, %al
callq 0x40a0
leaq 0x8fd5(%rip), %rdi      # 0x10f69
callq 0x8840
movq -0x20(%rbp), %rdi
callq 0x4830
leaq 0x8ff4(%rip), %rdi      # 0x10f9d
leaq 0xd000(%rip), %rsi      # 0x14fb0
movb $0x0, %al
callq 0x40a0
movq -0x20(%rbp), %rax
movq %rax, 0xe406(%rip)      # 0x163c8
movq -0x20(%rbp), %rdi
movq -0x58(%rbp), %rsi
callq 0x7e10
movq %rax, -0x30(%rbp)
cmpl $0x0, 0xe406(%rip)      # 0x163e0
je 0x8033
leaq 0x8f8f(%rip), %rdi      # 0x10f72
callq 0x8840
movq 0xe3d9(%rip), %rdi      # 0x163c8
callq 0x4830
leaq 0x8fa2(%rip), %rdi      # 0x10f9d
leaq 0xcfae(%rip), %rsi      # 0x14fb0
movb $0x0, %al
callq 0x40a0
leaq 0x8f6b(%rip), %rdi      # 0x10f7b
callq 0x8840
movq -0x30(%rbp), %rdi
callq 0x4830
leaq 0x8f78(%rip), %rdi      # 0x10f9d
leaq 0xcf84(%rip), %rsi      # 0x14fb0
movb $0x0, %al
callq 0x40a0
movq 0xe38e(%rip), %rax      # 0x163c8
cmpq -0x20(%rbp), %rax
je 0x8093
movq -0x20(%rbp), %rax
cmpq $0x0, 0x20(%rax)
je 0x807d
movq 0xe376(%rip), %rcx      # 0x163c8
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movq %rcx, 0x28(%rax)
cmpq $0x0, 0xe362(%rip)      # 0x163c8
je 0x807b
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rcx
movq 0xe351(%rip), %rax      # 0x163c8
movq %rcx, 0x20(%rax)
jmp 0x808b
movq 0xe344(%rip), %rcx      # 0x163c8
movq -0x48(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x38(%rbp), %rax
movq %rax, 0xe32a(%rip)      # 0x163c8
movq -0x50(%rbp), %rax
movq %rax, 0xf39f(%rip)      # 0x17448
movq -0x40(%rbp), %rax
movq %rax, 0xf39c(%rip)      # 0x17450
cmpl $0x0, 0xe325(%rip)      # 0x163e0
je 0x8135
leaq 0x8ec0(%rip), %rdi      # 0x10f84
callq 0x8840
movq 0xf378(%rip), %rax      # 0x17448
movq %rax, -0x60(%rbp)
cmpq $0x0, -0x60(%rbp)
je 0x8133
movq -0x60(%rbp), %rax
movq (%rax), %rdi
callq 0x4830
leaq 0x972d(%rip), %rdi      # 0x1181b
callq 0x8840
leaq 0x8ea2(%rip), %rdi      # 0x10f9c
leaq 0xceaf(%rip), %rsi      # 0x14fb0
movb $0x0, %al
callq 0x40a0
leaq 0x8f07(%rip), %rdi      # 0x11016
movb $0x0, %al
callq 0x40a0
movq 0xbeb3(%rip), %rax      # 0x13fd0
movq (%rax), %rdi
callq 0x4130
movq -0x60(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x60(%rbp)
jmp 0x80d4
jmp 0x8135
jmp 0x8137
jmp 0x8139
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x7ef7
jmp 0x814c
movq -0x48(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x48(%rbp)
jmp 0x7ee1
movq $0x0, 0xf2f0(%rip) # 0x17458
movq $0x0, 0xf2ed(%rip) # 0x17460
cmpl $0x0, 0xe266(%rip)      # 0x163e0
je 0x8195
movq -0x18(%rbp), %rax
cmpq $0x0, 0x20(%rax)
jne 0x8195
leaq 0x8e13(%rip), %rdi      # 0x10fa1
movb $0x0, %al
callq 0x40a0
movq -0x10(%rbp), %rdi
movq 0xf2b0(%rip), %rsi      # 0x17450
movq -0x18(%rbp), %rdx
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rcx
callq 0x8940
cmpl $0x0, 0xe228(%rip)      # 0x163e0
je 0x81e7
leaq 0x8ded(%rip), %rdi      # 0x10fae
callq 0x8840
movq 0xf293(%rip), %rdi      # 0x17460
callq 0x4830
leaq 0x8dc4(%rip), %rdi      # 0x10f9d
leaq 0xcdd0(%rip), %rsi      # 0x14fb0
movb $0x0, %al
callq 0x40a0
callq 0x8df0
cmpl $0x0, 0xe1ed(%rip)      # 0x163e0
je 0x8222
leaq 0x8dbe(%rip), %rdi      # 0x10fba
callq 0x8840
movq 0xf258(%rip), %rdi      # 0x17460
callq 0x4830
leaq 0x8d89(%rip), %rdi      # 0x10f9d
leaq 0xcd95(%rip), %rsi      # 0x14fb0
movb $0x0, %al
callq 0x40a0
movq 0xf237(%rip), %rax      # 0x17460
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x82b9
movq -0x20(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x7190
cmpl $0x0, 0xe194(%rip)      # 0x163e0
je 0x8294
leaq 0x95c6(%rip), %rdi      # 0x1181b
callq 0x8840
movq -0x20(%rbp), %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
leaq 0x8d5a(%rip), %rdi      # 0x10fc6
movb $0x0, %al
callq 0x40a0
movq -0x20(%rbp), %rdi
movq 0xbd52(%rip), %rax      # 0x13fd0
movq (%rax), %rsi
callq 0x57e0
leaq 0x8d89(%rip), %rdi      # 0x11016
movb $0x0, %al
callq 0x40a0
movq -0x10(%rbp), %rdi
movq 0xf1b1(%rip), %rsi      # 0x17450
movq -0x20(%rbp), %rdx
callq 0x9080
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x822d
cmpq $0x0, 0xf19f(%rip)      # 0x17460
je 0x8374
movq -0x10(%rbp), %rax
movl 0x10(%rax), %ecx
movq 0xf18b(%rip), %rax      # 0x17460
movl %ecx, 0x10(%rax)
movq -0x10(%rbp), %rax
cmpq $0x0, 0x20(%rax)
jne 0x8308
movq 0xf176(%rip), %rax      # 0x17460
movq %rax, 0xe0d7(%rip)      # 0x163c8
cmpl $0x0, 0xe0e8(%rip)      # 0x163e0
je 0x8306
leaq 0x8ce2(%rip), %rdi      # 0x10fe3
callq 0x8840
jmp 0x832e
movq 0xf151(%rip), %rcx      # 0x17460
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq %rcx, 0x28(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
movq 0xf136(%rip), %rax      # 0x17460
movq %rcx, 0x20(%rax)
cmpq $0x0, 0xf11a(%rip)      # 0x17450
je 0x8372
movq 0xf111(%rip), %rax      # 0x17450
cmpq $0x0, 0x28(%rax)
je 0x8372
movq 0xf10b(%rip), %rcx      # 0x17458
movq 0xf0fc(%rip), %rax      # 0x17450
movq 0x28(%rax), %rax
movq %rcx, 0x20(%rax)
movq 0xf0ed(%rip), %rax      # 0x17450
movq 0x28(%rax), %rcx
movq 0xf0ea(%rip), %rax      # 0x17458
movq %rcx, 0x28(%rax)
jmp 0x83dd
movq -0x10(%rbp), %rax
cmpq $0x0, 0x20(%rax)
jne 0x83c7
cmpq $0x0, 0xf0c9(%rip)      # 0x17450
je 0x839a
movq 0xf0c0(%rip), %rax      # 0x17450
movq 0x28(%rax), %rax
movq %rax, -0x68(%rbp)
jmp 0x83a5
movq 0xf0af(%rip), %rax      # 0x17450
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq %rax, 0xe018(%rip)      # 0x163c8
cmpl $0x0, 0xe029(%rip)      # 0x163e0
je 0x83c5
leaq 0x8c2e(%rip), %rdi      # 0x10fee
callq 0x8840
jmp 0x83db
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rcx
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq %rcx, 0x28(%rax)
jmp 0x83dd
cmpl $0x0, 0xdffc(%rip)      # 0x163e0
je 0x8512
leaq 0x8c12(%rip), %rdi      # 0x11003
callq 0x8840
movq -0x18(%rbp), %rax
movq (%rax), %rsi
leaq 0x8c0e(%rip), %rdi      # 0x11012
movb $0x0, %al
callq 0x40a0
leaq 0x8c06(%rip), %rdi      # 0x11018
callq 0x8840
movq 0xdfaa(%rip), %rdi      # 0x163c8
callq 0x4830
leaq 0x8b73(%rip), %rdi      # 0x10f9d
leaq 0xcb7f(%rip), %rsi      # 0x14fb0
movb $0x0, %al
callq 0x40a0
movq 0xdf89(%rip), %rax      # 0x163c8
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x84f5
movq -0x20(%rbp), %rax
cmpq $0x0, 0x18(%rax)
jne 0x845e
jmp 0x84e4
leaq 0x93b6(%rip), %rdi      # 0x1181b
callq 0x8840
movq -0x20(%rbp), %rsi
leaq 0x8bad(%rip), %rdi      # 0x11022
movb $0x0, %al
callq 0x40a0
movq -0x20(%rbp), %rdi
movq 0xbb49(%rip), %rax      # 0x13fd0
movq (%rax), %rsi
callq 0x57e0
leaq 0x8b98(%rip), %rdi      # 0x1102e
movb $0x0, %al
callq 0x40a0
movq -0x20(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x84d6
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rsi
leaq 0x8b73(%rip), %rdi      # 0x11034
movb $0x0, %al
callq 0x40a0
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x84a9
leaq 0x8b39(%rip), %rdi      # 0x11016
movb $0x0, %al
callq 0x40a0
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x8443
leaq 0x8b1a(%rip), %rdi      # 0x11016
movb $0x0, %al
callq 0x40a0
movl 0xef37(%rip), %eax      # 0x17440
addl $-0x1, %eax
movl %eax, 0xef2e(%rip)      # 0x17440
movq 0xef37(%rip), %rax      # 0x17450
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x70, %rsp
popq %rbp
retq
nopw (%rax,%rax)