[BACK]Return to oxmisc2.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / plugin

Annotation of OpenXM/src/kan96xx/plugin/oxmisc2.c, Revision 1.1.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>