Created
February 6, 2024 00:51
-
-
Save imaami/15b7594c5bb816335c734f9265ffc076 to your computer and use it in GitHub Desktop.
Compile-time generation of correctly aligned text
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stddef.h> | |
#include <stdio.h> | |
#define options(X) \ | |
X('h', "help", "", "print this help") \ | |
X('s', "segfault", "", "commit sudoku") \ | |
X('d', "directory", "DIR", "touch a directory") \ | |
X('u', "uid-of", "NAME", "print a user ID") | |
#ifdef __clang__ | |
#pragma clang diagnostic push | |
#pragma clang diagnostic ignored "-Wc++-compat" | |
#pragma clang diagnostic ignored "-Wc++98-compat" | |
#pragma clang diagnostic ignored "-Wgnu-empty-initializer" | |
#pragma clang diagnostic ignored "-Wpre-c2x-compat" | |
#pragma clang diagnostic ignored "-Wunknown-attributes" | |
#endif // __clang__ | |
[[gnu::optimize("Os")]] static void usage(char const *argv0); | |
int main([[maybe_unused]] int argc, char **argv) | |
{ | |
usage(argv[0]); | |
} | |
#define ws0() " " | |
#define ws1() " " | |
#define ws2() " " | |
#define ws3() " " | |
#define ws4() " " | |
#define ws5() " " | |
#define ws6() " " | |
#define ws7() ws6() ws6() | |
#define ws8() ws7() ws7() | |
#define ws9() ws8() ws8() | |
#define ws10() ws9() ws9() | |
#define ws11() ws10() ws10() | |
#pragma GCC diagnostic push | |
#pragma GCC diagnostic ignored "-Wpedantic" | |
struct bit_off { }; | |
#pragma GCC diagnostic pop | |
struct bit0_on { const char a[1U << 0U]; }; | |
struct bit1_on { const char a[1U << 1U]; }; | |
struct bit2_on { const char a[1U << 2U]; }; | |
struct bit3_on { const char a[1U << 3U]; }; | |
struct bit4_on { const char a[1U << 4U]; }; | |
struct bit5_on { const char a[1U << 5U]; }; | |
struct bit6_on { const char a[1U << 6U]; }; | |
struct bit7_on { const char a[1U << 7U]; }; | |
struct bit8_on { const char a[1U << 8U]; }; | |
struct bit9_on { const char a[1U << 9U]; }; | |
struct bit10_on { const char a[1U << 10U]; }; | |
struct bit11_on { const char a[1U << 11U]; }; | |
#define bit_(b, n, v) _Generic(&(char[1U + ((n) & (1U << (size_t)b))]){0} \ | |
, char(*)[1U + (1U << (size_t)b)]: (const struct bit##b##_on){v} \ | |
, char(*)[1U]: (const struct bit_off){}) | |
#define bit(b, n) bit_(b, n, {ws##b()}) | |
#define bit_type(b, n) typeof(bit_(b, n, 0)) | |
#define ws_type(n) struct { \ | |
bit_type( 0, n) b0; bit_type( 1, n) b1; \ | |
bit_type( 2, n) b2; bit_type( 3, n) b3; \ | |
bit_type( 4, n) b4; bit_type( 5, n) b5; \ | |
bit_type( 6, n) b6; bit_type( 7, n) b7; \ | |
bit_type( 8, n) b8; bit_type( 9, n) b9; \ | |
bit_type(10, n) ba; bit_type(11, n) bb; } | |
#define ws_init(n) { \ | |
bit(0, n), bit(1, n), bit( 2, n), bit( 3, n), \ | |
bit(4, n), bit(5, n), bit( 6, n), bit( 7, n), \ | |
bit(8, n), bit(9, n), bit(10, n), bit(11, n), } | |
#define dog(x,y) x##y | |
#define cat(x,y) dog(x, y) | |
#define sym(x) cat(x##_,__COUNTER__) | |
#define c_str(x) char sym(m)[sizeof x] | |
#define mkarr(chr, str, arg, ...) c_str(str " " arg " "); | |
typedef char str_arg_max[sizeof(union {options(mkarr)})]; | |
#undef mkarr | |
#define str_arg_align(x) (sizeof(str_arg_max) - sizeof x) | |
#define space(x) ws_type(str_arg_align(x)) sym(m) | |
#define space_init(x) ws_init(str_arg_align(x)) | |
#define line_vars(chr, str, arg, help) \ | |
const c_str(" -"); \ | |
const c_str(", --" str " " arg); \ | |
const space(str " " arg); \ | |
const c_str(help); | |
#define line_init(chr, str, arg, help) \ | |
{ ' ', ' ', '-', chr }, \ | |
", --" str " " arg " ", \ | |
space_init(str " " arg), \ | |
help "\n", | |
#define help_text(x) ((const union { \ | |
const struct { \ | |
x(line_vars) \ | |
const char nul[1]; \ | |
}; \ | |
const char str[1U + sizeof ( \ | |
struct { \ | |
x(line_vars) \ | |
} \ | |
)]; \ | |
}){{ \ | |
x(line_init) "" \ | |
}}.str) | |
static void usage(char const *argv0) | |
{ | |
(void)printf("Usage: %s [OPTIONS]\n\nOptions:\n%s", | |
argv0, help_text(options)); | |
} | |
#ifdef __clang__ | |
#pragma clang diagnostic pop | |
#endif // __clang__ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
On Godbolt:
https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1AB9U8lJL6yAngGVG6AMKpaAVxYMQAVgBMpBwAyeAyYAHLuAEaYxBJepAAOqAqEtgzObh7efonJNgJBIeEsUTFccZaY1qlCBEzEBOnunr4WmFZ5DDV1BAVhkdGxFrX1jZktCsM9wX3FA2UAlBaorsTI7BwApD4AzMHIblgA1BvbjhPoWFQAdAgn2BsaAIJbuwz7rkcnZwT4qDd3D2eTxel2mh1Q8Q6CggAA15ocEYikciUai0YiNl5HICHgBOGEQMAcBBE0jHHw%2BBBteJbPwo2m0slI2nxYjBAiHAgIPAKQ5U2g0inwhGY7HAjT4wkcBSk8k%2BJTAKhMVy0AiMkUU9XMiloFgsQiHBQfVAAa1ctOFGKxOIlBKJ6FltPwxEqRGIAE91bSACIASQASlraURXMgEIcmIdna6SJ6hcdreLJUTXI6Ka48OgALSoKhajU%2BUKPACy9wpZJZbMEEcOriUxEOvu9Fptzx2eCol0OZgMRlMOJ2rKYwBYkf2hmAUbww4YSRsyEO8Trt2Bg%2BIw9Hh3HRinM7neAXeGAs5d6DlWYA6sgtgAhW9Z3XxJhqzWr7ZDkdj3uT/B7iYHw4jxPTAz1pS9rx8O9INxAAOB9UBYJ8Xx8Ad33XT8t2/Xdj33Q8cNPc8L2PVws0wRCCHdLNghSMQ8AAL2iBk3w/Tdtx/accP/PDgNAilL1ZTAHx8VR4MQ58mLbNCNy/CdsNnLjAPwkDCNcBgTVnAB3Bgs2fAg2QiVwCEwBQJJeBwO0OAB6Szu2MNj%2B3FZ4vDvZziJAEAIRsfUGIgWkAHkTKFTFmy8b1DVqedDgAN1QTNawUYdMAgMM6i3AQJkOAAqOpgCijR5hOO9HPZQ5R2CXznMxG9R3dKJjFUusQOC4LAOrHLzC3BBUsy7LiFygrgQAdiKoFcTrRKIByqKqo0YKCu2EaNkG5tHJBTAaBCQ4NIUDQIGFWk5VQ0FNu2rg9oLAsjvWsFtp8c65W1FC32OzAtoUbZ7oO1FTJ2F63skT6KXRb7X0kv7tq8QGfGBmGYZ%2B7ZwYUAA2KHYbR9GMeB%2BHEcG%2B7tpR4V8b2q6Nte7aYLxhRccJqniee66ToUXFKYpmnWZJm6FC4Xb4W25maf5jnGa4M7ea5nm3u5umgUkljIwAcUcRw5Nwxdl1QuXDkV5Xf04yKgJIZSwIveIQMMecJImYhQw5CJCGMXMqBFYbjmWwqNfQzdtZVhTEhpRyrZtw47YIDQHYYZ2bzShgMpShsmCqrg5GOU4vgRDQ5GahbXebBbAUD6xg8ILhw8j6PY66%2BPE%2BTr408OJOs6jpbc5GgvbcIHxS9dqO0Bjjk44jauU%2BxU4ER8TPQsKnP3aeNui4IbYu6Wnv0v7yvB%2BcpPh7r7YJ5b6e89nvSg5DyQl5d3uK9ShPN5r1PR8OSQ96n5uZ8eOeQ68c%2BV77zrr6H2uD8vDP2zq/Q%2B79j6FxDkjb%2B5c17/1vtvB%2BSMQFNzduAj%2BhBBqwMvvAquiDAHK0OINVBB9W6QPbgQGCODV5/3wTeLehCEQwVIWA8h1soGEFxDQ3%2BA8b4MLviPIhuJWHoPYSfYuYcBDdzgXQjeAikHK25qIlu%2BcKHzxFqXZesi%2BEAPvkohuk9QFiNbGtUm89jAQAiGSBgZIorwmMPLRg0QDy%2BR8CjOOADIKHCgAweEWwkY%2BMYfonxyQGLGAIPMCI8wCqhQKsNWay0ExilGmSOOEBMqxIUbeIJgi04QDCZgCJUTYnehAD43B4UOGUJeC8CItSdjh3iTeaaSTkk2lxGkyuGSsmGLKRU2hmCCAOyoFQZpzcBoyzMWCEOVibGWkRCHSx1jDi2O7ttBp2wIjE2WpM6Zm0lkUVNnM1Z8IjmYFzFY%2B2Jy1n5T2fTcx20InumOX4qpQdtHo1FB0w5LykqHA0PM4Os1s6/OOfXIFEQuAv0TKNMF/y6RvIiChUF9tzkQEONsSF2wYUpLxPCjF0hTnB0kFPAlhw4jEoiF4XFPy0V/IxUjSFSMyX0vBYNSFg1aVJnJTBSFMFWXDPRYcTpVLcTcrhWypK3NIUJ1RUKhlItIX1OMStKZv0GZkwUMYaiBAIBvM%2BZjTG3yeWEAgIC05ZJZlcHmVas1hxEWLHnhirFlr2mmr1USvxdq9WUu9c6w4TK3WzOIba91kq9V8uDWa0V/rrUWrjWapVbrX6rQ1eY9AqBgAQFUKQd08JVCbM9A8sEog9W5vzVGLNOayT5qFq9BQ7oWA5stGWnNmzjCkFMI4PychQgABVsD%2BlMHs9NpbjBWxbXIxtzaWBZMKbmQ4hbJ5poRpq0qJo6jEGSggMgVSyQ5TJFcY98JkATr0gUvSD0Do5WvUFcB5yuwDytsYHKxhRzLpvAuqgEBVKpG7p5VI0IWCbuIMQeJ3pSlvxeKpLsIGt31qqa%2Bvqr7aBASnQU%2BiFyf0vrfR%2B%2BEWZDRYcXaoe5YN10KCfGsKdyInnotwyh2ix4W3whnRAOdiHKNMDWDqhgZrSNvV42ahjwBUPodI2R/Zr00MhGMFFOo0Iwx7qtgevqZJ%2BTxEtCa0alSz2Tq%2BlmFs2c0babxLp89271RZkM0DK2d7oY5Xmk3WFZnBlUaSnZg6N6%2BpObRKZiU5nJ0aac6Ysdm0ZNFN1Tu5TelVPAHU9SfxLmJTaKJIcWUaWMscCzLKJTOcmT0mS%2BK8shxrMHU80Dbzk4vMle%2BkVrjPGosVehlVp1hW8USg04dLEDBGShbXeYjTETMCqHLfCKAlS/3SO0f53ElS56GthrNvEqgIARbkwphZyJlsBdoQPBgKpE6NytB18VYijVYyK7p9eVsvFR2/T48NeI8QLZdktorz2JSrfW/J4gCgkunee20i7s2oPGYu%2B1nEuzl6LYh5d0733phCciYdIGJmXNu2WlcK2ZGJjPgAjFOK41gBJQHpU3quV8pQ8WhKCAhP0DzFZOyH9tJFCJXKVsLwvIqp%2BWUP230flQhCGaj10UDA/KQiAyAMXnPAp%2BA6WjKaFqhtGVGxAQD6UYnQbdqujsXYewTgcrLT2Mkdy63kpFP2qFzJO2srZeyxh%2BuwfWnyakw3RuoWd07dburPcMC7D9hTfuuwNci3xtUb4veGnc8Hl3ImxPHlj07PTekk%2BGibWnstafM3ADT0833kf/cu7o38tP8Ky%2BEAr8MvPXNoWF67KdWa9fi9MxrwK5vTttpco729FlPeIY19Jf396NenqSSj6dGvTfHgcEWLQTgXheCeA4FoUgqBODKwUMsVYr0Xg8FIAQTQs/FgmhANsXEVxJBeAlDBDQ5%2BfBlCRjBJGcR58cEkEvo/a/OC8AUCAQFh%2BK%2Bs%2BpAcAsAMAiAKACE8QdA0Q5AlAj4MBMQyAwAXA2wfgNAqo0Qf%2BViX%2BdszAHonA%2B%2BeBdQ7ofkEQ2grohBvAuobAggfkDAtA7oX%2BWABkwAjgYgtAf%2B3AvAWAo4Rg4gQBpA0YVQUUxkX%2BI2lQhk6wq%2B7IbQX%2BaGEQ64HozgWAX%2BekeALAVBiwVABgwACgAAangJgBpBLowFQTIIICIGIOwDKvwIIIoCoOoIIboH4N%2BCAKYHZPoHgBEH/pAIsBrjHJwFmOcCcN6MRMJKVn5NsKVryJeBwaVheCNnpJGFmKbOgObAeLwKgKIWBpmGIX4a0O0KkPYP7qMJ4DaoENMEUCUHoDkCkAIGUbUUkPUQwL0NUXMIUa6NUJMI0TahUFUAIF0PUG0f0KUEMN0L0eMcMVUaMRIIsFvisGsHMfoAvp/oIevhwEus/lmEjJIIcMAMgAuKgVcNDBALgIQCQOSNsFwPMLwIAVoDEqQFSEwFgDEHtKQKfmgZfl4NsNsBoL4DBDBD4LiEjHfise/rwJoZIDBFcHfriA/l4E/kjD4INFfjasvqvhsb/v/gfkfosKARAQgfQGQBQMlFAYgSgGxFwINBoDahgUZH9pQBELgcECQeYcQR6GQRQdYOYTQYwAQPQYwcwZgKwewbQJweYbwROAIavsITYKIVwavhIcgFIV/rIW/qvgoUoe6CodIXcWyJodwdoboQYUYSYabMvvvnYcIKIOILYbIA4WoF/roDam4R4eYAob4e8QEVwcET8KEeEaoJEdEcEQkfEZeEkeuKVmkRkQuBGTke6FyMEMAFkTkWyFgF6fMW0F0XYBAA4JMZUYULMTanUR0JMaWakCMbMGMf0R0EMQ0C4E0HoLWd0d0FWTUX0T0Y2ZkJ2W2TMdWcsQsTvssW/ovqQBiVkZwFsUjDsXsWxPXINLCVcFwD4ucW6FcTcXcXiYsM8a8ZQHPpwB/qQJoV4FwFcCCRoINDBJINcdsIND4F4HEBOd/hwNiQAduR8Wfl4FcEiSiVfjfnCa4ZwNsGsZiT/riUAfieAQSRAEgMqYZCQHAZNH1AoMoIYG0EIAgKgFpF/kSfjgIGhSELQJhdhc%2BUSQMMgagX4ORcQKEKwOsNQeScSX5IZCRThYIcqY8CheBcqTUPgMvrwNaVYXadINaY6U4avi6foBOO4WYF4T4fAP4ZLulEESEdsGEQdhEVmFETEWGeKQkZGSkTGYIJkWvmmXkZmaQNbCZWwP2qgC4JZUOUsZ2fxYRRhVhexfvnpJgOwIChpOuPEHieCWOc%2BRsdgKoJIeuaoNsbsfsYcfXNsCcT4o4GSGuZcXvrcRBQ8TuZgC8QMO8Z8Ylb8cVSVaVUym/keVCd%2BaCYNMVdee4iiSCeOV/liRYDifccATBXBRFSqW6EhTlKhehcRR5ZaYxYhHQPhQwG5cNaRbhUxRRVSTSTajRXRWwOBTRSxcICNeIT1VxXoTxT1XxcEOBUJbaTYaJQ6UoE6c4WftJUYLJZ4Z6YpWvspYEdlmpRpa4FpTpXEfpRGaNlGakWbCZXGYkQmUmUYKmdEOmfke8dZV5JgHZQ5c9U5TYUMK5UNWxaNQfi6L5aQP5UwIFZBcFaBZORwOFZFZcdFTObFfOdSUuSuRAClYcGlQ2BlVuZBTlXlW8QeRCced4JIFcPfkjCLWULVfeRoNIKFeBX/u%2BZzZ%2BT4ILc/n%2BdfrBIBVwOVcBaTS%2BRzdleCT4Nra1R1Y8TkckHYJIEAA%3D%3D