Markus Armbruster <[email protected]> writes:
> Commit 05dfb26 added eatspace stripping to mcgen(). Move it to
> cgen(), just in case somebody gets tempted to use cgen() directly
> instead of via mcgen().
>
> cgen() indents blank lines. No such lines get generated right now,
> but fix it anyway.
>
> We use triple-quoted strings for program text, like this:
>
> '''
> Program text
> any number of lines
> '''
>
> Keeps the program text relatively readable, but puts an extra newline
> at either end. mcgen() "fixes" that by dropping the first and last
> line outright. Drop only the newlines.
>
> This unmasks a bug in qapi-commands.py: four quotes instead of three.
> Fix it up.
>
> Output doesn't change
>
> Signed-off-by: Markus Armbruster <[email protected]>
> Reviewed-by: Eric Blake <[email protected]>
> ---
> scripts/qapi-commands.py | 2 +-
> scripts/qapi.py | 19 ++++++++++++-------
> 2 files changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
> index ca22acc..ce51408 100644
> --- a/scripts/qapi-commands.py
> +++ b/scripts/qapi-commands.py
> @@ -56,7 +56,7 @@ def gen_sync_call(name, args, ret_type, indent=0):
> name=c_name(name), args=arglist, retval=retval).rstrip()
> if ret_type:
> ret += "\n" + gen_err_check('local_err')
> - ret += "\n" + mcgen(''''
> + ret += "\n" + mcgen('''
> %(marshal_output_call)s
> ''',
>
> marshal_output_call=gen_marshal_output_call(name, ret_type)).rstrip()
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index 06d7fc2..20383ef 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -943,16 +943,21 @@ def pop_indent(indent_amount=4):
> global indent_level
> indent_level -= indent_amount
>
> +# Generate @code with @kwds interpolated.
> +# Obey indent_level, and strip eatspace.
> def cgen(code, **kwds):
> - indent = genindent(indent_level)
> - lines = code.split('\n')
> - lines = map(lambda x: indent + x, lines)
> - return '\n'.join(lines) % kwds + '\n'
> -
> -def mcgen(code, **kwds):
> - raw = cgen('\n'.join(code.split('\n')[1:-1]), **kwds)
> + raw = code % kwds
> + if indent_level:
> + indent = genindent(indent_level)
> + raw = re.subn("^.", indent + '\g<0>', raw, 0, re.MULTILINE)
pylint wants us to use r'\g<0>'. If nothing else comes up, I'll fix
this up for my pull.
> + raw = raw[0]
> return re.sub(re.escape(eatspace) + ' *', '', raw)
>
> +def mcgen(code, **kwds):
> + if code[0] == '\n':
> + code = code[1:]
> + return cgen(code, **kwds)
> +
> def basename(filename):
> return filename.split("/")[-1]