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