bool MLAttempt(int func){ if (!func) { char err_msg[150]; sprintf(err_msg, "Message[GrapheneToolsLink::error,\"%.76s\"]", MLErrorMessage(stdlink)); MLClearError(stdlink); MLNewPacket(stdlink); MLEvaluate(stdlink, err_msg); MLNextPacket(stdlink); MLNewPacket(stdlink); MLPutSymbol(stdlink, "$Failed"); return false; } return true; }
/*@C PetscViewerMathematicaSkipPackets - Discard packets sent by Mathematica until a certain packet type is received Input Parameters: . viewer - The Mathematica viewer . type - The packet type to search for, e.g RETURNPKT Level: advanced .keywords PetscViewer, Mathematica, packets .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaGetVector() @*/ PetscErrorCode PetscViewerMathematicaSkipPackets(PetscViewer viewer, int type) { PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data; MLINK link = vmath->link; /* The link to Mathematica */ int pkt; /* The packet type */ PetscFunctionBegin; while ((pkt = MLNextPacket(link)) && (pkt != type)) MLNewPacket(link); if (!pkt) { MLClearError(link); SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB, (char*) MLErrorMessage(link)); } PetscFunctionReturn(0); }
static int processPacket(MLINK link, int indent) { static int isHead = 0; int tokenType = MLGetNext(link); int ierr; PetscFunctionBegin; ierr = printIndent(indent);CHKERRQ(ierr); switch (tokenType) { case MLTKFUNC: { long numArguments; int arg; printf("Function:\n"); MLGetArgCount(link, &numArguments); /* Process head */ printf(" Head:\n"); isHead = 1; ierr = processPacket(link, indent+4); if (ierr) PetscFunctionReturn(ierr); isHead = 0; /* Process arguments */ printf(" Arguments:\n"); for (arg = 0; arg < numArguments; arg++) { ierr = processPacket(link, indent+4);CHKERRQ(ierr); } } break; case MLTKSYM: { const char *symbol; MLGetSymbol(link, &symbol); printf("Symbol: %s\n", symbol); if (isHead && !strcmp(symbol, "Shutdown")) { MLDisownSymbol(link, symbol); PetscFunctionReturn(2); } MLDisownSymbol(link, symbol); } break; case MLTKINT: { int i; MLGetInteger(link, &i); printf("Integer: %d\n", i); } break; case MLTKREAL: { double r; MLGetReal(link, &r); printf("Real: %g\n", r); } break; case MLTKSTR: { const char *string; MLGetString(link, &string); printf("String: %s\n", string); MLDisownString(link, string); } break; default: printf("Unknown code %d\n", tokenType); MLClearError(link); fprintf(stderr, "ERROR: %s\n", (char*) MLErrorMessage(link)); PetscFunctionReturn(1); } PetscFunctionReturn(0); }
static int processPackets(MLINK link) { int packetType; int loop = 1; int errors = 0; int ierr; PetscFunctionBegin; while (loop) { while ((packetType = MLNextPacket(link)) && (packetType != RETURNPKT)) { switch (packetType) { case BEGINDLGPKT: printf("Begin dialog packet\n"); break; case CALLPKT: printf("Call packet\n"); break; case DISPLAYPKT: printf("Display packet\n"); break; case DISPLAYENDPKT: printf("Display end packet\n"); break; case ENDDLGPKT: printf("End dialog packet\n"); break; case ENTERTEXTPKT: printf("Enter text packet\n"); break; case ENTEREXPRPKT: printf("Enter expression packet\n"); break; case EVALUATEPKT: printf("Evaluate packet\n"); break; case INPUTPKT: printf("Input packet\n"); break; case INPUTNAMEPKT: printf("Input name packet\n"); break; case INPUTSTRPKT: printf("Input string packet\n"); break; case MENUPKT: printf("Menu packet\n"); break; case MESSAGEPKT: printf("Message packet\n"); break; case OUTPUTNAMEPKT: printf("Output name packet\n"); break; case RESUMEPKT: printf("Resume packet\n"); break; case RETURNTEXTPKT: printf("Return text packet\n"); break; case RETURNEXPRPKT: printf("Return expression packet\n"); break; case SUSPENDPKT: printf("Suspend packet\n"); break; case SYNTAXPKT: printf("Syntax packet\n"); break; case TEXTPKT: printf("Text packet\n"); break; } MLNewPacket(link); } /* Got a Return packet */ if (!packetType) { MLClearError(link); printf("ERROR: %s\n", (char*) MLErrorMessage(link)); errors++; } else if (packetType == RETURNPKT) { ierr = processPacket(link, 0); if (ierr == 1) CHKERRQ(ierr); if (ierr == 2) loop = 0; } else { fprintf(stderr, "Invalid packet type %d\n", packetType); loop = 0; } if (errors > 10) loop = 0; } PetscFunctionReturn(0); }