aconfig: add c codegen
c codegen can be done at the same time with cpp codegen, the idea is to
create a c compatible header that defines the flag apis, including flag
override apis for test. then in the corresponding cpp file, the
implementation simply calls into cpp api.
c header supports static method interface, and unit test override, but
it does not support injection pattern compared to cpp header
Bug: b/279483801
Test: atest aconfig.test
Change-Id: Ie62b76d6524e443de5d3c2f9000f7f66623ab571
diff --git a/tools/aconfig/templates/c_exported_header.template b/tools/aconfig/templates/c_exported_header.template
new file mode 100644
index 0000000..08af860
--- /dev/null
+++ b/tools/aconfig/templates/c_exported_header.template
@@ -0,0 +1,22 @@
+#ifndef {header}_c_HEADER_H
+#define {header}_c_HEADER_H
+
+#ifdef __cplusplus
+extern "C" \{
+#endif
+
+{{ for item in class_elements}}
+extern const char* {header}_{item.uppercase_flag_name};
+{{ endfor -}}
+
+{{ for item in class_elements}}
+bool {header}_{item.flag_name}();{{ endfor }}
+
+void {header}_override_flag(const char* name, bool val);
+
+void {header}_reset_overrides();
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/tools/aconfig/templates/c_source_file.template b/tools/aconfig/templates/c_source_file.template
new file mode 100644
index 0000000..18da299
--- /dev/null
+++ b/tools/aconfig/templates/c_source_file.template
@@ -0,0 +1,21 @@
+#include "{header}_c.h"
+#include "{header}.h"
+#include <string>
+
+{{ for item in class_elements}}
+const char* {header}_{item.uppercase_flag_name} = "{item.device_config_flag}";
+{{ endfor - }}
+
+{{ for item in class_elements}}
+bool {header}_{item.flag_name}() \{
+ return {cpp_namespace}::{item.flag_name}();
+}
+{{ endfor }}
+
+void {header}_override_flag(const char* name, bool val) \{
+ {cpp_namespace}::override_flag(std::string(name), val);
+}
+
+void {header}_reset_overrides() \{
+ {cpp_namespace}::reset_overrides();
+}