Release 971130
[wine/hacks.git] / misc / debugstr.c
blob2ef4649b0d527a990d203a724c0af6ecc60dc35e
1 #include "debugstr.h"
2 #include "xmalloc.h"
3 #include <stdlib.h>
5 /* ---------------------------------------------------------------------- */
7 #define SAVE_STRING_COUNT 50
8 static void *strings[SAVE_STRING_COUNT];
9 static int nextstring;
11 /* ---------------------------------------------------------------------- */
13 static void *
14 gimme1 (int n)
16 void *res;
17 if (strings[nextstring]) free (strings[nextstring]);
18 res = strings[nextstring] = xmalloc (n);
19 if (++nextstring == SAVE_STRING_COUNT) nextstring = 0;
20 return res;
23 /* ---------------------------------------------------------------------- */
25 LPSTR
26 debugstr_an (LPCSTR src, int n)
28 LPSTR dst, res;
30 if (!src) return "(null)";
31 if (n < 0) n = 0;
32 dst = res = gimme1 (n * 4 + 10);
33 *dst++ = '"';
34 while (n-- > 0 && *src)
36 BYTE c = *src++;
37 switch (c)
39 case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
40 case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
41 case '\t': *dst++ = '\\'; *dst++ = 't'; break;
42 case '"': *dst++ = '\\'; *dst++ = '"'; break;
43 case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
44 default:
45 if (c >= ' ' && c <= 126)
46 *dst++ = c;
47 else
49 *dst++ = '\\';
50 *dst++ = '0' + ((c >> 6) & 7);
51 *dst++ = '0' + ((c >> 3) & 7);
52 *dst++ = '0' + ((c >> 0) & 7);
56 if (*src)
58 *dst++ = '.';
59 *dst++ = '.';
60 *dst++ = '.';
62 *dst++ = '"';
63 *dst = 0;
64 return res;
67 /* ---------------------------------------------------------------------- */
69 LPSTR
70 debugstr_a (LPCSTR s)
72 return debugstr_an (s, 80);
75 /* ---------------------------------------------------------------------- */
77 LPSTR
78 debugstr_wn (LPCWSTR src, int n)
80 LPSTR dst, res;
82 if (!src) return "(null)";
83 if (n < 0) n = 0;
84 dst = res = gimme1 (n * 4 + 10);
85 *dst++ = '"';
86 while (n-- > 0 && *src)
88 WORD c = *src++;
89 switch (c)
91 case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
92 case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
93 case '\t': *dst++ = '\\'; *dst++ = 't'; break;
94 case '"': *dst++ = '\\'; *dst++ = '"'; break;
95 case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
96 default:
97 if (c >= ' ' && c <= 126)
98 *dst++ = c;
99 else
101 *dst++ = '\\';
102 *dst++ = '0' + ((c >> 6) & 7);
103 *dst++ = '0' + ((c >> 3) & 7);
104 *dst++ = '0' + ((c >> 0) & 7);
108 if (*src)
110 *dst++ = '.';
111 *dst++ = '.';
112 *dst++ = '.';
114 *dst++ = '"';
115 *dst = 0;
116 return res;
119 /* ---------------------------------------------------------------------- */
121 LPSTR
122 debugstr_w (LPCWSTR s)
124 return debugstr_wn (s, 80);
127 /* ---------------------------------------------------------------------- */