diff options
Diffstat (limited to 'scripts/qapi/common.py')
-rw-r--r-- | scripts/qapi/common.py | 59 |
1 files changed, 46 insertions, 13 deletions
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py index 6ad1eeb61d..1724ac32db 100644 --- a/scripts/qapi/common.py +++ b/scripts/qapi/common.py @@ -12,7 +12,13 @@ # See the COPYING file in the top-level directory. import re -from typing import Match, Optional, Sequence +from typing import ( + Any, + Dict, + Match, + Optional, + Union, +) #: Magic string that gets removed along with all space to its right. @@ -194,22 +200,49 @@ def guardend(name: str) -> str: name=c_fname(name).upper()) -def gen_if(ifcond: Sequence[str]) -> str: - ret = '' - for ifc in ifcond: - ret += mcgen(''' +def cgen_ifcond(ifcond: Union[str, Dict[str, Any]]) -> str: + if not ifcond: + return '' + if isinstance(ifcond, str): + return 'defined(' + ifcond + ')' + + oper, operands = next(iter(ifcond.items())) + if oper == 'not': + return '!' + cgen_ifcond(operands) + oper = {'all': '&&', 'any': '||'}[oper] + operands = [cgen_ifcond(o) for o in operands] + return '(' + (') ' + oper + ' (').join(operands) + ')' + + +def docgen_ifcond(ifcond: Union[str, Dict[str, Any]]) -> str: + # TODO Doc generated for conditions needs polish + if not ifcond: + return '' + if isinstance(ifcond, str): + return ifcond + + oper, operands = next(iter(ifcond.items())) + if oper == 'not': + return '!' + docgen_ifcond(operands) + oper = {'all': ' and ', 'any': ' or '}[oper] + operands = [docgen_ifcond(o) for o in operands] + return '(' + oper.join(operands) + ')' + + +def gen_if(cond: str) -> str: + if not cond: + return '' + return mcgen(''' #if %(cond)s -''', cond=ifc) - return ret +''', cond=cond) -def gen_endif(ifcond: Sequence[str]) -> str: - ret = '' - for ifc in reversed(ifcond): - ret += mcgen(''' +def gen_endif(cond: str) -> str: + if not cond: + return '' + return mcgen(''' #endif /* %(cond)s */ -''', cond=ifc) - return ret +''', cond=cond) def must_match(pattern: str, string: str) -> Match[str]: |