[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/build/uClibc/libc/stdio/_WRITE.c b/ap/build/uClibc/libc/stdio/_WRITE.c
new file mode 100644
index 0000000..6af5da8
--- /dev/null
+++ b/ap/build/uClibc/libc/stdio/_WRITE.c
@@ -0,0 +1,119 @@
+/* Copyright (C) 2004       Manuel Novoa III    <mjn3@codepoet.org>
+ *
+ * GNU Library General Public License (LGPL) version 2 or later.
+ *
+ * Dedicated to Toni.  See uClibc/DEDICATION.mjn3 for details.
+ */
+
+#include "_stdio.h"
+
+
+/* Given a writing stream with no buffered output, write the
+ * data in 'buf' (which may be the stream's bufstart) of size
+ * 'bufsize' to the stream.  If a write error occurs, set the
+ * stream's error indicator and (if buffering) buffer as much
+ * data as possible (FBF) or only up to '\n' (LBF) to implement
+ * "as if fputc()" clause in the standard.
+ *
+ * Returns the number of bytes written and/or buffered.
+ *
+ * Notes:
+ *   Calling with bufsize == 0 is permitted, and buf is ignored in
+ *     that case.
+ *   We implement fflush() by setting bufpos to bufstart and passing
+ *     bufstart as the buf arg.  If there is a write error, the
+ *     unwritten buffered data will simply be moved to the beginning
+ *     of the buffer.  Since the data obviously fits in the buffer
+ *     and since there will be no '\n' chars in the buffer in the LBF
+ *     case, no data will be lost.
+ *   NOT THREADSAFE!  Assumes stream already locked if necessary.
+ */
+
+size_t attribute_hidden __stdio_WRITE(register FILE *stream,
+					 register const unsigned char *buf, size_t bufsize)
+{
+	size_t todo;
+	ssize_t rv, stodo;
+
+	__STDIO_STREAM_VALIDATE(stream);
+	assert(stream->__filedes >= -1);
+	assert(__STDIO_STREAM_IS_WRITING(stream));
+	assert(!__STDIO_STREAM_BUFFER_WUSED(stream)); /* Buffer must be empty. */
+
+	todo = bufsize;
+
+	while (todo != 0) {
+		stodo = (todo <= SSIZE_MAX) ? todo : SSIZE_MAX;
+		rv = __WRITE(stream, (char *) buf, stodo);
+		if (rv >= 0) {
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning TODO: Make custom stream write return check optional.
+#endif
+#ifdef __UCLIBC_HAS_GLIBC_CUSTOM_STREAMS__
+			assert(rv <= stodo);
+			if (rv > stodo) {	/* Wrote more than stodo! */
+/* 				abort(); */
+			}
+#endif
+			todo -= rv;
+			buf += rv;
+		} else {
+
+			__STDIO_STREAM_SET_ERROR(stream);
+
+			/* We buffer data on "transient" errors, but discard it
+			 * on "hard" ones. Example of a hard error:
+			 *
+			 * close(fileno(stdout));
+			 * printf("Hi there 1\n"); // EBADF
+			 * dup2(good_fd, fileno(stdout));
+			 * printf("Hi there 2\n"); // buffers new data
+			 *
+			 * This program should not print "Hi there 1" to good_fd.
+			 * The rationale is that the caller of writing operation
+			 * should check for error and act on it.
+			 * If he didn't, then future users of the stream
+			 * have no idea what to do.
+			 * It's least confusing to at least not burden them with
+			 * some hidden buffered crap in the buffer.
+			 */
+			if (errno != EINTR && errno != EAGAIN) {
+				/* do we have other "soft" errors? */
+				break;
+			}
+#ifdef __STDIO_BUFFERS
+			stodo = __STDIO_STREAM_BUFFER_SIZE(stream);
+			if (stodo != 0) {
+				unsigned char *s;
+
+				if (stodo > todo) {
+					stodo = todo;
+				}
+
+				s = stream->__bufstart;
+
+				do {
+					*s = *buf;
+					if ((*s == '\n')
+						&& __STDIO_STREAM_IS_LBF(stream)
+						) {
+						break;
+					}
+					++s;
+					++buf;
+				} while (--stodo);
+
+				stream->__bufpos = s;
+
+				todo -= (s - stream->__bufstart);
+			}
+#endif /* __STDIO_BUFFERS */
+
+			bufsize -= todo;
+			break;
+		}
+	}
+
+	__STDIO_STREAM_VALIDATE(stream);
+	return bufsize;
+}