=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/sm1stackmachine.c,v retrieving revision 1.3 retrieving revision 1.9 diff -u -p -r1.3 -r1.9 --- OpenXM/src/kxx/sm1stackmachine.c 2001/05/06 07:53:01 1.3 +++ OpenXM/src/kxx/sm1stackmachine.c 2020/10/07 07:47:23 1.9 @@ -1,9 +1,22 @@ #include #include +#include #include "ox_kan.h" #include "serversm.h" extern int OXprintMessage; +extern char *MsgStackTrace; +extern char *MsgSourceTrace; +extern struct object *MsgStackTraceInArrayp; +void KSstart(); // kan96xx/Kan/datatype.h +int KSexecuteString(char *s); // kan96xx/Kan/datatype.h +int Kan_pushCMOFromStream(FILE2 *fp); //kan96xx/Kan/plugin.h +int Kan_popCMOToStream(FILE2 *fp,int serial); // +int KgetCmoTagOfObject(struct object obj); // +int KSstackPointer(void); //kan96xx/Kan/extern.h +int Kan_setMathCapToStream(FILE2 *fp,struct object ob); // kan96xx/plugin/cmo.c + + /* server stack machine */ int Sm1_start(int argc, char *fnames[],char *myname) { @@ -57,8 +70,8 @@ int Sm1_setMathCap(ox_stream os) { /* Set the mathcap data of the client in the server. */ /* sm1 <====== ox_sm1 mathcap is set in ox_stream = FILE2 * */ /* The mathcap data is on the stack. */ - struct object ob; - struct object ob2; + struct object ob = OINIT; + struct object ob2 = OINIT; int n,i; ob = KSpop(); KSpush(ob); KSexecuteString(" (mathcap data is ) message message "); @@ -93,7 +106,7 @@ char *Sm1_popString(void) { int Sm1_setName(void) { char *s; - struct object ob; + struct object ob = OINIT; s = Sm1_popString(); if (s == NULL) { printf("NULL argument for setName.\n"); @@ -109,7 +122,7 @@ int Sm1_setName(void) int Sm1_evalName(void) { char *s; - struct object ob; + struct object ob = OINIT; s = Sm1_popString(); if (s == NULL) { printf("NULL argument for evalName.\n"); @@ -137,8 +150,65 @@ int Sm1_popCMO(ox_stream fp,int serial) int Sm1_pushError2(int serial, int no, char *s) { - struct object ob; - ob = KnewErrorPacket(serial,no,s); + struct object ob = OINIT; + struct object core = OINIT; + struct object core1 = OINIT; + char *ss; + + ss = (char *)sGC_malloc(strlen(s)+1); + strcpy(ss,s); + /* + char *error_message=""; + char *message=""; + char *stack_trace=""; + char *source_trace=""; + char *error_message2=""; + char *message2=""; + char *stack_trace2=""; + char *source_trace2=""; + ss = (char *) sGC_malloc(strlen(s)+strlen(MsgStackTrace)+ + strlen(MsgSourceTrace)+ + strlen(error_message)+strlen(error_message2)+ + strlen(message)+strlen(message2)+ + strlen(stack_trace)+strlen(stack_trace2)+ + strlen(source_trace)+strlen(source_trace2)+2); + + strcat(ss,error_message); + strcat(ss,message); + strcat(ss,s); + strcat(ss,message2); + if (MsgStackTrace != NULL) { + strcat(ss,stack_trace); + strcat(ss,MsgStackTrace); + strcat(ss,stack_trace2); + } + if (MsgSourceTrace != NULL) { + strcat(ss,source_trace); + strcat(ss,MsgSourceTrace); + strcat(ss,source_trace2); + } + strcat(ss,error_message2); + */ + + if (MsgStackTraceInArrayp != NULL) { + core = KSnewObjectArray(2); + core1 = KSnewObjectArray(2); + putoa(core1,0,KpoString("where")); /* keyword */ + putoa(core1,1,(*MsgStackTraceInArrayp)); + putoa(core,0,core1); + core1 = KSnewObjectArray(2); + putoa(core1,0,KpoString("reason_of_error")); /* keyword */ + putoa(core1,1,KpoString(s)); + putoa(core,1,core1); + }else{ + core = KSnewObjectArray(0); + } + ob = KSnewObjectArray(4); + putoa(ob,0,KpoInteger(serial)); putoa(ob,1,KpoInteger(no)); + putoa(ob,2,KpoString(ss)); + putoa(ob,3,core); + + ob = KnewErrorPacketObj(ob); KSpush(ob); } @@ -177,7 +247,7 @@ void Sm1_dupErrors(void) { } void Sm1_pushCMOtag(int serial) { - struct object obj; + struct object obj = OINIT; int t; obj = KSpeek(0); t = KgetCmoTagOfObject(obj);