Annotation of OpenXM/src/kan96xx/plugin/oxmisc2.c, Revision 1.1
1.1 ! maekawa 1: #include <stdio.h>
! 2: #include "ox_kan.h"
! 3: #include "oxmisc2.h" /* This file requires sm1 object description. */
! 4: #include "cmo.h"
! 5: extern FILE *MyErrorOut;
! 6: extern int SerialOX; /* defined in SerialOX */
! 7:
! 8: extern int OxVersion;
! 9:
! 10: int DebugMathCap = 1;
! 11:
! 12:
! 13:
! 14: int oxGet(oxclientp client, struct object *op,int *isObj)
! 15: /* This method should be synchronized. */
! 16: /* oxGet is a function for client. */
! 17: {
! 18: int ans;
! 19: ox_stream os;
! 20: int m;
! 21: struct object rob;
! 22: int sss; /* Serial number of the recieved packet. */
! 23: *isObj = 0;
! 24: op->tag = Snull;
! 25: os = client->datafp2;
! 26: switch(client->dstate) {
! 27: case DSTATE_ANY:
! 28: m = oxGetOXheader(os,&sss);
! 29: switch(m) {
! 30: case OX_DATA:
! 31: client->dstate = DSTATE_WAIT_OX_DATA;
! 32: return(oxGet(client,op,isObj));
! 33: case OX_SYNC_BALL:
! 34: client->dstate = DSTATE_ANY;
! 35: return(OX_SYNC_BALL);
! 36: default:
! 37: errorOxmisc2("oxGet: cannot handle this tag.\n");
! 38: client->dstate = DSTATE_ERROR;
! 39: return(-1);
! 40: }
! 41: break;
! 42: case DSTATE_FIRST_SYNC: /* waiting the first sync ball */
! 43: /* I need to clear the buffer?? */
! 44: oxWaitSyncBall(os);
! 45: client->dstate = DSTATE_ANY;
! 46: oxSendSyncBall(os);
! 47: return(OX_SYNC_BALL);
! 48: break;
! 49: case DSTATE_WAIT_OX_DATA: /* waiting a cmo data. */
! 50: *op = cmoObjectFromStream2(client->datafp2);
! 51: client->dstate = DSTATE_ANY;
! 52: *isObj = 1;
! 53: return(0);
! 54: break;
! 55: case DSTATE_ERROR:
! 56: client->dstate = DSTATE_ERROR;
! 57: errorOxmisc2("oxGet: dstate == DSTATE_ERROR (error state)\n");
! 58: return(-1);
! 59: default:
! 60: client->dstate = DSTATE_ERROR;
! 61: errorOxmisc2("oxGet: Unknown state number.");
! 62: }
! 63:
! 64: return(-1);
! 65: }
! 66:
! 67: int oxGetFromControl(oxclientp client)
! 68: {
! 69: int ans = -1;
! 70: if (client->cstate != -1) {
! 71: ans = oxGetResultOfControlInt32(client->controlfd);
! 72: if (ans != -1) { client->cstate = 0; }
! 73: else {client->cstate = -1; }
! 74: }
! 75: return(ans);
! 76: }
! 77:
! 78: int oxReq(oxclientp client,int func,struct object ob)
! 79: {
! 80: struct object *ob1p;
! 81: /* request to the control channel */
! 82: if (func == SM_control_reset_connection ||
! 83: func == SM_control_kill) {
! 84: switch(func) {
! 85: case SM_control_reset_connection:
! 86: oxReqControlResetConnection(client->controlfd);
! 87: client->cstate = 1;
! 88: client->dstate = DSTATE_FIRST_SYNC;
! 89: break;
! 90: case SM_control_kill:
! 91: oxReqControlKill(client->controlfd);
! 92: client->cstate = 0;
! 93: client->dstate = DSTATE_ANY;
! 94: break;
! 95: }
! 96: fflush(NULL);
! 97: return(0);
! 98: }
! 99:
! 100: /* request to the data channel */
! 101: if (client->dstate != DSTATE_ANY) {
! 102: errorOxmisc2("oxReq: client->dstate != DSTATE_ANY, data channel is not ready to send data.\n");
! 103: return(-1);
! 104: }
! 105: switch(func) {
! 106: case SM_DUMMY_sendcmo:
! 107: if (!cmoCheckMathCap(ob,(struct object *)client->mathcapObjp)) {
! 108: errorOxmisc2("oxReq: your peer does not understand this cmo.\n");
! 109: return(-1);
! 110: }
! 111: oxSendOXheader(client->datafp2,OX_DATA,SerialOX++);
! 112: cmoObjectToStream2(ob,client->datafp2);
! 113: client->dstate = DSTATE_ANY;
! 114: break;
! 115: case SM_sync_ball:
! 116: oxSendSyncBall(client->datafp2);
! 117: client->dstate = DSTATE_ANY; /* We do not expect the sync ball.*/
! 118: client->cstate = 0; /* clear the cstate */
! 119: break;
! 120: case SM_popCMO:
! 121: oxReqPopCMO(client->datafp2);
! 122: client->dstate = DSTATE_ANY;
! 123: break;
! 124: case SM_mathcap:
! 125: oxReqMathCap(client->datafp2);
! 126: client->dstate = DSTATE_ANY;
! 127: break;
! 128: case SM_setMathCap:
! 129: /* ob = [(mathcap-obj) [[version num, system name] [sm tags]
! 130: ob1 smtags
! 131: [[ox numbers] [cmo numbers]]]
! 132: ob3 ob2 */
! 133: {
! 134: struct object ob1;
! 135: struct object ob2;
! 136: struct object ob3;
! 137: struct object smtags;
! 138: int n,i;
! 139: struct mathCap mathcap;
! 140:
! 141: if (strcmp(KopString(getoa(ob,0)),"mathcap-object") != 0) {
! 142: errorOxmisc2("data format error in oxReqSetMathCap");
! 143: client->dstate = DSTATE_ANY;
! 144: break;
! 145: }
! 146: ob1 = getoa(getoa(ob,1),0);
! 147: smtags = getoa(getoa(ob,1),1);
! 148: ob2 = getoa(getoa(getoa(ob,1),2),1);
! 149: ob3 = getoa(getoa(getoa(ob,1),2),0);
! 150:
! 151: ob1p = (struct object *) sGC_malloc(sizeof(struct object));
! 152: *ob1p = ob1;
! 153: mathcap.infop = ob1p;
! 154: n = getoaSize(ob2);
! 155: mathcap.n = n;
! 156: if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer.");
! 157: for (i=0; i<n; i++) {
! 158: mathcap.cmo[i] = KopInteger(getoa(ob2,i));
! 159: }
! 160: n = getoaSize(ob3);
! 161: if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer.");
! 162: mathcap.oxSize = n;
! 163: for (i=0; i<n; i++) {
! 164: mathcap.ox[i] = KopInteger(getoa(ob3,i));
! 165: }
! 166:
! 167: n = getoaSize(smtags);
! 168: if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer.");
! 169: mathcap.smSize = n;
! 170: for (i=0; i<n; i++) {
! 171: mathcap.sm[i] = KopInteger(getoa(smtags,i));
! 172: }
! 173:
! 174: oxReqSetMathCap(client->datafp2,&mathcap);
! 175: client->dstate = DSTATE_ANY;
! 176: }
! 177: break;
! 178: case SM_pops:
! 179: if (ob.tag != Sinteger) {
! 180: errorOxmisc2("SM_pops : the argument must be an integer.");
! 181: return(-1);
! 182: }
! 183: oxReqPops(client->datafp2, KopInteger(ob));
! 184: client->dstate = DSTATE_ANY;
! 185: break;
! 186: case SM_executeStringByLocalParser:
! 187: if (ob.tag != Sdollar) {
! 188: errorOxmisc2("SM_executeStringByLocalParser : the argument must be a string.");
! 189: return(-1);
! 190: }
! 191: oxReqExecuteStringByLocalParser(client->datafp2,KopString(ob));
! 192: client->dstate = DSTATE_ANY;
! 193: break;
! 194: case SM_executeFunction:
! 195: if (ob.tag != Sdollar) {
! 196: errorOxmisc2("SM_executeFunction : the argument must be a string.");
! 197: return(-1);
! 198: }
! 199: oxReqExecuteFunction(client->datafp2,KopString(ob));
! 200: client->dstate = DSTATE_ANY;
! 201: break;
! 202: case SM_popString:
! 203: oxReqPopString(client->datafp2);
! 204: client->dstate = DSTATE_ANY;
! 205: break;
! 206: case SM_evalName:
! 207: if (ob.tag != Sdollar) {
! 208: errorOxmisc2("SM_evalName : the argument must be a string.");
! 209: return(-1);
! 210: }
! 211: oxReqEvalName(client->datafp2,KopString(ob));
! 212: client->dstate = DSTATE_ANY;
! 213: break;
! 214: case SM_setName:
! 215: if (ob.tag != Sdollar) {
! 216: errorOxmisc2("SM_setName : the argument must be a string.");
! 217: return(-1);
! 218: }
! 219: oxReqSetName(client->datafp2,KopString(ob));
! 220: client->dstate = DSTATE_ANY;
! 221: break;
! 222: case SM_getsp:
! 223: oxReqSingleOperand(client->datafp2,SM_getsp);
! 224: client->dstate = DSTATE_ANY;
! 225: break;
! 226: case SM_dupErrors:
! 227: oxReqSingleOperand(client->datafp2,SM_dupErrors);
! 228: client->dstate = DSTATE_ANY;
! 229: break;
! 230: default:
! 231: fprintf(MyErrorOut,"func=%d ",func);
! 232: errorOxmisc2("This function is not implemented.");
! 233: break;
! 234: }
! 235: fp2fflush(client->datafp2);
! 236: return(0);
! 237: }
! 238:
! 239: struct object KoxCreateClient(struct object ip,
! 240: struct object portStream,
! 241: struct object portControl)
! 242: {
! 243: struct object rob;
! 244: oxclientp client;
! 245: rob.tag = Snull;
! 246: if (ip.tag != Sdollar) {
! 247: errorOxmisc2("KoxCreateClient(): The first argument must be a hostname given by a string.");
! 248: return(rob);
! 249: }
! 250: if (portStream.tag == Sdollar) {
! 251: client = oxCreateClientFile(KopString(ip),KopString(portStream),
! 252: "/dev/null","w");
! 253: if (client == NULL) {
! 254: errorOxmisc2("KoxCreateClient(): Open error.");
! 255: return(rob);
! 256: }
! 257: rob = newObjectArray(N_OF_CLIENT_FIELDS);
! 258: oxClientToObject(client,rob);
! 259: return(rob);
! 260: }
! 261:
! 262: if (portStream.tag != Sinteger) {
! 263: errorOxmisc2("KoxCreateClient(): The second argument must be a port number given in an integer.");
! 264: return(rob);
! 265: }
! 266: if (portControl.tag != Sinteger) {
! 267: errorOxmisc2("KoxCreateClient(): The third argument must be a port number given in an integer.");
! 268: return(rob);
! 269: }
! 270: client = oxCreateClient(KopString(ip),KopInteger(portStream),KopInteger(portControl));
! 271: if (client == NULL) {
! 272: errorOxmisc2("KoxCreateClient(): Open error.");
! 273: return(rob);
! 274: }
! 275: rob = newObjectArray(N_OF_CLIENT_FIELDS);
! 276: oxClientToObject(client,rob);
! 277: return(rob);
! 278: }
! 279:
! 280: static int isItClientObject(struct object ob)
! 281: {
! 282: int size,i;
! 283: struct object ee[N_OF_CLIENT_FIELDS];
! 284: if (ob.tag != Sarray) {
! 285: return(0);
! 286: }
! 287: size = getoaSize(ob);
! 288: if (size != N_OF_CLIENT_FIELDS) return(0);
! 289: for (i=0; i<N_OF_CLIENT_FIELDS; i++) {
! 290: ee[i] = getoa(ob,i);
! 291: }
! 292:
! 293: if (ee[0].tag != Sdollar) return(0);
! 294: if (strcmp(KopString(ee[0]),"client")!=0) return(0);
! 295:
! 296: if (ee[1].tag != Sfile) return(0);
! 297: if (strcmp((ee[1]).lc.str,MAGIC2) != 0) return(0);
! 298:
! 299: for (i=2; i<=9; i++) {
! 300: if (ee[i].tag != Sinteger) return(0);
! 301: }
! 302: return(1);
! 303: }
! 304:
! 305:
! 306: struct object KoxIsThereErrorClient(struct object ob)
! 307: {
! 308: struct object rob;
! 309: int ans;
! 310: int size;
! 311: oxclient cc;
! 312: rob.tag = Snull;
! 313: if (!isItClientObject(ob)) {
! 314: errorOxmisc2("KoxIsThereErrorClient(): the argument must be an array for client object.");
! 315: return(rob);
! 316: }
! 317: if (oxObjectToClient(ob,&cc) == -1) return(KpoInteger(-1));
! 318: ans = oxIsThereErrorClient(&cc);
! 319: return(KpoInteger(ans));
! 320: }
! 321:
! 322: int oxClientToObject(oxclientp client,struct object rob)
! 323: {
! 324: struct object ob;
! 325: if (client == NULL) return;
! 326: /* rob = newObjectArray(N_OF_CLIENT_FIELDS); */
! 327: if (rob.tag != Sarray) {
! 328: errorOxmisc2("oxClientToObject(): the second argument must be an array.");
! 329: return(-1);
! 330: }
! 331: if (getoaSize(rob) != N_OF_CLIENT_FIELDS) {
! 332: errorOxmisc2("oxClientToObject(): the second argument must be an array of size N_OF_CLIENT_FIELDS.");
! 333: return(-1);
! 334: }
! 335:
! 336: ob = KpoString("client");
! 337: putoa(rob,0,ob);
! 338:
! 339: ob.tag = Sfile; ob.lc.str = MAGIC2; ob.rc.voidp = (void *)(client->datafp2);
! 340: putoa(rob,1,ob);
! 341:
! 342: putoa(rob,2,KpoInteger(client->dataport));
! 343: putoa(rob,3,KpoInteger(client->controlfd));
! 344: putoa(rob,4,KpoInteger(client->controlport));
! 345: putoa(rob,5,KpoInteger(client->dstate));
! 346: putoa(rob,6,KpoInteger(client->cstate));
! 347: putoa(rob,7,KpoInteger(client->humanio));
! 348: putoa(rob,8,KpoInteger(client->id));
! 349: putoa(rob,9,KpoInteger(client->type));
! 350: if (client->mathcapObjp == NULL) {
! 351: putoa(rob,10,NullObject);
! 352: }else{
! 353: putoa(rob,10,*((struct object *)(client->mathcapObjp)));
! 354: }
! 355: putoa(rob,11,KpoInteger(client->engineByteOrder));
! 356: putoa(rob,12,KpoInteger(client->controlByteOrder));
! 357: return(0);
! 358: }
! 359:
! 360: int oxObjectToClient(struct object ob,oxclientp cp)
! 361: {
! 362: struct object ob1;
! 363: struct object *obp;
! 364: if (cp == NULL) {
! 365: errorOxmisc2("oxObjectToClient(): the second argument is NULL");
! 366: return(-1);
! 367: }
! 368: if (!isItClientObject(ob)) {
! 369: errorOxmisc2("oxObjectToClient(): the first argument is not client object.");
! 370: oxInitClient(cp);
! 371: return(-1);
! 372: }
! 373:
! 374: ob1 = getoa(ob,1);
! 375: cp->datafp2 = (FILE2 *) (ob1.rc.voidp);
! 376:
! 377: ob1 = getoa(ob,2);
! 378: cp->dataport = KopInteger(ob1);
! 379:
! 380: ob1 = getoa(ob,3);
! 381: cp->controlfd = KopInteger(ob1);
! 382:
! 383: ob1 = getoa(ob,4);
! 384: cp->controlport = KopInteger(ob1);
! 385:
! 386: ob1 = getoa(ob,5);
! 387: cp->dstate = KopInteger(ob1);
! 388:
! 389: ob1 = getoa(ob,6);
! 390: cp->cstate = KopInteger(ob1);
! 391:
! 392: ob1 = getoa(ob,7);
! 393: cp->humanio = KopInteger(ob1);
! 394:
! 395: ob1 = getoa(ob,8);
! 396: cp->id = KopInteger(ob1);
! 397:
! 398: ob1 = getoa(ob,9);
! 399: cp->type = KopInteger(ob1);
! 400:
! 401: ob1 = getoa(ob,10);
! 402: if (ob1.tag == Snull) {
! 403: cp->mathcapObjp = NULL;
! 404: }else{
! 405: obp = (struct object *) sGC_malloc(sizeof(struct object));
! 406: *obp = ob1;
! 407: cp->mathcapObjp = (void *)obp;
! 408: }
! 409: ob1 = getoa(ob,11);
! 410: cp->engineByteOrder = KopInteger(ob1);
! 411: ob1 = getoa(ob,12);
! 412: cp->controlByteOrder = KopInteger(ob1);
! 413:
! 414:
! 415: return(0);
! 416: }
! 417:
! 418: struct object KoxReq(struct object client,
! 419: struct object func,
! 420: struct object ob1)
! 421: {
! 422: int ans;
! 423: static oxclientp cc1 = NULL;
! 424: struct object rob;
! 425: rob.tag = Snull;
! 426: if (cc1 == NULL) {
! 427: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
! 428: if (cc1 == NULL) {
! 429: errorOxmisc2("KoxReq(): no more memory.");
! 430: return(rob);
! 431: }
! 432: oxInitClient(cc1);
! 433: }
! 434:
! 435: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 436: if (cc1 == NULL) {
! 437: errorOxmisc2("KoxReq(): the first argument must be a client object.");
! 438: return(rob);
! 439: }
! 440: if (func.tag != Sinteger) {
! 441: errorOxmisc2("KoxReq(): the second argument must be an integer.");
! 442: return(rob);
! 443: }
! 444: ans = oxReq(cc1,KopInteger(func),ob1);
! 445: /* synchronize cc1 and client. */
! 446: oxClientToObject(cc1,client);
! 447:
! 448: return(KpoInteger(ans));
! 449: }
! 450:
! 451: struct object KoxGet(struct object client)
! 452: {
! 453: int ans,k;
! 454: static oxclientp cc1 = NULL;
! 455: struct object rob;
! 456: rob.tag = Snull;
! 457: if (cc1 == NULL) {
! 458: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
! 459: if (cc1 == NULL) {
! 460: errorOxmisc2("KoxGet(): no more memory.");
! 461: return(rob);
! 462: }
! 463: oxInitClient(cc1);
! 464: }
! 465:
! 466: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 467: if (cc1 == NULL) {
! 468: errorOxmisc2("KoxGet(): the first argument must be a client object.");
! 469: return(rob);
! 470: }
! 471:
! 472: ans = oxGet(cc1,&rob,&k);
! 473: /* synchronize cc1 and client. */
! 474: oxClientToObject(cc1,client);
! 475:
! 476: if (k) return(rob);
! 477: else {
! 478: return(KpoInteger(ans));
! 479: }
! 480: }
! 481:
! 482: struct object KoxGetFromControl(struct object client)
! 483: {
! 484: int ans;
! 485: static oxclientp cc1 = NULL;
! 486: struct object rob;
! 487: rob.tag = Snull;
! 488: if (cc1 == NULL) {
! 489: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
! 490: if (cc1 == NULL) {
! 491: errorOxmisc2("KoxGetFromControl(): no more memory.");
! 492: return(rob);
! 493: }
! 494: oxInitClient(cc1);
! 495: }
! 496:
! 497: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 498: if (cc1 == NULL) {
! 499: errorOxmisc2("KoxGetFromControl(): the first argument must be a client object.");
! 500: return(rob);
! 501: }
! 502:
! 503: ans = oxGetFromControl(cc1);
! 504: /* synchronize cc1 and client. */
! 505: oxClientToObject(cc1,client);
! 506:
! 507: return(KpoInteger(ans));
! 508: }
! 509:
! 510: struct object KoxMultiSelect(struct object oclients,struct object t)
! 511: {
! 512: static int first = 1;
! 513: static int csize = 0;
! 514: static oxclientp *clients = NULL;
! 515: oxclientp cc1;
! 516: struct object rob;
! 517: int i;
! 518: int tt;
! 519: struct object ob1;
! 520: struct object ob2;
! 521: struct object ob0;
! 522: int size;
! 523: int ans;
! 524: int dataready[1024];
! 525: int controlready[1024];
! 526:
! 527: rob.tag = Snull;
! 528: if (oclients.tag != Sarray) {
! 529: errorOxmisc2("KoxMultiSelect(): the first argument must be an array.");
! 530: return(rob);
! 531: }
! 532: size = getoaSize(oclients);
! 533: if (first) {
! 534: first = 0; csize = size;
! 535: clients = (oxclientp *)mymalloc(sizeof(oxclientp)*(size+1));
! 536: if (clients == NULL) {
! 537: errorOxmisc2("KoxMultiSelect(): no more memory.");
! 538: return(rob);
! 539: }
! 540: for (i=0; i<size; i++) {
! 541: clients[i] = (oxclientp) mymalloc(sizeof(oxclient));
! 542: if (clients[i] == NULL) {
! 543: errorOxmisc2("KoxMultiSelect(): no more memory.");
! 544: return(rob);
! 545: }
! 546: oxInitClient(clients[i]);
! 547: }
! 548: }
! 549: if (csize < size) {
! 550: first = 1;
! 551: return(KoxMultiSelect(oclients,t));
! 552: }
! 553: for (i=0; i<size; i++) {
! 554: ob0 = getoa(oclients,i);
! 555: if (oxObjectToClient(ob0,clients[i]) == -1) return(rob);
! 556: }
! 557: if (t.tag != Sinteger) {
! 558: errorOxmisc2("KoxMultiSelect(): the second argument must be an integer.");
! 559: }
! 560: tt = KopInteger(t);
! 561: ans = oxclientMultiSelect(clients,dataready,controlready,size,tt);
! 562: /* synchronize oclients and clients. */
! 563: for (i=0; i<size; i++) {
! 564: ob0 = getoa(oclients,i);
! 565: oxClientToObject(clients[i],ob0);
! 566: putoa(oclients,i,ob0);
! 567: }
! 568: rob = newObjectArray(3);
! 569: putoa(rob,0,KpoInteger(ans));
! 570: ob1 = newObjectArray(size);
! 571: ob2 = newObjectArray(size);
! 572: for (i=0; i<size; i++) {
! 573: putoa(ob1,i,KpoInteger(dataready[i]));
! 574: putoa(ob2,i,KpoInteger(controlready[i]));
! 575: }
! 576: putoa(rob,1,ob1);
! 577: putoa(rob,2,ob2);
! 578: return(rob);
! 579: }
! 580:
! 581: struct object KoxWatch(struct object client,struct object f)
! 582: /* f is not used for now. It should be log file. */
! 583: {
! 584: int ans,k;
! 585: static oxclientp cc1 = NULL;
! 586: struct object rob;
! 587: rob.tag = Snull;
! 588: if (cc1 == NULL) {
! 589: cc1 = (oxclientp) mymalloc(sizeof(oxclient));
! 590: if (cc1 == NULL) {
! 591: errorOxmisc2("KoxWatch(): no more memory.");
! 592: return(rob);
! 593: }
! 594: oxInitClient(cc1);
! 595: }
! 596:
! 597: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 598: if (cc1 == NULL) {
! 599: errorOxmisc2("KoxWatch(): the first argument must be a client object.");
! 600: return(rob);
! 601: }
! 602:
! 603: k = fp2watch(cc1->datafp2,stdout);
! 604: /* synchronize cc1 and client. */
! 605: oxClientToObject(cc1,client);
! 606:
! 607: return(KpoInteger(ans));
! 608: }
! 609:
! 610:
! 611: struct object KoxCloseClient(struct object client) {
! 612: oxclientp cc1 = NULL;
! 613: oxclient cc;
! 614: struct object rob;
! 615: rob.tag = Snull;
! 616: cc1 = &cc;
! 617: if (oxObjectToClient(client,cc1) == -1) return(rob);
! 618: if (cc1 == NULL) {
! 619: errorOxmisc2("KoxCloseClient(): the first argument must be a client object.");
! 620: return(rob);
! 621: }
! 622:
! 623: fp2fflush(cc1->datafp2);
! 624: if (cc1->humanio) {
! 625: /* Do not close the file. */
! 626: return(KpoInteger(0));
! 627: }
! 628: switch (cc1->type) {
! 629: case CLIENT_SOCKET:
! 630: fp2fclose(cc1->datafp2);
! 631: close(cc1->controlfd);
! 632: break;
! 633: case CLIENT_FILE:
! 634: fp2fclose(cc1->datafp2);
! 635: close(cc1->controlfd);
! 636: break;
! 637: default:
! 638: errorOxmisc2("Unknown client->type\n");
! 639: break;
! 640: }
! 641: return(KpoInteger(0));
! 642:
! 643: }
! 644:
! 645: static int cmoCheck00(struct object obj,int cmo[], int n) {
! 646: int i,j,m;
! 647: int ttt;
! 648: #define CHECK00_N 4098 /* look up stackm.h and kclass.h */
! 649: static int typeTrans[CHECK00_N];
! 650: static int init = 0;
! 651: if (n == 0) return(1); /* For null cmolist, OK. */
! 652: if (!init) {
! 653: for (i=0; i<CHECK00_N; i++) {
! 654: typeTrans[i] = 0; /* unknown cmo number */
! 655: }
! 656: typeTrans[Snull] = CMO_NULL;
! 657: typeTrans[Sinteger] = CMO_INT32;
! 658: typeTrans[Sdollar] = CMO_STRING;
! 659: if (OxVersion >= 199907170) {
! 660: typeTrans[SuniversalNumber] = CMO_ZZ;
! 661: }else{
! 662: typeTrans[SuniversalNumber] = CMO_ZZ_OLD;
! 663: }
! 664: typeTrans[Sarray] = CMO_LIST;
! 665: /* typeTrans[Spoly] = CMO_DMS; */
! 666: typeTrans[Spoly] = CMO_DISTRIBUTED_POLYNOMIAL;
! 667: typeTrans[Sdouble] = CMO_64BIT_MACHINE_DOUBLE;
! 668: typeTrans[CLASSNAME_ERROR_PACKET] = CMO_ERROR2;
! 669: typeTrans[CLASSNAME_mathcap] = CMO_MATHCAP;
! 670: typeTrans[CLASSNAME_indeterminate] = CMO_INDETERMINATE;
! 671: typeTrans[CLASSNAME_tree] = CMO_TREE;
! 672: typeTrans[CLASSNAME_recursivePolynomial] = CMO_RECURSIVE_POLYNOMIAL;
! 673: typeTrans[CLASSNAME_polynomialInOneVariable] = CMO_POLYNOMIAL_IN_ONE_VARIABLE;
! 674: init = 1;
! 675: }
! 676: ttt = typeTrans[obj.tag];
! 677: if (obj.tag == Sclass) {
! 678: ttt = typeTrans[ectag(obj)];
! 679: }
! 680:
! 681: for (i=0; i<n; i++) {
! 682: if (ttt == cmo[i]) {
! 683: if (ttt != CMO_LIST) return(1);
! 684: else {
! 685: m = getoaSize(obj);
! 686: for (j=0; j<m; j++) {
! 687: if (!cmoCheck00(getoa(obj,j),cmo,n)) return(0);
! 688: }
! 689: return(1);
! 690: }
! 691: }
! 692: }
! 693: if (DebugMathCap) {
! 694: if (DebugMathCap && 1) {
! 695: fprintf(stderr,"Type translation table (internal object tag --> CMO tag)\n");
! 696: for (i=0; i<20; i++) {
! 697: printf("%d ", typeTrans[i]);
! 698: }
! 699: printf("\n");
! 700: }
! 701: fprintf(stderr,"The type of the argument object in sm1 is %d.\n",obj.tag);
! 702: fprintf(stderr,"The type of the argument object in CMO is %d.\n",ttt);
! 703: fprintf(stderr,"Available CMO tags in mathcap= %d elements : [ ",n);
! 704: for (i=0; i<n; i++) {
! 705: fprintf(stderr," %d ",cmo[i]);
! 706: }
! 707: fprintf(stderr," ] \n");
! 708: }
! 709: return(0);
! 710: }
! 711:
! 712: int cmoCheckMathCap(struct object obj, struct object *obp)
! 713: {
! 714: struct object mathcap;
! 715: struct object cmolist;
! 716: int n;
! 717: int i;
! 718: #define CMO_CHECK_MATH_CAP_LIST_SIZE 1024
! 719: int cmo[CMO_CHECK_MATH_CAP_LIST_SIZE];
! 720: if (obp == NULL) return(1);
! 721: if (obp->tag != Sarray) {
! 722: fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
! 723: printObject(*obp,0,stderr);
! 724: fprintf(stderr,"\n");
! 725: errorOxmisc2("cmoCheckMathCap: format error in the client->mathcapObjp field.\n");
! 726: }
! 727: mathcap = *obp;
! 728: n = getoaSize(mathcap);
! 729: if (n < 2) {
! 730: fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
! 731: printObject(*obp,0,stderr);
! 732: fprintf(stderr,"\n");
! 733: errorOxmisc2("cmoCheckMathCap: length of mathcap is wrong in the client->mathcapObjp field.\n");
! 734: }
! 735: /* I should check
! 736: getoa(getoa(mathcap,2),0)
! 737: contains OX_DATA.
! 738: It has not yet implemented.
! 739: */
! 740: mathcap = getoa(getoa(mathcap,1),2);
! 741: n = getoaSize(mathcap);
! 742: if (n < 2) {
! 743: fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
! 744: printObject(*obp,0,stderr);
! 745: fprintf(stderr,"\n");
! 746: errorOxmisc2("cmoCheckMathCap: length of mathcap is wrong in the client->mathcapObjp field.\n");
! 747: }
! 748: cmolist = getoa(mathcap,1);
! 749: if (cmolist.tag != Sarray) {
! 750: fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
! 751: printObject(*obp,0,stderr);
! 752: fprintf(stderr,"\n");
! 753: errorOxmisc2("cmoCheckMathCap: mathcap[1] must be an array of integers.\n");
! 754: }
! 755: n = getoaSize(cmolist);
! 756: if (n > CMO_CHECK_MATH_CAP_LIST_SIZE) {
! 757: errorOxmisc2("cmoCheckMathCap: Too big cmo list.\n");
! 758: }
! 759: for (i=0; i<n; i++) {
! 760: cmo[i] = KopInteger(getoa(cmolist,i));
! 761: }
! 762: return(cmoCheck00(obj,cmo,n));
! 763: }
! 764:
! 765:
! 766: struct object KoxGenPortFile(void) {
! 767: struct object ob;
! 768: ob = KpoString(oxGenPortFile());
! 769: return(ob);
! 770: }
! 771: void KoxRemovePortFile(void) {
! 772: oxRemovePortFile();
! 773: }
! 774:
! 775: void oxPushMathCap(struct mathCap *mathcap)
! 776: {
! 777: struct object rob;
! 778: rob = newMathCap(mathcap);
! 779: Kpush(rob);
! 780: }
! 781:
! 782: struct object KoxGenPass(void) {
! 783: struct object rob;
! 784: rob = KpoString(oxGenPass());
! 785: return(rob);
! 786: }
! 787:
! 788: struct object KoxGetPort(struct object host)
! 789: {
! 790: struct object rob;
! 791: int fdStream, fdControl;
! 792: int portStream, portControl;
! 793: extern int OpenedSocket;
! 794: char *sname;
! 795: rob = NullObject;
! 796: if (host.tag != Sdollar) {
! 797: errorOxmisc2("KoxGetPort: argument is not a string.");
! 798: return(rob);
! 799: }
! 800: sname = KopString(host);
! 801: fdControl = socketOpen(sname,0);
! 802: portControl = OpenedSocket;
! 803: fdStream = socketOpen(sname,0);
! 804: portStream = OpenedSocket;
! 805: rob = newObjectArray(4);
! 806: putoa(rob,0,KpoInteger(fdStream));
! 807: putoa(rob,1,KpoInteger(portStream));
! 808: putoa(rob,2,KpoInteger(fdControl));
! 809: putoa(rob,3,KpoInteger(portControl));
! 810: return(rob);
! 811: }
! 812:
! 813: struct object KoxCreateClient2(struct object peer,
! 814: struct object ipmask,
! 815: struct object pass)
! 816: {
! 817: struct object rob;
! 818: oxclientp client;
! 819: int fdStream, portStream, fdControl, portControl;
! 820: int i;
! 821: struct object ob1;
! 822: rob.tag = Snull;
! 823: if (peer.tag != Sarray) {
! 824: errorOxmisc2("KoxCreateClient2(): The first argument must be an array [fdStream, portStream, fdControl, portControl]");
! 825: return(rob);
! 826: }
! 827: if (getoaSize(peer) != 4) {
! 828: errorOxmisc2("KoxCreateClient2(): The first argument must be an array [fdStream, portStream, fdControl, portControl] of size 4.");
! 829: return(rob);
! 830: }
! 831: for (i=0; i<4; i++) {
! 832: ob1 = getoa(peer,i);
! 833: if (ob1.tag != Sinteger) {
! 834: errorOxmisc2("KoxCreateClient2(): The element of the first argument must be an integer.");
! 835: }
! 836: }
! 837: fdStream = KopInteger(getoa(peer,0));
! 838: portStream = KopInteger(getoa(peer,1));
! 839: fdControl = KopInteger(getoa(peer,2));
! 840: portControl = KopInteger(getoa(peer,3));
! 841:
! 842: if (ipmask.tag != Sinteger) {
! 843: errorOxmisc2("KoxCreateClient2(): ipmask must be an integer.");
! 844: }
! 845: if (pass.tag != Sdollar) {
! 846: errorOxmisc2("KoxCreateClient2(): pass must be a string.");
! 847: }
! 848:
! 849: client = oxCreateClient2(fdStream, portStream, fdControl, portControl,
! 850: KopInteger(ipmask), KopString(pass));
! 851: if (client == NULL) {
! 852: errorOxmisc2("KoxCreateClient2(): Open error.");
! 853: return(rob);
! 854: }
! 855: rob = newObjectArray(N_OF_CLIENT_FIELDS);
! 856: oxClientToObject(client,rob);
! 857: return(rob);
! 858: }
! 859:
! 860: errorOxmisc2(char *s) {
! 861: fprintf(MyErrorOut,"error in oxmisc2.c: %s\n",s);
! 862: errorKan1("%s\n"," ");
! 863: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>