|
10 | 10 | //
|
11 | 11 | //===----------------------------------------------------------------------===//
|
12 | 12 |
|
| 13 | +#include <sys/param.h> |
13 | 14 | #include <Foundation/Foundation.h>
|
14 | 15 | #include "format.h"
|
15 | 16 |
|
|
24 | 25 | _os_log_encode(char buf[OS_LOG_FMT_BUF_SIZE], const char *format, va_list args,
|
25 | 26 | int saved_errno, os_trace_blob_t ob)
|
26 | 27 | {
|
27 |
| - os_log_fmt_hdr_s hdr = { }; |
| 28 | + os_log_fmt_hdr_s hdr = {0}; |
28 | 29 | os_trace_blob_add(ob, &hdr, sizeof(hdr));
|
29 | 30 |
|
30 | 31 | const char *percent = strchr(format, '%');
|
31 | 32 |
|
32 | 33 | while (percent != NULL) {
|
33 | 34 | ++percent;
|
34 | 35 | if (percent[0] != '%') {
|
35 |
| - os_log_fmt_cmd_s cmd = { }; |
| 36 | + os_log_fmt_cmd_s cmd = {0}; |
36 | 37 | os_log_count_type_t widtht = T_C_NONE;
|
37 | 38 | os_log_count_type_t prect = T_C_NONE;
|
38 | 39 | os_log_fmt_cmd_flags_t flags = 0;
|
|
99 | 100 | }
|
100 | 101 | break;
|
101 | 102 |
|
102 |
| -#define encode_width() ({ \ |
103 |
| - if (widtht == T_C_DYNAMIC) { \ |
104 |
| - cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; \ |
105 |
| - encode(int, 0); \ |
106 |
| - }}) |
| 103 | +#define encode_width() \ |
| 104 | + do { \ |
| 105 | + if (widtht == T_C_DYNAMIC) { \ |
| 106 | + cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; \ |
| 107 | + encode(int, 0); \ |
| 108 | + } \ |
| 109 | + } while (0) |
107 | 110 |
|
108 | 111 | // clang inconsistency: static precision counts are still marked with the
|
109 | 112 | // privacy bits of the command they preceed
|
110 |
| -#define encode_precision(type) ({ \ |
111 |
| - if (prect != T_C_NONE) { \ |
112 |
| - cmd.cmd_type = type; \ |
113 |
| - cmd.cmd_size = sizeof(int); \ |
114 |
| - if (prect == T_C_STATIC && type == OSLF_CMD_TYPE_COUNT) { \ |
115 |
| - cmd.cmd_flags = flags; \ |
116 |
| - } else if (prect == T_C_DYNAMIC) { \ |
117 |
| - precision = va_arg(args, int); \ |
118 |
| - } \ |
119 |
| - _os_log_encode_arg(ob, &cmd, &precision); \ |
120 |
| - hdr.hdr_cmd_cnt++; \ |
121 |
| - prect = T_C_NONE; \ |
122 |
| - }}) |
| 113 | +#define encode_precision(type) \ |
| 114 | + do { \ |
| 115 | + if (prect != T_C_NONE) { \ |
| 116 | + cmd.cmd_type = type; \ |
| 117 | + cmd.cmd_size = sizeof(int); \ |
| 118 | + if (prect == T_C_STATIC && type == OSLF_CMD_TYPE_COUNT) { \ |
| 119 | + cmd.cmd_flags = flags; \ |
| 120 | + } else if (prect == T_C_DYNAMIC) { \ |
| 121 | + precision = va_arg(args, int); \ |
| 122 | + } \ |
| 123 | + _os_log_encode_arg(ob, &cmd, &precision); \ |
| 124 | + hdr.hdr_cmd_cnt++; \ |
| 125 | + prect = T_C_NONE; \ |
| 126 | + } \ |
| 127 | + } while (0) |
123 | 128 |
|
124 | 129 | // scalar data types encode their precision as a scalar
|
125 |
| -#define encode_scalar_preamble() ({ \ |
126 |
| - encode_width(); \ |
127 |
| - if (prect == T_C_DYNAMIC) { \ |
128 |
| - encode_precision(OSLF_CMD_TYPE_SCALAR); \ |
129 |
| - }}) |
| 130 | +#define encode_scalar_preamble() \ |
| 131 | + do { \ |
| 132 | + encode_width(); \ |
| 133 | + if (prect == T_C_DYNAMIC) { \ |
| 134 | + encode_precision(OSLF_CMD_TYPE_SCALAR); \ |
| 135 | + } \ |
| 136 | + } while (0) |
130 | 137 |
|
131 |
| -#define encode_pointer_preamble() ({ \ |
132 |
| - encode_width(); \ |
133 |
| - encode_precision(OSLF_CMD_TYPE_COUNT); \ |
134 |
| -}) |
| 138 | +#define encode_pointer_preamble() \ |
| 139 | + do { \ |
| 140 | + encode_width(); \ |
| 141 | + encode_precision(OSLF_CMD_TYPE_COUNT); \ |
| 142 | + } while (0) |
135 | 143 |
|
136 |
| -#define encode_nsstring(flags) ({ \ |
137 |
| - NSString *__arg = va_arg(args, NSString *); \ |
138 |
| - const char * _Nullable __var = __arg.UTF8String; \ |
139 |
| - cmd.cmd_flags = flags; \ |
140 |
| - cmd.cmd_size = sizeof(__var); \ |
141 |
| - _os_log_encode_arg(ob, &cmd, &__var); \ |
142 |
| - hdr.hdr_cmd_cnt++; \ |
143 |
| -}) |
| 144 | +#define encode_nsstring(flags) \ |
| 145 | + do { \ |
| 146 | + NSString *__arg = va_arg(args, NSString *); \ |
| 147 | + const char *_Nullable __var = __arg.UTF8String; \ |
| 148 | + cmd.cmd_flags = flags; \ |
| 149 | + cmd.cmd_size = sizeof(__var); \ |
| 150 | + _os_log_encode_arg(ob, &cmd, &__var); \ |
| 151 | + hdr.hdr_cmd_cnt++; \ |
| 152 | + } while (0) |
144 | 153 |
|
145 |
| -#define encode_smallint(ty, flags) ({ \ |
146 |
| - int __var = va_arg(args, int); \ |
147 |
| - cmd.cmd_flags = flags; \ |
148 |
| - cmd.cmd_size = sizeof(__var); \ |
149 |
| - _os_log_encode_arg(ob, &cmd, &__var); \ |
150 |
| - hdr.hdr_cmd_cnt++; \ |
151 |
| -}) |
| 154 | +#define encode_smallint(ty, flags) \ |
| 155 | + do { \ |
| 156 | + int __var = va_arg(args, int); \ |
| 157 | + cmd.cmd_flags = flags; \ |
| 158 | + cmd.cmd_size = sizeof(__var); \ |
| 159 | + _os_log_encode_arg(ob, &cmd, &__var); \ |
| 160 | + hdr.hdr_cmd_cnt++; \ |
| 161 | + } while (0) |
152 | 162 |
|
153 |
| -#define encode(ty, flags) ({ \ |
154 |
| - ty __var = va_arg(args, ty); \ |
155 |
| - cmd.cmd_flags = flags; \ |
156 |
| - cmd.cmd_size = sizeof(__var); \ |
157 |
| - _os_log_encode_arg(ob, &cmd, &__var); \ |
158 |
| - hdr.hdr_cmd_cnt++; \ |
159 |
| -}) |
| 163 | +#define encode(ty, flags) \ |
| 164 | + do { \ |
| 165 | + ty __var = va_arg(args, ty); \ |
| 166 | + cmd.cmd_flags = flags; \ |
| 167 | + cmd.cmd_size = sizeof(__var); \ |
| 168 | + _os_log_encode_arg(ob, &cmd, &__var); \ |
| 169 | + hdr.hdr_cmd_cnt++; \ |
| 170 | + } while (0) |
160 | 171 |
|
161 |
| - /* fixed types */ |
162 |
| - case 'c': // char |
163 |
| - case 'd': // integer |
164 |
| - case 'i': // integer |
165 |
| - case 'o': // octal |
166 |
| - case 'u': // unsigned |
167 |
| - case 'x': // hex |
168 |
| - case 'X': // upper-hex |
169 |
| - encode_scalar_preamble(); |
170 |
| - cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
171 |
| - switch (type) { |
172 |
| - case T_CHAR: encode_smallint(char, flags); break; |
173 |
| - case T_SHORT: encode_smallint(short, flags); break; |
174 |
| - case T_INT: encode(int, flags); break; |
175 |
| - case T_LONG: encode(long, flags); break; |
176 |
| - case T_LONGLONG: encode(long long, flags); break; |
177 |
| - case T_SIZE: encode(size_t, flags); break; |
178 |
| - case T_INTMAX: encode(intmax_t, flags); break; |
179 |
| - case T_PTRDIFF: encode(ptrdiff_t, flags); break; |
180 |
| - default: return false; |
181 |
| - } |
182 |
| - done = true; |
| 172 | + /* fixed types */ |
| 173 | + case 'c': // char |
| 174 | + case 'd': // integer |
| 175 | + case 'i': // integer |
| 176 | + case 'o': // octal |
| 177 | + case 'u': // unsigned |
| 178 | + case 'x': // hex |
| 179 | + case 'X': // upper-hex |
| 180 | + encode_scalar_preamble(); |
| 181 | + cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
| 182 | + switch (type) { |
| 183 | + case T_CHAR: |
| 184 | + encode_smallint(char, flags); |
183 | 185 | break;
|
184 |
| - |
185 |
| - case 'p': // emit pointers as scalars |
186 |
| - cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
187 |
| - encode(void *, flags); |
188 |
| - done = true; |
| 186 | + case T_SHORT: |
| 187 | + encode_smallint(short, flags); |
189 | 188 | break;
|
190 |
| - |
191 |
| - case 'C': // wchar is treated like %lc |
192 |
| - encode_scalar_preamble(); |
193 |
| - cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
194 |
| - encode_smallint(wint_t, flags); |
195 |
| - done = true; |
| 189 | + case T_INT: |
| 190 | + encode(int, flags); |
196 | 191 | break;
|
197 |
| - |
198 |
| - case 'P': // pointer data |
199 |
| - encode_pointer_preamble(); |
200 |
| - hdr.hdr_flags |= OSLF_HDR_FLAG_HAS_NON_SCALAR; |
201 |
| - cmd.cmd_type = OSLF_CMD_TYPE_DATA; |
202 |
| - cmd.cmd_size = sizeof(void *); |
203 |
| - encode(void *, flags); |
204 |
| - done = true; |
| 192 | + case T_LONG: |
| 193 | + encode(long, flags); |
205 | 194 | break;
|
206 |
| - |
207 |
| - case 'L': // long double |
208 |
| - long_double = true; |
| 195 | + case T_LONGLONG: |
| 196 | + encode(long long, flags); |
209 | 197 | break;
|
210 |
| - |
211 |
| - case 'a': case 'A': case 'e': case 'E': // floating types |
212 |
| - case 'f': case 'F': case 'g': case 'G': |
213 |
| - encode_scalar_preamble(); |
214 |
| - cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
215 |
| - if (long_double) { |
216 |
| - encode(long double, flags); |
217 |
| - } else { |
218 |
| - encode(double, flags); |
219 |
| - } |
220 |
| - done = true; |
| 198 | + case T_SIZE: |
| 199 | + encode(size_t, flags); |
221 | 200 | break;
|
222 |
| - |
223 |
| - case 's': // Strings sent from Swift as NSString objects |
224 |
| - encode_pointer_preamble(); |
225 |
| - hdr.hdr_flags |= OSLF_HDR_FLAG_HAS_NON_SCALAR; |
226 |
| - cmd.cmd_type = OSLF_CMD_TYPE_STRING; |
227 |
| - encode_nsstring(flags); |
228 |
| - done = true; |
| 201 | + case T_INTMAX: |
| 202 | + encode(intmax_t, flags); |
229 | 203 | break;
|
230 |
| - |
231 |
| - case '@': // CFTypeRef aka NSObject * |
232 |
| - // %@ does not support precision |
233 |
| - encode_width(); |
234 |
| - hdr.hdr_flags |= OSLF_HDR_FLAG_HAS_NON_SCALAR; |
235 |
| - cmd.cmd_type = OSLF_CMD_TYPE_OBJECT; |
236 |
| - encode(void *, flags); |
237 |
| - done = true; |
| 204 | + case T_PTRDIFF: |
| 205 | + encode(ptrdiff_t, flags); |
238 | 206 | break;
|
| 207 | + default: |
| 208 | + return false; |
| 209 | + } |
| 210 | + done = true; |
| 211 | + break; |
239 | 212 |
|
240 |
| - case 'm': |
241 |
| - cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
242 |
| - cmd.cmd_size = sizeof(int); |
243 |
| - cmd.cmd_flags = flags; |
244 |
| - _os_log_encode_arg(ob, &cmd, &saved_errno); |
245 |
| - hdr.hdr_cmd_cnt++; |
246 |
| - done = true; |
247 |
| - break; |
| 213 | + case 'p': // emit pointers as scalars |
| 214 | + cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
| 215 | + encode(void *, flags); |
| 216 | + done = true; |
| 217 | + break; |
248 | 218 |
|
249 |
| - default: |
250 |
| - if (isdigit(ch)) { // [0-9] |
251 |
| - continue; |
252 |
| - } |
253 |
| - done = true; |
254 |
| - break; |
| 219 | + case 'C': // wchar is treated like %lc |
| 220 | + encode_scalar_preamble(); |
| 221 | + cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
| 222 | + encode_smallint(wint_t, flags); |
| 223 | + done = true; |
| 224 | + break; |
| 225 | + |
| 226 | + case 'P': // pointer data |
| 227 | + encode_pointer_preamble(); |
| 228 | + hdr.hdr_flags |= OSLF_HDR_FLAG_HAS_NON_SCALAR; |
| 229 | + cmd.cmd_type = OSLF_CMD_TYPE_DATA; |
| 230 | + cmd.cmd_size = sizeof(void *); |
| 231 | + encode(void *, flags); |
| 232 | + done = true; |
| 233 | + break; |
| 234 | + |
| 235 | + case 'L': // long double |
| 236 | + long_double = true; |
| 237 | + break; |
| 238 | + |
| 239 | + case 'a': |
| 240 | + case 'A': |
| 241 | + case 'e': |
| 242 | + case 'E': // floating types |
| 243 | + case 'f': |
| 244 | + case 'F': |
| 245 | + case 'g': |
| 246 | + case 'G': |
| 247 | + encode_scalar_preamble(); |
| 248 | + cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
| 249 | + if (long_double) { |
| 250 | + encode(long double, flags); |
| 251 | + } else { |
| 252 | + encode(double, flags); |
| 253 | + } |
| 254 | + done = true; |
| 255 | + break; |
| 256 | + |
| 257 | + case 's': // Strings sent from Swift as NSString objects |
| 258 | + encode_pointer_preamble(); |
| 259 | + hdr.hdr_flags |= OSLF_HDR_FLAG_HAS_NON_SCALAR; |
| 260 | + cmd.cmd_type = OSLF_CMD_TYPE_STRING; |
| 261 | + encode_nsstring(flags); |
| 262 | + done = true; |
| 263 | + break; |
| 264 | + |
| 265 | + case '@': // CFTypeRef aka NSObject * |
| 266 | + // %@ does not support precision |
| 267 | + encode_width(); |
| 268 | + hdr.hdr_flags |= OSLF_HDR_FLAG_HAS_NON_SCALAR; |
| 269 | + cmd.cmd_type = OSLF_CMD_TYPE_OBJECT; |
| 270 | + encode(void *, flags); |
| 271 | + done = true; |
| 272 | + break; |
| 273 | + |
| 274 | + case 'm': |
| 275 | + cmd.cmd_type = OSLF_CMD_TYPE_SCALAR; |
| 276 | + cmd.cmd_size = sizeof(int); |
| 277 | + cmd.cmd_flags = flags; |
| 278 | + _os_log_encode_arg(ob, &cmd, &saved_errno); |
| 279 | + hdr.hdr_cmd_cnt++; |
| 280 | + done = true; |
| 281 | + break; |
| 282 | + |
| 283 | + default: |
| 284 | + if (isdigit(ch)) { // [0-9] |
| 285 | + continue; |
| 286 | + } |
| 287 | + done = true; |
| 288 | + break; |
255 | 289 | }
|
256 | 290 |
|
257 | 291 | if (done) {
|
|
0 commit comments