Kiibohd Controller
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

mchck-cdefs.h 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /* Copyright (c) 2011,2012 Simon Schubert <[email protected]>.
  2. * Modifications by Jacob Alexander 2014-2015 <[email protected]>
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #pragma once
  18. // ----- Compiler Includes -----
  19. #include <sys/param.h>
  20. // ----- Defines & Macros -----
  21. #define _CONCAT(x,y) _CONCAT1(x,y)
  22. #define _CONCAT1(x,y) x ## y
  23. #define _STR(a) #a
  24. typedef __CHAR16_TYPE__ char16_t;
  25. #define __packed __attribute__((__packed__))
  26. /* From FreeBSD: compile-time asserts */
  27. #define CTASSERT(x) _Static_assert(x, _STR(x))
  28. #define CTASSERT_SIZE_BYTE(t, s) CTASSERT(sizeof(t) == (s))
  29. #define CTASSERT_SIZE_BIT(t, s) CTASSERT(sizeof(t) * 8 == (s))
  30. #define UNION_STRUCT_START(size) \
  31. union { \
  32. _CONCAT(_CONCAT(uint, size), _t) raw; \
  33. struct { \
  34. /* just to swallow the following semicolon */ \
  35. struct _CONCAT(_CONCAT(__dummy_, __COUNTER__), _t) {}
  36. #define UNION_STRUCT_END \
  37. }; /* struct */ \
  38. }; /* union */
  39. /**
  40. * From <news:[email protected]>,
  41. * <https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s>
  42. */
  43. #define __PP_NARG(...) \
  44. __PP_NARG_(__0, ## __VA_ARGS__, __PP_RSEQ_N())
  45. #define __PP_NARG_(...) \
  46. __PP_ARG_N(__VA_ARGS__)
  47. #define __PP_ARG_N( \
  48. _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
  49. _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
  50. _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
  51. _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
  52. _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
  53. _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
  54. _61,_62,_63,N,...) N
  55. #define __PP_RSEQ_N() \
  56. 62,61,60, \
  57. 59,58,57,56,55,54,53,52,51,50, \
  58. 49,48,47,46,45,44,43,42,41,40, \
  59. 39,38,37,36,35,34,33,32,31,30, \
  60. 29,28,27,26,25,24,23,22,21,20, \
  61. 19,18,17,16,15,14,13,12,11,10, \
  62. 9,8,7,6,5,4,3,2,1,0
  63. /**
  64. * From <https://github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms>
  65. */
  66. #define __CAT(a, ...) __PRIMITIVE_CAT(a, __VA_ARGS__)
  67. #define __PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
  68. #define __IIF(c) __PRIMITIVE_CAT(__IIF_, c)
  69. #define __IIF_0(t, ...) __VA_ARGS__
  70. #define __IIF_1(t, ...) t
  71. #define __COMPL(b) __PRIMITIVE_CAT(__COMPL_, b)
  72. #define __COMPL_0 1
  73. #define __COMPL_1 0
  74. #define __CHECK_N(x, n, ...) n
  75. #define __CHECK(...) __CHECK_N(__VA_ARGS__, 0,)
  76. #define __PROBE(x) x, 1,
  77. #define __NOT(x) __CHECK(__PRIMITIVE_CAT(__NOT_, x))
  78. #define __NOT_0 __PROBE(~)
  79. #define __BOOL(x) __COMPL(__NOT(x))
  80. #define __IF(c) __IIF(__BOOL(c))
  81. #define __EAT(...)
  82. #define __EXPAND(...) __VA_ARGS__
  83. #define __WHEN(c) __IF(c)(__EXPAND, __EAT)
  84. #define __HEAD(h, ...) h
  85. #define __TAIL(h, ...) __VA_ARGS__
  86. #define __EVAL(...) __EVAL1(__EVAL1(__EVAL1(__VA_ARGS__)))
  87. #define __EVAL1(...) __EVAL2(__EVAL2(__EVAL2(__VA_ARGS__)))
  88. #define __EVAL2(...) __EVAL3(__EVAL3(__EVAL3(__VA_ARGS__)))
  89. #define __EVAL3(...) __EVAL4(__EVAL4(__EVAL4(__VA_ARGS__)))
  90. #define __EVAL4(...) __EVAL5(__EVAL5(__EVAL5(__VA_ARGS__)))
  91. #define __EVAL5(...) __EVAL6(__EVAL6(__EVAL6(__VA_ARGS__)))
  92. #define __EVAL6(...) __VA_ARGS__
  93. #define __EMPTY()
  94. #define __DEFER(id) id __EMPTY()
  95. #define __OBSTRUCT(...) __VA_ARGS__ __DEFER(__EMPTY)()
  96. #define __CAT_ARG(f, a) __OBSTRUCT(f) a
  97. #define __REPEAT(...) __EVAL(__REPEAT_(__VA_ARGS__))
  98. #define __REPEAT_INNER(...) __OBSTRUCT(__REPEAT_INDIRECT) () (__VA_ARGS__)
  99. #define __REPEAT_INDIRECT() __REPEAT_
  100. #define __REPEAT_(iter, itermacro, macro, a, ...) \
  101. __OBSTRUCT(macro)(iter, a) \
  102. __WHEN(__PP_NARG(__VA_ARGS__)) \
  103. ( \
  104. __OBSTRUCT(__REPEAT_INDIRECT) () ( \
  105. itermacro(iter, a), itermacro, macro, __VA_ARGS__ \
  106. ) \
  107. )