00001 00006 #include "libmgk.h" 00007 00008 static mgk_value *last_peek_value = NULL; 00009 00010 mgk_error_code 00011 mgk_write_node_input_port(void *data, 00012 mgk_data_type type, 00013 mgk_nodep node, 00014 unsigned int port) 00015 { 00016 mgk_inport *ip; 00017 mgk_value *vp; 00018 if (__mgk_check_remnode(node)) { 00019 mgk_remnode *rn = (mgk_remnode *) node; 00020 mgk_value *args[3]; 00021 mgk_value *rargs[1]; 00022 if (!(vp = __mgk_build_value(data, type))) { 00023 return (mgk_errno); 00024 } 00025 args[0] = vp; 00026 args[1] = __mgk_build_value(&rn->ID, T_LONGINT); 00027 args[2] = __mgk_build_value(&port, T_INTEGER); 00028 if (__mgk_remote_call(rn->host, 00029 cmd_write_node_input_port, 00030 3, args, 00031 1, rargs)) { 00032 mgk_data_type t; 00033 mgk_scalar s; 00034 int *errp = __mgk_extract_value(rargs[0], &t, &s); 00035 if (t == T_INTEGER) { 00036 return (mgk_errno = *errp); 00037 } 00038 } 00039 return (mgk_errno = E_COMM); 00040 } 00041 if (!__mgk_check_node(node)) { 00042 return (mgk_errno = E_NOTNODE); 00043 } 00044 if (port >= node->nin) { 00045 return (mgk_errno = E_BADPORTIX); 00046 } 00047 ip = &node->ins[port]; 00048 if (!(vp = __mgk_build_value(data, type))) { 00049 return (mgk_errno); 00050 } 00051 ip = &node->ins[port]; 00052 if (ip->head) { 00053 ip->tail->next = vp; 00054 } 00055 else { 00056 ip->head = vp; 00057 } 00058 ip->tail = vp; 00059 vp->next = NULL; 00060 ip->qlen++; 00061 if ((ip->head == ip->tail) && 00062 (node->status == WAITING) && 00063 (node->priority > MGK_NODE_STOP_PRIORITY)) { 00064 __mgk_update(node); 00065 } 00066 return (mgk_errno = E_SUCCESS); 00067 } 00068 00069 DEFSVC(write_node_input_port) 00070 { 00071 if ((argc == 3) && (rargc == 1)) { 00072 mgk_data_type t1, t2; 00073 long *idp = __mgk_parse_value(argv[1], &t1); 00074 int *idxp = __mgk_parse_value(argv[2], &t2); 00075 if ((t1 == T_LONGINT) && (t2 == T_INTEGER)) { 00076 mgk_data_type type; 00077 mgk_scalar svalue; 00078 mgk_node *np = __mgk_retrieve_node_by_ID(*idp); 00079 void *value = __mgk_extract_value(argv[0], &type, &svalue); 00080 int res = mgk_write_node_input_port(value, type, np, *idxp); 00081 if ((res != E_SUCCESS) && (type & T_BUFFER)) { 00082 __mgk_free_buffer(value); 00083 } 00084 argv[0] = NULL; 00085 rargv[0] = __mgk_build_value(&res, T_INTEGER); 00086 return (TRUE); 00087 } 00088 } 00089 return (FALSE); 00090 } 00091 00092 mgk_error_code 00093 mgk_write_node_output_port(void *data, 00094 mgk_data_type type, 00095 mgk_nodep node, 00096 unsigned int port, 00097 unsigned int whichconn) 00098 { 00099 mgk_link *lp; 00100 mgk_error_code res = E_SUCCESS; 00101 unsigned int done_any, idx; 00102 mgk_value *vp; 00103 if (__mgk_check_remnode(node)) { 00104 mgk_remnode *rn = (mgk_remnode *) node; 00105 mgk_value *args[4]; 00106 mgk_value *rargs[1]; 00107 if (!(args[0] = __mgk_build_value(data, type))) { 00108 return (mgk_errno); 00109 } 00110 args[1] = __mgk_build_value(&rn->ID, T_LONGINT); 00111 args[2] = __mgk_build_value(&port, T_INTEGER); 00112 args[3] = __mgk_build_value(&whichconn, T_INTEGER); 00113 if (__mgk_remote_call(rn->host, 00114 cmd_write_node_output_port, 00115 4, args, 00116 1, rargs)) { 00117 mgk_data_type t; 00118 mgk_scalar s; 00119 int *errp = __mgk_extract_value(rargs[0], &t, &s); 00120 if (t == T_INTEGER) { 00121 return (mgk_errno = *errp); 00122 } 00123 } 00124 return (mgk_errno = E_COMM); 00125 } 00126 if (!__mgk_check_node(node)) { 00127 return (mgk_errno = E_NOTNODE); 00128 } 00129 if (port >= node->nout) { 00130 return (mgk_errno = E_BADPORTIX); 00131 } 00132 for (lp = node->outs[port].links, idx = 0, done_any = 0; 00133 lp; 00134 lp = lp->l.l2l.nextout, idx++) { 00135 if ((whichconn == MGK_ALL_OUTPUT_CONNECTIONS) || (whichconn == idx)) { 00136 switch (lp->type) { 00137 case LINK_L2L: 00138 res = mgk_write_node_input_port(data, type, 00139 lp->l.l2l.dst, lp->dstidx); 00140 break; 00141 case LINK_L2R: 00142 if (!(vp = __mgk_build_value(data, type))) { 00143 return (mgk_errno); 00144 } 00145 if (lp->l.l2r.head) { 00146 lp->l.l2r.tail->next = vp; 00147 } 00148 else { 00149 lp->l.l2r.head = vp; 00150 } 00151 lp->l.l2r.tail = vp; 00152 vp->next = NULL; 00153 lp->l.l2r.qlen++; 00154 if (!lp->l.l2r.active) { 00155 __mgk_remote_propagate(lp); 00156 } 00157 res = E_SUCCESS; 00158 break; 00159 default: 00160 res = E_GENERROR; 00161 break; 00162 } 00163 if (res != E_SUCCESS) { 00164 return (mgk_errno = res); 00165 } 00166 done_any++; 00167 } 00168 } 00169 if (!done_any) { 00170 return (mgk_errno = E_PORTCONN); 00171 } 00172 return (mgk_errno = res); 00173 } 00174 00175 DEFSVC(write_node_output_port) 00176 { 00177 if ((argc == 4) && (rargc == 1)) { 00178 mgk_data_type t1, t2, t3; 00179 long *idp = __mgk_parse_value(argv[1], &t1); 00180 int *idxp = __mgk_parse_value(argv[2], &t2); 00181 int *selp = __mgk_parse_value(argv[3], &t3); 00182 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) && (t3 == T_INTEGER)) { 00183 mgk_data_type type; 00184 mgk_scalar svalue; 00185 mgk_node *np = __mgk_retrieve_node_by_ID(*idp); 00186 void *value = __mgk_extract_value(argv[0], &type, &svalue); 00187 int res = mgk_write_node_output_port(value, type, np, *idxp, *selp); 00188 if ((res != E_SUCCESS) && (type & T_BUFFER)) { 00189 __mgk_free_buffer(value); 00190 } 00191 argv[0] = NULL; 00192 rargv[0] = __mgk_build_value(&res, T_INTEGER); 00193 return (TRUE); 00194 } 00195 } 00196 return (FALSE); 00197 } 00198 00199 mgk_error_code 00200 mgk_clear_node_input_port(mgk_nodep node, 00201 unsigned int port, 00202 unsigned int count) 00203 { 00204 mgk_inport *ip; 00205 mgk_value *vp; 00206 unsigned int i; 00207 if (__mgk_check_remnode(node)) { 00208 mgk_remnode *rn = (mgk_remnode *) node; 00209 mgk_value *args[3]; 00210 mgk_value *rargs[1]; 00211 args[0] = __mgk_build_value(&rn->ID, T_LONGINT); 00212 args[1] = __mgk_build_value(&port, T_INTEGER); 00213 args[2] = __mgk_build_value(&count, T_INTEGER); 00214 if (__mgk_remote_call(rn->host, 00215 cmd_clear_node_input_port, 00216 3, args, 00217 1, rargs)) { 00218 mgk_data_type t; 00219 mgk_scalar s; 00220 int *errp = __mgk_extract_value(rargs[0], &t, &s); 00221 if (t == T_INTEGER) { 00222 return (mgk_errno = *errp); 00223 } 00224 } 00225 return (mgk_errno = E_COMM); 00226 } 00227 if (!__mgk_check_node(node)) { 00228 return (mgk_errno = E_NOTNODE); 00229 } 00230 if (port >= node->nin) { 00231 return (mgk_errno = E_BADPORTIX); 00232 } 00233 ip = &node->ins[port]; 00234 for (i = 0; i < count; i++) { 00235 vp = ip->head; 00236 if (!vp) { 00237 break; 00238 } 00239 ip->head = vp->next; 00240 ip->qlen--; 00241 __mgk_free_value(vp); 00242 } 00243 if ((i > 0) && !ip->head) { 00244 __mgk_update(node); 00245 } 00246 return (mgk_errno = E_SUCCESS); 00247 } 00248 00249 DEFSVC(clear_node_input_port) 00250 { 00251 if ((argc == 3) && (rargc == 1)) { 00252 mgk_data_type t1, t2, t3; 00253 long *idp = __mgk_parse_value(argv[0], &t1); 00254 int *idxp = __mgk_parse_value(argv[1], &t2); 00255 int *cntp = __mgk_parse_value(argv[2], &t3); 00256 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) && (t3 == T_INTEGER)) { 00257 mgk_node *np = __mgk_retrieve_node_by_ID(*idp); 00258 int res = mgk_clear_node_input_port(np, *idxp, *cntp); 00259 rargv[0] = __mgk_build_value(&res, T_INTEGER); 00260 return (TRUE); 00261 } 00262 } 00263 return (FALSE); 00264 } 00265 00266 mgk_error_code 00267 mgk_clear_node_output_port(mgk_nodep node, 00268 unsigned int port, 00269 unsigned int whichconn, 00270 unsigned int count) 00271 { 00272 mgk_link *lp; 00273 unsigned int i, idx, done_any; 00274 mgk_value *vp; 00275 if (__mgk_check_remnode(node)) { 00276 mgk_remnode *rn = (mgk_remnode *) node; 00277 mgk_value *args[4]; 00278 mgk_value *rargs[1]; 00279 args[0] = __mgk_build_value(&rn->ID, T_LONGINT); 00280 args[1] = __mgk_build_value(&port, T_INTEGER); 00281 args[2] = __mgk_build_value(&whichconn, T_INTEGER); 00282 args[3] = __mgk_build_value(&count, T_INTEGER); 00283 if (__mgk_remote_call(rn->host, 00284 cmd_clear_node_output_port, 00285 4, args, 00286 1, rargs)) { 00287 mgk_data_type t; 00288 mgk_scalar s; 00289 int *errp = __mgk_extract_value(rargs[0], &t, &s); 00290 if (t == T_INTEGER) { 00291 return (mgk_errno = *errp); 00292 } 00293 } 00294 return (mgk_errno = E_COMM); 00295 } 00296 if (!__mgk_check_node(node)) { 00297 return (mgk_errno = E_NOTNODE); 00298 } 00299 if (port >= node->nout) { 00300 return (mgk_errno = E_BADPORTIX); 00301 } 00302 for (lp = node->outs[port].links, idx = 0, done_any = 0; 00303 lp; 00304 lp = lp->l.l2l.nextout, idx++) { 00305 if ((whichconn == MGK_ALL_OUTPUT_CONNECTIONS) || (whichconn == idx)) { 00306 switch (lp->type) { 00307 case LINK_L2L: 00308 break; 00309 case LINK_L2R: 00310 for (i = 0; i < count; i++) { 00311 if (!(vp = lp->l.l2r.head)) { 00312 break; 00313 } 00314 lp->l.l2r.head = vp->next; 00315 lp->l.l2r.qlen--; 00316 __mgk_free_value(vp); 00317 } 00318 break; 00319 default: 00320 return (mgk_errno = E_GENERROR); 00321 } 00322 done_any++; 00323 } 00324 } 00325 return (mgk_errno = (done_any ? E_SUCCESS : E_PORTCONN)); 00326 } 00327 00328 DEFSVC(clear_node_output_port) 00329 { 00330 if ((argc == 4) && (rargc == 1)) { 00331 mgk_data_type t1, t2, t3, t4; 00332 long *idp = __mgk_parse_value(argv[0], &t1); 00333 int *idxp = __mgk_parse_value(argv[1], &t2); 00334 int *selp = __mgk_parse_value(argv[2], &t3); 00335 int *cntp = __mgk_parse_value(argv[3], &t4); 00336 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) && 00337 (t3 == T_INTEGER) && (t4 == T_INTEGER)) { 00338 mgk_node *np = __mgk_retrieve_node_by_ID(*idp); 00339 int res = mgk_clear_node_output_port(np, *idxp, *selp, *cntp); 00340 rargv[0] = __mgk_build_value(&res, T_INTEGER); 00341 return (TRUE); 00342 } 00343 } 00344 return (FALSE); 00345 } 00346 00347 unsigned int 00348 mgk_node_input_port_length(mgk_nodep node, unsigned int port) 00349 { 00350 mgk_inport *ip; 00351 if (__mgk_check_remnode(node)) { 00352 mgk_remnode *rn = (mgk_remnode *) node; 00353 mgk_value *args[2]; 00354 mgk_value *rargs[2]; 00355 args[0] = __mgk_build_value(&rn->ID, T_LONGINT); 00356 args[1] = __mgk_build_value(&port, T_INTEGER); 00357 if (__mgk_remote_call(rn->host, 00358 cmd_node_input_port_length, 00359 2, args, 00360 2, rargs)) { 00361 mgk_data_type t1, t2; 00362 mgk_scalar s1, s2; 00363 int *lenp = __mgk_extract_value(rargs[0], &t1, &s1); 00364 int *errp = __mgk_extract_value(rargs[1], &t2, &s2); 00365 if ((t1 == T_INTEGER) && (t2 == T_INTEGER)) { 00366 mgk_errno = *errp; 00367 return (*lenp); 00368 } 00369 } 00370 return (mgk_errno = E_COMM); 00371 } 00372 if (!__mgk_check_node(node)) { 00373 mgk_errno = E_NOTNODE; 00374 return (MGK_U_BADVAL); 00375 } 00376 if (port >= node->nin) { 00377 mgk_errno = E_BADPORTIX; 00378 return (MGK_U_BADVAL); 00379 } 00380 ip = &node->ins[port]; 00381 mgk_errno = E_SUCCESS; 00382 return (ip->qlen); 00383 } 00384 00385 DEFSVC(node_input_port_length) 00386 { 00387 if ((argc == 2) && (rargc == 2)) { 00388 mgk_data_type t1, t2; 00389 long *idp = __mgk_parse_value(argv[0], &t1); 00390 int *idxp = __mgk_parse_value(argv[1], &t2); 00391 if ((t1 == T_LONGINT) && (t2 == T_INTEGER)) { 00392 mgk_node *np = __mgk_retrieve_node_by_ID(*idp); 00393 int res = mgk_node_input_port_length(np, *idxp); 00394 rargv[0] = __mgk_build_value(&res, T_INTEGER); 00395 rargv[1] = __mgk_build_value(&mgk_errno, T_INTEGER); 00396 return (TRUE); 00397 } 00398 } 00399 return (FALSE); 00400 } 00401 00402 unsigned int 00403 mgk_node_output_port_length(mgk_nodep node, 00404 unsigned int port, 00405 unsigned int whichconn) 00406 { 00407 mgk_link *lp; 00408 unsigned int len, idx, done_any; 00409 if (__mgk_check_remnode(node)) { 00410 mgk_remnode *rn = (mgk_remnode *) node; 00411 mgk_value *args[3]; 00412 mgk_value *rargs[2]; 00413 args[0] = __mgk_build_value(&rn->ID, T_LONGINT); 00414 args[1] = __mgk_build_value(&port, T_INTEGER); 00415 args[2] = __mgk_build_value(&whichconn, T_INTEGER); 00416 if (__mgk_remote_call(rn->host, 00417 cmd_node_output_port_length, 00418 3, args, 00419 2, rargs)) { 00420 mgk_data_type t1, t2; 00421 mgk_scalar s1, s2; 00422 int *lenp = __mgk_extract_value(rargs[0], &t1, &s1); 00423 int *errp = __mgk_extract_value(rargs[1], &t2, &s2); 00424 if ((t1 == T_INTEGER) && (t2 == T_INTEGER)) { 00425 mgk_errno = *errp; 00426 return (*lenp); 00427 } 00428 } 00429 return (mgk_errno = E_COMM); 00430 } 00431 if (!__mgk_check_node(node)) { 00432 mgk_errno = E_NOTNODE; 00433 return (MGK_U_BADVAL); 00434 } 00435 if (port >= node->nout) { 00436 mgk_errno = E_BADPORTIX; 00437 return (MGK_U_BADVAL); 00438 } 00439 for (lp = node->outs[port].links, len = 0, idx = 0, done_any = 0; 00440 lp; 00441 lp = lp->l.l2l.nextout, idx++) { 00442 if ((whichconn == MGK_ALL_OUTPUT_CONNECTIONS) || (whichconn == idx)) { 00443 switch (lp->type) { 00444 case LINK_L2L: 00445 break; 00446 case LINK_L2R: 00447 len = max(len, lp->l.l2r.qlen); 00448 break; 00449 default: 00450 return (mgk_errno = E_GENERROR); 00451 } 00452 done_any++; 00453 } 00454 } 00455 mgk_errno = (done_any ? E_SUCCESS : E_PORTCONN); 00456 return (done_any ? len : MGK_U_BADVAL); 00457 } 00458 00459 DEFSVC(node_output_port_length) 00460 { 00461 if ((argc == 3) && (rargc == 2)) { 00462 mgk_data_type t1, t2, t3; 00463 long *idp = __mgk_parse_value(argv[0], &t1); 00464 int *idxp = __mgk_parse_value(argv[1], &t2); 00465 int *selp = __mgk_parse_value(argv[2], &t3); 00466 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) && (t3 == T_INTEGER)) { 00467 mgk_node *np = __mgk_retrieve_node_by_ID(*idp); 00468 int res = mgk_node_output_port_length(np, *idxp, *selp); 00469 rargv[0] = __mgk_build_value(&res, T_INTEGER); 00470 rargv[1] = __mgk_build_value(&mgk_errno, T_INTEGER); 00471 return (TRUE); 00472 } 00473 } 00474 return (FALSE); 00475 } 00476 00477 void * 00478 mgk_peek_node_input_port(mgk_nodep node, 00479 unsigned int port, 00480 unsigned int streampos, 00481 mgk_data_type * typep) 00482 { 00483 mgk_inport *ip; 00484 mgk_value *vp; 00485 last_peek_value = NULL; 00486 if (__mgk_check_remnode(node)) { 00487 mgk_remnode *rn = (mgk_remnode *) node; 00488 mgk_value *args[3]; 00489 mgk_value *rargs[2]; 00490 args[0] = __mgk_build_value(&rn->ID, T_LONGINT); 00491 args[1] = __mgk_build_value(&port, T_INTEGER); 00492 args[2] = __mgk_build_value(&streampos, T_INTEGER); 00493 if (__mgk_remote_call(rn->host, 00494 cmd_peek_node_input_port, 00495 3, args, 00496 2, rargs)) { 00497 mgk_data_type t; 00498 mgk_scalar s; 00499 int *errp = __mgk_extract_value(rargs[1], &t, &s); 00500 if (t == T_INTEGER) { 00501 static int rcnt = 0; 00502 static mgk_scalar sres[16]; 00503 mgk_errno = *errp; 00504 return (__mgk_extract_value(rargs[0], typep, &sres[++rcnt & 15])); 00505 } 00506 __mgk_free_value(rargs[0]); 00507 } 00508 mgk_errno = E_COMM; 00509 *typep = T_NODATA; 00510 return (NULL); 00511 } 00512 if (!__mgk_check_node(node)) { 00513 mgk_errno = E_NOTNODE; 00514 *typep = T_NODATA; 00515 return (MGK_P_BADVAL); 00516 } 00517 if (port >= node->nin) { 00518 mgk_errno = E_BADPORTIX; 00519 *typep = T_NODATA; 00520 return (MGK_P_BADVAL); 00521 } 00522 ip = &node->ins[port]; 00523 mgk_errno = E_SUCCESS; 00524 for (vp = ip->head; streampos > 0; streampos--, vp = vp->next) { 00525 if (!vp) { 00526 *typep = T_NODATA; 00527 return (NULL); 00528 } 00529 } 00530 last_peek_value = vp; 00531 return (__mgk_parse_value(vp, typep)); 00532 } 00533 00534 DEFSVC(peek_node_input_port) 00535 { 00536 if ((argc == 3) && (rargc == 2)) { 00537 mgk_data_type t1, t2, t3; 00538 long *idp = __mgk_parse_value(argv[0], &t1); 00539 int *idxp = __mgk_parse_value(argv[1], &t2); 00540 int *posp = __mgk_parse_value(argv[2], &t3); 00541 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) && (t3 == T_INTEGER)) { 00542 mgk_node *np = __mgk_retrieve_node_by_ID(*idp); 00543 void *value = mgk_peek_node_input_port(np, *idxp, *posp, &t1); 00544 if ((value) && 00545 (last_peek_value) && 00546 (mgk_errno == E_SUCCESS) && 00547 (t1 != T_NODATA)) { 00548 rargv[0] = __mgk_alias_value(last_peek_value); 00549 } 00550 else { 00551 int dummy = 0; 00552 rargv[0] = __mgk_build_value(&dummy, T_INTEGER); 00553 rargv[0]->type = T_NODATA; 00554 } 00555 rargv[1] = __mgk_build_value(&mgk_errno, T_INTEGER); 00556 return (TRUE); 00557 } 00558 } 00559 return (FALSE); 00560 } 00561 00562 00563 void * 00564 mgk_peek_node_output_port(mgk_nodep node, 00565 unsigned int port, 00566 unsigned int whichconn, 00567 unsigned int streampos, 00568 mgk_data_type * typep) 00569 { 00570 mgk_link *lp; 00571 mgk_value *vp; 00572 unsigned int idx; 00573 last_peek_value = NULL; 00574 if (__mgk_check_remnode(node)) { 00575 mgk_remnode *rn = (mgk_remnode *) node; 00576 mgk_value *args[4]; 00577 mgk_value *rargs[2]; 00578 args[0] = __mgk_build_value(&rn->ID, T_LONGINT); 00579 args[1] = __mgk_build_value(&port, T_INTEGER); 00580 args[2] = __mgk_build_value(&whichconn, T_INTEGER); 00581 args[3] = __mgk_build_value(&streampos, T_INTEGER); 00582 if (__mgk_remote_call(rn->host, 00583 cmd_peek_node_output_port, 00584 4, args, 00585 2, rargs)) { 00586 mgk_data_type t; 00587 mgk_scalar s; 00588 int *errp = __mgk_extract_value(rargs[1], &t, &s); 00589 if (t == T_INTEGER) { 00590 static int rcnt = 0; 00591 static mgk_scalar sres[16]; 00592 mgk_errno = *errp; 00593 return (__mgk_extract_value(rargs[0], typep, &sres[++rcnt & 15])); 00594 } 00595 __mgk_free_value(rargs[0]); 00596 } 00597 mgk_errno = E_COMM; 00598 *typep = T_NODATA; 00599 return (NULL); 00600 } 00601 if (!__mgk_check_node(node)) { 00602 mgk_errno = E_NOTNODE; 00603 *typep = T_NODATA; 00604 return (MGK_P_BADVAL); 00605 } 00606 if (port >= node->nout) { 00607 mgk_errno = E_BADPORTIX; 00608 *typep = T_NODATA; 00609 return (MGK_P_BADVAL); 00610 } 00611 for (lp = node->outs[port].links, vp = NULL, idx = 0; 00612 lp; 00613 lp = lp->l.l2l.nextout, idx++) { 00614 if (whichconn == idx) { 00615 switch (lp->type) { 00616 case LINK_L2L: 00617 break; 00618 case LINK_L2R: 00619 vp = lp->l.l2r.head; 00620 break; 00621 default: 00622 mgk_errno = E_GENERROR; 00623 *typep = T_NODATA; 00624 return (NULL); 00625 } 00626 break; 00627 } 00628 } 00629 if (!lp) { 00630 *typep = T_NODATA; 00631 mgk_errno = E_PORTCONN; 00632 return (NULL); 00633 } 00634 mgk_errno = E_SUCCESS; 00635 while (vp && (streampos > 0)) { 00636 vp = vp->next; 00637 streampos--; 00638 } 00639 if (!vp) { 00640 *typep = T_NODATA; 00641 return (NULL); 00642 } 00643 last_peek_value = vp; 00644 return (__mgk_parse_value(vp, typep)); 00645 } 00646 00647 DEFSVC(peek_node_output_port) 00648 { 00649 if ((argc == 4) && (rargc == 2)) { 00650 mgk_data_type t1, t2, t3, t4; 00651 long *idp = __mgk_parse_value(argv[0], &t1); 00652 int *idxp = __mgk_parse_value(argv[1], &t2); 00653 int *selp = __mgk_parse_value(argv[2], &t3); 00654 int *posp = __mgk_parse_value(argv[3], &t4); 00655 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) && 00656 (t3 == T_INTEGER) && (t4 == T_INTEGER)) { 00657 mgk_node *np = __mgk_retrieve_node_by_ID(*idp); 00658 void *value = mgk_peek_node_output_port(np, *idxp, *selp, *posp, &t1); 00659 if ((value) && 00660 (last_peek_value) && 00661 (mgk_errno == E_SUCCESS) && 00662 (t1 != T_NODATA)) { 00663 rargv[0] = __mgk_alias_value(last_peek_value); 00664 } 00665 else { 00666 int dummy = 0; 00667 rargv[0] = __mgk_build_value(&dummy, T_INTEGER); 00668 rargv[0]->type = T_NODATA; 00669 } 00670 rargv[1] = __mgk_build_value(&mgk_errno, T_INTEGER); 00671 return (TRUE); 00672 } 00673 } 00674 return (FALSE); 00675 }