inline std::string getCallFunctionName()

in src/RStuff/RUtil.h [221:244]


inline std::string getCallFunctionName(SEXP call) {
  SHIELD(call);
  if (TYPEOF(call) != LANGSXP) {
    return "";
  }
  ShieldSEXP func = CAR(call);
  if (func.type() == SYMSXP) {
    return asStringUTF8(func);
  }
  if (func.type() == LANGSXP && func.length() == 3) {
    SEXP op = CAR(func);
    if (TYPEOF(op) == SYMSXP) {
      std::string name = asStringUTF8(op);
      if (name == "::" || name == ":::" || name == "$" || name == "@") {
        std::string name1 = asStringUTF8(CADR(func));
        std::string name2 = asStringUTF8(CADDR(func));
        if (!name1.empty() && !name2.empty()) {
          return quoteIfNeeded(name1) + name + quoteIfNeeded(name2);
        }
      }
    }
  }
  return "";
}