mirror of
https://github.com/postgres/postgres.git
synced 2025-04-25 21:42:33 +03:00
Get rid of explicit argument-count markings in tab-complete.c.
This replaces the "TailMatchesN" macros with just "TailMatches", and likewise "HeadMatchesN" becomes "HeadMatches" and "MatchesN" becomes "Matches". The various COMPLETE_WITH_LISTn macros are reduced to COMPLETE_WITH, and the single-item COMPLETE_WITH_CONST also gets folded into that. This eliminates a lot of minor annoyance in writing tab-completion rules. Usefully, the compiled code also gets a bit smaller (10% or so, on my machine). The implementation depends on variadic macros, so we couldn't have done this before we required C99. Andres Freund and Thomas Munro; some cosmetic cleanup by me. Discussion: https://postgr.es/m/d8jo9djvm7h.fsf@dalvik.ping.uio.no
This commit is contained in:
parent
1f7fc7670c
commit
4f3b38fe2b
File diff suppressed because it is too large
Load Diff
@ -224,6 +224,39 @@
|
||||
#define CppAsString2(x) CppAsString(x)
|
||||
#define CppConcat(x, y) x##y
|
||||
|
||||
/*
|
||||
* VA_ARGS_NARGS
|
||||
* Returns the number of macro arguments it is passed.
|
||||
*
|
||||
* An empty argument still counts as an argument, so effectively, this is
|
||||
* "one more than the number of commas in the argument list".
|
||||
*
|
||||
* This works for up to 63 arguments. Internally, VA_ARGS_NARGS_() is passed
|
||||
* 64+N arguments, and the C99 standard only requires macros to allow up to
|
||||
* 127 arguments, so we can't portably go higher. The implementation is
|
||||
* pretty trivial: VA_ARGS_NARGS_() returns its 64th argument, and we set up
|
||||
* the call so that that is the appropriate one of the list of constants.
|
||||
* This idea is due to Laurent Deniau.
|
||||
*/
|
||||
#define VA_ARGS_NARGS(...) \
|
||||
VA_ARGS_NARGS_(__VA_ARGS__, \
|
||||
63,62,61,60, \
|
||||
59,58,57,56,55,54,53,52,51,50, \
|
||||
49,48,47,46,45,44,43,42,41,40, \
|
||||
39,38,37,36,35,34,33,32,31,30, \
|
||||
29,28,27,26,25,24,23,22,21,20, \
|
||||
19,18,17,16,15,14,13,12,11,10, \
|
||||
9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
|
||||
#define VA_ARGS_NARGS_( \
|
||||
_01,_02,_03,_04,_05,_06,_07,_08,_09,_10, \
|
||||
_11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
|
||||
_21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
|
||||
_31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
|
||||
_41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
|
||||
_51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
|
||||
_61,_62,_63, N, ...) \
|
||||
(N)
|
||||
|
||||
/*
|
||||
* dummyret is used to set return values in macros that use ?: to make
|
||||
* assignments. gcc wants these to be void, other compilers like char
|
||||
|
Loading…
x
Reference in New Issue
Block a user