// File: /workspace/github_c_makefile_star2_O1/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 %rbx
pushq %rax
cmpw $0x246, 0x2(%rdx)       # imm = 0x246
jne 0xc8b0
movb 0x8c5f(%rip), %r8b      # 0x15191
testb %r8b, %r8b
setne %r9b
cmpl $0x5, %edi
sete %r10b
movq 0x18(%rdx), %rax
testb %r9b, %r10b
je 0xc582
movq 0x28(%rax), %r9
movq 0x20(%r9), %r10
cmpq %rax, %r10
je 0xc848
movl $0x1, %r9d
cmpw $0x246, 0x2(%r10)       # imm = 0x246
je 0xc835
incl %r9d
movq 0x28(%r10), %r10
movq 0x20(%r10), %r10
cmpq %rax, %r10
jne 0xc560
jmp 0xc83b
movl $0x1, %r9d
movq 0x28(%rax), %rax
movq 0x18(%rax), %rax
incl %r9d
cmpw $0x246, 0x2(%rax)       # imm = 0x246
jne 0xc588
cmpl %r9d, %edi
jl 0xc8b5
movl %edi, %r11d
subl %r9d, %r11d
jne 0xc5fd
movzwl (%rax), %esi
movw %si, 0x2(%rdx)
leaq 0x28(%rdx), %rsi
movq %rax, 0x28(%rdx)
movzwl (%rdx), %r9d
movw %r9w, 0x2(%rax)
movq %rdx, 0x28(%rax)
movq 0x20(%rdx), %rax
movl $0x2, %r10d
movl %r10d, %r9d
movq 0x28(%rax), %rax
movq 0x20(%rax), %rax
cmpw $0x246, 0x2(%rax)       # imm = 0x246
je 0xc5ef
leal 0x1(%r9), %r10d
cmpl $0x6, %r9d
jb 0xc5d2
cmpl $0x5, %r9d
ja 0xc666
movq %rax, (%rcx)
jmp 0xc7ee
movzwl 0x2(%rsi), %r9d
leaq 0x1(%r9), %r8
leaq (%r8,%r8,8), %rbx
shll $0x4, %ebx
leaq (%rsi,%rbx), %r10
movw %r8w, 0x2(%rdx)
movq %r10, 0x28(%rdx)
movzwl (%rdx), %ebp
movw %bp, 0x2(%rsi,%rbx)
movq %rdx, 0x28(%rsi,%rbx)
cmpl $0x1, %r11d
jne 0xc6f6
movzwl (%rax), %r9d
leaq 0x30(%r10), %r11
movw %r9w, 0x32(%r10)
movq %rax, 0x58(%r10)
movw %r8w, 0x2(%rax)
movq %r11, 0x28(%rax)
leaq 0x60(%r10), %rax
movw $0x246, 0x62(%r10)      # imm = 0x246
movq $0x0, 0x88(%r10)
jmp 0xc7e6
movq $0x0, (%rcx)
cmpq 0x20(%rdx), %rax
jne 0xc7ee
movslq 0x156da(%rip), %r10     # 0x21d58
leaq 0x4(%r10), %rax
leaq 0x8be7(%rip), %rcx      # 0x15270
movq %r10, %r9
movq (%rsi), %rsi
movq %rsi, (%rcx,%r10,8)
testb %r8b, %r8b
je 0xc6d9
movq 0x28(%rsi), %r10
movq 0x18(%r10), %r11
cmpq %rsi, %r11
je 0xc6d9
movl $0x1, %r10d
cmpw $0x246, 0x2(%r11)       # imm = 0x246
je 0xc6c6
incl %r10d
movq 0x28(%r11), %r11
movq 0x18(%r11), %r11
cmpq %rsi, %r11
jne 0xc6ab
jmp 0xc6cc
movl $0x6, %r10d
cmpl $0x5, %r10d
jne 0xc6d9
movb $0x0, 0x8a8b(%rip)      # 0x15164
leaq 0x1(%r9), %r10
movq 0x28(%rsi), %rsi
addq $0x20, %rsi
cmpq %rax, %r9
jl 0xc689
movl %r10d, 0x15667(%rip)    # 0x21d58
jmp 0xc7ee
addl %r9d, %r11d
leaq 0x2(%r9), %r8
movw %r8w, 0x32(%r10)
leaq (%r8,%r8,8), %rbx
shll $0x4, %ebx
addq %rsi, %rbx
movq %rbx, 0x58(%r10)
movw $0x246, 0x62(%r10)      # imm = 0x246
movq $0x0, 0x88(%r10)
cmpl %r11d, %r8d
jge 0xc788
movl %r9d, %r8d
movl %r11d, %r9d
leaq (%r8,%r8,8), %r10
shll $0x4, %r10d
addq %rsi, %r10
addq $0x1b0, %r10            # imm = 0x1B0
addq $-0x2, %r9
movq %r8, %r11
incq %r8
movw %r8w, -0x8e(%r10)
leaq -0xf0(%r10), %rbx
movq %rbx, -0x68(%r10)
addl $0x3, %r11d
movw %r11w, -0x5e(%r10)
movq %r10, -0x38(%r10)
movw $0x246, -0x2e(%r10)     # imm = 0x246
movq $0x0, -0x8(%r10)
addq $0x90, %r10
cmpq %r8, %r9
jne 0xc743
addl $0x2, %r8d
leal -0x1(%r8), %r9d
movl %r8d, %r10d
leaq (%r10,%r10,8), %r10
shlq $0x4, %r10
leaq (%rsi,%r10), %r11
addq $0x30, %r11
movw %r9w, -0x2e(%r11)
movslq %r9d, %r9
leaq (%r9,%r9,8), %r9
shlq $0x4, %r9
addq %rsi, %r9
addq $0x30, %r9
movq %r9, -0x8(%r11)
movzwl (%rax), %r9d
movw %r9w, 0x2(%r11)
movq %rax, 0x28(%r11)
movw %r8w, 0x2(%rax)
movq %r11, 0x28(%rax)
leaq (%rsi,%r10), %rax
addq $0x60, %rax
movw $0x246, 0x2(%rax)       # imm = 0x246
movq $0x0, 0x28(%rax)
movq %rax, (%rcx)
movw %r8w, 0x2(%rsi)
cmpl $0x5, %edi
jne 0xc82e
movslq 0x1555e(%rip), %rax     # 0x21d58
leaq 0x4(%rax), %rcx
leaq 0x8a6b(%rip), %rsi      # 0x15270
leaq (%rsi,%rax,8), %rsi
movq %rax, %rdi
decq %rdi
movq %rdx, (%rsi)
movq 0x28(%rdx), %rdx
movq 0x20(%rdx), %rdx
incq %rdi
addq $0x8, %rsi
incl %eax
cmpq %rcx, %rdi
jl 0xc80f
movl %eax, 0x1552a(%rip)     # 0x21d58
addq $0x8, %rsp
popq %rbx
popq %rbp
retq
movl $0x6, %r9d
cmpl $0x5, %r9d
jne 0xc848
movb $0x0, 0x891c(%rip)      # 0x15164
movq 0x28(%rax), %rax
movq 0x18(%rax), %rax
movl $0x2, %r9d
cmpw $0x246, 0x2(%rax)       # imm = 0x246
je 0xc59b
movq 0x28(%rax), %r10
movq 0x20(%r10), %r11
cmpq %rax, %r11
je 0xc8a3
movl $0x1, %r10d
cmpw $0x246, 0x2(%r11)       # imm = 0x246
je 0xc890
incl %r10d
movq 0x28(%r11), %r11
movq 0x20(%r11), %r11
cmpq %rax, %r11
jne 0xc875
jmp 0xc896
movl $0x6, %r10d
cmpl $0x5, %r10d
jne 0xc8a3
movb $0x0, 0x88c1(%rip)      # 0x15164
incl %r9d
movq 0x28(%rax), %rax
movq 0x18(%rax), %rax
jmp 0xc856
callq 0x204a
callq 0x206f