// File: /workspace/github_c_makefile_star2_O1/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 0x46c1
cmpb $0x0, 0x10b3f(%rip)     # 0x15191
je 0x46c1
movl $0x5, %r8d
movq %rax, %r9
movq 0x28(%r9), %r9
movq 0x18(%r9), %r9
decl %r8d
cmpq %rax, %r9
jne 0x465d
testl %r8d, %r8d
jne 0x4679
movb $0x0, 0x10aeb(%rip)     # 0x15164
movq 0x28(%rax), %rax
movq 0x20(%rax), %rax
movl $0x2, %r8d
cmpw $0x246, 0x2(%rax)       # imm = 0x246
je 0x46da
movl $0x5, %r9d
movq %rax, %r10
movq 0x28(%r10), %r10
movq 0x18(%r10), %r10
decl %r9d
cmpq %rax, %r10
jne 0x4698
testl %r9d, %r9d
jne 0x46b4
movb $0x0, 0x10ab0(%rip)     # 0x15164
incl %r8d
movq 0x28(%rax), %rax
movq 0x20(%rax), %rax
jmp 0x4687
movl $0x1, %r8d
movq 0x28(%rax), %rax
movq 0x20(%rax), %rax
incl %r8d
cmpw $0x246, 0x2(%rax)       # imm = 0x246
jne 0x46c7
cmpl %r8d, %edi
jl 0x4869
subl %r8d, %edi
jne 0x470a
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 0x4867
movzwl 0x2(%rsi), %r8d
leaq 0x1(%r8), %r10
leaq (%r10,%r10,8), %r11
shll $0x4, %r11d
leaq (%rsi,%r11), %r9
movw %r10w, 0x2(%rdx)
movq %r9, 0x28(%rdx)
movzwl (%rdx), %ebx
movw %bx, 0x2(%rsi,%r11)
movq %rdx, 0x28(%rsi,%r11)
cmpl $0x1, %edi
jne 0x4777
leaq 0x30(%r9), %rdx
movw $0x246, 0x32(%r9)       # imm = 0x246
movq $0x0, 0x58(%r9)
movzwl (%rax), %edi
leaq 0x60(%r9), %r8
movw %di, 0x62(%r9)
movq %rax, 0x88(%r9)
movw %r10w, 0x2(%rax)
movq %r8, 0x28(%rax)
movq %rdx, (%rcx)
movw %r10w, 0x2(%rsi)
jmp 0x4867
addl %r8d, %edi
movw $0x246, 0x32(%r9)       # imm = 0x246
movq $0x0, 0x58(%r9)
leaq 0x2(%r8), %rdx
movw %dx, 0x62(%r9)
leaq (%rdx,%rdx,8), %r10
shll $0x4, %r10d
addq %rsi, %r10
movq %r10, 0x88(%r9)
cmpl %edi, %edx
jge 0x4807
movl %r8d, %edx
movl %edi, %edi
leaq (%rdx,%rdx,8), %r8
shll $0x4, %r8d
addq %rsi, %r8
addq $0x1b0, %r8             # imm = 0x1B0
addq $-0x2, %rdi
movq %rdx, %r9
incq %rdx
movw %dx, -0x8e(%r8)
leaq -0xc0(%r8), %r10
movq %r10, -0x68(%r8)
movw $0x246, -0x5e(%r8)      # imm = 0x246
movq $0x0, -0x38(%r8)
addl $0x3, %r9d
movw %r9w, -0x2e(%r8)
movq %r8, -0x8(%r8)
addq $0x90, %r8
cmpq %rdx, %rdi
jne 0x47c3
addl $0x2, %edx
leal -0x1(%rdx), %edi
movl %edx, %r8d
leaq (%r8,%r8,8), %r8
shlq $0x4, %r8
leaq (%rsi,%r8), %r9
addq $0x30, %r9
movw %di, -0x2e(%r9)
movslq %edi, %rdi
leaq (%rdi,%rdi,8), %rdi
shlq $0x4, %rdi
addq %rsi, %rdi
addq $0x60, %rdi
movq %rdi, -0x8(%r9)
movw $0x246, 0x2(%r9)        # imm = 0x246
movq $0x0, 0x28(%r9)
movzwl (%rax), %edi
leaq 0x60(%rsi,%r8), %r8
movw %di, 0x2(%r8)
movq %rax, 0x28(%r8)
movw %dx, 0x2(%rax)
movq %r8, 0x28(%rax)
movq %r9, (%rcx)
movw %dx, 0x2(%rsi)
popq %rbx
retq
callq 0x14b8