blob: 0756045b34611c6f9d7b2c15af9a65650ded2d6c [file] [log] [blame]
/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#include <stdio.h>
#include <stdarg.h>
#if defined(_AMD64_) || defined(__x86_64__) || \
defined(_X86_) || defined(__i386__)
extern int __ms_vfscanf_internal (
FILE * s,
const char * format,
va_list arg,
int (*func)(FILE * __restrict__, const char * __restrict__, ...))
asm("__argtos");
#elif defined (__arm__) || defined (_ARM_)
#define QUOTE_(x) #x
#define QUOTE(x) QUOTE_(x)
int __ms_vfscanf_internal (FILE * __restrict__,
const char * __restrict__, va_list);
asm("\t.text\n"
"\t.align 2\n"
"\t.thumb_func\n"
"\t.globl __ms_vfscanf_internal\n"
"__ms_vfscanf_internal:\n\t"
"push {r4-r7, lr}\n\t"
"mov r4, sp\n\t"
"sub r4, r4, #128\n\t"
"ldr r5, [r2]\n\t"
"add r2, r2, #4\n\t"
"ldr r6, [r2]\n\t"
"add r2, r2, #4\n\t"
"mov r3, #116\n\t"
"1: ldr r7, [r2]\n\t"
"add r2, r2, #4\n\t"
"str r7, [r4]\n\t"
"add r4, r4, #4\n\t"
"sub r3, r3, #4\n\t"
"cmp r3, #0\n\t"
"bne 1b\n\t"
"sub sp, sp, #128\n\t"
"mov r2, r5\n\t"
"mov r3, r6\n\t"
"bl " QUOTE(__MINGW_USYMBOL(fscanf)) "\n\t"
"add sp, sp, #128\n\t"
"pop {r4-r7, pc}");
#endif /* defined (__arm__) || defined (_ARM_) */
int __ms_vfscanf (FILE * __restrict__ stream, const char * __restrict__ format, va_list arg)
{
int ret;
#if defined(_AMD64_) || defined(__x86_64__) || \
defined(_X86_) || defined(__i386__)
ret = __ms_vfscanf_internal (stream, format, arg, fscanf);
#elif defined (_ARM_) || defined (__arm__)
ret = __ms_vfscanf_internal (stream, format, arg);
#else
#error "unknown platform"
#endif
return ret;
}