// File: /workspace/github_c_makefile_star2_O2/mishun[P]plantri/fullgen.c
// Function: add_polygon_invers
void add_polygon_invers(int n, PLANMAP map, KANTE *start, KANTE **lastout)
/* fuegt ein weiteres polygon einer Reihe an. Dabei ist n die groesse des polygons. 
   Angefuegt wird immer an start. Ueber lastout wird die letzte Aussenkante des 
   Polygons zurueckgegeben.
   Es arbeitet wie add_polygon nur im anderen Drehsinn. Das wird fuer die REkonstruktion
   der Patches gebraucht
   Im Falle, dass nur eine Kante eingefuegt werden muss, wird *lastout auf die naechste 
   zu benutzende Aussenkante gesetzt. Die ist nicht mit dem gebauten Polygon
   inzident. Im Falle, dass es sie nicht gibt, wird *lastout auf nil gesetzt.

   angefuegt wird in den Winkel in prev-Richtung, d.h. zwischen start und start->prev

 */


{
int i, new_tempknz, tempknz;
KANTE *ende, *run;
int common_vertices;


if (start->name != aussen) { fprintf(stderr,"ERROR ADD_P_INV not starting at external edge\n");
			     exit(86); }

if (IPR && (n==5))
  { 
    if (checksize_2(start->prev)==5) is_ipr=0;
    for (ende=start->prev->invers->prev, common_vertices=2; ende->name != aussen; 
	  ende=ende->invers->prev) {if (checksize_2(ende)==5) is_ipr=0;
                                     common_vertices++;
				   }
  }
else for (ende=start->prev->invers->prev, common_vertices=2; ende->name != aussen; 
	  ende=ende->invers->prev) common_vertices++;


if (n<common_vertices) 
   { fprintf(stderr,"polygon to insert (inv) too small !\n"); 
     exit(87); }

/* es muessen also n-common_vertices knoten hinzugefuegt werden */

tempknz=map[0][0].name;
new_tempknz=tempknz+n-common_vertices;

if (n-common_vertices==0) /* dann kommt kein knoten dazu */
  { start->name=ende->ursprung; start->invers=ende;
    ende->name=start->ursprung; ende->invers=start;

    for (ende=start->next->invers->next, common_vertices=2; 
	 (ende->name != aussen) && (common_vertices<6); 
         ende=ende->invers->next) common_vertices++;
    if (common_vertices<6) *lastout=ende; /* ein common_vertices+1 -- Eck ist noch moeglich */
    else { *lastout=nil;
	   if (ende==start->next) /* dann ist nur noch eine 5-Eck Luecke */
	     { for (i=anzahl_5ek+5, run=start->invers; anzahl_5ek<i; 
		  anzahl_5ek++, run=run->invers->next) { F_eck_kanten[anzahl_5ek]=run;
							 if (IPR)
							   if (checksize_right_2(run)==5) is_ipr=0; }
	     }
	 }
  }
else
  {
    if (n-common_vertices==1) /* dann kommt nur ein knoten dazu */
      {
	tempknz++;
	start->name=tempknz; start->invers=map[tempknz];
	map[tempknz][0].name=start->ursprung; map[tempknz][0].invers=start;
	map[tempknz][1].name=ende->ursprung; map[tempknz][1].invers=ende;
	ende->name=tempknz; ende->invers=map[tempknz]+1;
	map[tempknz][2].name=aussen; map[tempknz][2].invers=nil;
	*lastout=map[tempknz]+2;
	map[0][0].name=tempknz;
      }
    else
      {
	
	/* es bleibt: mindestens zwei neue knoten */
	
	tempknz++;
	start->name=tempknz; start->invers=map[tempknz];
	map[tempknz][0].name=start->ursprung; map[tempknz][0].invers=start;
	map[tempknz][1].name=tempknz+1; map[tempknz][1].invers=map[tempknz+1];
	map[tempknz][2].name=aussen; map[tempknz][2].invers=nil;
	
	for (tempknz++; tempknz<new_tempknz; tempknz++)
	  { map[tempknz][0].name=tempknz-1; map[tempknz][0].invers=map[tempknz-1]+1;
	    map[tempknz][1].name=tempknz+1; map[tempknz][1].invers=map[tempknz+1]; 
	    map[tempknz][2].name=aussen; map[tempknz][2].invers=nil; }
	
	/* und nun noch den letzten knoten */
	map[tempknz][0].name=tempknz-1; map[tempknz][0].invers=map[tempknz-1]+1;
	map[tempknz][1].name=ende->ursprung; map[tempknz][1].invers= ende;
	ende->name=tempknz; ende->invers=map[tempknz]+1;
	map[tempknz][2].name=aussen; map[tempknz][2].invers=nil;
	*lastout=map[tempknz]+2;
	map[0][0].name=tempknz;
      } /* ende zweites else */
  } /* ende erstes else */

if (n==5)
  for (i=anzahl_5ek+5, run=start; anzahl_5ek<i; 
       anzahl_5ek++, run=run->invers->next) F_eck_kanten[anzahl_5ek]=run;

return;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
cmpw $0x246, 0x2(%rdx)       # imm = 0x246
jne 0xa71b
movq %rdx, %rbx
movq %rsi, %r15
movl %edi, %ebp
movb 0x8d59(%rip), %r13b     # 0x13171
testb %r13b, %r13b
setne %al
cmpl $0x5, %edi
sete %dl
movq 0x18(%rbx), %r12
testb %al, %dl
movq %rcx, 0x10(%rsp)
je 0xa475
movq %r12, %rdi
callq 0xa2db
cmpl $0x5, %eax
jne 0xa445
movb $0x0, 0x8cff(%rip)      # 0x13144
pushq $0x2
popq %r14
movq 0x28(%r12), %rax
movq 0x18(%rax), %r12
cmpw $0x246, 0x2(%r12)       # imm = 0x246
je 0xa48f
movq %r12, %rdi
callq 0xa2db
cmpl $0x5, %eax
jne 0xa470
movb $0x0, 0x8cd4(%rip)      # 0x13144
incl %r14d
jmp 0xa449
pushq $0x1
popq %r14
movq 0x28(%r12), %rax
movq 0x18(%rax), %r12
incl %r14d
cmpw $0x246, 0x2(%r12)       # imm = 0x246
jne 0xa479
cmpl %r14d, %ebp
jl 0xa73b
movl %ebp, %esi
subl %r14d, %esi
movl %ebp, 0xc(%rsp)
jne 0xa4f5
pushq $0x2
popq %rdx
movzwl (%r12), %eax
movw %ax, 0x2(%rbx)
leaq 0x28(%rbx), %rax
movq %r12, 0x28(%rbx)
movzwl (%rbx), %ecx
movw %cx, 0x2(%r12)
movq %rbx, 0x28(%r12)
movq 0x20(%rbx), %rcx
movq 0x10(%rsp), %rdi
movl %edx, %esi
movq 0x28(%rcx), %rcx
movq 0x20(%rcx), %rcx
cmpw $0x246, 0x2(%rcx)       # imm = 0x246
je 0xa4e8
leal 0x1(%rsi), %edx
cmpl $0x6, %esi
jb 0xa4ce
cmpl $0x5, %esi
ja 0xa569
movq %rcx, (%rdi)
jmp 0xa6c9
movzwl 0x2(%r15), %ecx
leaq 0x1(%rcx), %rdx
imulq $0x90, %rdx, %rdi
leaq (%r15,%rdi), %rax
movw %dx, 0x2(%rbx)
movq %rax, 0x28(%rbx)
movzwl (%rbx), %r8d
movw %r8w, 0x2(%r15,%rdi)
movq %rbx, 0x28(%r15,%rdi)
cmpl $0x1, %esi
movq 0x10(%rsp), %rdi
jne 0xa5d5
movzwl (%r12), %ecx
leaq 0x30(%rax), %rsi
movw %cx, 0x32(%rax)
movq %r12, 0x58(%rax)
movw %dx, 0x2(%r12)
movq %rsi, 0x28(%r12)
movw $0x246, 0x62(%rax)      # imm = 0x246
andq $0x0, 0x88(%rax)
addq $0x60, %rax
movq %rax, (%rdi)
movw %dx, 0x2(%r15)
jmp 0xa6c9
andq $0x0, (%rdi)
cmpq 0x20(%rbx), %rcx
jne 0xa6c9
movslq 0x157ba(%rip), %r12     # 0x1fd38
leal 0x1(%r12), %r15d
shlq $0x3, %r12
xorl %ebp, %ebp
cmpq $0x5, %rbp
je 0xa6c9
movq (%rax), %r14
leaq (%r12,%rbp,8), %rax
leaq 0x8caf(%rip), %rcx      # 0x13250
movq %r14, (%rcx,%rax)
testb %r13b, %r13b
je 0xa5be
movq %r14, %rdi
callq 0xa2b6
cmpl $0x5, %eax
jne 0xa5be
movb $0x0, 0x8b86(%rip)      # 0x13144
leal (%r15,%rbp), %eax
movl %eax, 0x15770(%rip)     # 0x1fd38
movq 0x28(%r14), %rax
addq $0x20, %rax
incq %rbp
jmp 0xa589
leal (%rsi,%rcx), %edx
leaq 0x2(%rcx), %rsi
movw %si, 0x32(%rax)
imulq $0x90, %rsi, %rsi
addq %r15, %rsi
movq %rsi, 0x58(%rax)
movw $0x246, 0x62(%rax)      # imm = 0x246
andq $0x0, 0x88(%rax)
movl %ecx, %eax
movslq %edx, %rdx
imulq $0x90, %rax, %rcx
addq $0x2, %rax
addq %r15, %rcx
cmpq %rdx, %rax
jge 0xa65e
leal -0x1(%rax), %esi
movw %si, 0x122(%rcx)
leaq 0xc0(%rcx), %rsi
movq %rsi, 0x148(%rcx)
incq %rax
movw %ax, 0x152(%rcx)
leaq 0x1b0(%rcx), %rsi
movq %rsi, 0x178(%rcx)
movw $0x246, 0x182(%rcx)     # imm = 0x246
andq $0x0, 0x1a8(%rcx)
addq $0x90, %rcx
jmp 0xa60f
movl %eax, %edx
decl %edx
leal -0x1(%rax), %esi
movw %si, 0x122(%rcx)
movslq %edx, %rdx
imulq $0x90, %rdx, %rdx
addq %r15, %rdx
addq $0x30, %rdx
movq %rdx, 0x148(%rcx)
movzwl (%r12), %edx
leaq 0x150(%rcx), %rsi
movw %dx, 0x152(%rcx)
movq %r12, 0x178(%rcx)
movw %ax, 0x2(%r12)
movq %rsi, 0x28(%r12)
movw $0x246, 0x182(%rcx)     # imm = 0x246
andq $0x0, 0x1a8(%rcx)
addq $0x180, %rcx            # imm = 0x180
movq %rcx, (%rdi)
movw %ax, 0x2(%r15)
cmpl $0x5, 0xc(%rsp)
jne 0xa70c
movslq 0x15661(%rip), %rax     # 0x1fd38
leaq (,%rax,8), %rcx
xorl %edx, %edx
leaq 0x8b68(%rip), %rsi      # 0x13250
cmpq $0x5, %rdx
je 0xa706
leaq (%rcx,%rdx,8), %rdi
movq %rbx, (%rsi,%rdi)
incq %rax
movq 0x28(%rbx), %rdi
movq 0x20(%rdi), %rbx
incq %rdx
jmp 0xa6e8
movl %eax, 0x1562c(%rip)     # 0x1fd38
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0x88d6(%rip), %rax      # 0x12ff8
movq (%rax), %rcx
leaq 0x42af(%rip), %rdi      # 0xe9db
pushq $0x2e
popq %rsi
pushq $0x1
popq %rdx
callq 0x1150
pushq $0x56
jmp 0xa759
movq 0x88b6(%rip), %rax      # 0x12ff8
movq (%rax), %rcx
leaq 0x42be(%rip), %rdi      # 0xea0a
pushq $0x24
popq %rsi
pushq $0x1
popq %rdx
callq 0x1150
pushq $0x57
popq %rdi
callq 0x1140