OSDN Git Service

* smallprint.c: New file.
authorcorinna <corinna>
Thu, 2 Aug 2007 14:07:19 +0000 (14:07 +0000)
committercorinna <corinna>
Thu, 2 Aug 2007 14:07:19 +0000 (14:07 +0000)
* Makefile.in (OBJS): Add smallprint.o.
(CYGWIN_OBJS): Remove smallprint.o from Cygwin dir.

winsup/cygserver/ChangeLog
winsup/cygserver/Makefile.in
winsup/cygserver/smallprint.c [new file with mode: 0644]

index d2fb08c..fbfc796 100644 (file)
@@ -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.
index 550f472..b12ff20 100644 (file)
@@ -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 (file)
index 0000000..9150318
--- /dev/null
@@ -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