// File: /workspace/github_c_makefile_star2_O2/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 %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rcx, %rbx
movq %rdx, %r13
movq %rsi, %r14
movl %edi, %r12d
movq 0x20(%rdx), %r15
cmpl $0x5, %edi
jne 0x2ba5
cmpb $0x0, 0x1060e(%rip)     # 0x13171
je 0x2ba5
movq %r15, %rdi
callq 0x2b27
cmpl $0x5, %eax
jne 0x2b79
movb $0x0, 0x105cb(%rip)     # 0x13144
pushq $0x2
popq %rbp
movq 0x28(%r15), %rax
movq 0x20(%rax), %r15
cmpw $0x246, 0x2(%r15)       # imm = 0x246
je 0x2bbb
movq %r15, %rdi
callq 0x2b27
cmpl $0x5, %eax
jne 0x2ba1
movb $0x0, 0x105a3(%rip)     # 0x13144
incl %ebp
jmp 0x2b7c
pushq $0x1
popq %rbp
movq 0x28(%r15), %rax
movq 0x20(%rax), %r15
incl %ebp
cmpw $0x246, 0x2(%r15)       # imm = 0x246
jne 0x2ba8
cmpl %ebp, %r12d
jl 0x2d59
subl %ebp, %r12d
jne 0x2bed
movzwl (%r15), %eax
movw %ax, 0x2(%r13)
movq %r15, 0x28(%r13)
movzwl (%r13), %eax
movw %ax, 0x2(%r15)
movq %r13, 0x28(%r15)
andq $0x0, (%rbx)
jmp 0x2d4a
movzwl 0x2(%r14), %ecx
leaq 0x1(%rcx), %rdx
imulq $0x90, %rdx, %rsi
leaq (%r14,%rsi), %rax
movw %dx, 0x2(%r13)
movq %rax, 0x28(%r13)
movzwl (%r13), %edi
movw %di, 0x2(%r14,%rsi)
movq %r13, 0x28(%r14,%rsi)
cmpl $0x1, %r12d
jne 0x2c58
leaq 0x30(%rax), %rcx
movw $0x246, 0x32(%rax)      # imm = 0x246
andq $0x0, 0x58(%rax)
movzwl (%r15), %esi
leaq 0x60(%rax), %rdi
movw %si, 0x62(%rax)
movq %r15, 0x88(%rax)
movw %dx, 0x2(%r15)
movq %rdi, 0x28(%r15)
movq %rcx, (%rbx)
movw %dx, 0x2(%r14)
jmp 0x2d4a
movw $0x246, 0x32(%rax)      # imm = 0x246
andq $0x0, 0x58(%rax)
leal (%r12,%rcx), %edx
leaq 0x2(%rcx), %rsi
movw %si, 0x62(%rax)
imulq $0x90, %rsi, %rsi
addq %r14, %rsi
movq %rsi, 0x88(%rax)
movl %ecx, %eax
movslq %edx, %rdx
imulq $0x90, %rax, %rcx
addq $0x2, %rax
addq %r14, %rcx
cmpq %rdx, %rax
jge 0x2ce2
leal -0x1(%rax), %esi
movw %si, 0x122(%rcx)
leaq 0xf0(%rcx), %rsi
movq %rsi, 0x148(%rcx)
movw $0x246, 0x152(%rcx)     # imm = 0x246
andq $0x0, 0x178(%rcx)
incq %rax
movw %ax, 0x182(%rcx)
leaq 0x1b0(%rcx), %rsi
movq %rsi, 0x1a8(%rcx)
addq $0x90, %rcx
jmp 0x2c93
movl %eax, %edx
decl %edx
leal -0x1(%rax), %esi
movw %si, 0x122(%rcx)
movslq %edx, %rdx
imulq $0x90, %rdx, %rdx
addq %r14, %rdx
addq $0x60, %rdx
movq %rdx, 0x148(%rcx)
leaq 0x150(%rcx), %rdx
movw $0x246, 0x152(%rcx)     # imm = 0x246
andq $0x0, 0x178(%rcx)
movzwl (%r15), %esi
leaq 0x180(%rcx), %rdi
movw %si, 0x182(%rcx)
movq %r15, 0x1a8(%rcx)
movw %ax, 0x2(%r15)
movq %rdi, 0x28(%r15)
movq %rdx, (%rbx)
movw %ax, 0x2(%r14)
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0x10298(%rip), %rax     # 0x12ff8
movq (%rax), %rcx
leaq 0xb5b7(%rip), %rdi      # 0xe321
pushq $0x1e
popq %rsi
pushq $0x1
popq %rdx
callq 0x1150
pushq $0x4
popq %rdi
callq 0x1140