Annotation of OpenXM_contrib2/asir2000/builtin/itvnum.c, Revision 1.11
1.1 saito 1: /*
1.11 ! noro 2: * $OpenXM: OpenXM_contrib2/asir2000/builtin/itvnum.c,v 1.10 2016/06/29 08:16:11 ohara Exp $
1.1 saito 3: */
4:
5: #include "ca.h"
6: #include "parse.h"
7: #include "version.h"
1.10 ohara 8: #if !defined(ANDROID)
1.6 saito 9: #include "../plot/ifplot.h"
1.10 ohara 10: #endif
1.1 saito 11:
12: #if defined(INTERVAL)
13:
14: static void Pitv(NODE, Obj *);
15: static void Pitvd(NODE, Obj *);
16: static void Pitvbf(NODE, Obj *);
17: static void Pinf(NODE, Obj *);
18: static void Psup(NODE, Obj *);
19: static void Pmid(NODE, Obj *);
20: static void Pabsitv(NODE, Obj *);
21: static void Pdisjitv(NODE, Obj *);
22: static void Pinitv(NODE, Obj *);
23: static void Pcup(NODE, Obj *);
24: static void Pcap(NODE, Obj *);
25: static void Pwidth(NODE, Obj *);
26: static void Pdistance(NODE, Obj *);
1.3 saito 27: static void Pitvversion(Q *);
1.7 saito 28: void miditvp(Itv,Num *);
29: void absitvp(Itv,Num *);
30: int initvd(Num,IntervalDouble);
31: int initvp(Num,Itv);
32: int itvinitvp(Itv,Itv);
1.1 saito 33: #endif
34: static void Pprintmode(NODE, Obj *);
35:
1.6 saito 36: /* plot time check func */
37: static void ccalc(double **, struct canvas *, int);
38: static void Pifcheck(NODE, Obj *);
39:
1.11 ! noro 40: #if defined(__osf__) && 0
! 41: int end;
1.1 saito 42: #endif
43:
44: struct ftab interval_tab[] = {
1.11 ! noro 45: {"printmode",Pprintmode,1},
1.1 saito 46: #if defined(INTERVAL)
1.11 ! noro 47: {"itvd",Pitvd,-2},
! 48: {"intvald",Pitvd,-2},
! 49: {"itv",Pitv,-2},
! 50: {"intval",Pitv,-2},
! 51: {"itvbf",Pitvbf,-2},
! 52: {"intvalbf",Pitvbf,-2},
! 53: {"inf",Pinf,1},
! 54: {"sup",Psup,1},
! 55: {"absintval",Pabsitv,1},
! 56: {"disintval",Pdisjitv,2},
! 57: {"inintval",Pinitv,2},
! 58: {"cup",Pcup,2},
! 59: {"cap",Pcap,2},
! 60: {"mid",Pmid,1},
! 61: {"width",Pwidth,1},
! 62: {"diam",Pwidth,1},
! 63: {"distance",Pdistance,2},
! 64: {"iversion",Pitvversion,0},
1.6 saito 65: /* plot time check */
1.11 ! noro 66: {"ifcheck",Pifcheck,-7},
1.1 saito 67: #endif
1.11 ! noro 68: {0,0,0},
1.1 saito 69: };
70:
71: #if defined(INTERVAL)
1.6 saito 72:
73: /* plot time check */
74: static void
75: Pifcheck(NODE arg, Obj *rp)
76: {
1.11 ! noro 77: Q m2,p2,s_id;
! 78: NODE defrange;
! 79: LIST xrange,yrange,range[2],list,geom;
! 80: VL vl,vl0;
! 81: V v[2],av[2];
! 82: int ri,i,j,sign;
! 83: P poly;
! 84: P var;
! 85: NODE n,n0;
! 86: Obj t;
! 87:
! 88: struct canvas *can;
! 89: MAT m;
! 90: pointer **mb;
! 91: double **tabe, *px, *px1, *px2;
! 92: Q one;
! 93: int width, height, ix, iy;
! 94: int id;
! 95:
! 96: STOQ(-2,m2); STOQ(2,p2);
! 97: STOQ(1,one);
! 98: MKNODE(n,p2,0); MKNODE(defrange,m2,n);
! 99: poly = 0; vl = 0; geom = 0; ri = 0;
! 100: v[0] = v[1] = 0;
! 101: for ( ; arg; arg = NEXT(arg) ){
! 102: switch ( OID(BDY(arg)) ) {
! 103: case O_P:
! 104: poly = (P)BDY(arg);
! 105: get_vars_recursive((Obj)poly,&vl);
! 106: for(vl0=vl,i=0;vl0;vl0=NEXT(vl0)){
! 107: if(vl0->v->attr==(pointer)V_IND){
! 108: if(i>=2){
! 109: error("ifplot : invalid argument");
! 110: } else {
! 111: v[i++]=vl0->v;
! 112: }
! 113: }
! 114: }
! 115: break;
! 116: case O_LIST:
! 117: list = (LIST)BDY(arg);
! 118: if ( OID(BDY(BDY(list))) == O_P )
! 119: if ( ri > 1 )
! 120: error("ifplot : invalid argument");
! 121: else
! 122: range[ri++] = list;
! 123: else
! 124: geom = list;
! 125: break;
! 126: default:
! 127: error("ifplot : invalid argument"); break;
! 128: }
! 129: }
! 130: if ( !poly ) error("ifplot : invalid argument");
! 131: switch ( ri ) {
! 132: case 0:
! 133: if ( !v[1] ) error("ifplot : please specify all variables");
! 134: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
! 135: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
! 136: break;
! 137: case 1:
! 138: if ( !v[1] ) error("ifplot : please specify all variables");
! 139: av[0] = VR((P)BDY(BDY(range[0])));
! 140: if ( v[0] == av[0] ) {
! 141: xrange = range[0];
! 142: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
! 143: } else if ( v[1] == av[0] ) {
! 144: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
! 145: yrange = range[0];
! 146: } else
! 147: error("ifplot : invalid argument");
! 148: break;
! 149: case 2:
! 150: av[0] = VR((P)BDY(BDY(range[0])));
! 151: av[1] = VR((P)BDY(BDY(range[1])));
! 152: if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
! 153: ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
! 154: xrange = range[0]; yrange = range[1];
! 155: } else error("ifplot : invalid argument");
! 156: break;
! 157: default:
! 158: error("ifplot : cannot happen"); break;
! 159: }
! 160: can = canvas[id = search_canvas()];
! 161: if ( !geom ) {
! 162: width = 300;
! 163: height = 300;
! 164: can->width = 300;
! 165: can->height = 300;
! 166: } else {
! 167: can->width = QTOS((Q)BDY(BDY(geom)));
! 168: can->height = QTOS((Q)BDY(NEXT(BDY(geom))));
! 169: width = can->width;
! 170: height = can->height;
! 171: }
! 172: if ( xrange ) {
! 173: n = BDY(xrange); can->vx = VR((P)BDY(n)); n = NEXT(n);
! 174: can->qxmin = (Q)BDY(n); n = NEXT(n); can->qxmax = (Q)BDY(n);
! 175: can->xmin = ToReal(can->qxmin); can->xmax = ToReal(can->qxmax);
! 176: }
! 177: if ( yrange ) {
! 178: n = BDY(yrange); can->vy = VR((P)BDY(n)); n = NEXT(n);
! 179: can->qymin = (Q)BDY(n); n = NEXT(n); can->qymax = (Q)BDY(n);
! 180: can->ymin = ToReal(can->qymin); can->ymax = ToReal(can->qymax);
! 181: }
! 182: can->wname = "ifcheck";
! 183: can->formula = poly;
! 184: tabe = (double **)ALLOCA((width+1)*sizeof(double *));
! 185: for ( i = 0; i <= width; i++ )
! 186: tabe[i] = (double *)ALLOCA((height+1)*sizeof(double));
! 187: for(i=0;i<=width;i++)for(j=0;j<=height;j++)tabe[i][j]=0;
! 188: ccalc(tabe,can,0);
! 189: MKMAT(m,width,height);
! 190: mb = BDY(m);
! 191: for( ix=0; ix<width; ix++ ){
! 192: for( iy=0; iy<height; iy++){
! 193: if ( tabe[ix][iy] >= 0 ){
! 194: if ( (tabe[ix+1][iy] <= 0) ||
! 195: (tabe[ix][iy+1] <= 0 ) ||
! 196: (tabe[ix+1][iy+1] <= 0 ) ) mb[ix][iy] = (Obj)one;
! 197: } else {
! 198: if ( (tabe[ix+1][iy] >= 0 ) ||
! 199: ( tabe[ix][iy+1] >= 0 ) ||
! 200: ( tabe[ix+1][iy+1] >= 0 )) mb[ix][iy] = (Obj)one;
! 201: }
! 202: }
! 203: }
! 204: *rp = (Obj)m;
1.6 saito 205: }
206:
207: void ccalc(double **tab,struct canvas *can,int nox)
208: {
1.11 ! noro 209: double x,y,xmin,ymin,xstep,ystep;
! 210: int ix,iy;
! 211: Real r,rx,ry;
! 212: Obj fr,g;
! 213: int w,h;
! 214: V vx,vy;
! 215: Obj t,s;
! 216:
! 217: MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr);
! 218: vx = can->vx;
! 219: vy = can->vy;
! 220: w = can->width; h = can->height;
! 221: xmin = can->xmin; xstep = (can->xmax-can->xmin)/w;
! 222: ymin = can->ymin; ystep = (can->ymax-can->ymin)/h;
! 223: MKReal(1.0,rx); MKReal(1.0,ry);
! 224: for( ix = 0, x = xmin; ix < w+1 ; ix++, x += xstep ) {
! 225: BDY(rx) = x; substr(CO,0,fr,vx,x?(Obj)rx:0,&t);
! 226: devalr(CO,t,&g);
! 227: for( iy = 0, y = ymin; iy < h+1 ; iy++, y += ystep ) {
! 228: BDY(ry) = y;
! 229: substr(CO,0,g,vy,y?(Obj)ry:0,&t);
! 230: devalr(CO,t,&s);
! 231: tab[ix][iy] = ToReal(s);
! 232: }
! 233: }
1.6 saito 234: }
235: /* end plot time check */
236:
1.1 saito 237: static void
1.4 saito 238: Pitvversion(Q *rp)
1.1 saito 239: {
1.11 ! noro 240: STOQ(ASIR_VERSION, *rp);
1.1 saito 241: }
242:
1.11 ! noro 243: extern int bigfloat;
1.1 saito 244:
245: static void
246: Pitv(NODE arg, Obj *rp)
247: {
1.11 ! noro 248: Num a, i, s;
! 249: Itv c;
! 250: double inf, sup;
1.1 saito 251:
252: #if 1
1.11 ! noro 253: if ( bigfloat )
! 254: Pitvbf(arg, rp);
! 255: else
! 256: Pitvd(arg,rp);
1.1 saito 257: #else
1.11 ! noro 258: asir_assert(ARG0(arg),O_N,"itv");
! 259: if ( argc(arg) > 1 ) {
! 260: asir_assert(ARG1(arg),O_N,"itv");
! 261: istoitv((Num)ARG0(arg),(Num)ARG1(arg),&c);
! 262: } else {
! 263: a = (Num)ARG0(arg);
! 264: if ( ! a ) {
! 265: *rp = 0;
! 266: return;
! 267: }
! 268: else if ( NID(a) == N_IP || NID(a) == N_IntervalBigFloat) {
! 269: *rp = (Obj)a;
! 270: return;
! 271: }
! 272: else if ( NID(a) == N_IntervalDouble ) {
! 273: inf = INF((IntervalDouble)a);
! 274: sup = SUP((IntervalDouble)a);
! 275: double2bf(inf, (BF *)&i);
! 276: double2bf(sup, (BF *)&s);
! 277: istoitv(i,s,&c);
! 278: }
! 279: else istoitv(a,a,&c);
! 280: }
! 281: if ( NID( c ) == N_IntervalBigFloat )
! 282: addulp((IntervalBigFloat)c, (IntervalBigFloat *)rp);
! 283: else *rp = (Obj)c;
1.1 saito 284: #endif
285: }
286:
287: static void
288: Pitvbf(NODE arg, Obj *rp)
289: {
1.11 ! noro 290: Num a, i, s;
! 291: Itv c;
! 292: BF ii,ss;
! 293: double inf, sup;
! 294:
! 295: asir_assert(ARG0(arg),O_N,"intvalbf");
! 296: a = (Num)ARG0(arg);
! 297: if ( argc(arg) > 1 ) {
! 298: asir_assert(ARG1(arg),O_N,"intvalbf");
! 299: i = (Num)ARG0(arg);
! 300: s = (Num)ARG1(arg);
! 301: ToBf(i, &ii);
! 302: ToBf(s, &ss);
! 303: istoitv((Num)ii,(Num)ss,&c);
! 304: } else {
! 305: if ( ! a ) {
! 306: *rp = 0;
! 307: return;
! 308: }
! 309: else if ( NID(a) == N_IP ) {
! 310: itvtois((Itv)a, &i, &s);
! 311: ToBf(i, &ii);
! 312: ToBf(s, &ss);
! 313: istoitv((Num)ii,(Num)ss,&c);
! 314: }
! 315: else if ( NID(a) == N_IntervalBigFloat) {
! 316: *rp = (Obj)a;
! 317: return;
! 318: }
! 319: else if ( NID(a) == N_IntervalDouble ) {
! 320: inf = INF((IntervalDouble)a);
! 321: sup = SUP((IntervalDouble)a);
! 322: double2bf(inf, (BF *)&i);
! 323: double2bf(sup, (BF *)&s);
! 324: istoitv(i,s,&c);
! 325: }
! 326: else {
! 327: ToBf(a, (BF *)&i);
! 328: istoitv(i,i,&c);
! 329: }
! 330: }
! 331: if ( c && OID( c ) == O_N && NID( c ) == N_IntervalBigFloat )
! 332: addulp((IntervalBigFloat)c, (IntervalBigFloat *)rp);
! 333: else *rp = (Obj)c;
1.1 saito 334: }
335:
336: static void
337: Pitvd(NODE arg, Obj *rp)
338: {
1.11 ! noro 339: double inf, sup;
! 340: Num a, a0, a1, t;
! 341: Itv ia;
! 342: IntervalDouble d;
! 343:
! 344: asir_assert(ARG0(arg),O_N,"intvald");
! 345: a0 = (Num)ARG0(arg);
! 346: if ( argc(arg) > 1 ) {
! 347: asir_assert(ARG1(arg),O_N,"intvald");
! 348: a1 = (Num)ARG1(arg);
! 349: } else {
! 350: if ( a0 && OID(a0)==O_N && NID(a0)==N_IntervalDouble ) {
! 351: inf = INF((IntervalDouble)a0);
! 352: sup = SUP((IntervalDouble)a0);
! 353: MKIntervalDouble(inf,sup,d);
! 354: *rp = (Obj)d;
! 355: return;
! 356: }
! 357: a1 = (Num)ARG0(arg);
! 358: }
! 359: if ( compnum(0,a0,a1) > 0 ) {
! 360: t = a0; a0 = a1; a1 = t;
! 361: }
! 362: inf = ToRealDown(a0);
! 363: sup = ToRealUp(a1);
! 364: MKIntervalDouble(inf,sup,d);
! 365: *rp = (Obj)d;
1.1 saito 366: }
367:
368: static void
369: Pinf(NODE arg, Obj *rp)
370: {
1.11 ! noro 371: Num a, i, s;
! 372: Real r;
! 373: double d;
! 374:
! 375: a = (Num)ARG0(arg);
! 376: if ( ! a ) {
! 377: *rp = 0;
! 378: } else if ( OID(a) == O_N ) {
! 379: switch ( NID(a) ) {
! 380: case N_IntervalDouble:
! 381: d = INF((IntervalDouble)a);
! 382: MKReal(d, r);
! 383: *rp = (Obj)r;
! 384: break;
! 385: case N_IP:
! 386: case N_IntervalBigFloat:
! 387: case N_IntervalQuad:
! 388: itvtois((Itv)ARG0(arg),&i,&s);
! 389: *rp = (Obj)i;
! 390: break;
! 391: default:
! 392: *rp = (Obj)a;
! 393: break;
! 394: }
! 395: } else {
! 396: *rp = (Obj)a;
! 397: }
1.1 saito 398: }
399:
400: static void
401: Psup(NODE arg, Obj *rp)
402: {
1.11 ! noro 403: Num a, i, s;
! 404: Real r;
! 405: double d;
! 406:
! 407: a = (Num)ARG0(arg);
! 408: if ( ! a ) {
! 409: *rp = 0;
! 410: } else if ( OID(a) == O_N ) {
! 411: switch ( NID(a) ) {
! 412: case N_IntervalDouble:
! 413: d = SUP((IntervalDouble)a);
! 414: MKReal(d, r);
! 415: *rp = (Obj)r;
! 416: break;
! 417: case N_IP:
! 418: case N_IntervalBigFloat:
! 419: case N_IntervalQuad:
! 420: itvtois((Itv)ARG0(arg),&i,&s);
! 421: *rp = (Obj)s;
! 422: break;
! 423: default:
! 424: *rp = (Obj)a;
! 425: break;
! 426: }
! 427: } else {
! 428: *rp = (Obj)a;
! 429: }
1.1 saito 430: }
431:
432: static void
433: Pmid(NODE arg, Obj *rp)
434: {
1.11 ! noro 435: Num a, s;
! 436: Real r;
! 437: double d;
! 438:
! 439: a = (Num)ARG0(arg);
! 440: if ( ! a ) {
! 441: *rp = 0;
! 442: } else switch (OID(a)) {
! 443: case O_N:
! 444: if ( NID(a) == N_IntervalDouble ) {
! 445: d = ( INF((IntervalDouble)a)+SUP((IntervalDouble)a) ) / 2.0;
! 446: MKReal(d, r);
! 447: *rp = (Obj)r;
! 448: } else if ( NID(a) == N_IntervalQuad ) {
! 449: error("mid: not supported operation");
! 450: *rp = 0;
! 451: } else if ( NID(a) == N_IP || NID(a) == N_IntervalBigFloat ) {
! 452: miditvp((Itv)ARG0(arg),&s);
! 453: *rp = (Obj)s;
! 454: } else {
! 455: *rp = (Obj)a;
! 456: }
! 457: break;
1.1 saito 458: #if 0
1.11 ! noro 459: case O_P:
! 460: case O_R:
! 461: case O_LIST:
! 462: case O_VECT:
! 463: case O_MAT:
1.1 saito 464: #endif
1.11 ! noro 465: default:
! 466: *rp = (Obj)a;
! 467: break;
! 468: }
1.1 saito 469: }
470:
471: static void
472: Pcup(NODE arg, Obj *rp)
473: {
1.11 ! noro 474: Itv s;
! 475: Num a, b;
1.1 saito 476:
1.11 ! noro 477: asir_assert(ARG0(arg),O_N,"cup");
! 478: asir_assert(ARG1(arg),O_N,"cup");
! 479: a = (Num)ARG0(arg);
! 480: b = (Num)ARG1(arg);
! 481: if ( a && NID(a) == N_IntervalDouble && b && NID(b) == N_IntervalDouble ) {
! 482: cupitvd((IntervalDouble)a, (IntervalDouble)b, (IntervalDouble *)rp);
! 483: } else {
! 484: cupitvp((Itv)ARG0(arg),(Itv)ARG1(arg),&s);
! 485: *rp = (Obj)s;
! 486: }
1.1 saito 487: }
488:
489: static void
490: Pcap(NODE arg, Obj *rp)
491: {
1.11 ! noro 492: Itv s;
! 493: Num a, b;
1.1 saito 494:
1.11 ! noro 495: asir_assert(ARG0(arg),O_N,"cap");
! 496: asir_assert(ARG1(arg),O_N,"cap");
! 497: a = (Num)ARG0(arg);
! 498: b = (Num)ARG1(arg);
! 499: if ( a && NID(a) == N_IntervalDouble && b && NID(b) == N_IntervalDouble ) {
! 500: capitvd((IntervalDouble)a, (IntervalDouble)b, (IntervalDouble *)rp);
! 501: } else {
! 502: capitvp((Itv)ARG0(arg),(Itv)ARG1(arg),&s);
! 503: *rp = (Obj)s;
! 504: }
1.1 saito 505: }
506:
507: static void
508: Pwidth(arg,rp)
509: NODE arg;
510: Obj *rp;
511: {
1.11 ! noro 512: Num s;
! 513: Num a;
1.1 saito 514:
1.11 ! noro 515: asir_assert(ARG0(arg),O_N,"width");
! 516: a = (Num)ARG0(arg);
! 517: if ( ! a ) {
! 518: *rp = 0;
! 519: } else if ( NID(a) == N_IntervalDouble ) {
! 520: widthitvd((IntervalDouble)a, (Num *)rp);
! 521: } else {
! 522: widthitvp((Itv)ARG0(arg),&s);
! 523: *rp = (Obj)s;
! 524: }
1.1 saito 525: }
526:
527: static void
528: Pabsitv(arg,rp)
529: NODE arg;
530: Obj *rp;
531: {
1.11 ! noro 532: Num s;
! 533: Num a, b;
1.1 saito 534:
1.11 ! noro 535: asir_assert(ARG0(arg),O_N,"absitv");
! 536: a = (Num)ARG0(arg);
! 537: if ( ! a ) {
! 538: *rp = 0;
! 539: } else if ( NID(a) == N_IntervalDouble ) {
! 540: absitvd((IntervalDouble)a, (Num *)rp);
! 541: } else {
! 542: absitvp((Itv)ARG0(arg),&s);
! 543: *rp = (Obj)s;
! 544: }
1.1 saito 545: }
546:
547: static void
548: Pdistance(arg,rp)
549: NODE arg;
550: Obj *rp;
551: {
1.11 ! noro 552: Num s;
! 553: Num a, b;
1.1 saito 554:
1.11 ! noro 555: asir_assert(ARG0(arg),O_N,"distance");
! 556: asir_assert(ARG1(arg),O_N,"distance");
! 557: a = (Num)ARG0(arg);
! 558: b = (Num)ARG1(arg);
! 559: if ( a && NID(a) == N_IntervalDouble && b && NID(b) == N_IntervalDouble ) {
! 560: distanceitvd((IntervalDouble)a, (IntervalDouble)b, (Num *)rp);
! 561: } else {
! 562: distanceitvp((Itv)ARG0(arg),(Itv)ARG1(arg),&s);
! 563: *rp = (Obj)s;
! 564: }
1.1 saito 565: }
566:
567: static void
568: Pinitv(arg,rp)
569: NODE arg;
570: Obj *rp;
571: {
1.11 ! noro 572: int s;
! 573: Q q;
1.1 saito 574:
1.11 ! noro 575: asir_assert(ARG0(arg),O_N,"intval");
! 576: asir_assert(ARG1(arg),O_N,"intval");
! 577: if ( ! ARG1(arg) ) {
! 578: if ( ! ARG0(arg) ) s = 1;
! 579: else s = 0;
! 580: }
! 581: else if ( NID(ARG1(arg)) == N_IntervalDouble ) {
! 582: s = initvd((Num)ARG0(arg),(IntervalDouble)ARG1(arg));
! 583:
! 584: } else if ( NID(ARG1(arg)) == N_IP || NID(ARG1(arg)) == N_IntervalBigFloat ) {
! 585: if ( ! ARG0(arg) ) s = initvp((Num)ARG0(arg),(Itv)ARG1(arg));
! 586: else if ( NID(ARG0(arg)) == N_IP ) {
! 587: s = itvinitvp((Itv)ARG0(arg),(Itv)ARG1(arg));
! 588: } else {
! 589: s = initvp((Num)ARG0(arg),(Itv)ARG1(arg));
! 590: }
! 591: } else {
! 592: s = ! compnum(0,(Num)ARG0(arg),(Num)ARG1(arg));
! 593: }
! 594: STOQ(s,q);
! 595: *rp = (Obj)q;
1.1 saito 596: }
597:
598: static void
599: Pdisjitv(arg,rp)
600: NODE arg;
601: Obj *rp;
602: {
1.11 ! noro 603: Itv s;
1.1 saito 604:
1.11 ! noro 605: asir_assert(ARG0(arg),O_N,"disjitv");
! 606: asir_assert(ARG1(arg),O_N,"disjitv");
! 607: error("disjitv: not implemented yet");
! 608: if ( ! s ) *rp = 0;
! 609: else *rp = (Obj)ONE;
1.1 saito 610: }
611:
612: #endif
1.11 ! noro 613: extern int printmode;
1.1 saito 614:
1.11 ! noro 615: static void pprintmode( void )
1.1 saito 616: {
1.11 ! noro 617: switch (printmode) {
1.1 saito 618: #if defined(INTERVAL)
1.11 ! noro 619: case MID_PRINTF_E:
! 620: fprintf(stderr,"Interval printing mode is a mitpoint type.\n");
1.1 saito 621: #endif
1.11 ! noro 622: case PRINTF_E:
! 623: fprintf(stderr,"Printf's double printing mode is \"%%.16e\".\n");
! 624: break;
1.1 saito 625: #if defined(INTERVAL)
1.11 ! noro 626: case MID_PRINTF_G:
! 627: fprintf(stderr,"Interval printing mode is a mitpoint type.\n");
1.1 saito 628: #endif
1.11 ! noro 629: default:
! 630: case PRINTF_G:
! 631: fprintf(stderr,"Printf's double printing mode is \"%%g\".\n");
! 632: break;
! 633: }
1.1 saito 634: }
635:
636: static void
637: Pprintmode(NODE arg, Obj *rp)
638: {
1.11 ! noro 639: int l;
! 640: Q a, r;
1.1 saito 641:
1.11 ! noro 642: a = (Q)ARG0(arg);
! 643: if(!a||(NUM(a)&&INT(a))){
! 644: l=QTOS(a);
! 645: if ( l < 0 ) l = 0;
1.1 saito 646: #if defined(INTERVAL)
1.11 ! noro 647: else if ( l > MID_PRINTF_E ) l = 0;
1.1 saito 648: #else
1.11 ! noro 649: else if ( l > PRINTF_E ) l = 0;
1.1 saito 650: #endif
1.11 ! noro 651: STOQ(printmode,r);
! 652: *rp = (Obj)r;
! 653: printmode = l;
! 654: pprintmode();
! 655: } else {
! 656: *rp = 0;
! 657: }
1.1 saito 658: }
1.11 ! noro 659:
1.1 saito 660:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>