aboutsummaryrefslogtreecommitdiff
path: root/libc/utils/hdrgen/header.py
diff options
context:
space:
mode:
Diffstat (limited to 'libc/utils/hdrgen/header.py')
-rw-r--r--libc/utils/hdrgen/header.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/libc/utils/hdrgen/header.py b/libc/utils/hdrgen/header.py
new file mode 100644
index 0000000..9339acc
--- /dev/null
+++ b/libc/utils/hdrgen/header.py
@@ -0,0 +1,86 @@
+# ====- HeaderFile Class for libc function headers -----------*- python -*--==#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+# ==-------------------------------------------------------------------------==#
+
+
+class HeaderFile:
+ def __init__(self, name):
+ self.template_file = None
+ self.name = name
+ self.macros = []
+ self.types = []
+ self.enumerations = []
+ self.objects = []
+ self.functions = []
+
+ def add_macro(self, macro):
+ self.macros.append(macro)
+
+ def add_type(self, type_):
+ self.types.append(type_)
+
+ def add_enumeration(self, enumeration):
+ self.enumerations.append(enumeration)
+
+ def add_object(self, object):
+ self.objects.append(object)
+
+ def add_function(self, function):
+ self.functions.append(function)
+
+ def public_api(self):
+ content = [""]
+
+ for macro in self.macros:
+ content.append(f"{macro}\n")
+
+ for type_ in self.types:
+ content.append(f"{type_}")
+
+ if self.enumerations:
+ combined_enum_content = ",\n ".join(
+ str(enum) for enum in self.enumerations
+ )
+ content.append(f"\nenum {{\n {combined_enum_content},\n}};")
+
+ content.append("\n__BEGIN_C_DECLS\n")
+
+ current_guard = None
+ for function in self.functions:
+ if function.guard == None:
+ content.append(str(function) + " __NOEXCEPT;")
+ content.append("")
+ else:
+ if current_guard == None:
+ current_guard = function.guard
+ content.append(f"#ifdef {current_guard}")
+ content.append(str(function) + " __NOEXCEPT;")
+ content.append("")
+ elif current_guard == function.guard:
+ content.append(str(function) + " __NOEXCEPT;")
+ content.append("")
+ else:
+ content.pop()
+ content.append(f"#endif // {current_guard}")
+ content.append("")
+ current_guard = function.guard
+ content.append(f"#ifdef {current_guard}")
+ content.append(str(function) + " __NOEXCEPT;")
+ content.append("")
+ if current_guard != None:
+ content.pop()
+ content.append(f"#endif // {current_guard}")
+ content.append("")
+
+ for object in self.objects:
+ content.append(str(object))
+ if self.objects:
+ content.append("\n__END_C_DECLS")
+ else:
+ content.append("__END_C_DECLS")
+
+ return "\n".join(content)