|
144 | 144 | #include "TargetConditionals.h" |
145 | 145 | #if defined(TARGET_OS_IPHONE) && !defined(INCBIN_SILENCE_BITCODE_WARNING) |
146 | 146 | #warning |
147 | | - "incbin is incompatible with bitcode. Using the library will break upload to App Store if you have bitcode enabled. Add `#define INCBIN_SILENCE_BITCODE_WARNING` before including this header to silence this warning." |
| 147 | +"incbin is incompatible with bitcode. Using the library will break upload to App Store if you have " |
| 148 | +"bitcode enabled. Add `#define INCBIN_SILENCE_BITCODE_WARNING` before including this header to " |
| 149 | +"silence this warning." |
148 | 150 | #endif |
149 | 151 | /* The directives are different for Apple branded compilers */ |
150 | 152 | #define INCBIN_SECTION INCBIN_OUTPUT_SECTION "\n" |
|
236 | 238 | #define INCBIN_STYLE_1_SIZE _size |
237 | 239 |
|
238 | 240 | /* Style lookup: returning identifier */ |
239 | | -#define INCBIN_STYLE_IDENT(TYPE) \ |
240 | | - INCBIN_CONCATENATE( \ |
241 | | - INCBIN_STYLE_, \ |
242 | | - INCBIN_CONCATENATE( \ |
243 | | - INCBIN_EVAL(INCBIN_STYLE), \ |
244 | | - INCBIN_CONCATENATE(_, TYPE))) |
| 241 | +#define INCBIN_STYLE_IDENT(TYPE) \ |
| 242 | + INCBIN_CONCATENATE(INCBIN_STYLE_, \ |
| 243 | + INCBIN_CONCATENATE(INCBIN_EVAL(INCBIN_STYLE), INCBIN_CONCATENATE(_, TYPE))) |
245 | 244 |
|
246 | 245 | /* Style lookup: returning string literal */ |
247 | | -#define INCBIN_STYLE_STRING(TYPE) \ |
248 | | - INCBIN_STRINGIZE( \ |
249 | | - INCBIN_STYLE_IDENT(TYPE)) \ |
| 246 | +#define INCBIN_STYLE_STRING(TYPE) INCBIN_STRINGIZE(INCBIN_STYLE_IDENT(TYPE)) |
250 | 247 |
|
251 | 248 | /* Generate the global labels by indirectly invoking the macro with our style |
252 | 249 | * type and concatenating the name against them. */ |
253 | | -#define INCBIN_GLOBAL_LABELS(NAME, TYPE) \ |
254 | | - INCBIN_INVOKE( \ |
255 | | - INCBIN_GLOBAL, \ |
256 | | - INCBIN_CONCATENATE( \ |
257 | | - NAME, \ |
258 | | - INCBIN_INVOKE( \ |
259 | | - INCBIN_STYLE_IDENT, \ |
260 | | - TYPE))) \ |
261 | | - INCBIN_INVOKE( \ |
262 | | - INCBIN_TYPE, \ |
263 | | - INCBIN_CONCATENATE( \ |
264 | | - NAME, \ |
265 | | - INCBIN_INVOKE( \ |
266 | | - INCBIN_STYLE_IDENT, \ |
267 | | - TYPE))) |
| 250 | +#define INCBIN_GLOBAL_LABELS(NAME, TYPE) \ |
| 251 | + INCBIN_INVOKE(INCBIN_GLOBAL, \ |
| 252 | + INCBIN_CONCATENATE(NAME, INCBIN_INVOKE(INCBIN_STYLE_IDENT, TYPE))) \ |
| 253 | + INCBIN_INVOKE(INCBIN_TYPE, INCBIN_CONCATENATE(NAME, INCBIN_INVOKE(INCBIN_STYLE_IDENT, TYPE))) |
268 | 254 |
|
269 | 255 | /** |
270 | 256 | * @brief Externally reference binary data included in another translation unit. |
|
286 | 272 | * // extern const unsigned char *const <prefix>Foo<end>; |
287 | 273 | * // extern const unsigned int <prefix>Foo<size>; |
288 | 274 | * @endcode |
289 | | - * |
| 275 | + * |
290 | 276 | * You may specify a custom optional data type as well as the first argument. |
291 | 277 | * @code |
292 | 278 | * INCBIN_EXTERN(custom_type, Foo); |
293 | | - * |
| 279 | + * |
294 | 280 | * // Now you have the following symbols: |
295 | 281 | * // extern const custom_type <prefix>Foo<data>[]; |
296 | 282 | * // extern const custom_type *const <prefix>Foo<end>; |
297 | 283 | * // extern const unsigned int <prefix>Foo<size>; |
298 | 284 | * @endcode |
299 | 285 | */ |
300 | | -#define INCBIN_EXTERN(...) \ |
| 286 | +#define INCBIN_EXTERN(...) \ |
301 | 287 | INCBIN_CONCATENATE(INCBIN_EXTERN_, INCBIN_VA_ARGC(__VA_ARGS__))(__VA_ARGS__) |
302 | | -#define INCBIN_EXTERN_1(NAME, ...) \ |
303 | | - INCBIN_EXTERN_2(unsigned char, NAME) |
304 | | -#define INCBIN_EXTERN_2(TYPE, NAME) \ |
305 | | - INCBIN_EXTERNAL const INCBIN_ALIGN TYPE \ |
306 | | - INCBIN_CONCATENATE( \ |
307 | | - INCBIN_CONCATENATE(INCBIN_PREFIX, NAME), \ |
308 | | - INCBIN_STYLE_IDENT(DATA))[]; \ |
309 | | - INCBIN_EXTERNAL const INCBIN_ALIGN TYPE *const \ |
310 | | - INCBIN_CONCATENATE( \ |
311 | | - INCBIN_CONCATENATE(INCBIN_PREFIX, NAME), \ |
312 | | - INCBIN_STYLE_IDENT(END)); \ |
313 | | - INCBIN_EXTERNAL const unsigned int \ |
314 | | - INCBIN_CONCATENATE( \ |
315 | | - INCBIN_CONCATENATE(INCBIN_PREFIX, NAME), \ |
316 | | - INCBIN_STYLE_IDENT(SIZE)) |
| 288 | +#define INCBIN_EXTERN_1(NAME, ...) INCBIN_EXTERN_2(unsigned char, NAME) |
| 289 | +#define INCBIN_EXTERN_2(TYPE, NAME) \ |
| 290 | + INCBIN_EXTERNAL const INCBIN_ALIGN TYPE INCBIN_CONCATENATE( \ |
| 291 | + INCBIN_CONCATENATE(INCBIN_PREFIX, NAME), INCBIN_STYLE_IDENT(DATA))[]; \ |
| 292 | + INCBIN_EXTERNAL const INCBIN_ALIGN TYPE *const INCBIN_CONCATENATE( \ |
| 293 | + INCBIN_CONCATENATE(INCBIN_PREFIX, NAME), INCBIN_STYLE_IDENT(END)); \ |
| 294 | + INCBIN_EXTERNAL const unsigned int INCBIN_CONCATENATE(INCBIN_CONCATENATE(INCBIN_PREFIX, NAME), \ |
| 295 | + INCBIN_STYLE_IDENT(SIZE)) |
317 | 296 |
|
318 | 297 | /** |
319 | 298 | * @brief Externally reference textual data included in another translation unit. |
|
335 | 314 | * // extern const unsigned int <prefix>Foo<size>; |
336 | 315 | * @endcode |
337 | 316 | */ |
338 | | -#define INCTXT_EXTERN(NAME) \ |
339 | | - INCBIN_EXTERN_2(char, NAME) |
| 317 | +#define INCTXT_EXTERN(NAME) INCBIN_EXTERN_2(char, NAME) |
340 | 318 |
|
341 | 319 | /** |
342 | 320 | * @brief Include a binary file into the current translation unit. |
|
359 | 337 | * // const unsigned char *const <prefix>Icon<end>; |
360 | 338 | * // const unsigned int <prefix>Icon<size>; |
361 | 339 | * @endcode |
362 | | - * |
| 340 | + * |
363 | 341 | * You may specify a custom optional data type as well as the first argument. |
364 | 342 | * These macros are specialized by arity. |
365 | 343 | * @code |
|
378 | 356 | * please @see INCBIN_EXTERN. |
379 | 357 | */ |
380 | 358 | #ifdef _WIN32 |
381 | | -#define INCBIN(NAME, FILENAME) \ |
382 | | - INCBIN_EXTERN(NAME) |
| 359 | +#define INCBIN(NAME, FILENAME) INCBIN_EXTERN(NAME) |
383 | 360 | #else |
384 | | -#define INCBIN(...) \ |
385 | | - INCBIN_CONCATENATE(INCBIN_, INCBIN_VA_ARGC(__VA_ARGS__))(__VA_ARGS__) |
| 361 | +#define INCBIN(...) INCBIN_CONCATENATE(INCBIN_, INCBIN_VA_ARGC(__VA_ARGS__))(__VA_ARGS__) |
386 | 362 | #if defined(__GNUC__) |
387 | 363 | #define INCBIN_1(...) _Pragma("GCC error \"Single argument INCBIN not allowed\"") |
388 | 364 | #elif defined(__clang__) |
389 | 365 | #define INCBIN_1(...) _Pragma("clang error \"Single argument INCBIN not allowed\"") |
390 | 366 | #else |
391 | 367 | #define INCBIN_1(...) /* Cannot do anything here */ |
392 | 368 | #endif |
393 | | -#define INCBIN_2(NAME, FILENAME) \ |
394 | | - INCBIN_3(unsigned char, NAME, FILENAME) |
395 | | -#define INCBIN_3(TYPE, NAME, FILENAME) INCBIN_COMMON(TYPE, NAME, FILENAME, /* No terminator for binary data */) |
396 | | -#define INCBIN_COMMON(TYPE, NAME, FILENAME, TERMINATOR) \ |
397 | | - __asm__(INCBIN_SECTION \ |
398 | | - INCBIN_GLOBAL_LABELS(NAME, DATA) \ |
399 | | - INCBIN_ALIGN_HOST \ |
400 | | - INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(DATA) ":\n" \ |
401 | | - INCBIN_MACRO " \"" FILENAME "\"\n" \ |
402 | | - TERMINATOR \ |
403 | | - INCBIN_GLOBAL_LABELS(NAME, END) \ |
404 | | - INCBIN_ALIGN_BYTE \ |
405 | | - INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(END) ":\n" \ |
406 | | - INCBIN_BYTE "1\n" \ |
407 | | - INCBIN_GLOBAL_LABELS(NAME, SIZE) \ |
408 | | - INCBIN_ALIGN_HOST \ |
409 | | - INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(SIZE) ":\n" \ |
410 | | - INCBIN_INT INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(END) " - " \ |
411 | | - INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(DATA) "\n" \ |
412 | | - INCBIN_ALIGN_HOST \ |
413 | | - ".text\n" \ |
414 | | - ); \ |
| 369 | +#define INCBIN_2(NAME, FILENAME) INCBIN_3(unsigned char, NAME, FILENAME) |
| 370 | +#define INCBIN_3(TYPE, NAME, FILENAME) \ |
| 371 | + INCBIN_COMMON(TYPE, NAME, FILENAME, /* No terminator for binary data */) |
| 372 | +#define INCBIN_COMMON(TYPE, NAME, FILENAME, TERMINATOR) \ |
| 373 | + __asm__( \ |
| 374 | + INCBIN_SECTION INCBIN_GLOBAL_LABELS(NAME, DATA) INCBIN_ALIGN_HOST INCBIN_MANGLE \ |
| 375 | + INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING( \ |
| 376 | + DATA) ":\n" INCBIN_MACRO " \"" FILENAME "\"\n" TERMINATOR \ |
| 377 | + INCBIN_GLOBAL_LABELS(NAME, END) INCBIN_ALIGN_BYTE INCBIN_MANGLE \ |
| 378 | + INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING( \ |
| 379 | + END) ":\n" INCBIN_BYTE "1\n" INCBIN_GLOBAL_LABELS(NAME, SIZE) \ |
| 380 | + INCBIN_ALIGN_HOST INCBIN_MANGLE INCBIN_STRINGIZE( \ |
| 381 | + INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(SIZE) ":\n" INCBIN_INT \ |
| 382 | + INCBIN_MANGLE INCBIN_STRINGIZE( \ |
| 383 | + INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(END) " - " INCBIN_MANGLE \ |
| 384 | + INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING( \ |
| 385 | + DATA) "\n" INCBIN_ALIGN_HOST ".text\n"); \ |
415 | 386 | INCBIN_EXTERN(TYPE, NAME) |
416 | 387 | #endif |
417 | 388 |
|
418 | 389 | /** |
419 | 390 | * @brief Include a textual file into the current translation unit. |
420 | | - * |
| 391 | + * |
421 | 392 | * This behaves the same as INCBIN except it produces char compatible arrays |
422 | 393 | * and implicitly adds a null-terminator byte, thus the size of data included |
423 | 394 | * by this is one byte larger than that of INCBIN. |
|
447 | 418 | * please @see INCBIN_EXTERN. |
448 | 419 | */ |
449 | 420 | #if defined(_WIN32) |
450 | | -#define INCTXT(NAME, FILENAME) \ |
451 | | - INCBIN_EXTERN(NAME) |
| 421 | +#define INCTXT(NAME, FILENAME) INCBIN_EXTERN(NAME) |
452 | 422 | #else |
453 | | -#define INCTXT(NAME, FILENAME) \ |
454 | | - INCBIN_COMMON(char, NAME, FILENAME, INCBIN_BYTE "0\n") |
| 423 | +#define INCTXT(NAME, FILENAME) INCBIN_COMMON(char, NAME, FILENAME, INCBIN_BYTE "0\n") |
455 | 424 | #endif |
456 | 425 |
|
457 | 426 | #endif |
0 commit comments