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

Annotation of OpenXM/src/ox_pari/ox_pari.c, Revision 1.7

1.7     ! noro        1: /*  $OpenXM: OpenXM/src/ox_pari/ox_pari.c,v 1.6 2015/08/18 02:24:04 noro Exp $  */
1.1       noro        2:
                      3: #include <stdio.h>
                      4: #include <stdlib.h>
                      5: #include <string.h>
1.2       noro        6: #include "pari/pari.h"
1.3       noro        7: #include "pari/paripriv.h"
1.1       noro        8: #include "gmp.h"
1.2       noro        9: #include "gmp-impl.h"
1.3       noro       10: #include "mpfr.h"
1.1       noro       11: #include "ox_toolkit.h"
                     12: OXFILE *fd_rw;
                     13:
1.3       noro       14: #define MPFR_PREC(x)      ((x)->_mpfr_prec)
                     15: #define MPFR_EXP(x)       ((x)->_mpfr_exp)
                     16: #define MPFR_MANT(x)      ((x)->_mpfr_d)
                     17: #define MPFR_LAST_LIMB(x) ((MPFR_PREC (x) - 1) / GMP_NUMB_BITS)
                     18: #define MPFR_LIMB_SIZE(x) (MPFR_LAST_LIMB (x) + 1)
                     19:
1.1       noro       20: static int stack_size = 0;
                     21: static int stack_pointer = 0;
                     22: static cmo **stack = NULL;
                     23: extern int debug_print;
1.2       noro       24: long paristack=10000000;
1.1       noro       25:
                     26: void init_pari(void);
1.2       noro       27: cmo *GEN_to_cmo(GEN z);
                     28: cmo_zz *GEN_to_cmo_zz(GEN z);
1.7     ! noro       29: cmo_qq *GEN_to_cmo_qq(GEN z);
1.3       noro       30: cmo_bf *GEN_to_cmo_bf(GEN z);
1.2       noro       31: cmo_list *GEN_to_cmo_list(GEN z);
1.6       noro       32: cmo_complex *GEN_to_cmo_cmo_complex(GEN z);
1.2       noro       33: GEN cmo_to_GEN(cmo *c);
1.6       noro       34: GEN cmo_int32_to_GEN(cmo_int32 *c);
1.2       noro       35: GEN cmo_zz_to_GEN(cmo_zz *c);
1.6       noro       36: GEN cmo_qq_to_GEN(cmo_qq *c);
1.3       noro       37: GEN cmo_bf_to_GEN(cmo_bf *c);
1.6       noro       38: GEN cmo_list_to_GEN(cmo_list *c);
                     39: GEN cmo_rp_to_GEN(cmo_recursive_polynomial *c);
                     40: GEN cmo_up_to_GEN(cmo_polynomial_in_one_variable *c);
                     41: GEN cmo_complex_to_GEN(cmo_complex *c);
1.1       noro       42:
                     43: #define INIT_S_SIZE 2048
                     44: #define EXT_S_SIZE  2048
                     45:
1.3       noro       46: void *gc_realloc(void *p,size_t osize,size_t nsize)
                     47: {
                     48:   return (void *)GC_realloc(p,nsize);
                     49: }
                     50:
                     51: void gc_free(void *p,size_t size)
                     52: {
                     53:   GC_free(p);
                     54: }
                     55:
                     56: void init_gc()
                     57: {
1.4       noro       58:   GC_INIT();
1.3       noro       59:   mp_set_memory_functions(GC_malloc,gc_realloc,gc_free);
                     60: }
                     61:
1.1       noro       62: void init_pari()
                     63: {
1.2       noro       64:   pari_init(paristack,2);
1.1       noro       65: }
                     66:
                     67: int initialize_stack()
                     68: {
1.4       noro       69:   stack_pointer = 0;
                     70:    stack_size = INIT_S_SIZE;
                     71:   stack = MALLOC(stack_size*sizeof(cmo*));
                     72:   return 0;
1.1       noro       73: }
                     74:
                     75: static int extend_stack()
                     76: {
1.4       noro       77:   int size2 = stack_size + EXT_S_SIZE;
                     78:   cmo **stack2 = MALLOC(size2*sizeof(cmo*));
                     79:   memcpy(stack2, stack, stack_size*sizeof(cmo *));
                     80:   free(stack);
                     81:   stack = stack2;
                     82:   stack_size = size2;
                     83:   return 0;
1.1       noro       84: }
                     85:
                     86: int push(cmo* m)
                     87: {
1.4       noro       88:   stack[stack_pointer] = m;
                     89:   stack_pointer++;
                     90:   if(stack_pointer >= stack_size) {
                     91:     extend_stack();
                     92:   }
                     93:   return 0;
1.1       noro       94: }
                     95:
                     96: cmo* pop()
                     97: {
1.4       noro       98:   if(stack_pointer > 0) {
                     99:     stack_pointer--;
                    100:     return stack[stack_pointer];
                    101:   }
                    102:   return new_cmo_null();
1.1       noro      103: }
                    104:
                    105: void pops(int n)
                    106: {
1.4       noro      107:   stack_pointer -= n;
                    108:   if(stack_pointer < 0) {
                    109:     stack_pointer = 0;
                    110:   }
1.1       noro      111: }
                    112:
                    113: #define OX_PARI_VERSION 20150731
                    114: #define ID_STRING  "2015/07/31 15:00:00"
                    115:
                    116: int sm_mathcap()
                    117: {
1.4       noro      118:   mathcap_init(OX_PARI_VERSION, ID_STRING, "ox_pari", NULL, NULL);
                    119:   push((cmo*)oxf_cmo_mathcap(fd_rw));
                    120:   return 0;
1.1       noro      121: }
                    122:
                    123: int sm_popCMO()
                    124: {
1.4       noro      125:   cmo* m = pop();
1.1       noro      126:
1.4       noro      127:   if(m != NULL) {
                    128:     send_ox_cmo(fd_rw, m);
                    129:     return 0;
                    130:   }
                    131:   return SM_popCMO;
1.1       noro      132: }
                    133:
                    134: cmo_error2 *make_error2(int code)
                    135: {
1.4       noro      136:   return (cmo_error2 *) new_cmo_int32(code);
1.1       noro      137: }
                    138:
                    139: int get_i()
                    140: {
1.4       noro      141:   cmo *c = pop();
                    142:   if(c->tag == CMO_INT32) {
                    143:     return ((cmo_int32 *)c)->i;
                    144:   }else if(c->tag == CMO_ZZ) {
                    145:     return mpz_get_si(((cmo_zz *)c)->mpz);
                    146:   }
                    147:   make_error2(-1);
                    148:   return 0;
1.1       noro      149: }
                    150:
                    151: char *get_str()
                    152: {
1.4       noro      153:   cmo *c = pop();
                    154:   if(c->tag == CMO_STRING) {
                    155:     return ((cmo_string *)c)->s;
                    156:   }
                    157:   make_error2(-1);
                    158:   return "";
1.1       noro      159: }
                    160:
                    161: int cmo2int(cmo *c)
                    162: {
1.4       noro      163:   if(c->tag == CMO_INT32) {
                    164:     return ((cmo_int32 *)c)->i;
                    165:   }else if(c->tag == CMO_ZZ) {
                    166:     return mpz_get_si(((cmo_zz *)c)->mpz);
                    167:   } else if(c->tag == CMO_NULL){
                    168:     return 0;
                    169:   }
1.1       noro      170:
1.4       noro      171:   return 0;
1.1       noro      172: }
                    173:
1.6       noro      174: GEN cmo_int32_to_GEN(cmo_int32 *c)
                    175: {
                    176:   GEN z;
                    177:   int i,sgn;
                    178:
                    179:   i = c->i;
                    180:   if ( !i ) return gen_0;
                    181:   z = cgeti(3);
                    182:   sgn = 1;
                    183:   if ( i < 0 ) {
                    184:     i = -i;
                    185:     sgn = -1;
                    186:   }
                    187:   z[2] = i;
                    188:   setsigne(z,sgn);
                    189:   setlgefint(z,lg(z));
                    190:   return z;
                    191: }
                    192:
1.2       noro      193: GEN cmo_zz_to_GEN(cmo_zz *c)
                    194: {
                    195:   mpz_ptr mpz;
                    196:   GEN z;
                    197:   long *ptr;
                    198:   int j,sgn,len;
                    199:
                    200:   mpz = c->mpz;
                    201:   sgn = mpz_sgn(mpz);
                    202:   len = ABSIZ(mpz);
                    203:   ptr = (long *)PTR(mpz);
                    204:   z = cgeti(len+2);
                    205:   for ( j = 0; j < len; j++ )
                    206:     z[len-j+1] = ptr[j];
                    207:   setsigne(z,sgn);
                    208:   setlgefint(z,lg(z));
                    209:   return z;
                    210: }
                    211:
1.6       noro      212: GEN cmo_qq_to_GEN(cmo_qq *c)
                    213: {
                    214:   GEN z,nm,den;
                    215:
                    216:   z = cgetg(3,4);
                    217:   nm = cmo_zz_to_GEN(new_cmo_zz_set_mpz(mpq_numref(c->mpq)));
                    218:   den = cmo_zz_to_GEN(new_cmo_zz_set_mpz(mpq_denref(c->mpq)));
                    219:   z[1] = (long)nm;
                    220:   z[2] = (long)den;
                    221:   return z;
                    222: }
                    223:
1.3       noro      224: GEN cmo_bf_to_GEN(cmo_bf *c)
                    225: {
                    226:   mpfr_ptr mpfr;
                    227:   GEN z;
                    228:   int sgn,len,j;
                    229:   long exp;
                    230:   long *ptr;
                    231:
                    232:   mpfr = c->mpfr;
                    233:   sgn = MPFR_SIGN(mpfr);
                    234:   exp = MPFR_EXP(mpfr)-1;
                    235:   len = MPFR_LIMB_SIZE(mpfr);
                    236:   ptr = (long *)MPFR_MANT(mpfr);
                    237:   z = cgetr(len+2);
                    238:   for ( j = 0; j < len; j++ )
                    239:     z[len-j+1] = ptr[j];
                    240:   z[1] = evalsigne(sgn)|evalexpo(exp);
                    241:   setsigne(z,sgn);
                    242:   return z;
                    243: }
                    244:
1.6       noro      245: /* list->vector */
                    246:
                    247: GEN cmo_list_to_GEN(cmo_list *c)
                    248: {
                    249:   GEN z;
1.7     ! noro      250:   int i;
1.6       noro      251:   cell *cell;
                    252:
                    253:   z = cgetg(c->length+1,17);
1.7     ! noro      254:   for ( i = 0, cell = c->head->next; cell != c->head; cell = cell->next, i++ ) {
        !           255:     z[i+1] = (long)cmo_to_GEN(cell->cmo);
1.6       noro      256:   }
                    257:   return z;
                    258: }
                    259:
                    260: GEN cmo_complex_to_GEN(cmo_complex *c)
                    261: {
                    262:   GEN z;
                    263:
                    264:   z = cgetg(3,6);
                    265:   z[1] = (long)cmo_to_GEN(c->re);
                    266:   z[2] = (long)cmo_to_GEN(c->im);
                    267:   return z;
                    268: }
                    269:
                    270: GEN cmo_up_to_GEN(cmo_polynomial_in_one_variable *c)
                    271: {
                    272:   GEN z;
                    273:   int d,i;
                    274:   cell *cell;
                    275:
                    276:   d = c->head->next->exp;
                    277:   z = cgetg(d+3,10);
                    278:   setsigne(z,1);
                    279:   setvarn(z,c->var);
                    280:   setlgef(z,d+3);
                    281:   for ( i = 2; i <= d+2; i++ )
                    282:     z[i] = (long)gen_0;
                    283:   for ( cell = c->head->next; cell != c->head; cell = cell->next ) {
                    284:     z[2+cell->exp] = (long)cmo_to_GEN(cell->cmo);
                    285:   }
                    286:   return z;
                    287: }
                    288:
                    289: cmo_list *current_ringdef;
                    290:
                    291: void register_variables(cmo_list *ringdef)
                    292: {
                    293:   current_ringdef = ringdef;
                    294: }
                    295:
                    296: GEN cmo_rp_to_GEN(cmo_recursive_polynomial *c)
                    297: {
                    298:   register_variables(c->ringdef);
                    299:   switch ( c->coef->tag ) {
                    300:   case CMO_ZERO:
1.7     ! noro      301:   case CMO_NULL:
1.6       noro      302:     return gen_0;
                    303:   case CMO_INT32:
                    304:     return cmo_int32_to_GEN((cmo_int32 *)c->coef);
                    305:   case CMO_ZZ:
                    306:     return cmo_zz_to_GEN((cmo_zz *)c->coef);
                    307:   case CMO_QQ:
                    308:     return cmo_qq_to_GEN((cmo_qq *)c->coef);
                    309:   case CMO_POLYNOMIAL_IN_ONE_VARIABLE:
                    310:     return cmo_up_to_GEN((cmo_polynomial_in_one_variable *)c->coef);
                    311:   default:
                    312:     return 0;
                    313:   }
                    314: }
                    315:
1.2       noro      316: cmo_zz *GEN_to_cmo_zz(GEN z)
                    317: {
                    318:   cmo_zz *c;
                    319:
                    320:   c = new_cmo_zz();
                    321:   mpz_import(c->mpz,lgef(z)-2,1,sizeof(long),0,0,&z[2]);
                    322:   if ( signe(z) < 0 )
                    323:     mpz_neg(c->mpz,c->mpz);
                    324:   return c;
                    325: }
                    326:
1.7     ! noro      327: cmo_qq *GEN_to_cmo_qq(GEN z)
        !           328: {
        !           329:   cmo_qq *c;
        !           330:   GEN num,den;
        !           331:
        !           332:   num = (GEN)z[1];
        !           333:   den = (GEN)z[2];
        !           334:   c = new_cmo_qq();
        !           335:   mpz_import(mpq_numref(c->mpq),lgef(num)-2,1,sizeof(long),0,0,&num[2]);
        !           336:   mpz_import(mpq_denref(c->mpq),lgef(num)-2,1,sizeof(long),0,0,&den[2]);
        !           337:   if ( signe(num)*signe(den) < 0 )
        !           338:     mpz_neg(mpq_numref(c->mpq),mpq_numref(c->mpq));
        !           339:   return c;
        !           340: }
        !           341:
        !           342:
1.3       noro      343: cmo_bf *GEN_to_cmo_bf(GEN z)
                    344: {
                    345:   cmo_bf *c;
                    346:   int len,prec,j;
                    347:   long *ptr;
                    348:
                    349:   c = new_cmo_bf();
                    350:   len = lg(z)-2;
                    351:   prec = len*sizeof(long)*8;
                    352:   mpfr_init2(c->mpfr,prec);
                    353:   ptr = (long *)MPFR_MANT(c->mpfr);
                    354:   for ( j = 0; j < len; j++ )
                    355:     ptr[j] = z[len-j+1];
                    356:   MPFR_EXP(c->mpfr) = (long long)(expo(z)+1);
                    357:   MPFR_SIGN(c->mpfr) = gsigne(z);
                    358:   return c;
                    359: }
                    360:
                    361:
1.2       noro      362: cmo_list *GEN_to_cmo_list(GEN z)
                    363: {
                    364:   cmo_list *c;
                    365:   cmo *ob;
                    366:   int i,len;
                    367:
                    368:   c = new_cmo_list();
                    369:   len = lg(z)-1;
                    370:   for ( i = 1; i <= len; i++ ) {
                    371:     ob = GEN_to_cmo((GEN)z[i]);
                    372:     c = list_append(c,ob);
                    373:   }
                    374:   return c;
                    375: }
                    376:
1.6       noro      377: cmo_complex *GEN_to_cmo_complex(GEN z)
                    378: {
                    379:   cmo_complex *c;
                    380:
                    381:   c = new_cmo_complex();
                    382:   c->re = GEN_to_cmo((GEN)z[1]);
                    383:   c->im = GEN_to_cmo((GEN)z[2]);
                    384:   return c;
                    385: }
                    386:
1.2       noro      387:
                    388: GEN cmo_to_GEN(cmo *c)
                    389: {
                    390:   switch ( c->tag ) {
                    391:   case CMO_ZERO:
1.7     ! noro      392:   case CMO_NULL:
1.3       noro      393:     return gen_0;
1.2       noro      394:   case CMO_ZZ: /* int */
                    395:     return cmo_zz_to_GEN((cmo_zz *)c);
1.3       noro      396:   case CMO_BIGFLOAT: /* bigfloat */
                    397:     return cmo_bf_to_GEN((cmo_bf *)c);
1.6       noro      398:   case CMO_LIST:
                    399:     return cmo_list_to_GEN((cmo_list *)c);
                    400:   case CMO_RECURSIVE_POLYNOMIAL:
                    401:     return cmo_rp_to_GEN((cmo_recursive_polynomial *)c);
                    402:   case CMO_POLYNOMIAL_IN_ONE_VARIABLE:
                    403:     return cmo_up_to_GEN((cmo_polynomial_in_one_variable *)c);
1.2       noro      404:   default:
                    405:     return 0;
                    406:   }
                    407: }
                    408:
                    409: cmo *GEN_to_cmo(GEN z)
                    410: {
                    411:   if ( gcmp0(z) )
                    412:     return new_cmo_zero();
                    413:   switch ( typ(z) ) {
                    414:   case 1: /* int */
                    415:     return (cmo *)GEN_to_cmo_zz(z);
1.3       noro      416:   case 2: /* bigfloat */
                    417:     return (cmo *)GEN_to_cmo_bf(z);
1.7     ! noro      418:   case 4: /* rational number */
        !           419:     return (cmo *)GEN_to_cmo_qq(z);
1.6       noro      420:   case 6: /* complex */
                    421:     return (cmo *)GEN_to_cmo_complex(z);
1.2       noro      422:   case 17: case 18: /* vector */
                    423:     return (cmo *)GEN_to_cmo_list(z);
                    424:   case 19: /* matrix */
                    425:     return (cmo *)GEN_to_cmo_list(shallowtrans(z));
                    426:   default:
                    427:     return (cmo *)make_error2(typ(z));
                    428:   }
                    429: }
1.7     ! noro      430: /* type=1 : num/poly arg, type=2 : matrix arg */
1.2       noro      431:
1.3       noro      432: struct parif {
                    433:   char *name;
1.4       noro      434:   GEN (*f)();
1.3       noro      435:   int type;
                    436: } parif_tab[] = {
1.4       noro      437: /* (ulong)allocatemoremem(ulong) */
                    438:   {"allocatemem",(GEN (*)())allocatemoremem,0},
                    439: /* num/num */
                    440:   {"abs",gabs,1},
                    441:   {"erfc",gerfc,1},
                    442:   {"arg",garg,1},
                    443:   {"isqrt",racine,1},
                    444:   {"gamma",ggamma,1},
                    445:   {"zeta",gzeta,1},
                    446:   {"floor",gfloor,1},
                    447:   {"frac",gfrac,1},
                    448:   {"imag",gimag,1},
                    449:   {"conj",gconj,1},
                    450:   {"ceil",gceil,1},
                    451:   {"isprime",gisprime,2},
                    452:   {"bigomega",gbigomega,1},
                    453:   {"denom",denom,1},
                    454:   {"numer",numer,1},
                    455:   {"lngamma",glngamma,1},
                    456:   {"logagm",glogagm,1},
                    457:   {"classno",classno,1},
                    458:   {"classno2",classno2,1},
                    459:   {"dilog",dilog,1},
                    460:   {"disc",discsr,1},
                    461:   {"discf",discf,1},
                    462:   {"nextprime",nextprime,1},
                    463:   {"eintg1",eint1,1},
                    464:   {"eta",eta,1},
                    465:   {"issqfree",gissquarefree,1},
                    466:   {"issquare",gcarreparfait,1},
                    467:   {"gamh",ggamd,1},
                    468:   {"hclassno",classno3,1},
                    469:
                    470:   /* num/array */
                    471:   {"binary",binaire,1},
                    472:   {"factorint",factorint,2},
                    473:   {"factor",Z_factor,1},
                    474:   {"cf",gcf,1},
                    475:   {"divisors",divisors,1},
                    476:   {"smallfact",smallfact,1},
                    477:
                    478:   /* poly/poly */
                    479:   {"centerlift",centerlift,1},
                    480:   {"content",content,1},
                    481:
                    482:   /* poly/array */
                    483:   {"galois",galois,1},
                    484:   {"roots",roots,1},
                    485:
1.7     ! noro      486:   /* mat/mat */
        !           487:   {"adj",adj,2},
        !           488:   {"lll",lll,2},
        !           489:   {"lllgen",lllgen,2},
        !           490:   {"lllgram",lllgram,2},
        !           491:   {"lllgramgen",lllgramgen,2},
        !           492:   {"lllgramint",lllgramint,2},
        !           493:   {"lllgramkerim",lllgramkerim,2},
        !           494:   {"lllgramkerimgen",lllgramkerimgen,2},
        !           495:   {"lllint",lllint,2},
        !           496:   {"lllkerim",lllkerim,2},
        !           497:   {"lllkerimgen",lllkerimgen,2},
        !           498:   {"trans",gtrans,2},
        !           499:   {"eigen",eigen,2},
        !           500:   {"hermite",hnf,2},
        !           501:   {"mat",gtomat,2},
        !           502:   {"matrixqz2",matrixqz2,2},
        !           503:   {"matrixqz3",matrixqz3,2},
        !           504:   {"hess",hess,2},
        !           505:   {"ker",ker,2},
        !           506:   {"keri",keri,2},
        !           507:   {"kerint",kerint,2},
        !           508:   {"kerintg1",kerint1,2},
        !           509:
        !           510:   /* mat/poly */
        !           511:   {"det",det,2},
        !           512:   {"det2",det2,2},
        !           513:
1.3       noro      514: };
1.2       noro      515:
                    516: #define PARI_MAX_AC 64
                    517:
1.3       noro      518: struct parif *search_parif(char *name)
                    519: {
                    520:   int tablen,i;
                    521:
                    522:   tablen = sizeof(parif_tab)/sizeof(struct parif);
                    523:   for ( i = 0; i < tablen; i++ ) {
                    524:     if ( !strcmp(parif_tab[i].name,name) )
                    525:       return &parif_tab[i];
                    526:   }
                    527:   return 0;
                    528: }
                    529:
1.1       noro      530: int sm_executeFunction()
                    531: {
1.5       noro      532:   pari_sp av0;
1.2       noro      533:   int ac,i;
                    534:   cmo_int32 *c;
                    535:   cmo *av[PARI_MAX_AC];
                    536:   cmo *ret;
                    537:   GEN z,m;
1.3       noro      538:   struct parif *parif;
1.7     ! noro      539:   unsigned long prec;
        !           540:
1.2       noro      541:
1.3       noro      542:   if ( setjmp(GP_DATA->env) ) {
1.4       noro      543:     printf("sm_executeFunction : an error occured.\n");fflush(stdout);
                    544:     push((cmo*)make_error2(0));
                    545:     return -1;
                    546:   }
                    547:   cmo_string *func = (cmo_string *)pop();
                    548:   if(func->tag != CMO_STRING) {
                    549:     printf("sm_executeFunction : func->tag is not CMO_STRING");fflush(stdout);
                    550:     push((cmo*)make_error2(0));
                    551:     return -1;
                    552:   }
1.1       noro      553:
1.4       noro      554:   c = (cmo_int32 *)pop();
1.2       noro      555:   ac = c->i;
                    556:   if ( ac > PARI_MAX_AC ) {
1.4       noro      557:     push((cmo*)make_error2(0));
                    558:     return -1;
1.2       noro      559:   }
                    560:   for ( i = 0; i < ac; i++ ) {
                    561:     av[i] = (cmo *)pop();
                    562:     fprintf(stderr,"arg%d:",i);
                    563:     print_cmo(av[i]);
                    564:     fprintf(stderr,"\n");
                    565:   }
1.4       noro      566:   if( strcmp( func->s, "exit" ) == 0 )
                    567:     exit(0);
1.3       noro      568:
                    569:   parif =search_parif(func->s);
                    570:   if ( !parif ) {
1.4       noro      571:     push((cmo*)make_error2(0));
                    572:     return -1;
1.3       noro      573:  } else if ( parif->type == 0 ) {
                    574:     /* one long int variable */
                    575:     int a = cmo_to_int(av[0]);
1.4       noro      576:     a = (int)(parif->f)(a);
1.3       noro      577:     ret = (cmo *)new_cmo_int32(a);
1.2       noro      578:     push(ret);
1.4       noro      579:     return 0;
1.7     ! noro      580:   } else if ( parif->type == 1 || parif->type == 2 ) {
        !           581:     /* one number/poly/matrix argument possibly with prec */
1.5       noro      582:     av0 = avma;
1.2       noro      583:     z = cmo_to_GEN(av[0]);
1.7     ! noro      584:     prec = ac==2 ? cmo_to_int(av[1])*3.32193/32+3 : precreal;
        !           585:     if ( parif->type == 2 ) {
        !           586:       /* matrix argument */
        !           587:       int i,len;
        !           588:
        !           589:       if ( typ(z) != t_VEC ) {
        !           590:         push((cmo*)make_error2(0));
        !           591:         return -1;
        !           592:       }
        !           593:       len = lg(z);
        !           594:       for ( i = 1; i < len; i++ )
        !           595:         settyp(z[i],t_COL);
        !           596:       settyp(z,t_MAT);
        !           597:       z = shallowtrans(z);
        !           598:     }
        !           599:     printf("input : "); output(z);
1.3       noro      600:     m = (*parif->f)(z,prec);
1.2       noro      601:     ret = GEN_to_cmo(m);
1.5       noro      602:     avma = av0;
1.2       noro      603:     push(ret);
1.4       noro      604:     return 0;
1.3       noro      605:   } else {
1.4       noro      606:     push((cmo*)make_error2(0));
                    607:     return -1;
1.3       noro      608:   }
1.1       noro      609: }
                    610:
                    611: int receive_and_execute_sm_command()
                    612: {
1.4       noro      613:   int code = receive_int32(fd_rw);
                    614:   switch(code) {
                    615:   case SM_popCMO:
                    616:     sm_popCMO();
                    617:     break;
                    618:   case SM_executeFunction:
                    619:     sm_executeFunction();
                    620:     break;
                    621:   case SM_mathcap:
                    622:     sm_mathcap();
                    623:     break;
                    624:   case SM_setMathCap:
                    625:     pop();
                    626:     break;
                    627:   default:
                    628:     printf("receive_and_execute_sm_command : code=%d\n",code);fflush(stdout);
                    629:     break;
                    630:   }
                    631:   return 0;
1.1       noro      632: }
                    633:
                    634: int receive()
                    635: {
1.4       noro      636:   int tag;
1.1       noro      637:
1.4       noro      638:   tag = receive_ox_tag(fd_rw);
                    639:   switch(tag) {
                    640:   case OX_DATA:
                    641:     printf("receive : ox_data %d\n",tag);fflush(stdout);
                    642:     push(receive_cmo(fd_rw));
                    643:     break;
                    644:   case OX_COMMAND:
                    645:     printf("receive : ox_command %d\n",tag);fflush(stdout);
                    646:     receive_and_execute_sm_command();
                    647:     break;
                    648:   default:
                    649:     printf("receive : tag=%d\n",tag);fflush(stdout);
                    650:   }
                    651:   return 0;
1.1       noro      652: }
                    653:
                    654: int main()
                    655: {
1.3       noro      656:   init_gc();
1.4       noro      657:   ox_stderr_init(stderr);
                    658:   initialize_stack();
                    659:   init_pari();
                    660:
                    661:   fprintf(stderr,"ox_pari\n");
                    662:
                    663:   fd_rw = oxf_open(3);
                    664:   oxf_determine_byteorder_server(fd_rw);
                    665:
                    666:   while(1){
                    667:     receive();
                    668:   }
1.1       noro      669: }

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