+/*----------------.
+| Concatenation. |
+`----------------*/
+
+/* Concatenate at most 20 strings and return a uniqstr. The goal of
+ this macro is to make the caller's code a little more succinct
+ without a trivial uniqstr_vsprintf format string to maintain
+ (for example, "%s%s%s") while still benefitting from gcc's type
+ checking. Unfortunately, because of the missing format string in the
+ macro invocation, the argument number reported by gcc for a bad
+ argument type is 1 too large. */
+# define UNIQSTR_CONCAT(...) \
+ uniqstr_vsprintf (UNIQSTR_GEN_FORMAT (__VA_ARGS__, \
+ "%s", "%s", "%s", "%s", "%s", \
+ "%s", "%s", "%s", "%s", "%s", \
+ "%s", "%s", "%s", "%s", "%s", \
+ "%s", "%s", "%s", "%s", "%s"), \
+ __VA_ARGS__)
+
+# define UNIQSTR_GEN_FORMAT(F1, F2, F3, F4, F5, \
+ F6, F7, F8, F9, F10, \
+ F11, F12, F13, F14, F15, \
+ F16, F17, F18, F19, F20, \
+ ...) \
+ UNIQSTR_GEN_FORMAT_ (__VA_ARGS__, \
+ "", "", "", "", "", \
+ "", "", "", "", "", \
+ "", "", "", "", "", \
+ "", "", "", "", "")
+
+# define UNIQSTR_GEN_FORMAT_(F1, F2, F3, F4, F5, \
+ F6, F7, F8, F9, F10, \
+ F11, F12, F13, F14, F15, \
+ F16, F17, F18, F19, F20, ...) \
+ F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 \
+ F11 F12 F13 F14 F15 F16 F17 F18 F19 F20
+