version 1.1, 1999/10/08 02:12:05 |
version 1.6, 2000/03/20 01:53:47 |
|
|
|
/* $OpenXM: OpenXM/src/kan96xx/plugin/oxmisc2.c,v 1.5 2000/02/02 03:30:48 takayama Exp $ */ |
#include <stdio.h> |
#include <stdio.h> |
#include "ox_kan.h" |
#include "ox_kan.h" |
#include "oxmisc2.h" /* This file requires sm1 object description. */ |
#include "oxmisc2.h" /* This file requires sm1 object description. */ |
#include "cmo.h" |
#include "cmo.h" |
extern FILE *MyErrorOut; |
extern FILE *MyErrorOut; |
|
#define SET_MYERROROUT { if (MyErrorOut == NULL) MyErrorOut=stdout; } |
|
/* It is also defined in oxmisc.c */ |
|
|
extern int SerialOX; /* defined in SerialOX */ |
extern int SerialOX; /* defined in SerialOX */ |
|
|
extern int OxVersion; |
extern int OxVersion; |
Line 78 int oxGetFromControl(oxclientp client) |
|
Line 82 int oxGetFromControl(oxclientp client) |
|
int oxReq(oxclientp client,int func,struct object ob) |
int oxReq(oxclientp client,int func,struct object ob) |
{ |
{ |
struct object *ob1p; |
struct object *ob1p; |
|
SET_MYERROROUT; |
/* request to the control channel */ |
/* request to the control channel */ |
if (func == SM_control_reset_connection || |
if (func == SM_control_reset_connection || |
func == SM_control_kill) { |
func == SM_control_kill) { |
Line 128 int oxReq(oxclientp client,int func,struct object ob) |
|
Line 133 int oxReq(oxclientp client,int func,struct object ob) |
|
case SM_setMathCap: |
case SM_setMathCap: |
/* ob = [(mathcap-obj) [[version num, system name] [sm tags] |
/* ob = [(mathcap-obj) [[version num, system name] [sm tags] |
ob1 smtags |
ob1 smtags |
[[ox numbers] [cmo numbers]]] |
oxtags [[ox numbers, [cmo numbers]]] |
ob3 ob2 */ |
ob3 ob2 */ |
|
/* oxtags [[OX_DATA, [cmo numbers]],[OX_DATA_LOCAL,[opt]],...]*/ |
{ |
{ |
struct object ob1; |
struct object ob1; |
struct object ob2; |
struct object ob2; |
struct object ob3; |
struct object ob3; |
|
struct object obm; |
struct object smtags; |
struct object smtags; |
|
struct object oxtags; |
|
struct object ox; |
int n,i; |
int n,i; |
struct mathCap mathcap; |
struct mathCap mathcap; |
|
|
Line 143 int oxReq(oxclientp client,int func,struct object ob) |
|
Line 152 int oxReq(oxclientp client,int func,struct object ob) |
|
client->dstate = DSTATE_ANY; |
client->dstate = DSTATE_ANY; |
break; |
break; |
} |
} |
ob1 = getoa(getoa(ob,1),0); |
obm = getoa(ob,1); |
smtags = getoa(getoa(ob,1),1); |
ob1 = getoa(obm,0); |
ob2 = getoa(getoa(getoa(ob,1),2),1); |
smtags = getoa(obm,1); |
ob3 = getoa(getoa(getoa(ob,1),2),0); |
oxtags = getoa(obm,2); |
|
if (smtags.tag != Sarray || oxtags.tag != Sarray) { |
|
errorOxmisc2("data format error in oxReqSetMathCap"); |
|
} |
ob1p = (struct object *) sGC_malloc(sizeof(struct object)); |
ob1p = (struct object *) sGC_malloc(sizeof(struct object)); |
*ob1p = ob1; |
*ob1p = ob1; |
mathcap.infop = ob1p; |
mathcap.infop = ob1p; |
n = getoaSize(ob2); |
|
mathcap.n = n; |
n = getoaSize(oxtags); |
if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer."); |
if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer."); |
for (i=0; i<n; i++) { |
|
mathcap.cmo[i] = KopInteger(getoa(ob2,i)); |
|
} |
|
n = getoaSize(ob3); |
|
if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer."); |
|
mathcap.oxSize = n; |
mathcap.oxSize = n; |
for (i=0; i<n; i++) { |
for (i=0; i<n; i++) { |
mathcap.ox[i] = KopInteger(getoa(ob3,i)); |
ox = getoa(oxtags,i); |
|
if (ox.tag != Sarray) { |
|
errorOxmisc2("Data format error of the third argument of mathcap."); |
|
} |
|
mathcap.ox[i] = KopInteger(getoa(ox,0)); |
|
if (mathcap.ox[i] == OX_DATA) { |
|
if (getoaSize(ox) < 2) { |
|
errorOxmisc2("Data format error in an entry of the third argument of mathcap."); |
|
} |
|
ob2 = getoa(ox,1); |
|
if (ob2.tag != Sarray) { |
|
errorOxmisc2("Data format error in an entry of the third argument of mathcap."); |
|
} |
|
mathcap.n = getoaSize(ob2); |
|
if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer."); |
|
for (i=0; i<mathcap.n; i++) { |
|
mathcap.cmo[i] = KopInteger(getoa(ob2,i)); |
|
} |
|
} |
} |
} |
|
|
n = getoaSize(smtags); |
n = getoaSize(smtags); |
Line 584 struct object KoxWatch(struct object client,struct obj |
|
Line 608 struct object KoxWatch(struct object client,struct obj |
|
int ans,k; |
int ans,k; |
static oxclientp cc1 = NULL; |
static oxclientp cc1 = NULL; |
struct object rob; |
struct object rob; |
|
extern int WatchStream; |
rob.tag = Snull; |
rob.tag = Snull; |
|
if (client.tag == Sinteger) { |
|
if (KopInteger(client)) { |
|
WatchStream = 1; |
|
}else{ |
|
WatchStream = 0; |
|
} |
|
return; |
|
} |
if (cc1 == NULL) { |
if (cc1 == NULL) { |
cc1 = (oxclientp) mymalloc(sizeof(oxclient)); |
cc1 = (oxclientp) mymalloc(sizeof(oxclient)); |
if (cc1 == NULL) { |
if (cc1 == NULL) { |
Line 648 static int cmoCheck00(struct object obj,int cmo[], int |
|
Line 681 static int cmoCheck00(struct object obj,int cmo[], int |
|
#define CHECK00_N 4098 /* look up stackm.h and kclass.h */ |
#define CHECK00_N 4098 /* look up stackm.h and kclass.h */ |
static int typeTrans[CHECK00_N]; |
static int typeTrans[CHECK00_N]; |
static int init = 0; |
static int init = 0; |
if (n == 0) return(1); /* For null cmolist, OK. */ |
/* if n == 0, report the cmo tag of the object obj. |
|
If it cannot be translated to cmo, then return -1. */ |
|
|
if (!init) { |
if (!init) { |
for (i=0; i<CHECK00_N; i++) { |
for (i=0; i<CHECK00_N; i++) { |
typeTrans[i] = 0; /* unknown cmo number */ |
typeTrans[i] = 0; /* unknown cmo number */ |
Line 677 static int cmoCheck00(struct object obj,int cmo[], int |
|
Line 712 static int cmoCheck00(struct object obj,int cmo[], int |
|
if (obj.tag == Sclass) { |
if (obj.tag == Sclass) { |
ttt = typeTrans[ectag(obj)]; |
ttt = typeTrans[ectag(obj)]; |
} |
} |
|
/* Only report the cmo tag. */ |
|
if (n == 0) { |
|
if (ttt == 0) return(-1); |
|
else return(ttt); |
|
} |
|
|
for (i=0; i<n; i++) { |
for (i=0; i<n; i++) { |
if (ttt == cmo[i]) { |
if (ttt == cmo[i]) { |
Line 713 int cmoCheckMathCap(struct object obj, struct object * |
|
Line 753 int cmoCheckMathCap(struct object obj, struct object * |
|
{ |
{ |
struct object mathcap; |
struct object mathcap; |
struct object cmolist; |
struct object cmolist; |
|
struct object mathcapMain; |
|
struct object mathcapThird; |
|
struct object ox; |
|
struct object oxtag; |
|
struct object ob0; |
|
int oxsize; |
int n; |
int n; |
int i; |
int i; |
#define CMO_CHECK_MATH_CAP_LIST_SIZE 1024 |
#define CMO_CHECK_MATH_CAP_LIST_SIZE 1024 |
int cmo[CMO_CHECK_MATH_CAP_LIST_SIZE]; |
int cmo[CMO_CHECK_MATH_CAP_LIST_SIZE]; |
if (obp == NULL) return(1); |
if (obp == NULL) return(1); |
|
/* printObject(*obp,0,stderr); for debug*/ |
if (obp->tag != Sarray) { |
if (obp->tag != Sarray) { |
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
printObject(*obp,0,stderr); |
printObject(*obp,0,stderr); |
Line 725 int cmoCheckMathCap(struct object obj, struct object * |
|
Line 772 int cmoCheckMathCap(struct object obj, struct object * |
|
errorOxmisc2("cmoCheckMathCap: format error in the client->mathcapObjp field.\n"); |
errorOxmisc2("cmoCheckMathCap: format error in the client->mathcapObjp field.\n"); |
} |
} |
mathcap = *obp; |
mathcap = *obp; |
|
/* Example of mathcap |
|
[ $mathcap-object$ , |
|
[ [ 199909080 , $Ox_system=ox_sm1.plain$ , $Version=2.991106$ , |
|
$HOSTTYPE=i386$ ] , |
|
[ 262 , 263 , 264 , 265 , 266 , 268 , 269 , 272 , 273 , 275 , |
|
276 ] , |
|
[ [ 514 , [ 2130706434 , 1 , 2 , 4 , 5 , 17 , 19 , 20 , 22 , 23 , 24 , 25 , 26 , 30 , 31 , 60 , 61 , 27 , 33 , 40 , 16 , 34 ] ] ] ] ] |
|
*/ |
|
|
n = getoaSize(mathcap); |
n = getoaSize(mathcap); |
if (n < 2) { |
if (n < 2) { |
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
Line 732 int cmoCheckMathCap(struct object obj, struct object * |
|
Line 788 int cmoCheckMathCap(struct object obj, struct object * |
|
fprintf(stderr,"\n"); |
fprintf(stderr,"\n"); |
errorOxmisc2("cmoCheckMathCap: length of mathcap is wrong in the client->mathcapObjp field.\n"); |
errorOxmisc2("cmoCheckMathCap: length of mathcap is wrong in the client->mathcapObjp field.\n"); |
} |
} |
/* I should check |
ob0 = getoa(mathcap,0); |
getoa(getoa(mathcap,2),0) |
if (ob0.tag != Sdollar) { |
contains OX_DATA. |
|
It has not yet implemented. |
|
*/ |
|
mathcap = getoa(getoa(mathcap,1),2); |
|
n = getoaSize(mathcap); |
|
if (n < 2) { |
|
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
printObject(*obp,0,stderr); |
printObject(*obp,0,stderr); |
fprintf(stderr,"\n"); |
fprintf(stderr,"\n"); |
errorOxmisc2("cmoCheckMathCap: length of mathcap is wrong in the client->mathcapObjp field.\n"); |
errorOxmisc2("cmoCheckMathCap: The first field must be the string mathcap-object.\n"); |
} |
} |
cmolist = getoa(mathcap,1); |
if (strcmp(KopString(ob0),"mathcap-object") != 0) { |
if (cmolist.tag != Sarray) { |
|
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
printObject(*obp,0,stderr); |
printObject(*obp,0,stderr); |
fprintf(stderr,"\n"); |
fprintf(stderr,"\n"); |
errorOxmisc2("cmoCheckMathCap: mathcap[1] must be an array of integers.\n"); |
errorOxmisc2("cmoCheckMathCap: The mathcap must be of the form [(mathcap-object) [...]]\n"); |
} |
} |
n = getoaSize(cmolist); |
|
if (n > CMO_CHECK_MATH_CAP_LIST_SIZE) { |
/* I should check |
errorOxmisc2("cmoCheckMathCap: Too big cmo list.\n"); |
getoa(getoa(mathcap,1),2) |
|
contains OX_DATA. |
|
It has not yet implemented. |
|
*/ |
|
mathcapMain = getoa(mathcap,1); |
|
if (mathcapMain.tag != Sarray) { |
|
fprintf(stderr,"cmoCheckMathCap: mathcap[1] is \n"); |
|
printObject(mathcapMain,0,stderr); |
|
fprintf(stderr,"\n"); |
|
errorOxmisc2("cmoCheckMathCap: format error in the (client->mathcapObjp)[1] field. It should be an array.\n"); |
} |
} |
for (i=0; i<n; i++) { |
if (getoaSize(mathcapMain) < 3) { |
cmo[i] = KopInteger(getoa(cmolist,i)); |
fprintf(stderr,"cmoCheckMathCap: mathcap[1] is \n"); |
|
printObject(mathcapMain,0,stderr); |
|
fprintf(stderr,"\n"); |
|
errorOxmisc2("cmoCheckMathCap: format error in the (client->mathcapObjp)[1] field. It should be an array of which length is more than 2.\n"); |
} |
} |
|
mathcapThird = getoa(mathcapMain,2); |
|
oxsize = getoaSize(mathcapThird); |
|
for (i=0; i<oxsize; i++) { |
|
ox = getoa(mathcapThird,i); |
|
if (ox.tag != Sarray) { |
|
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
|
printObject(*obp,0,stderr); |
|
fprintf(stderr,"\n"); |
|
errorOxmisc2("cmoCheckMathCap: the third element of mathcap is a list of lists."); |
|
} |
|
if (getoaSize(ox) != 0) { |
|
oxtag = getoa(ox,0); |
|
if (oxtag.tag != Sinteger) { |
|
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
|
printObject(*obp,0,stderr); |
|
fprintf(stderr,"\n"); |
|
errorOxmisc2("cmoCheckMathCap: the third element of mathcap must be [OX_DATA_xxx, [ ]]."); |
|
} |
|
if (KopInteger(oxtag) == OX_DATA) { |
|
if (getoaSize(ox) > 1) { |
|
cmolist = getoa(ox,1); |
|
if (cmolist.tag != Sarray) { |
|
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
|
printObject(*obp,0,stderr); |
|
fprintf(stderr,"\n"); |
|
errorOxmisc2("cmoCheckMathCap: mathcap[1] must be an array of integers.\n"); |
|
} |
|
n = getoaSize(cmolist); |
|
if (n > CMO_CHECK_MATH_CAP_LIST_SIZE) { |
|
errorOxmisc2("cmoCheckMathCap: Too big cmo list.\n"); |
|
} |
|
for (i=0; i<n; i++) { |
|
cmo[i] = KopInteger(getoa(cmolist,i)); |
|
} |
|
}else{ |
|
fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n"); |
|
printObject(*obp,0,stderr); |
|
fprintf(stderr,"\nox="); |
|
printObject(ox,0,stderr); |
|
errorOxmisc2("cmoCheckMathCap: [OX_DATA, cmolist]"); |
|
} |
|
} |
|
} |
|
} |
return(cmoCheck00(obj,cmo,n)); |
return(cmoCheck00(obj,cmo,n)); |
} |
} |
|
|
Line 857 struct object KoxCreateClient2(struct object peer, |
|
Line 962 struct object KoxCreateClient2(struct object peer, |
|
return(rob); |
return(rob); |
} |
} |
|
|
|
int KgetCmoTagOfObject(struct object obj) { |
|
int k; |
|
k=cmoCheck00(obj,(int *)NULL,0); |
|
return(k); |
|
} |
|
|
errorOxmisc2(char *s) { |
errorOxmisc2(char *s) { |
|
SET_MYERROROUT; |
fprintf(MyErrorOut,"error in oxmisc2.c: %s\n",s); |
fprintf(MyErrorOut,"error in oxmisc2.c: %s\n",s); |
errorKan1("%s\n"," "); |
errorKan1("%s\n"," "); |
} |
} |