--- /dev/null
+#include "opt.h"
+
+static const opt_extension_t opt_extension_matrix[] = {
+ /*
+ * same as GNUC but no dollar identifiers, they don't make much sense
+ * and in C11 mode, opposed to GNUC which is C99
+ */
+ [STANDARD_LICEC] = EXTENSION_TYPEOF | EXTENSION_OMITOPCOND |
+ EXTENSION_STATEMENTEXPRS | EXTENSION_NOMEMBERSTRUCT |
+ EXTENSION_CASERANGES | EXTENSION_ESCCHAR |
+ EXTENSION_INCOMPLETEENUM | EXTENSION_BINARYCONSTANTS |
+ EXTENSION_ARITHMETICVOID | EXTENSION_LABELASVALUES |
+ EXTENSION_ZEROARRAYS | EXTENSION_ZEROARRAYS |
+ EXTENSION_NONCONSTINIT | EXTENSION_NONSTANDARD,
+
+ /*
+ * standard GNUC format, TODO: -std=gnuc90, which is the same as this
+ * but C90, instead of C90
+ */
+ [STANDARD_GNUC] = EXTENSION_TYPEOF | EXTENSION_OMITOPCOND |
+ EXTENSION_STATEMENTEXPRS | EXTENSION_NOMEMBERSTRUCT |
+ EXTENSION_CASERANGES | EXTENSION_ESCCHAR |
+ EXTENSION_INCOMPLETEENUM | EXTENSION_BINARYCONSTANTS |
+ EXTENSION_ARITHMETICVOID | EXTENSION_LABELASVALUES |
+ EXTENSION_ZEROARRAYS | EXTENSION_ZEROARRAYS |
+ EXTENSION_NONCONSTINIT | EXTENSION_DOLLAR |
+ EXTENSION_NONSTANDARD,
+
+ [STANDARD_C90] = 0,
+ [STANDARD_C99] = 0,
+ [STANDARD_C11] = 0
+};
+
+static opt_std_t standard = STANDARD_LICEC;
+static opt_extension_t extensions = ~0;
+
+bool opt_std_test(opt_std_t std) {
+ return (standard == std);
+}
+
+bool opt_extension_test(opt_extension_t ext) {
+ return (extensions & ext);
+}
+
+void opt_std_set(opt_std_t std) {
+ standard = std;
+ extensions = opt_extension_matrix[std];
+}
+
+void opt_extension_set(opt_extension_t ext) {
+ if (opt_extension_matrix[standard] & ext)
+ extensions &= ext;
+}