adb: win32: handle incomplete UTF-8 in console output, other fixes

Previously, the various adb_printf, adb_fwrite, etc. functions did not
correctly handle the case of the passed buffer ending with an incomplete
UTF-8 sequence. This is fixed by buffering up incomplete UTF-8 sequences
in g_console_output_buffer (protected by the mutex
g_console_output_buffer) and outputting it later once the full sequence
is available.

A unittest for the main worker function, ParseCompleteUTF8(), was added
to adb_test.

Other fixes:

- Fix the return value of number-of-chars written to be number of UTF-8
  bytes instead of number of UTF-16 characters.

- Don't overwrite errno in success cases of various adb_printf, etc.
  functions. This might be excessive, but might be useful in the case
  when these functions are used for debugging/tracing.

- Add missing UTF-8 stdio functions that aren't currently used by adb,
  but might be in the future: vprintf, putc, putchar, puts.

- stdin_raw_init: If we can't get the console handle, don't call
  SetConsoleMode(). Not a big deal, but this will prevent erroneous
  trace output.

Change-Id: I8730e8af92882c42b884ad921b39a17b54465085
Signed-off-by: Spencer Low <CompareAndSwap@gmail.com>
diff --git a/adb/sysdeps.h b/adb/sysdeps.h
index 2190c61..797d7bd 100644
--- a/adb/sysdeps.h
+++ b/adb/sysdeps.h
@@ -27,6 +27,7 @@
 #include <errno.h>
 
 #include <string>
+#include <vector>
 
 // Include this before open/unlink are defined as macros below.
 #include <android-base/utf8.h>
@@ -282,6 +283,8 @@
 
 extern int adb_vfprintf(FILE *stream, const char *format, va_list ap)
     __attribute__((__format__(ADB_FORMAT_ARCHETYPE, 2, 0)));
+extern int adb_vprintf(const char *format, va_list ap)
+    __attribute__((__format__(ADB_FORMAT_ARCHETYPE, 1, 0)));
 extern int adb_fprintf(FILE *stream, const char *format, ...)
     __attribute__((__format__(ADB_FORMAT_ARCHETYPE, 2, 3)));
 extern int adb_printf(const char *format, ...)
@@ -289,6 +292,8 @@
 
 extern int adb_fputs(const char* buf, FILE* stream);
 extern int adb_fputc(int ch, FILE* stream);
+extern int adb_putchar(int ch);
+extern int adb_puts(const char* buf);
 extern size_t adb_fwrite(const void* ptr, size_t size, size_t nmemb,
                          FILE* stream);
 
@@ -315,13 +320,20 @@
 #define chmod adb_chmod
 
 #define vfprintf adb_vfprintf
+#define vprintf adb_vprintf
 #define fprintf adb_fprintf
 #define printf adb_printf
 #define fputs adb_fputs
 #define fputc adb_fputc
+// putc may be a macro, so if so, undefine it, so that we can redefine it.
+#undef putc
+#define putc(c, s) adb_fputc(c, s)
+#define putchar adb_putchar
+#define puts adb_puts
 #define fwrite adb_fwrite
 
 #define fopen adb_fopen
+#define freopen freopen_utf8_not_yet_implemented
 
 #define getenv adb_getenv
 #define putenv putenv_utf8_not_yet_implemented
@@ -380,6 +392,12 @@
 // but does not check if the handle != INVALID_HANDLE_VALUE.
 typedef std::unique_ptr<HANDLE, handle_deleter> unique_handle;
 
+namespace internal {
+
+size_t ParseCompleteUTF8(const char* first, const char* last, std::vector<char>* remaining_bytes);
+
+}
+
 #else /* !_WIN32 a.k.a. Unix */
 
 #include "fdevent.h"