// File: /workspace/github_c_makefile_star2_O3/mishun[P]plantri/fullgen.c
// Function: add_polygon
void add_polygon(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. Die Marke wird nicht versetzt. Ueber lastout wird
   die letzte Aussenkante des Polygons zurueckgegeben. */


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


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


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

/* 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;
    *lastout=nil;
    return;
  }

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=aussen; map[tempknz][1].invers=nil;
 map[tempknz][2].name=ende->ursprung; map[tempknz][2].invers=ende;
 ende->name=tempknz; ende->invers=map[tempknz]+2;
 *lastout=map[tempknz]+1;
 map[0][0].name=tempknz;
 return;
 }


/* 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=aussen; map[tempknz][1].invers=nil;
map[tempknz][2].name=tempknz+1; map[tempknz][2].invers=map[tempknz+1];

for (tempknz++; tempknz<new_tempknz; tempknz++)
    { map[tempknz][0].name=tempknz-1; map[tempknz][0].invers=map[tempknz-1]+2;
      map[tempknz][1].name=aussen; map[tempknz][1].invers=nil;
      map[tempknz][2].name=tempknz+1; map[tempknz][2].invers=map[tempknz+1]; }

/* und nun noch den letzten knoten */
map[tempknz][0].name=tempknz-1; map[tempknz][0].invers=map[tempknz-1]+2;
map[tempknz][1].name=aussen; map[tempknz][1].invers=nil;
map[tempknz][2].name=ende->ursprung; map[tempknz][2].invers= ende;
ende->name=tempknz; ende->invers=map[tempknz]+2;
*lastout=map[tempknz]+1;
map[0][0].name=tempknz;
}

// Assembly:
pushq %rbx
movq 0x20(%rdx), %rax
cmpl $0x5, %edi
jne 0x46fb
cmpb $0x0, 0x10b05(%rip)     # 0x15191
je 0x46fb
movl $0x5, %r8d
movq %rax, %r9
movq 0x28(%r9), %r9
movq 0x18(%r9), %r9
decl %r8d
cmpq %rax, %r9
jne 0x4697
testl %r8d, %r8d
jne 0x46b3
movb $0x0, 0x10ab1(%rip)     # 0x15164
movq 0x28(%rax), %rax
movq 0x20(%rax), %rax
movl $0x2, %r8d
cmpw $0x246, 0x2(%rax)       # imm = 0x246
je 0x4714
movl $0x5, %r9d
movq %rax, %r10
movq 0x28(%r10), %r10
movq 0x18(%r10), %r10
decl %r9d
cmpq %rax, %r10
jne 0x46d2
testl %r9d, %r9d
jne 0x46ee
movb $0x0, 0x10a76(%rip)     # 0x15164
incl %r8d
movq 0x28(%rax), %rax
movq 0x20(%rax), %rax
jmp 0x46c1
movl $0x1, %r8d
movq 0x28(%rax), %rax
movq 0x20(%rax), %rax
incl %r8d
cmpw $0x246, 0x2(%rax)       # imm = 0x246
jne 0x4701
cmpl %r8d, %edi
jl 0x48ae
subl %r8d, %edi
jne 0x4744
movzwl (%rax), %esi
movw %si, 0x2(%rdx)
movq %rax, 0x28(%rdx)
movzwl (%rdx), %esi
movw %si, 0x2(%rax)
movq %rdx, 0x28(%rax)
movq $0x0, (%rcx)
jmp 0x48ac
movzwl 0x2(%rsi), %r9d
leaq 0x1(%r9), %r8
leaq (%r8,%r8,8), %r11
shll $0x4, %r11d
leaq (%rsi,%r11), %r10
movw %r8w, 0x2(%rdx)
movq %r10, 0x28(%rdx)
movzwl (%rdx), %ebx
movw %bx, 0x2(%rsi,%r11)
movq %rdx, 0x28(%rsi,%r11)
cmpl $0x1, %edi
jne 0x47ac
leaq 0x30(%r10), %rdx
movw $0x246, 0x32(%r10)      # imm = 0x246
movq $0x0, 0x58(%r10)
movzwl (%rax), %edi
leaq 0x60(%r10), %r9
movw %di, 0x62(%r10)
movq %rax, 0x88(%r10)
movw %r8w, 0x2(%rax)
movq %r9, 0x28(%rax)
movq %rdx, (%rcx)
jmp 0x48a7
leal (%rdi,%r9), %edx
movw $0x246, 0x32(%r10)      # imm = 0x246
movq $0x0, 0x58(%r10)
leaq 0x2(%r9), %r8
movw %r8w, 0x62(%r10)
leaq (%r8,%r8,8), %rdi
shll $0x4, %edi
addq %rsi, %rdi
movq %rdi, 0x88(%r10)
movq %r8, %rdi
movl %r8d, %r10d
cmpl %edx, %r8d
jge 0x484d
movl %r9d, %r8d
movl %edx, %edi
leaq (%r8,%r8,8), %r9
shll $0x4, %r9d
addq %rsi, %r9
addq $0xf0, %r9
leaq -0x2(%rdi), %r10
leaq 0x1(%r8), %r11
movw %r11w, 0x32(%r9)
movq %r9, 0x58(%r9)
movw $0x246, 0x62(%r9)       # imm = 0x246
movq $0x0, 0x88(%r9)
addl $0x3, %r8d
movw %r8w, 0x92(%r9)
leaq 0xc0(%r9), %r8
movq %r8, 0xb8(%r9)
addq $0x90, %r9
movq %r11, %r8
cmpq %r11, %r10
jne 0x47ff
movl %edx, %r8d
movl %edx, %r10d
decl %r10d
leaq (%rdi,%rdi,8), %rdx
shlq $0x4, %rdx
leaq (%rsi,%rdx), %rdi
addq $0x30, %rdi
movw %r10w, -0x2e(%rdi)
movslq %r10d, %r9
leaq (%r9,%r9,8), %r9
shlq $0x4, %r9
addq %rsi, %r9
addq $0x60, %r9
movq %r9, -0x8(%rdi)
movw $0x246, 0x2(%rdi)       # imm = 0x246
movq $0x0, 0x28(%rdi)
movzwl (%rax), %r9d
leaq 0x60(%rsi,%rdx), %rdx
movw %r9w, 0x2(%rdx)
movq %rax, 0x28(%rdx)
movw %r8w, 0x2(%rax)
movq %rdx, 0x28(%rax)
movq %rdi, (%rcx)
movw %r8w, 0x2(%rsi)
popq %rbx
retq
callq 0x14b8