let rec cstmtlist mname slist =  List.map (cstmt mname) slist

(* Prepend suffixes *)
and cdef vdef = get_vdef vdef

(*convert sast statement to c statements*)
and cstmt mname sstmt =
    let getoptexpr env = function
        | Some exp -> Some(sast_to_castexpr mname env exp)
        | None     -> None in

    let rec getiflist env = function
        | []                   -> []
        | [(optexpr, slist)]   -> [(getoptexpr env optexpr, cstmtlist mname slist)]
        | (optexpr, slist)::tl -> (getoptexpr env optexpr, cstmtlist mname slist)::(getiflist env tl) in

    let getsuper args fuid parent env =
        let init = if BuiltIns.is_built_in parent then fuid else to_fname fuid "init" in
        let cargs = sast_to_castexprlist mname env args in
        Cast.Super(parent, init, cargs) in

    match sstmt with
        | Sast.Decl(var_def, optexpr, env)      -> Cast.Decl(cdef var_def, getoptexpr env optexpr, env)
        | Sast.If(iflist, env)                  -> Cast.If(getiflist env iflist, env)
        | Sast.While(expr, sstmtlist, env)      -> Cast.While(sast_to_castexpr mname env expr, cstmtlist mname sstmtlist, env)
        | Sast.Expr(exp, env)                   -> Cast.Expr(sast_to_castexpr mname env exp, env)
        | Sast.Return(optexpr, env)             -> Cast.Return(getoptexpr env optexpr, env)
        | Sast.Super(args, fuid, parent, env)   -> getsuper args fuid parent env