Files
ObsidianDragon/libs/incbin.h
dan_s c809666624 ObsidianDragon - DragonX ImGui Wallet
Full-node GUI wallet for DragonX cryptocurrency.
Built with Dear ImGui, SDL3, and OpenGL3/DX11.

Features:
- Send/receive shielded and transparent transactions
- Autoshield with merged transaction display
- Built-in CPU mining (xmrig)
- Peer management and network monitoring
- Wallet encryption with PIN lock
- QR code generation for receive addresses
- Transaction history with pagination
- Console for direct RPC commands
- Cross-platform (Linux, Windows)
2026-02-27 00:26:01 -06:00

108 lines
3.9 KiB
C

/*
* incbin.h — Portable binary embedding via assembler .incbin directive
*
* Usage:
* INCBIN(myData, "path/to/file.bin");
*
* This creates:
* extern const unsigned char g_myData_data[]; // file contents
* extern const unsigned char *g_myData_end; // one past end
* extern const unsigned int g_myData_size; // byte count
*
* Compared to xxd -i hex arrays, this uses near-zero compile-time RAM
* because the assembler streams the file directly into the object file
* without building an AST for millions of array elements.
*
* Supports: GCC, Clang, MinGW (any target that uses GAS).
* MSVC: not supported (would need a different strategy).
*
* Based on the public-domain incbin technique.
* Adapted for DragonX Wallet by The Hush Developers, 2024-2026.
*/
#ifndef DRAGONX_INCBIN_H
#define DRAGONX_INCBIN_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* Helper macros for token pasting and stringification.
*/
#define INCBIN_CAT(a, b) INCBIN_CAT_(a, b)
#define INCBIN_CAT_(a, b) a ## b
#define INCBIN_STR(x) INCBIN_STR_(x)
#define INCBIN_STR_(x) #x
/*
* Section attribute: place embedded data in .rodata so it lives in the
* read-only segment just like a normal const array would.
*/
#if defined(__APPLE__)
# define INCBIN_SECTION ".const_data"
# define INCBIN_MANGLE "_"
#else
# define INCBIN_SECTION ".rodata"
# define INCBIN_MANGLE ""
#endif
/*
* Alignment: 16 bytes is sufficient for SIMD loads if anyone ever
* wants to process embedded data with SSE/NEON, and is a safe default.
*/
#define INCBIN_ALIGN 16
/*
* INCBIN_EXTERN — declare the symbols (use in headers)
*/
#define INCBIN_EXTERN(NAME) \
extern const unsigned char INCBIN_CAT(g_, INCBIN_CAT(NAME, _data))[]; \
extern const unsigned char *INCBIN_CAT(g_, INCBIN_CAT(NAME, _end)); \
extern const unsigned int INCBIN_CAT(g_, INCBIN_CAT(NAME, _size))
/*
* INCBIN — define the symbols + embed the file (use in ONE .cpp/.c file)
*
* NAME : C identifier prefix (no quotes)
* FILE : path to the file to embed (string literal, relative to -I or absolute)
*
* The generated assembly:
* .section .rodata
* .balign 16
* .global g_NAME_data
* g_NAME_data:
* .incbin "FILE"
* .global g_NAME_end
* g_NAME_end:
* .byte 0 // NUL sentinel for C string compatibility
* .balign 4
* .global g_NAME_size
* g_NAME_size:
* .int g_NAME_end - g_NAME_data
*/
#define INCBIN(NAME, FILE) \
__asm__( \
".section " INCBIN_SECTION "\n" \
".balign " INCBIN_STR(INCBIN_ALIGN) "\n" \
".global " INCBIN_MANGLE "g_" #NAME "_data\n" \
INCBIN_MANGLE "g_" #NAME "_data:\n" \
" .incbin \"" FILE "\"\n" \
".global " INCBIN_MANGLE "g_" #NAME "_end\n" \
INCBIN_MANGLE "g_" #NAME "_end:\n" \
" .byte 0\n" \
".balign 4\n" \
".global " INCBIN_MANGLE "g_" #NAME "_size\n" \
INCBIN_MANGLE "g_" #NAME "_size:\n" \
" .int " INCBIN_MANGLE "g_" #NAME "_end - " \
INCBIN_MANGLE "g_" #NAME "_data\n" \
".text\n" /* restore default section */ \
); \
INCBIN_EXTERN(NAME)
#ifdef __cplusplus
}
#endif
#endif /* DRAGONX_INCBIN_H */