00001
00005 #include <malloc.h>
00006 #include <string.h>
00007
00008 #include "libmgk.h"
00009
00010 unsigned int
00011 mgk_node_input_count(mgk_nodep node)
00012 {
00013 if (__mgk_check_remnode(node)) {
00014 mgk_remnode *rn = (mgk_remnode *) node;
00015 mgk_value *args[1];
00016 mgk_value *rargs[2];
00017 args[0] = __mgk_build_value(&rn->ID, T_LONGINT);
00018 if (__mgk_remote_call(rn->host,
00019 cmd_node_input_count,
00020 1, args,
00021 2, rargs)) {
00022 mgk_data_type t1, t2;
00023 mgk_scalar s1, s2;
00024 int *ninp = __mgk_extract_value(rargs[0], &t1, &s1);
00025 int *errp = __mgk_extract_value(rargs[1], &t2, &s2);
00026 if ((t1 == T_INTEGER) && (t2 == T_INTEGER)) {
00027 mgk_errno = *errp;
00028 return (*ninp);
00029 }
00030 }
00031 mgk_errno = E_COMM;
00032 return (MGK_U_BADVAL);
00033 }
00034 if (!__mgk_check_node(node)) {
00035 mgk_errno = E_NOTNODE;
00036 return (MGK_U_BADVAL);
00037 }
00038 mgk_errno = E_SUCCESS;
00039 return (node->nin);
00040 }
00041
00042 unsigned int
00043 mgk_node_output_count(mgk_nodep node)
00044 {
00045 if (__mgk_check_remnode(node)) {
00046 mgk_remnode *rn = (mgk_remnode *) node;
00047 mgk_value *args[1];
00048 mgk_value *rargs[2];
00049 args[0] = __mgk_build_value(&rn->ID, T_LONGINT);
00050 if (__mgk_remote_call(rn->host,
00051 cmd_node_output_count,
00052 1, args,
00053 2, rargs)) {
00054 mgk_data_type t1, t2;
00055 mgk_scalar s1, s2;
00056 int *noutp = __mgk_extract_value(rargs[0], &t1, &s1);
00057 int *errp = __mgk_extract_value(rargs[1], &t2, &s2);
00058 if ((t1 == T_INTEGER) && (t2 == T_INTEGER)) {
00059 mgk_errno = *errp;
00060 return (*noutp);
00061 }
00062 }
00063 mgk_errno = E_COMM;
00064 return (MGK_U_BADVAL);
00065 }
00066 if (!__mgk_check_node(node)) {
00067 mgk_errno = E_NOTNODE;
00068 return (MGK_U_BADVAL);
00069 }
00070 mgk_errno = E_SUCCESS;
00071 return (node->nout);
00072 }
00073
00074 DEFSVC(node_input_count)
00075 {
00076 if ((argc == 1) && (rargc == 2)) {
00077 mgk_data_type t;
00078 long *idp = __mgk_parse_value(argv[0], &t);
00079 if (t == T_LONGINT) {
00080 mgk_node *np = __mgk_retrieve_node_by_ID(*idp);
00081 int cnt = mgk_node_input_count(np);
00082 rargv[0] = __mgk_build_value(&cnt, T_INTEGER);
00083 rargv[1] = __mgk_build_value(&mgk_errno, T_INTEGER);
00084 return (TRUE);
00085 }
00086 }
00087 return (FALSE);
00088 }
00089
00090 DEFSVC(node_output_count)
00091 {
00092 if ((argc == 1) && (rargc == 2)) {
00093 mgk_data_type t;
00094 long *idp = __mgk_parse_value(argv[0], &t);
00095 if (t == T_LONGINT) {
00096 mgk_node *np = __mgk_retrieve_node_by_ID(*idp);
00097 int cnt = mgk_node_output_count(np);
00098 rargv[0] = __mgk_build_value(&cnt, T_INTEGER);
00099 rargv[1] = __mgk_build_value(&mgk_errno, T_INTEGER);
00100 return (TRUE);
00101 }
00102 }
00103 return (FALSE);
00104 }
00105
00106 unsigned int
00107 mgk_node_input_connection_count(mgk_nodep node,
00108 unsigned int port)
00109 {
00110 mgk_link *lp;
00111 unsigned int count;
00112 if (__mgk_check_remnode(node)) {
00113 mgk_remnode *rn = (mgk_remnode *) node;
00114 mgk_value *args[2];
00115 mgk_value *rargs[2];
00116 args[0] = __mgk_build_value(&rn->ID, T_LONGINT);
00117 args[1] = __mgk_build_value(&port, T_INTEGER);
00118 if (__mgk_remote_call(rn->host,
00119 cmd_node_input_connection_count,
00120 2, args,
00121 2, rargs)) {
00122 mgk_data_type t1, t2;
00123 mgk_scalar s1, s2;
00124 int *nump = __mgk_extract_value(rargs[0], &t1, &s1);
00125 int *errp = __mgk_extract_value(rargs[1], &t2, &s2);
00126 if ((t1 == T_INTEGER) && (t2 == T_INTEGER)) {
00127 mgk_errno = *errp;
00128 return (*nump);
00129 }
00130 }
00131 mgk_errno = E_COMM;
00132 return (MGK_U_BADVAL);
00133 }
00134 if (!__mgk_check_node(node)) {
00135 mgk_errno = E_NOTNODE;
00136 return (MGK_U_BADVAL);
00137 }
00138 if (port >= node->nin) {
00139 mgk_errno = E_BADPORTIX;
00140 return (MGK_U_BADVAL);
00141 }
00142 for (lp = node->ins[port].links, count = 0;
00143 lp;
00144 lp = lp->l.l2l.nextin, count++);
00145 mgk_errno = E_SUCCESS;
00146 return (count);
00147 }
00148
00149 unsigned int
00150 mgk_node_output_connection_count(mgk_nodep node,
00151 unsigned int port)
00152 {
00153 mgk_link *lp;
00154 unsigned int count;
00155 if (__mgk_check_remnode(node)) {
00156 mgk_remnode *rn = (mgk_remnode *) node;
00157 mgk_value *args[2];
00158 mgk_value *rargs[2];
00159 args[0] = __mgk_build_value(&rn->ID, T_LONGINT);
00160 args[1] = __mgk_build_value(&port, T_INTEGER);
00161 if (__mgk_remote_call(rn->host,
00162 cmd_node_output_connection_count,
00163 2, args,
00164 2, rargs)) {
00165 mgk_data_type t1, t2;
00166 mgk_scalar s1, s2;
00167 int *nump = __mgk_extract_value(rargs[0], &t1, &s1);
00168 int *errp = __mgk_extract_value(rargs[1], &t2, &s2);
00169 if ((t1 == T_INTEGER) && (t2 == T_INTEGER)) {
00170 mgk_errno = *errp;
00171 return (*nump);
00172 }
00173 }
00174 mgk_errno = E_COMM;
00175 return (MGK_U_BADVAL);
00176 }
00177 if (!__mgk_check_node(node)) {
00178 mgk_errno = E_NOTNODE;
00179 return (MGK_U_BADVAL);
00180 }
00181 if (port >= node->nout) {
00182 mgk_errno = E_BADPORTIX;
00183 return (MGK_U_BADVAL);
00184 }
00185 for (lp = node->outs[port].links, count = 0;
00186 lp;
00187 lp = lp->l.l2l.nextout, count++);
00188 mgk_errno = E_SUCCESS;
00189 return (count);
00190 }
00191
00192 DEFSVC(node_input_connection_count)
00193 {
00194 if ((argc == 2) && (rargc == 2)) {
00195 mgk_data_type t1, t2;
00196 long *idp = __mgk_parse_value(argv[0], &t1);
00197 int *idxp = __mgk_parse_value(argv[1], &t2);
00198 if ((t1 == T_LONGINT) && (t2 == T_INTEGER)) {
00199 mgk_node *np = __mgk_retrieve_node_by_ID(*idp);
00200 int cnt = mgk_node_input_connection_count(np, *idxp);
00201 rargv[0] = __mgk_build_value(&cnt, T_INTEGER);
00202 rargv[1] = __mgk_build_value(&mgk_errno, T_INTEGER);
00203 return (TRUE);
00204 }
00205 }
00206 return (FALSE);
00207 }
00208
00209 DEFSVC(node_output_connection_count)
00210 {
00211 if ((argc == 2) && (rargc == 2)) {
00212 mgk_data_type t1, t2;
00213 long *idp = __mgk_parse_value(argv[0], &t1);
00214 int *idxp = __mgk_parse_value(argv[1], &t2);
00215 if ((t1 == T_LONGINT) && (t2 == T_INTEGER)) {
00216 mgk_node *np = __mgk_retrieve_node_by_ID(*idp);
00217 int cnt = mgk_node_output_connection_count(np, *idxp);
00218 rargv[0] = __mgk_build_value(&cnt, T_INTEGER);
00219 rargv[1] = __mgk_build_value(&mgk_errno, T_INTEGER);
00220 return (TRUE);
00221 }
00222 }
00223 return (FALSE);
00224 }
00225
00226 mgk_nodep
00227 mgk_node_input_connection(mgk_nodep node, unsigned int port,
00228 unsigned int which, unsigned int *connport)
00229 {
00230 mgk_link *lp;
00231 unsigned int count;
00232 if (__mgk_check_remnode(node)) {
00233 mgk_remnode *rn = (mgk_remnode *) node;
00234 mgk_value *args[3];
00235 mgk_value *rargs[4];
00236 args[0] = __mgk_build_value(&rn->ID, T_LONGINT);
00237 args[1] = __mgk_build_value(&port, T_INTEGER);
00238 args[2] = __mgk_build_value(&which, T_INTEGER);
00239 if (__mgk_remote_call(rn->host,
00240 cmd_node_input_connection,
00241 3, args,
00242 4, rargs)) {
00243 mgk_data_type t1, t2, t3, t4;
00244 mgk_scalar s1, s2, s3, s4;
00245 long *idp = __mgk_extract_value(rargs[0], &t1, &s1);
00246 int *hixp = __mgk_extract_value(rargs[1], &t2, &s2);
00247 int *prtp = __mgk_extract_value(rargs[2], &t3, &s3);
00248 int *errp = __mgk_extract_value(rargs[3], &t4, &s4);
00249 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) &&
00250 (t3 == T_INTEGER) && (t4 == T_INTEGER)) {
00251 mgk_errno = *errp;
00252 *connport = *prtp;
00253 return (__mgk_locate_node(*hixp, *idp));
00254 }
00255 }
00256 mgk_errno = E_COMM;
00257 return (MGK_P_BADVAL);
00258 }
00259 if (!__mgk_check_node(node)) {
00260 mgk_errno = E_NOTNODE;
00261 return (NULL);
00262 }
00263 if (port >= node->nin) {
00264 mgk_errno = E_BADPORTIX;
00265 return (NULL);
00266 }
00267 mgk_errno = E_SUCCESS;
00268 for (lp = node->ins[port].links, count = 0;
00269 lp;
00270 lp = lp->l.l2l.nextin, count++) {
00271 if (count == which) {
00272 *connport = lp->srcidx;
00273 switch (lp->type) {
00274 case LINK_L2L:
00275 return (lp->l.l2l.src);
00276 case LINK_R2L:
00277 return ((mgk_nodep) lp->l.r2l.src);
00278 default:
00279 mgk_errno = E_GENERROR;
00280 return (NULL);
00281 }
00282 }
00283 }
00284 mgk_errno = E_BADPORTIX;
00285 return (NULL);
00286 }
00287
00288 mgk_nodep
00289 mgk_node_output_connection(mgk_nodep node, unsigned int port,
00290 unsigned int which, unsigned int *connport)
00291 {
00292 mgk_link *lp;
00293 unsigned int count;
00294 if (__mgk_check_remnode(node)) {
00295 mgk_remnode *rn = (mgk_remnode *) node;
00296 mgk_value *args[3];
00297 mgk_value *rargs[4];
00298 args[0] = __mgk_build_value(&rn->ID, T_LONGINT);
00299 args[1] = __mgk_build_value(&port, T_INTEGER);
00300 args[2] = __mgk_build_value(&which, T_INTEGER);
00301 if (__mgk_remote_call(rn->host,
00302 cmd_node_output_connection,
00303 3, args,
00304 4, rargs)) {
00305 mgk_data_type t1, t2, t3, t4;
00306 mgk_scalar s1, s2, s3, s4;
00307 long *idp = __mgk_extract_value(rargs[0], &t1, &s1);
00308 int *hixp = __mgk_extract_value(rargs[1], &t2, &s2);
00309 int *prtp = __mgk_extract_value(rargs[2], &t3, &s3);
00310 int *errp = __mgk_extract_value(rargs[3], &t4, &s4);
00311 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) &&
00312 (t3 == T_INTEGER) && (t4 == T_INTEGER)) {
00313 mgk_errno = *errp;
00314 *connport = *prtp;
00315 return (__mgk_locate_node(*hixp, *idp));
00316 }
00317 }
00318 mgk_errno = E_COMM;
00319 return (MGK_P_BADVAL);
00320 }
00321 if (!__mgk_check_node(node)) {
00322 mgk_errno = E_NOTNODE;
00323 return (NULL);
00324 }
00325 if (port >= node->nout) {
00326 mgk_errno = E_BADPORTIX;
00327 return (NULL);
00328 }
00329 mgk_errno = E_SUCCESS;
00330 for (lp = node->outs[port].links, count = 0;
00331 lp;
00332 lp = lp->l.l2l.nextout, count++) {
00333 if (count == which) {
00334 *connport = lp->dstidx;
00335 switch (lp->type) {
00336 case LINK_L2L:
00337 return (lp->l.l2l.dst);
00338 case LINK_L2R:
00339 return ((mgk_nodep) lp->l.l2r.dst);
00340 default:
00341 mgk_errno = E_GENERROR;
00342 return (NULL);
00343 }
00344 }
00345 }
00346 mgk_errno = E_BADPORTIX;
00347 return (NULL);
00348 }
00349
00350 DEFSVC(node_input_connection)
00351 {
00352 if ((argc == 3) && (rargc == 4)) {
00353 mgk_data_type t1, t2, t3;
00354 long *idp = __mgk_parse_value(argv[0], &t1);
00355 int *idxp = __mgk_parse_value(argv[1], &t2);
00356 int *cntp = __mgk_parse_value(argv[2], &t3);
00357 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) && (t3 == T_INTEGER)) {
00358 unsigned int connidx = 0;
00359 mgk_node *np = __mgk_retrieve_node_by_ID(*idp);
00360 mgk_node *conn = mgk_node_input_connection(np, *idxp, *cntp, &connidx);
00361 if (__mgk_check_node(conn)) {
00362 rargv[0] = __mgk_build_value(&conn->ID, T_LONGINT);
00363 rargv[1] = __mgk_build_value(&__mgk_local_host->index, T_INTEGER);
00364 }
00365 else if (__mgk_check_remnode(conn)) {
00366 mgk_remnode *rconn = (mgk_remnode *) conn;
00367 rargv[0] = __mgk_build_value(&rconn->ID, T_LONGINT);
00368 rargv[1] = __mgk_build_value(&rconn->host->index, T_INTEGER);
00369 }
00370 else {
00371 long ID = 0;
00372 int hix = -1;
00373 rargv[0] = __mgk_build_value(&ID, T_LONGINT);
00374 rargv[1] = __mgk_build_value(&hix, T_INTEGER);
00375 }
00376 rargv[2] = __mgk_build_value(&connidx, T_INTEGER);
00377 rargv[3] = __mgk_build_value(&mgk_errno, T_INTEGER);
00378 return (TRUE);
00379 }
00380 }
00381 return (FALSE);
00382 }
00383
00384 DEFSVC(node_output_connection)
00385 {
00386 if ((argc == 3) && (rargc == 4)) {
00387 mgk_data_type t1, t2, t3;
00388 long *idp = __mgk_parse_value(argv[0], &t1);
00389 int *idxp = __mgk_parse_value(argv[1], &t2);
00390 int *cntp = __mgk_parse_value(argv[2], &t3);
00391 if ((t1 == T_LONGINT) && (t2 == T_INTEGER) && (t3 == T_INTEGER)) {
00392 unsigned int connidx = 0;
00393 mgk_node *np = __mgk_retrieve_node_by_ID(*idp);
00394 mgk_node *conn = mgk_node_output_connection(np, *idxp, *cntp, &connidx);
00395 if (__mgk_check_node(conn)) {
00396 rargv[0] = __mgk_build_value(&conn->ID, T_LONGINT);
00397 rargv[1] = __mgk_build_value(&__mgk_local_host->index, T_INTEGER);
00398 }
00399 else if (__mgk_check_remnode(conn)) {
00400 mgk_remnode *rconn = (mgk_remnode *) conn;
00401 rargv[0] = __mgk_build_value(&rconn->ID, T_LONGINT);
00402 rargv[1] = __mgk_build_value(&rconn->host->index, T_INTEGER);
00403 }
00404 else {
00405 long ID = 0;
00406 int hix = -1;
00407 rargv[0] = __mgk_build_value(&ID, T_LONGINT);
00408 rargv[1] = __mgk_build_value(&hix, T_INTEGER);
00409 }
00410 rargv[2] = __mgk_build_value(&connidx, T_INTEGER);
00411 rargv[3] = __mgk_build_value(&mgk_errno, T_INTEGER);
00412 return (TRUE);
00413 }
00414 }
00415 return (FALSE);
00416 }