From 8b5fa210a6acedf46114485082d52a23cbc635ee Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 31 Jul 2007 20:48:17 +0000 Subject: * ntdll.h (RtlFreeAnsiString): Declare. * ntdll.h (RtlFreeOemString): Declare. * ntdll.h (RtlUnicodeStringToAnsiString): Declare. * ntdll.h (RtlUnicodeStringToOemString): Declare. * smallprint.cc: Renamed from smallprint.c. Drop unnecessary forward declarations. (__small_vsprintf): Add format specifiers 'C' for WCHAR arguments and 'S' for PUNICODE_STRING arguments. --- winsup/cygwin/ChangeLog | 11 ++ winsup/cygwin/ntdll.h | 6 + winsup/cygwin/smallprint.c | 250 -------------------------------------- winsup/cygwin/smallprint.cc | 284 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 301 insertions(+), 250 deletions(-) delete mode 100644 winsup/cygwin/smallprint.c create mode 100644 winsup/cygwin/smallprint.cc (limited to 'winsup/cygwin') diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index fc03aea72..2cbcf39c1 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,14 @@ +2007-07-31 Corinna Vinschen + + * ntdll.h (RtlFreeAnsiString): Declare. + * ntdll.h (RtlFreeOemString): Declare. + * ntdll.h (RtlUnicodeStringToAnsiString): Declare. + * ntdll.h (RtlUnicodeStringToOemString): Declare. + * smallprint.cc: Renamed from smallprint.c. Drop unnecessary + forward declarations. + (__small_vsprintf): Add format specifiers 'C' for WCHAR arguments + and 'S' for PUNICODE_STRING arguments. + 2007-07-31 Corinna Vinschen * fhandler_disk_file.cc (fhandler_disk_file::link): Revert to checking diff --git a/winsup/cygwin/ntdll.h b/winsup/cygwin/ntdll.h index 9e1606f34..25d9b080e 100644 --- a/winsup/cygwin/ntdll.h +++ b/winsup/cygwin/ntdll.h @@ -790,6 +790,8 @@ extern "C" ULONG WINAPI RtlCreateUnicodeStringFromAsciiz (PUNICODE_STRING, PCSTR); BOOLEAN NTAPI RtlEqualUnicodeString (PUNICODE_STRING, PUNICODE_STRING, BOOLEAN); + VOID NTAPI RtlFreeAnsiString (PANSI_STRING); + VOID NTAPI RtlFreeOemString (POEM_STRING); VOID NTAPI RtlFreeUnicodeString (PUNICODE_STRING); VOID NTAPI RtlInitEmptyUnicodeString (PUNICODE_STRING, PCWSTR, USHORT); VOID NTAPI RtlInitUnicodeString (PUNICODE_STRING, PCWSTR); @@ -800,6 +802,10 @@ extern "C" BOOLEAN NTAPI RtlPrefixUnicodeString (PUNICODE_STRING, PUNICODE_STRING, BOOLEAN); VOID NTAPI RtlSecondsSince1970ToTime (ULONG, PLARGE_INTEGER); + NTSTATUS NTAPI RtlUnicodeStringToAnsiString (PANSI_STRING, PUNICODE_STRING, + BOOLEAN); + NTSTATUS NTAPI RtlUnicodeStringToOemString (PANSI_STRING, PUNICODE_STRING, + BOOLEAN); /* A few Rtl functions are either actually macros, or they just don't exist even though they would be a big help. We implement them here diff --git a/winsup/cygwin/smallprint.c b/winsup/cygwin/smallprint.c deleted file mode 100644 index 915031823..000000000 --- a/winsup/cygwin/smallprint.c +++ /dev/null @@ -1,250 +0,0 @@ -/* 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 -#include -#include -#define WIN32_LEAN_AND_MEAN -#include - -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 diff --git a/winsup/cygwin/smallprint.cc b/winsup/cygwin/smallprint.cc new file mode 100644 index 000000000..d06f558da --- /dev/null +++ b/winsup/cygwin/smallprint.cc @@ -0,0 +1,284 @@ +/* smallprint.cc: small print routines for WIN32 + + Copyright 1996, 1998, 2000, 2001, 2002, 2003, 2005, 2006, 2007 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 "ntdll.h" +#include +#include +#include + +#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[] = "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; +} + +extern "C" 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 'C': + { + WCHAR wc = (WCHAR) va_arg (ap, int); + char buf[4], *c; + sys_wcstombs (buf, 4, &wc, 1); + for (c = buf; *c; ++c) + if (isprint (*c)) + *dst++ = *c; + else + { + *dst++ = '0'; + *dst++ = 'x'; + dst = __rn (dst, 16, 0, *c, len, pad, LMASK); + } + } + 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 'S': + { + PUNICODE_STRING us = va_arg (ap, PUNICODE_STRING); + ANSI_STRING as = { 0, 0, NULL }; + NTSTATUS status; + + if (current_codepage == ansi_cp) + status = RtlUnicodeStringToAnsiString (&as, us, TRUE); + else + status = RtlUnicodeStringToOemString (&as, us, TRUE); + if (!NT_SUCCESS (status)) + { + s = "invalid UNICODE_STRING"; + goto fillin; + } + for (i = 0; i < as.Length; ++i) + *dst++ = as.Buffer[i]; + if (current_codepage == ansi_cp) + RtlFreeAnsiString (&as); + else + RtlFreeOemString (&as); + } + break; + 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; +} + +extern "C" 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; +} + +extern "C" 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; +extern "C" 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 -- cgit v1.2.3