Release 980201
[wine] / misc / debugstr.c
1 #include "debugstr.h"
2 #include "xmalloc.h"
3 #include <stdlib.h>
4
5 /* ---------------------------------------------------------------------- */
6
7 #define SAVE_STRING_COUNT 50
8 static void *strings[SAVE_STRING_COUNT];
9 static int nextstring;
10
11 /* ---------------------------------------------------------------------- */
12
13 static void *
14 gimme1 (int n)
15 {
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;
21 }
22
23 /* ---------------------------------------------------------------------- */
24
25 LPSTR
26 debugstr_an (LPCSTR src, int n)
27 {
28   LPSTR dst, res;
29
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)
35     {
36       BYTE c = *src++;
37       switch (c)
38         {
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
48             {
49               *dst++ = '\\';
50               *dst++ = '0' + ((c >> 6) & 7);
51               *dst++ = '0' + ((c >> 3) & 7);
52               *dst++ = '0' + ((c >> 0) & 7);
53             }
54         }
55     }
56   if (*src)
57     {
58       *dst++ = '.';
59       *dst++ = '.';
60       *dst++ = '.';
61     }
62   *dst++ = '"';
63   *dst = 0;
64   return res;
65 }
66
67 /* ---------------------------------------------------------------------- */
68
69 LPSTR
70 debugstr_a (LPCSTR s)
71 {
72   return debugstr_an (s, 80);
73 }
74
75 /* ---------------------------------------------------------------------- */
76
77 LPSTR
78 debugstr_wn (LPCWSTR src, int n)
79 {
80   LPSTR dst, res;
81
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)
87     {
88       WORD c = *src++;
89       switch (c)
90         {
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
100             {
101               *dst++ = '\\';
102               *dst++ = '0' + ((c >> 6) & 7);
103               *dst++ = '0' + ((c >> 3) & 7);
104               *dst++ = '0' + ((c >> 0) & 7);
105             }
106         }
107     }
108   if (*src)
109     {
110       *dst++ = '.';
111       *dst++ = '.';
112       *dst++ = '.';
113     }
114   *dst++ = '"';
115   *dst = 0;
116   return res;
117 }
118
119 /* ---------------------------------------------------------------------- */
120
121 LPSTR
122 debugstr_w (LPCWSTR s)
123 {
124   return debugstr_wn (s, 80);
125 }
126
127 /* ---------------------------------------------------------------------- */