|
@@ -15,15 +15,25 @@
|
|
|
from typing import Optional, Sequence
|
|
|
|
|
|
|
|
|
+#: Magic string that gets removed along with all space to its right.
|
|
|
EATSPACE = '\033EATSPACE.'
|
|
|
POINTER_SUFFIX = ' *' + EATSPACE
|
|
|
_C_NAME_TRANS = str.maketrans('.-', '__')
|
|
|
|
|
|
|
|
|
-# ENUMName -> ENUM_NAME, EnumName1 -> ENUM_NAME1
|
|
|
-# ENUM_NAME -> ENUM_NAME, ENUM_NAME1 -> ENUM_NAME1, ENUM_Name2 -> ENUM_NAME2
|
|
|
-# ENUM24_Name -> ENUM24_NAME
|
|
|
def camel_to_upper(value: str) -> str:
|
|
|
+ """
|
|
|
+ Converts CamelCase to CAMEL_CASE.
|
|
|
+
|
|
|
+ Examples::
|
|
|
+
|
|
|
+ ENUMName -> ENUM_NAME
|
|
|
+ EnumName1 -> ENUM_NAME1
|
|
|
+ ENUM_NAME -> ENUM_NAME
|
|
|
+ ENUM_NAME1 -> ENUM_NAME1
|
|
|
+ ENUM_Name2 -> ENUM_NAME2
|
|
|
+ ENUM24_Name -> ENUM24_NAME
|
|
|
+ """
|
|
|
c_fun_str = c_name(value, False)
|
|
|
if value.isupper():
|
|
|
return c_fun_str
|
|
@@ -45,21 +55,33 @@ def camel_to_upper(value: str) -> str:
|
|
|
def c_enum_const(type_name: str,
|
|
|
const_name: str,
|
|
|
prefix: Optional[str] = None) -> str:
|
|
|
+ """
|
|
|
+ Generate a C enumeration constant name.
|
|
|
+
|
|
|
+ :param type_name: The name of the enumeration.
|
|
|
+ :param const_name: The name of this constant.
|
|
|
+ :param prefix: Optional, prefix that overrides the type_name.
|
|
|
+ """
|
|
|
if prefix is not None:
|
|
|
type_name = prefix
|
|
|
return camel_to_upper(type_name) + '_' + c_name(const_name, False).upper()
|
|
|
|
|
|
|
|
|
-# Map @name to a valid C identifier.
|
|
|
-# If @protect, avoid returning certain ticklish identifiers (like
|
|
|
-# C keywords) by prepending 'q_'.
|
|
|
-#
|
|
|
-# Used for converting 'name' from a 'name':'type' qapi definition
|
|
|
-# into a generated struct member, as well as converting type names
|
|
|
-# into substrings of a generated C function name.
|
|
|
-# '__a.b_c' -> '__a_b_c', 'x-foo' -> 'x_foo'
|
|
|
-# protect=True: 'int' -> 'q_int'; protect=False: 'int' -> 'int'
|
|
|
def c_name(name: str, protect: bool = True) -> str:
|
|
|
+ """
|
|
|
+ Map ``name`` to a valid C identifier.
|
|
|
+
|
|
|
+ Used for converting 'name' from a 'name':'type' qapi definition
|
|
|
+ into a generated struct member, as well as converting type names
|
|
|
+ into substrings of a generated C function name.
|
|
|
+
|
|
|
+ '__a.b_c' -> '__a_b_c', 'x-foo' -> 'x_foo'
|
|
|
+ protect=True: 'int' -> 'q_int'; protect=False: 'int' -> 'int'
|
|
|
+
|
|
|
+ :param name: The name to map.
|
|
|
+ :param protect: If true, avoid returning certain ticklish identifiers
|
|
|
+ (like C keywords) by prepending ``q_``.
|
|
|
+ """
|
|
|
# ANSI X3J11/88-090, 3.1.1
|
|
|
c89_words = set(['auto', 'break', 'case', 'char', 'const', 'continue',
|
|
|
'default', 'do', 'double', 'else', 'enum', 'extern',
|
|
@@ -129,12 +151,16 @@ def decrease(self, amount: int = 4) -> None:
|
|
|
self._level -= amount
|
|
|
|
|
|
|
|
|
+#: Global, current indent level for code generation.
|
|
|
indent = Indentation()
|
|
|
|
|
|
|
|
|
-# Generate @code with @kwds interpolated.
|
|
|
-# Obey indent, and strip EATSPACE.
|
|
|
def cgen(code: str, **kwds: object) -> str:
|
|
|
+ """
|
|
|
+ Generate ``code`` with ``kwds`` interpolated.
|
|
|
+
|
|
|
+ Obey `indent`, and strip `EATSPACE`.
|
|
|
+ """
|
|
|
raw = code % kwds
|
|
|
if indent:
|
|
|
raw = re.sub(r'^(?!(#|$))', str(indent), raw, flags=re.MULTILINE)
|