let rec init_global_variable wenv lv init obj =
    match init with

      | SingleInit exp ->
          W.init_value  wenv lv (Cil.typeOfLval lv)(Some exp) obj

      | CompoundInit ( ct , initl ) ->

          let len = List.length initl in
          let implicit_defaults =
            match ct with
              | TArray (ty,Some {enode = (Const CInt64 (size,_,_))},_,_)
                  when My_bigint.lt (My_bigint.of_int len) size  ->

                  W.init_range wenv lv ty
                    (Int64.of_int len) (My_bigint.to_int64 size) obj

              | TComp (cp,_,_) when len < (List.length cp.cfields) ->

                  List.fold_left
                    (fun obj f ->
                       if List.exists
                         (function (Field(g,_),_) -> Fieldinfo.equal f g | _ -> false)
                         initl
                       then obj
                       else
                         W.init_value wenv
                           (Cil.addOffsetLval (Field(f, NoOffset)) lv)
                           f.ftype None obj)
                    obj (List.rev cp.cfields)

              | _ -> obj
          in
          List.fold_left
            (fun obj (off,init) ->
               let lv = Cil.addOffsetLval off lv in
               init_global_variable wenv lv init obj)
            implicit_defaults (List.rev initl)