int extract(LVariableTable *variables, CArrRef var_array, int extract_type /* = EXTR_OVERWRITE */, String prefix /* = "" */) { FUNCTION_INJECTION_BUILTIN(extract); bool reference = extract_type & EXTR_REFS; extract_type &= ~EXTR_REFS; int count = 0; for (ArrayIter iter(var_array); iter; ++iter) { String name = iter.first(); switch (extract_type) { case EXTR_SKIP: if (variables->exists(name)) continue; break; case EXTR_IF_EXISTS: if (!variables->exists(name)) continue; break; case EXTR_PREFIX_SAME: if (variables->exists(name)) name = prefix + "_" + name; break; case EXTR_PREFIX_ALL: name = prefix + "_" + name; break; case EXTR_PREFIX_INVALID: if (!name.isValidVariableName()) name = prefix + "_" + name; break; case EXTR_PREFIX_IF_EXISTS: if (!variables->exists(name)) continue; name = prefix + "_" + name; break; default: break; } // skip invalid variable names, as in PHP if (!name.isValidVariableName()) continue; if (reference) { variables->get(name).assignRef(iter.secondRef()); } else { variables->get(name).assignVal(iter.second()); } count++; } return count; }
Variant func_get_arg(int num_args, CArrRef params, CArrRef args, int pos) { FUNCTION_INJECTION_BUILTIN(func_get_arg); if (num_args <= params.size()) { if (pos >= 0 && pos < num_args) { return params.rvalAt(pos); } } else { if (pos >= 0) { int index = pos - params.size(); if (index < 0) { return params.rvalAt(pos); } if (index < args.size()) { return args.rvalAt(index); } } } return false; }
Array func_get_args(int num_args, CArrRef params, CArrRef args) { FUNCTION_INJECTION_BUILTIN(func_get_args); if (params.empty() && args.empty()) return Array::Create(); if (args.empty()) { if (num_args < params.size()) { return params.slice(0, num_args, false); } return params; } Array derefArgs; for (ArrayIter iter(args); iter; ++iter) { derefArgs.append(iter.second()); } if (params.empty()) return derefArgs; ASSERT(num_args > params.size()); Array ret = Array(params).merge(derefArgs); return ret; }