const nsresult = "unsigned int"
var states = []
function process(vars, state) {
  var f = vars[0]
  if(f.isFunction && f.type.indexOf(nsresult) == 0) {
    delete vars[0]
    for each (var v in vars) {
      var m = /class (\w+) (\*\*)/(v.type);
      if(!v.isParam || !m)
	continue;
      //print(m);
      //	print(f.name + "->"+m[1] + " in "+f.decl);
      var classtype = ""
      if(vars[1].name == "__receiver") {
	classtype = /class (\w+) &/(vars[1].type)[1]
      }
      return {name:classtype+"::"+f.name, aliased:[], decl:f.decl,
	      outparam:v.name, assigns:[], errors:{}};
      }
  } 
  if (!state)
    return;
  
  function process_v(v) {
    if(v.isReturn) {
      state.ret = v;
      return;
    }
    if (!v.assign) {
      if(v.isAlias && v.type == nsresult)
	state.aliased.push(v.name)
      return;
    }
    if (v.name == state.outparam) {
      state.assigns.push(v.assign[0]);
      return;
    } else if (v.type != nsresult || is_global(v.id))
      return;
    var e = state.errors[v.name];
    var from = v.assign[0];
    if (!e) 
      state.errors[v.name] = {from:[from], val:from};
    else {
      e.from.push(from);
      e.val = from;
    }
    //print(v.name + "="+v.assign)
  }
  iter(process_v, vars);
  return state;
}

function path_end(state) {
  if(state)
    states.push(state);
}

function graph_end() {
  var my_states = states;
  states = [];
  var rets = [];
  var retVals = [];
  var assigns = [];
  function add_unique(ls, x) {
    for each (var i in ls) {
      if (structurally_equal(i,x)) 
	return;
    }
    ls.push(x)
  }
  for each (var state in my_states) {
    var newRet = true;
    var curret = state.ret;
    if(!curret) {
      print(state);
      return;
    }
    if (curret.name) {
      if(curret.fieldOf || state.aliased.indexOf(state.ret.name) != -1 
	 || is_global(curret.id)) {
	return;
      }
      //print(is_global(state.ret.id)+" "+state.aliased+" "+state.ret)
      add_unique(retVals, state.errors[curret.name].val);
      add_unique(rets, curret);
    }
    else
      add_unique(retVals, curret);
    for each (var a in state.assigns) {
      add_unique(assigns, a);
    }
  }
  var haveNS_OK;
  for each (var ret in retVals) {
    if(ret.id)
      return;
    if(ret.value == 0)
      haveNS_OK = true;
  }
  if(!haveNS_OK || retVals.length > 2)
    return;
  if(assigns.length > 1)
    return;
  var rval = rets.length == 1 ? rets[0].name : "";
  print(my_states[0].name + ","+my_states[0].outparam+"="+assigns[0].name
	+","+ rval);
  //print(rets);
  //print(retVals);
}
