=================================================================== RCS file: /home/cvs/OpenXM/src/ox_pari/convert.c,v retrieving revision 1.1 retrieving revision 1.6 diff -u -p -r1.1 -r1.6 --- OpenXM/src/ox_pari/convert.c 2015/08/21 01:20:30 1.1 +++ OpenXM/src/ox_pari/convert.c 2020/08/26 06:03:31 1.6 @@ -19,6 +19,17 @@ GEN cmo_int32_to_GEN(cmo_int32 *c) return z; } +GEN cmo_string_to_GEN(cmo_string *c) +{ + GEN z; + int l; + + l = strlen(c->s); + z = cgetg(l+1,t_STR); + strcpy(GSTR(z),c->s); + return z; +} + GEN cmo_zz_to_GEN(cmo_zz *c) { mpz_ptr mpz; @@ -106,7 +117,7 @@ GEN cmo_up_to_GEN(cmo_polynomial_in_one_variable *c) z = cgetg(d+3,t_POL); setsigne(z,1); setvarn(z,c->var); - setlgef(z,d+3); + setlg(z,d+3); for ( i = 2; i <= d+2; i++ ) z[i] = (long)gen_0; for ( cell = c->head->next; cell != c->head; cell = cell->next ) { @@ -142,12 +153,20 @@ GEN cmo_rp_to_GEN(cmo_recursive_polynomial *c) } } +cmo_zz *GEN_to_cmo_string(GEN z) +{ + cmo_string *c; + + c = new_cmo_string(GSTR(z)); + return (cmo_zz *)c; +} + cmo_zz *GEN_to_cmo_zz(GEN z) { cmo_zz *c; c = new_cmo_zz(); - mpz_import(c->mpz,lgef(z)-2,1,sizeof(long),0,0,&z[2]); + mpz_import(c->mpz,lg(z)-2,1,sizeof(long),0,0,&z[2]); if ( signe(z) < 0 ) mpz_neg(c->mpz,c->mpz); return c; @@ -161,8 +180,8 @@ cmo_qq *GEN_to_cmo_qq(GEN z) num = (GEN)z[1]; den = (GEN)z[2]; c = new_cmo_qq(); - mpz_import(mpq_numref(c->mpq),lgef(num)-2,1,sizeof(long),0,0,&num[2]); - mpz_import(mpq_denref(c->mpq),lgef(num)-2,1,sizeof(long),0,0,&den[2]); + mpz_import(mpq_numref(c->mpq),lg(num)-2,1,sizeof(long),0,0,&num[2]); + mpz_import(mpq_denref(c->mpq),lg(den)-2,1,sizeof(long),0,0,&den[2]); if ( signe(num)*signe(den) < 0 ) mpz_neg(mpq_numref(c->mpq),mpq_numref(c->mpq)); return c; @@ -184,6 +203,7 @@ cmo_bf *GEN_to_cmo_bf(GEN z) ptr[j] = z[len-j+1]; MPFR_EXP(c->mpfr) = (long long)(expo(z)+1); MPFR_SIGN(c->mpfr) = gsigne(z); + if ( !mpfr_sgn(c->mpfr) ) c = (cmo_bf *)new_cmo_zero(); return c; } @@ -206,11 +226,17 @@ cmo_list *GEN_to_cmo_list(GEN z) cmo_complex *GEN_to_cmo_complex(GEN z) { cmo_complex *c; + cmo_bf *re,*im; - c = new_cmo_complex(); - c->re = GEN_to_cmo((GEN)z[1]); - c->im = GEN_to_cmo((GEN)z[2]); - return c; + re = (cmo_bf *)GEN_to_cmo((GEN)z[1]); + im = (cmo_bf *)GEN_to_cmo((GEN)z[2]); + if ( im->tag == CMO_ZERO ) + return (cmo_complex *)re; + else { + c = new_cmo_complex(); + c->re = (cmo *)re; c->im = (cmo *)im; + return c; + } } cmo_polynomial_in_one_variable *GEN_to_cmo_up(GEN z) @@ -251,7 +277,7 @@ GEN cmo_to_GEN(cmo *c) return cmo_complex_to_GEN((cmo_complex *)c); case CMO_IEEE_DOUBLE_FLOAT: return dbltor(((cmo_double *)c)->d); - case CMO_BIGFLOAT: /* bigfloat */ + case CMO_BIGFLOAT32: /* bigfloat */ return cmo_bf_to_GEN((cmo_bf *)c); case CMO_LIST: return cmo_list_to_GEN((cmo_list *)c); @@ -259,6 +285,8 @@ GEN cmo_to_GEN(cmo *c) return cmo_rp_to_GEN((cmo_recursive_polynomial *)c); case CMO_POLYNOMIAL_IN_ONE_VARIABLE: return cmo_up_to_GEN((cmo_polynomial_in_one_variable *)c); + case CMO_STRING: + return cmo_string_to_GEN((cmo_string *)c); default: return 0; } @@ -285,6 +313,8 @@ cmo *GEN_to_cmo(GEN z) return (cmo *)GEN_to_cmo_list(z); case t_MAT: /* matrix */ return (cmo *)GEN_to_cmo_list(shallowtrans(z)); + case t_STR: /* string */ + return (cmo *)GEN_to_cmo_string(z); default: sprintf(buf,"GEN_to_cmo : unsupported type=%d",(int)typ(z)); return (cmo *)make_error2(buf);