[BACK]Return to serv2.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_math

Annotation of OpenXM/src/ox_math/serv2.c, Revision 1.17

1.1       ohara       1: /* -*- mode: C; coding: euc-japan -*- */
1.17    ! ohara       2: /* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.16 2000/10/10 19:58:30 ohara Exp $ */
1.1       ohara       3:
1.13      ohara       4: /*
                      5:    Copyright (C) Katsuyoshi OHARA, 2000.
                      6:    Portions copyright 1999 Wolfram Research, Inc.
                      7:
                      8:    You must see OpenXM/Copyright/Copyright.generic.
                      9:    The MathLink Library is licensed from Wolfram Research Inc..
                     10:    See OpenXM/Copyright/Copyright.mathlink for detail.
                     11: */
                     12:
                     13: /*
                     14:    Remarks:
                     15:    file descripter 3 and 4 are already opened by the parent process.
                     16: */
1.1       ohara      17:
                     18: #include <stdio.h>
                     19: #include <stdlib.h>
                     20: #include <unistd.h>
                     21: #include <gmp.h>
                     22: #include <mathlink.h>
1.14      ohara      23: #include <ox_toolkit.h>
1.1       ohara      24: #include "serv2.h"
                     25:
1.10      ohara      26: extern int flag_mlo_symbol;
1.1       ohara      27:
1.13      ohara      28: /* MathLink independent */
1.11      ohara      29: #define INIT_S_SIZE 2048
                     30: #define EXT_S_SIZE  2048
1.1       ohara      31:
1.11      ohara      32: static int stack_size = 0;
                     33: static int stack_pointer = 0;
                     34: static cmo **stack = NULL;
1.1       ohara      35:
                     36: int initialize_stack()
                     37: {
1.11      ohara      38:     stack_pointer = 0;
                     39:        stack_size = INIT_S_SIZE;
                     40:        stack = malloc(stack_size*sizeof(cmo*));
                     41: }
                     42:
                     43: static int extend_stack()
                     44: {
                     45:        int size2 = stack_size + EXT_S_SIZE;
                     46:        cmo **stack2 = malloc(size2*sizeof(cmo*));
                     47:        memcpy(stack2, stack, stack_size*sizeof(cmo *));
                     48:        free(stack);
                     49:        stack = stack2;
                     50:        stack_size = size2;
1.10      ohara      51: }
1.1       ohara      52:
                     53: int push(cmo* m)
                     54: {
                     55: #if DEBUG
1.14      ohara      56:     symbol_t symp;
1.6       ohara      57:
1.1       ohara      58:     if (m->tag == CMO_STRING) {
1.7       ohara      59:         fprintf(stderr, "ox_math:: a CMO_STRING(%s) was pushed.\n", ((cmo_string *)m)->s);
1.5       ohara      60:     }else {
1.7       ohara      61:         symp = lookup_by_tag(m->tag);
1.14      ohara      62:         fprintf(stderr, "ox_math:: a %s was pushed.\n", symbol_get_key(symp));
1.7       ohara      63:     }
1.1       ohara      64: #endif
1.11      ohara      65:     stack[stack_pointer] = m;
                     66:     stack_pointer++;
                     67:     if (stack_pointer >= stack_size) {
                     68:                extend_stack();
1.1       ohara      69:     }
                     70: }
                     71:
1.13      ohara      72: /* if the stack is empty, then pop() returns (CMO_NULL). */
1.1       ohara      73: cmo* pop()
                     74: {
1.11      ohara      75:     if (stack_pointer > 0) {
                     76:         stack_pointer--;
                     77:         return stack[stack_pointer];
1.1       ohara      78:     }
1.3       ohara      79:     return new_cmo_null();
1.1       ohara      80: }
                     81:
                     82: void pops(int n)
                     83: {
1.11      ohara      84:     stack_pointer -= n;
                     85:     if (stack_pointer < 0) {
                     86:         stack_pointer = 0;
1.1       ohara      87:     }
                     88: }
                     89:
1.13      ohara      90: /*
                     91:    if error occurs, then a sm_*() function returns non-zero and
                     92:    an error obect is set by a function which calls sm_*().
                     93: */
1.16      ohara      94: int sm_popCMO(OXFILE* oxfp)
1.1       ohara      95: {
                     96:     cmo* m = pop();
1.6       ohara      97: #ifdef DEBUG
1.15      ohara      98:     symbol_t symp = lookup_by_tag(m->tag);
1.14      ohara      99:     fprintf(stderr, "ox_math:: opecode = SM_popCMO. (%s)\n", symbol_get_key(symp));
1.6       ohara     100: #endif
1.10      ohara     101:
1.1       ohara     102:     if (m != NULL) {
1.16      ohara     103:         send_ox_cmo(oxfp, m);
1.1       ohara     104:         return 0;
                    105:     }
                    106:     return SM_popCMO;
                    107: }
                    108:
1.16      ohara     109: int sm_pops(OXFILE* oxfp)
1.1       ohara     110: {
                    111:     cmo* m = pop();
                    112:     if (m != NULL && m->tag == CMO_INT32) {
                    113:         pops(((cmo_int32 *)m)->i);
                    114:         return 0;
                    115:     }
1.7       ohara     116:     return ERROR_ID_UNKNOWN_SM;
1.1       ohara     117: }
                    118:
1.13      ohara     119: /* MathLink dependent */
1.16      ohara     120: int sm_popString(OXFILE* oxfp)
1.1       ohara     121: {
1.6       ohara     122:     char *s;
                    123:     cmo *err;
                    124:     cmo *m;
1.1       ohara     125:
                    126: #ifdef DEBUG
1.5       ohara     127:     fprintf(stderr, "ox_math:: opecode = SM_popString.\n");
1.1       ohara     128: #endif
                    129:
1.7       ohara     130:     m = pop();
                    131:     if (m->tag == CMO_STRING) {
1.16      ohara     132:         send_ox_cmo(oxfp, m);
1.11      ohara     133:     }else if ((s = new_string_set_cmo(m)) != NULL) {
1.16      ohara     134:         send_ox_cmo(oxfp, (cmo *)new_cmo_string(s));
1.6       ohara     135:     }else {
1.7       ohara     136:         err = make_error_object(SM_popString, m);
1.16      ohara     137:         send_ox_cmo(oxfp, err);
1.7       ohara     138:     }
                    139:     return 0;
1.6       ohara     140: }
                    141:
                    142: int local_execute(char *s)
                    143: {
1.10      ohara     144:     if(*s == 'i') {
                    145:         switch(s[1]) {
                    146:         case '+':
                    147:             flag_mlo_symbol = FLAG_MLTKSYM_IS_STRING;
                    148:             break;
                    149:         case '-':
                    150:         case '=':
                    151:         default:
                    152:             flag_mlo_symbol = FLAG_MLTKSYM_IS_INDETERMINATE;
                    153:         }
                    154:     }
1.7       ohara     155:     return 0;
1.1       ohara     156: }
                    157:
1.13      ohara     158: /* The following function is depend on an implementation of a server. */
1.16      ohara     159: int sm_executeStringByLocalParser(OXFILE* oxfp)
1.1       ohara     160: {
1.15      ohara     161:     symbol_t symp;
1.6       ohara     162:     cmo* m = pop();
1.7       ohara     163:     char *s = NULL;
1.1       ohara     164: #ifdef DEBUG
1.5       ohara     165:     fprintf(stderr, "ox_math:: opecode = SM_executeStringByLocalParser.\n");
1.1       ohara     166: #endif
1.6       ohara     167:
                    168:     if (m->tag == CMO_STRING
1.7       ohara     169:         && strlen(s = ((cmo_string *)m)->s) != 0) {
                    170:         if (s[0] == ':') {
1.8       ohara     171:             local_execute(++s);
1.7       ohara     172:         }else {
                    173:             /* for mathematica */
1.13      ohara     174:             /* Sending the string `s' to mathematica for its evaluation. */
1.10      ohara     175:             ml_evaluateStringByLocalParser(s);
1.11      ohara     176:                        ml_select();
                    177:             push(receive_mlo());
1.7       ohara     178:         }
                    179:         return 0;
1.1       ohara     180:     }
1.6       ohara     181: #ifdef DEBUG
1.10      ohara     182:     symp = lookup_by_tag(m->tag);
1.14      ohara     183:     fprintf(stderr, "ox_math:: error. the top of stack is %s.\n", symbol_get_key(symp));
1.6       ohara     184: #endif
1.1       ohara     185:     return SM_executeStringByLocalParser;
                    186: }
                    187:
1.16      ohara     188: int sm_executeFunction(OXFILE* oxfp)
1.1       ohara     189: {
                    190:     int i, argc;
                    191:     cmo **argv;
                    192:     char* func;
                    193:     cmo* m;
                    194:
                    195:     if ((m = pop()) == NULL || m->tag != CMO_STRING) {
                    196:         return SM_executeFunction;
                    197:     }
                    198:     func = ((cmo_string *)m)->s;
                    199:
                    200:     if ((m = pop()) == NULL || m->tag != CMO_INT32) {
                    201:         return SM_executeFunction;
                    202:     }
1.6       ohara     203:
1.1       ohara     204:     argc = ((cmo_int32 *)m)->i;
1.7       ohara     205:     argv = malloc(argc*sizeof(cmo *));
1.1       ohara     206:     for (i=0; i<argc; i++) {
1.6       ohara     207:         argv[i] = pop();
1.1       ohara     208:     }
1.10      ohara     209:     ml_executeFunction(func, argc, argv);
1.11      ohara     210:        ml_select();
                    211:     push(receive_mlo());
1.1       ohara     212:     return 0;
                    213: }
                    214:
1.16      ohara     215: int sm_mathcap(OXFILE* oxfp)
1.1       ohara     216: {
1.17    ! ohara     217:     push((cmo *)oxf_cmo_mathcap(oxfp));
1.1       ohara     218:     return 0;
1.17    ! ohara     219: }
        !           220:
        !           221: void sm_set_mathcap(OXFILE *oxfp)
        !           222: {
        !           223:     cmo_mathcap *m = (cmo_mathcap *)pop();
        !           224:     if (m->tag == CMO_MATHCAP) {
        !           225:         oxf_mathcap_update(oxfp, m);
        !           226:     }else {
        !           227:         push_error(-1, m);
        !           228:         /* an error object must be pushed */
        !           229:     }
1.1       ohara     230: }
                    231:
1.16      ohara     232: int receive_sm_command(OXFILE* oxfp)
1.1       ohara     233: {
1.16      ohara     234:     return receive_int32(oxfp);
1.1       ohara     235: }
                    236:
1.16      ohara     237: int execute_sm_command(OXFILE* oxfp, int code)
1.1       ohara     238: {
                    239:     int err = 0;
1.10      ohara     240: #ifdef DEBUG
1.14      ohara     241:     symbol_t sp = lookup_by_tag(code);
                    242:     fprintf(stderr, "ox_math:: %s received.\n", symbol_get_key(sp));
1.8       ohara     243: #endif
1.1       ohara     244:
                    245:     switch(code) {
                    246:     case SM_popCMO:
1.16      ohara     247:         err = sm_popCMO(oxfp);
1.1       ohara     248:         break;
                    249:     case SM_popString:
1.16      ohara     250:         err = sm_popString(oxfp);
1.1       ohara     251:         break;
                    252:     case SM_mathcap:
1.16      ohara     253:         err = sm_mathcap(oxfp);
1.1       ohara     254:         break;
                    255:     case SM_pops:
1.16      ohara     256:         err = sm_pops(oxfp);
1.1       ohara     257:         break;
                    258:     case SM_executeStringByLocalParser:
1.10      ohara     259:     case SM_executeStringByLocalParserInBatchMode:
1.16      ohara     260:         err = sm_executeStringByLocalParser(oxfp);
1.1       ohara     261:         break;
                    262:     case SM_executeFunction:
1.16      ohara     263:         err = sm_executeFunction(oxfp);
1.1       ohara     264:         break;
1.10      ohara     265:     case SM_shutdown:
                    266:         shutdown();
                    267:         break;
1.2       ohara     268:     case SM_setMathCap:
1.13      ohara     269:         pop();  /* ignore */
1.1       ohara     270:         break;
                    271:     default:
                    272:         fprintf(stderr, "unknown command: %d.\n", code);
1.7       ohara     273:         err = ERROR_ID_UNKNOWN_SM;
1.1       ohara     274:     }
                    275:
                    276:     if (err != 0) {
1.7       ohara     277:         push((cmo *)make_error_object(err, new_cmo_null()));
1.1       ohara     278:     }
                    279: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>