// File: yukioc[P]tscrpt/tscrpt.cpp
// Function: estrndup(char const*, unsigned long)
char* estrndup(const char*s, size_t n){
	if (s==NULL)return NULL;
	char *ret(new char[n+1]),*t(ret),*p;
	const char *e(&s[n]);
	for(;*s!='\0'&&s!=e&&n>0;--n,++s,++t){
//		printf("estrndup: s=%c\n",*s);
		if(*s=='\\'){
			++s;--n;
			switch(*s){
				case 'a':*t='\a';break;
				case 'b':*t='\b';break;
				case 'f':*t='\f';break;
				case 'n':*t='\n';break;
				case 'r':*t='\r';break;
				case 't':*t='\t';break;
				case 'v':*t='\v';break;
				case '?':*t='\?';break;
				case '\\':*t='\\';break;
				case '\'':*t='\'';break;
				case '\"':*t='\"';break;
				case 'x':*t=(char)strtol(s+1,&p,16);s=p-1;break;
				default:
					if(*s>='0'&&*s<='7'){ *t=strtol(s,&p,8);s=p-1;break; }
					else {
						delete ret; 
						throw std::logic_error("estrndup: contained wrong escaped character");
					}
			}
		}else if(*s=='"'){
			delete ret;
			throw std::logic_error("estrndup: contained un-escaped '\"'");
		}else{
			*t=*s;
		}
	}
	*t='\0';
	return ret;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0x2e74
movq $0x0, -0x8(%rbp)
jmp 0x314a
movq -0x18(%rbp), %rdi
addq $0x1, %rdi
callq 0x2030
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
addq -0x18(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movsbl (%rax), %ecx
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, -0x45(%rbp)
je 0x2ec4
movq -0x10(%rbp), %rcx
xorl %eax, %eax
cmpq -0x38(%rbp), %rcx
movb %al, -0x45(%rbp)
je 0x2ec4
cmpq $0x0, -0x18(%rbp)
seta %al
movb %al, -0x45(%rbp)
movb -0x45(%rbp), %al
testb $0x1, %al
jne 0x2ed0
jmp 0x313b
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x5c, %eax
jne 0x308a
movq -0x10(%rbp), %rax
incq %rax
movq %rax, -0x10(%rbp)
movq -0x18(%rbp), %rax
decq %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
addl $-0x22, %eax
movl %eax, %ecx
movq %rcx, -0x50(%rbp)
subl $0x56, %eax
ja 0x2fd6
movq -0x50(%rbp), %rax
leaq 0x70ea(%rip), %rcx      # 0xa004
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x28(%rbp), %rax
movb $0x7, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0x8, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0xc, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0xa, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0xd, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0x9, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0xb, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0x3f, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0x5c, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0x27, (%rax)
jmp 0x3085
movq -0x28(%rbp), %rax
movb $0x22, (%rax)
jmp 0x3085
movq -0x10(%rbp), %rdi
addq $0x1, %rdi
leaq -0x30(%rbp), %rsi
movl $0x10, %edx
callq 0x22a0
movb %al, %cl
movq -0x28(%rbp), %rax
movb %cl, (%rax)
movq -0x30(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x3085
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x30, %eax
jl 0x3016
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x37, %eax
jg 0x3016
movq -0x10(%rbp), %rdi
leaq -0x30(%rbp), %rsi
movl $0x8, %edx
callq 0x22a0
movb %al, %cl
movq -0x28(%rbp), %rax
movb %cl, (%rax)
movq -0x30(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x10(%rbp)
jmp 0x3085
movq -0x20(%rbp), %rax
movq %rax, -0x58(%rbp)
cmpq $0x0, %rax
je 0x3032
movq -0x58(%rbp), %rdi
movl $0x1, %esi
callq 0x21d0
movl $0x10, %edi
callq 0x2120
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x60(%rbp)
leaq 0x7416(%rip), %rsi      # 0xa463
callq 0x22b0
jmp 0x3054
movq -0x60(%rbp), %rdi
movq 0xaf81(%rip), %rsi      # 0xdfe0
movq 0xaf6a(%rip), %rdx      # 0xdfd0
callq 0x2310
movq -0x60(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
callq 0x2170
jmp 0x3154
jmp 0x3110
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x22, %eax
jne 0x3102
movq -0x20(%rbp), %rax
movq %rax, -0x68(%rbp)
cmpq $0x0, %rax
je 0x30b2
movq -0x68(%rbp), %rdi
movl $0x1, %esi
callq 0x21d0
movl $0x10, %edi
callq 0x2120
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x70(%rbp)
leaq 0x73c2(%rip), %rsi      # 0xa48f
callq 0x22b0
jmp 0x30d4
movq -0x70(%rbp), %rdi
movq 0xaf01(%rip), %rsi      # 0xdfe0
movq 0xaeea(%rip), %rdx      # 0xdfd0
callq 0x2310
movq -0x70(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
callq 0x2170
jmp 0x3154
movq -0x10(%rbp), %rax
movb (%rax), %cl
movq -0x28(%rbp), %rax
movb %cl, (%rax)
jmp 0x3110
jmp 0x3112
movq -0x18(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x2e99
movq -0x28(%rbp), %rax
movb $0x0, (%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x70, %rsp
popq %rbp
retq
movq -0x40(%rbp), %rdi
callq 0x2330
nopl (%rax)