aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2007-08-02 14:07:19 +0000
committerCorinna Vinschen <corinna@vinschen.de>2007-08-02 14:07:19 +0000
commitdcd1ef4516bf43cdd866069ef5df2a6a958945d2 (patch)
treeaebfea53b02f90b6e12ccf87f0708431ea91d61e
parente84b3704c41b0b298c61101509f79893748e1b48 (diff)
downloadnewlib-dcd1ef4516bf43cdd866069ef5df2a6a958945d2.zip
newlib-dcd1ef4516bf43cdd866069ef5df2a6a958945d2.tar.gz
newlib-dcd1ef4516bf43cdd866069ef5df2a6a958945d2.tar.bz2
* smallprint.c: New file.
* Makefile.in (OBJS): Add smallprint.o. (CYGWIN_OBJS): Remove smallprint.o from Cygwin dir.
-rw-r--r--winsup/cygserver/ChangeLog6
-rw-r--r--winsup/cygserver/Makefile.in4
-rw-r--r--winsup/cygserver/smallprint.c250
3 files changed, 258 insertions, 2 deletions
diff --git a/winsup/cygserver/ChangeLog b/winsup/cygserver/ChangeLog
index d2fb08c..fbfc796 100644
--- a/winsup/cygserver/ChangeLog
+++ b/winsup/cygserver/ChangeLog
@@ -1,3 +1,9 @@
+2007-08-02 Corinna Vinschen <corinna@vinschen.de>
+
+ * smallprint.c: New file.
+ * Makefile.in (OBJS): Add smallprint.o.
+ (CYGWIN_OBJS): Remove smallprint.o from Cygwin dir.
+
2007-07-21 Corinna Vinschen <corinna@vinschen.de>
* bsd_helper.cc: Drop unnecessary security.h include.
diff --git a/winsup/cygserver/Makefile.in b/winsup/cygserver/Makefile.in
index 550f472..b12ff20 100644
--- a/winsup/cygserver/Makefile.in
+++ b/winsup/cygserver/Makefile.in
@@ -38,12 +38,12 @@ override CXXFLAGS+=-MMD -DHAVE_DECL_GETOPT=0 -D__OUTSIDE_CYGWIN__ -DSYSCONFDIR="
.SUFFIXES: .c .cc .a .o .d
OBJS:= cygserver.o client.o process.o msg.o sem.o shm.o threaded_queue.o \
- transport.o transport_pipes.o \
+ transport.o transport_pipes.o smallprint.o \
bsd_helper.o bsd_log.o bsd_mutex.o \
sysv_msg.o sysv_sem.o sysv_shm.o
LIBOBJS:=${patsubst %.o,lib%.o,$(OBJS)}
-CYGWIN_OBJS:=$(cygwin_build)/smallprint.o $(cygwin_build)/version.o
+CYGWIN_OBJS:=$(cygwin_build)/version.o
CYGWIN_LIB:=$(cygwin_build)/libcygwin.a
diff --git a/winsup/cygserver/smallprint.c b/winsup/cygserver/smallprint.c
new file mode 100644
index 0000000..9150318
--- /dev/null
+++ b/winsup/cygserver/smallprint.c
@@ -0,0 +1,250 @@
+/* smallprint.c: small print routines for WIN32
+
+ Copyright 1996, 1998, 2000, 2001, 2002, 2003, 2005, 2006 Red Hat, Inc.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "winsup.h"
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+int __small_sprintf (char *dst, const char *fmt, ...);
+int __small_vsprintf (char *dst, const char *fmt, va_list ap);
+
+#define LLMASK (0xffffffffffffffffULL)
+#define LMASK (0xffffffff)
+
+#define rnarg(dst, base, dosign, len, pad) __rn ((dst), (base), (dosign), va_arg (ap, long), len, pad, LMASK)
+#define rnargLL(dst, base, dosign, len, pad) __rn ((dst), (base), (dosign), va_arg (ap, unsigned long long), len, pad, LLMASK)
+
+static char __fastcall *
+__rn (char *dst, int base, int dosign, long long val, int len, int pad, unsigned long long mask)
+{
+ /* longest number is ULLONG_MAX, 18446744073709551615, 20 digits */
+ unsigned long long uval = 0;
+ char res[20];
+ static const char str[16] = "0123456789ABCDEF";
+ int l = 0;
+
+ if (dosign && val < 0)
+ {
+ *dst++ = '-';
+ uval = -val;
+ }
+ else if (dosign > 0 && val > 0)
+ {
+ *dst++ = '+';
+ uval = val;
+ }
+ else
+ uval = val;
+
+ uval &= mask;
+
+ do
+ {
+ res[l++] = str[uval % base];
+ uval /= base;
+ }
+ while (uval);
+
+ while (len-- > l)
+ *dst++ = pad;
+
+ while (l > 0)
+ *dst++ = res[--l];
+
+ return dst;
+}
+
+int
+__small_vsprintf (char *dst, const char *fmt, va_list ap)
+{
+ char tmp[CYG_MAX_PATH + 1];
+ char *orig = dst;
+ const char *s;
+
+ DWORD err = GetLastError ();
+
+ while (*fmt)
+ {
+ int i, n = 0x7fff;
+ if (*fmt != '%')
+ *dst++ = *fmt++;
+ else
+ {
+ int len = 0;
+ char pad = ' ';
+ int addsign = -1;
+
+ switch (*++fmt)
+ {
+ case '+':
+ addsign = 1;
+ fmt++;
+ break;
+ case '%':
+ *dst++ = *fmt++;
+ continue;
+ }
+
+ for (;;)
+ {
+ char c = *fmt++;
+ switch (c)
+ {
+ case '0':
+ if (len == 0)
+ {
+ pad = '0';
+ continue;
+ }
+ case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ len = len * 10 + (c - '0');
+ continue;
+ case 'l':
+ continue;
+ case 'c':
+ {
+ int c = va_arg (ap, int);
+ if (c > ' ' && c <= 127)
+ *dst++ = c;
+ else
+ {
+ *dst++ = '0';
+ *dst++ = 'x';
+ dst = __rn (dst, 16, 0, c, len, pad, LMASK);
+ }
+ }
+ break;
+ case 'E':
+ strcpy (dst, "Win32 error ");
+ dst = __rn (dst + sizeof ("Win32 error"), 10, 0, err, len, pad, LMASK);
+ break;
+ case 'd':
+ dst = rnarg (dst, 10, addsign, len, pad);
+ break;
+ case 'D':
+ dst = rnargLL (dst, 10, addsign, len, pad);
+ break;
+ case 'u':
+ dst = rnarg (dst, 10, 0, len, pad);
+ break;
+ case 'U':
+ dst = rnargLL (dst, 10, 0, len, pad);
+ break;
+ case 'o':
+ dst = rnarg (dst, 8, 0, len, pad);
+ break;
+ case 'p':
+ *dst++ = '0';
+ *dst++ = 'x';
+ /* fall through */
+ case 'x':
+ dst = rnarg (dst, 16, 0, len, pad);
+ break;
+ case 'X':
+ dst = rnargLL (dst, 16, 0, len, pad);
+ break;
+ case 'P':
+ if (!GetModuleFileName (NULL, tmp, CYG_MAX_PATH))
+ s = "cygwin program";
+ else
+ s = tmp;
+ goto fillin;
+ case '.':
+ n = strtol (fmt, (char **) &fmt, 10);
+ if (*fmt++ != 's')
+ goto endfor;
+ case 's':
+ s = va_arg (ap, char *);
+ if (s == NULL)
+ s = "(null)";
+ fillin:
+ for (i = 0; *s && i < n; i++)
+ *dst++ = *s++;
+ break;
+ default:
+ *dst++ = '?';
+ *dst++ = fmt[-1];
+ }
+ endfor:
+ break;
+ }
+ }
+ }
+ *dst = 0;
+ SetLastError (err);
+ return dst - orig;
+}
+
+int
+__small_sprintf (char *dst, const char *fmt, ...)
+{
+ int r;
+ va_list ap;
+ va_start (ap, fmt);
+ r = __small_vsprintf (dst, fmt, ap);
+ va_end (ap);
+ return r;
+}
+
+void
+small_printf (const char *fmt, ...)
+{
+ char buf[16384];
+ va_list ap;
+ DWORD done;
+ int count;
+
+#if 0 /* Turn on to force console errors */
+ extern SECURITY_ATTRIBUTES sec_none;
+ HANDLE h = CreateFileA ("CONOUT$", GENERIC_READ|GENERIC_WRITE,
+ FILE_SHARE_WRITE | FILE_SHARE_WRITE, &sec_none,
+ OPEN_EXISTING, 0, 0);
+ if (h)
+ SetStdHandle (STD_ERROR_HANDLE, h);
+#endif
+
+ va_start (ap, fmt);
+ count = __small_vsprintf (buf, fmt, ap);
+ va_end (ap);
+
+ WriteFile (GetStdHandle (STD_ERROR_HANDLE), buf, count, &done, NULL);
+ FlushFileBuffers (GetStdHandle (STD_ERROR_HANDLE));
+}
+
+#ifdef DEBUGGING
+static HANDLE NO_COPY console_handle = NULL;
+void
+console_printf (const char *fmt, ...)
+{
+ char buf[16384];
+ va_list ap;
+ DWORD done;
+ int count;
+
+ if (!console_handle)
+ console_handle = CreateFileA ("CON", GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, 0);
+
+ if (console_handle == INVALID_HANDLE_VALUE)
+ console_handle = GetStdHandle (STD_ERROR_HANDLE);
+
+ va_start (ap, fmt);
+ count = __small_vsprintf (buf, fmt, ap);
+ va_end (ap);
+
+ WriteFile (console_handle, buf, count, &done, NULL);
+ FlushFileBuffers (console_handle);
+}
+#endif