let rec destruct_integer e = match e.enode with
| Lval(Var v,NoOffset) -> Some(v,None)
| BinOp((PlusA | MinusA as op),e1,e2,_) ->
begin match destruct_integer e1 with
| None -> None
| Some(v,None) ->
begin match op with
| PlusA -> Some(v,Some e2)
| MinusA -> Some(v,Some(new_exp(UnOp(Neg,e2,almost_integer_type))))
| _ -> assert false
end
| Some(v,Some off) ->
begin match op with
| PlusA ->
Some(v,Some(new_exp(BinOp(PlusA,off,e2,almost_integer_type))))
| MinusA ->
Some(v,Some(new_exp(BinOp(MinusA,off,e2,almost_integer_type))))
| _ -> assert false
end
end
| CastE(ty,e) ->
let ety = typeOf e in
if isIntegralType ty && isIntegralType ety then
destruct_integer e
else None
| _ -> None