function Rserve_eval($socket, $command, $attr = NULL) { $pkt = mkp_str(3, $command); socket_send($socket, $pkt, strlen($pkt), 0); $r = get_rsp($socket); $res = int32($r); $sc = $res >> 24 & 127; $rr = $res & 255; if ($rr != 1) { echo "eval failed with error code " . $sc; return FALSE; } if (int8($r, 16) != 10) { echo "invalid response (expecting SEXP)"; return FALSE; } $i = 20; return parse_SEXP($r, $i, &$attr); }
function Rserve_assign_raw($socket, $name, $what) { // CMD_setSEXP $bl = strlen($what); if ($bl > 16777088) { trigger_error("Body in Rserve_assign_raw is too big ({$bl} bytes), only small QAP packets are currently supported."); } $n = strlen($name) + 1; $name .= chr(0); while (($n & 3) != 0) { $name .= chr(1); $n++; } // [CMD_setSEXP][DT_STRING(name)][DT_SEXP([XT_RAW, (i32) len, what])] = payload + 4 + 4 + 8 $pkt = mkint32(0x20) . mkint32($n + $bl + 16) . mkint32(0) . mkint32(0) . chr(4) . mkint24($n) . $name . chr(10) . mkint24($bl + 8) . chr(37) . mkint24($bl + 4) . mkint32($bl) . $what; socket_send($socket, $pkt, strlen($pkt), 0); $r = get_rsp($socket); $res = int32($r); $sc = $res >> 24 & 127; $rr = $res & 255; if ($rr != 1) { echo "eval failed with error code " . $sc; return FALSE; } return TRUE; }