/* * Unicode routines for use inside the server * * Copyright (C) 1999 Alexandre Julliard */ #include #include "unicode.h" /* dump a Unicode string with proper escaping */ int dump_strW( const WCHAR *str, size_t len, FILE *f, char escape[2] ) { static const char escapes[32] = ".......abtnvfr.............e...."; char buffer[256]; char *pos = buffer; int count = 0; for (; len; str++, len--) { if (pos > buffer + sizeof(buffer) - 8) { fwrite( buffer, pos - buffer, 1, f ); count += pos - buffer; pos = buffer; } if (*str > 127) /* hex escape */ { if (len > 1 && str[1] < 128 && isxdigit((char)str[1])) pos += sprintf( pos, "\\x%04x", *str ); else pos += sprintf( pos, "\\x%x", *str ); continue; } if (*str < 32) /* octal or C escape */ { if (!*str && len == 1) continue; /* do not output terminating NULL */ if (escapes[*str] != '.') pos += sprintf( pos, "\\%c", escapes[*str] ); else if (len > 1 && str[1] >= '0' && str[1] <= '7') pos += sprintf( pos, "\\%03o", *str ); else pos += sprintf( pos, "\\%o", *str ); continue; } if (*str == '\\' || *str == escape[0] || *str == escape[1]) *pos++ = '\\'; *pos++ = *str; } fwrite( buffer, pos - buffer, 1, f ); count += pos - buffer; return count; }