#!/usr/bin/python3

from __future__ import print_function
import sys
from generator import ops, fop_subs, cbk_subs, generate

FAILURE_CBK_TEMPLATE = """
int32_t
default_@NAME@_failure_cbk (call_frame_t *frame, int32_t op_errno)
{
	STACK_UNWIND_STRICT (@NAME@, frame, -1, op_errno, @ERROR_ARGS@);
	return 0;
}
"""

CBK_RESUME_TEMPLATE = """
int32_t
default_@NAME@_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,
			   int32_t op_ret, int32_t op_errno, @LONG_ARGS@)
{
	STACK_UNWIND_STRICT (@NAME@, frame, op_ret, op_errno,
			     @SHORT_ARGS@);
	return 0;
}
"""

CBK_TEMPLATE = """
int32_t
default_@NAME@_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
		    int32_t op_ret, int32_t op_errno, @LONG_ARGS@)
{
	STACK_UNWIND_STRICT (@NAME@, frame, op_ret, op_errno,
			     @SHORT_ARGS@);
	return 0;
}
"""

RESUME_TEMPLATE = """
int32_t
default_@NAME@_resume (call_frame_t *frame, xlator_t *this, @LONG_ARGS@)
{
	STACK_WIND (frame, default_@NAME@_cbk,
		    FIRST_CHILD(this), FIRST_CHILD(this)->fops->@NAME@,
		    @SHORT_ARGS@);
	return 0;
}
"""

FOP_TEMPLATE = """
int32_t
default_@NAME@ (
	call_frame_t *frame,
	xlator_t *this,
	@LONG_ARGS@)
{
	STACK_WIND_TAIL (frame,
			 FIRST_CHILD(this), FIRST_CHILD(this)->fops->@NAME@,
			 @SHORT_ARGS@);
	return 0;
}
"""

def gen_defaults ():
	for name in list(ops.keys()):
		print(generate(FAILURE_CBK_TEMPLATE, name, cbk_subs))
	for name in list(ops.keys()):
		print(generate(CBK_RESUME_TEMPLATE, name, cbk_subs))
	for name in list(ops.keys()):
		print(generate(CBK_TEMPLATE, name, cbk_subs))
	for name in list(ops.keys()):
		print(generate(RESUME_TEMPLATE, name, fop_subs))
	for name in list(ops.keys()):
		print(generate(FOP_TEMPLATE, name, fop_subs))

for l in open(sys.argv[1], 'r').readlines():
	if l.find('#pragma generate') != -1:
		print("/* BEGIN GENERATED CODE - DO NOT MODIFY */")
		gen_defaults()
		print("/* END GENERATED CODE */")
	else:
		print(l[:-1])
