stdio: Pass the function to call to the v*scanf asm wrapper
This unifies the wrappers, allowing to share them as on x86.
Signed-off-by: Martin Storsjö <martin@martin.st>
diff --git a/mingw-w64-crt/stdio/vfscanf.c b/mingw-w64-crt/stdio/vfscanf.c
index f3b0dfe..e316750 100644
--- a/mingw-w64-crt/stdio/vfscanf.c
+++ b/mingw-w64-crt/stdio/vfscanf.c
@@ -19,11 +19,9 @@
#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);
+ const char * __restrict__, va_list,
+ int (*func)(FILE * __restrict__, const char * __restrict__, ...));
asm("\t.text\n"
"\t.align 2\n"
"\t.thumb_func\n"
@@ -31,6 +29,7 @@
"__ms_vfscanf_internal:\n\t"
"push {r4-r7, lr}\n\t"
"sub sp, sp, #128\n\t"
+ "mov r12, r3\n\t"
"mov r4, sp\n\t"
"ldr r5, [r2], #4\n\t"
@@ -44,7 +43,7 @@
"mov r2, r5\n\t"
"mov r3, r6\n\t"
- "bl " QUOTE(__MINGW_USYMBOL(fscanf)) "\n\t"
+ "blx r12\n\t"
"add sp, sp, #128\n\t"
"pop {r4-r7, pc}");
@@ -55,10 +54,9 @@
int ret;
#if defined(_AMD64_) || defined(__x86_64__) || \
- defined(_X86_) || defined(__i386__)
+ defined(_X86_) || defined(__i386__) || \
+ defined(_ARM_) || defined(__arm__)
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
diff --git a/mingw-w64-crt/stdio/vfwscanf.c b/mingw-w64-crt/stdio/vfwscanf.c
index d6f5a6f..f0b4821 100644
--- a/mingw-w64-crt/stdio/vfwscanf.c
+++ b/mingw-w64-crt/stdio/vfwscanf.c
@@ -19,11 +19,9 @@
#elif defined (__arm__) || defined (_ARM_)
-#define QUOTE_(x) #x
-#define QUOTE(x) QUOTE_(x)
-
int __ms_vfwscanf_internal (FILE * __restrict__,
- const wchar_t * __restrict__, va_list);
+ const wchar_t * __restrict__, va_list,
+ int (*func)(FILE * __restrict__, const wchar_t * __restrict__, ...));
asm("\t.text\n"
"\t.align 2\n"
"\t.thumb_func\n"
@@ -31,6 +29,7 @@
"__ms_vfwscanf_internal:\n\t"
"push {r4-r7, lr}\n\t"
"sub sp, sp, #128\n\t"
+ "mov r12, r3\n\t"
"mov r4, sp\n\t"
"ldr r5, [r2], #4\n\t"
@@ -44,7 +43,7 @@
"mov r2, r5\n\t"
"mov r3, r6\n\t"
- "bl " QUOTE(__MINGW_USYMBOL(fwscanf)) "\n\t"
+ "blx r12\n\t"
"add sp, sp, #128\n\t"
"pop {r4-r7, pc}");
@@ -56,10 +55,9 @@
int ret;
#if defined(_AMD64_) || defined(__x86_64__) || \
- defined(_X86_) || defined(__i386__)
+ defined(_X86_) || defined(__i386__) || \
+ defined(_ARM_) || defined(__arm__)
ret = __ms_vfwscanf_internal (stream, format, arg, fwscanf);
-#elif defined (_ARM_) || defined (__arm__)
- ret = __ms_vfwscanf_internal (stream, format, arg);
#else
#error "unknown platform"
#endif
diff --git a/mingw-w64-crt/stdio/vsscanf.c b/mingw-w64-crt/stdio/vsscanf.c
index 7c72b6c..995657d 100644
--- a/mingw-w64-crt/stdio/vsscanf.c
+++ b/mingw-w64-crt/stdio/vsscanf.c
@@ -19,11 +19,9 @@
#elif defined (__arm__) || defined (_ARM_)
-#define QUOTE_(x) #x
-#define QUOTE(x) QUOTE_(x)
-
int __ms_vsscanf_internal (const char * __restrict__,
- const char * __restrict__, va_list);
+ const char * __restrict__, va_list,
+ int (*func)(const char * __restrict__, const char * __restrict__, ...));
asm("\t.text\n"
"\t.align 2\n"
"\t.thumb_func\n"
@@ -31,6 +29,7 @@
"__ms_vsscanf_internal:\n\t"
"push {r4-r7, lr}\n\t"
"sub sp, sp, #128\n\t"
+ "mov r12, r3\n\t"
"mov r4, sp\n\t"
"ldr r5, [r2], #4\n\t"
@@ -44,7 +43,7 @@
"mov r2, r5\n\t"
"mov r3, r6\n\t"
- "bl " QUOTE(__MINGW_USYMBOL(sscanf)) "\n\t"
+ "blx r12\n\t"
"add sp, sp, #128\n\t"
"pop {r4-r7, pc}");
@@ -56,10 +55,9 @@
int ret;
#if defined(_AMD64_) || defined(__x86_64__) || \
- defined(_X86_) || defined(__i386__)
+ defined(_X86_) || defined(__i386__) || \
+ defined(_ARM_) || defined(__arm__)
ret = __ms_vsscanf_internal (s, format, arg, sscanf);
-#elif defined (_ARM_) || defined (__arm__)
- ret = __ms_vsscanf_internal (s, format, arg);
#else
#error "unknown platform"
#endif
diff --git a/mingw-w64-crt/stdio/vswscanf.c b/mingw-w64-crt/stdio/vswscanf.c
index 52ab0d6..eb106b1 100644
--- a/mingw-w64-crt/stdio/vswscanf.c
+++ b/mingw-w64-crt/stdio/vswscanf.c
@@ -19,11 +19,9 @@
#elif defined (__arm__) || defined (_ARM_)
-#define QUOTE_(x) #x
-#define QUOTE(x) QUOTE_(x)
-
int __ms_vswscanf_internal (const wchar_t * __restrict__,
- const wchar_t * __restrict__, va_list);
+ const wchar_t * __restrict__, va_list,
+ int (*func)(const wchar_t * __restrict__, const wchar_t * __restrict__, ...));
asm("\t.text\n"
"\t.align 2\n"
"\t.thumb_func\n"
@@ -31,6 +29,7 @@
"__ms_vswscanf_internal:\n\t"
"push {r4-r7, lr}\n\t"
"sub sp, sp, #128\n\t"
+ "mov r12, r3\n\t"
"mov r4, sp\n\t"
"ldr r5, [r2], #4\n\t"
@@ -44,7 +43,7 @@
"mov r2, r5\n\t"
"mov r3, r6\n\t"
- "bl " QUOTE(__MINGW_USYMBOL(swscanf)) "\n\t"
+ "blx r12\n\t"
"add sp, sp, #128\n\t"
"pop {r4-r7, pc}");
@@ -56,10 +55,9 @@
int ret;
#if defined(_AMD64_) || defined(__x86_64__) || \
- defined(_X86_) || defined(__i386__)
+ defined(_X86_) || defined(__i386__) || \
+ defined(_ARM_) || defined(__arm__)
ret = __ms_vswscanf_internal (s, format, arg, swscanf);
-#elif defined (_ARM_) || defined (__arm__)
- ret = __ms_vswscanf_internal (s, format, arg);
#else
#error "unknown platform"
#endif