More printf de-duplication.

Fix the 'j' (intmax_t/uintmax_t) length qualifier in the wide
variant. (With new tests that fail without this fix.)

Fix a typo in the wide support for intmax_t*, which isn't testable because
%n is disabled on Android (and will be removed in a later cleanup pass).

Also move the public vfprintf/vfwprint functions into stdio.cpp.

Bug: http://b/67371539
Test: ran tests
Change-Id: Ib003599b1e9cb789044a068940b59e447f2cb7cb
diff --git a/tests/stdio_test.cpp b/tests/stdio_test.cpp
index e07980e..87a0eae 100644
--- a/tests/stdio_test.cpp
+++ b/tests/stdio_test.cpp
@@ -621,6 +621,38 @@
   EXPECT_EQ(std::wstring(L"<a>"), buf);
 }
 
+TEST(STDIO_TEST, swprintf_jd_INTMAX_MAX) {
+  constexpr size_t nchars = 32;
+  wchar_t buf[nchars];
+
+  swprintf(buf, nchars, L"%jd", INTMAX_MAX);
+  EXPECT_EQ(std::wstring(L"9223372036854775807"), buf);
+}
+
+TEST(STDIO_TEST, swprintf_jd_INTMAX_MIN) {
+  constexpr size_t nchars = 32;
+  wchar_t buf[nchars];
+
+  swprintf(buf, nchars, L"%jd", INTMAX_MIN);
+  EXPECT_EQ(std::wstring(L"-9223372036854775808"), buf);
+}
+
+TEST(STDIO_TEST, swprintf_ju_UINTMAX_MAX) {
+  constexpr size_t nchars = 32;
+  wchar_t buf[nchars];
+
+  swprintf(buf, nchars, L"%ju", UINTMAX_MAX);
+  EXPECT_EQ(std::wstring(L"18446744073709551615"), buf);
+}
+
+TEST(STDIO_TEST, swprintf_1$ju_UINTMAX_MAX) {
+  constexpr size_t nchars = 32;
+  wchar_t buf[nchars];
+
+  swprintf(buf, nchars, L"%1$ju", UINTMAX_MAX);
+  EXPECT_EQ(std::wstring(L"18446744073709551615"), buf);
+}
+
 TEST(STDIO_TEST, swprintf_ls) {
   constexpr size_t nchars = 32;
   wchar_t buf[nchars];
@@ -655,6 +687,30 @@
   EXPECT_STREQ("-2147483648", buf);
 }
 
+TEST(STDIO_TEST, snprintf_jd_INTMAX_MAX) {
+  char buf[BUFSIZ];
+  snprintf(buf, sizeof(buf), "%jd", INTMAX_MAX);
+  EXPECT_STREQ("9223372036854775807", buf);
+}
+
+TEST(STDIO_TEST, snprintf_jd_INTMAX_MIN) {
+  char buf[BUFSIZ];
+  snprintf(buf, sizeof(buf), "%jd", INTMAX_MIN);
+  EXPECT_STREQ("-9223372036854775808", buf);
+}
+
+TEST(STDIO_TEST, snprintf_ju_UINTMAX_MAX) {
+  char buf[BUFSIZ];
+  snprintf(buf, sizeof(buf), "%ju", UINTMAX_MAX);
+  EXPECT_STREQ("18446744073709551615", buf);
+}
+
+TEST(STDIO_TEST, snprintf_1$ju_UINTMAX_MAX) {
+  char buf[BUFSIZ];
+  snprintf(buf, sizeof(buf), "%1$ju", UINTMAX_MAX);
+  EXPECT_STREQ("18446744073709551615", buf);
+}
+
 TEST(STDIO_TEST, snprintf_ld_LONG_MAX) {
   char buf[BUFSIZ];
   snprintf(buf, sizeof(buf), "%ld", LONG_MAX);