Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
strcvt.c
Go to the documentation of this file.
00001 /*
00002 
00003   Copyright (C) 2000, 2001 Silicon Graphics, Inc.  All Rights Reserved.
00004 
00005   This program is free software; you can redistribute it and/or modify it
00006   under the terms of version 2 of the GNU General Public License as
00007   published by the Free Software Foundation.
00008 
00009   This program is distributed in the hope that it would be useful, but
00010   WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 
00013   Further, this software is distributed without any warranty that it is
00014   free of the rightful claim of any third person regarding infringement 
00015   or the like.  Any license provided herein, whether implied or 
00016   otherwise, applies only to this software file.  Patent licenses, if 
00017   any, provided herein do not apply to combinations of this program with 
00018   other software, or any other product whatsoever.  
00019 
00020   You should have received a copy of the GNU General Public License along
00021   with this program; if not, write the Free Software Foundation, Inc., 59
00022   Temple Place - Suite 330, Boston MA 02111-1307, USA.
00023 
00024   Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pky,
00025   Mountain View, CA 94043, or:
00026 
00027   http://www.sgi.com
00028 
00029   For further information regarding this notice, see:
00030 
00031   http://oss.sgi.com/projects/GenInfo/NoticeExplan
00032 
00033 */
00034 
00035 
00036 /* Conversions to and from strings. */
00037 
00038 #include <string.h>
00039 #include <errno.h>
00040 #include <stdlib.h>
00041 #include <stdio.h>
00042 
00043 #include "arith.internal.h"
00044 
00045 /* string -> integer */
00046 int
00047 AR_convert_str_to_int (AR_DATA *res, const AR_TYPE *resulttype,
00048                        int *bits_used, const char *str, const int *base) {
00049 
00050         ar_data* result = (ar_data*)res;
00051 
00052         ar_data baseval, intval, temp;
00053         AR_TYPE u64type = AR_Int_64_U;
00054         int status = AR_STAT_OK;
00055 
00056         if (AR_CLASS(*resulttype) != AR_CLASS_INT ||
00057             AR_INT_SIZE(*resulttype) == AR_INT_SIZE_128 ||
00058             AR_SIGNEDNESS(*resulttype) != AR_UNSIGNED)
00059                 return AR_STAT_INVALID_TYPE;
00060 
00061         ZERO_INT64(result);
00062         ZERO_INT16_UPPER(&baseval);
00063 
00064         switch (*base) {
00065         case 2:
00066         case 8:
00067         case 10:
00068         case 16:
00069                 baseval.ar_i64.part4 = *base;
00070                 break;
00071         default:
00072                 return AR_STAT_UNDEFINED;
00073         }
00074 
00075         ZERO_INT64(&intval);
00076 
00077         /* Peeled iteration */
00078         if (*str) {
00079                 if (*str >= '0' && *str <= '9')
00080                         if (*base > (*str-'0'))
00081                                 result->ar_i64.part4 = *str - '0';
00082                         else
00083                                 return AR_STAT_UNDEFINED;
00084                 else if (*base != 16)
00085                         return AR_STAT_UNDEFINED;
00086                 else if (*str >= 'A' && *str <= 'F')
00087                         result->ar_i64.part4 = *str - 'A' + 10;
00088                 else if (*str >= 'a' && *str <= 'f')
00089                         result->ar_i64.part4 = *str - 'a' + 10;
00090                 else
00091                         return AR_STAT_UNDEFINED;
00092                 str++;
00093         }
00094 
00095         for (; *str; str++) {
00096                 if (*str >= '0' && *str <= '9')
00097                         if (*base > (*str-'0'))
00098                                 intval.ar_i64.part4 = *str - '0';
00099                         else
00100                                 return AR_STAT_UNDEFINED;
00101                 else if (*base != 16)
00102                         return AR_STAT_UNDEFINED;
00103                 else if (*str >= 'A' && *str <= 'F')
00104                         intval.ar_i64.part4 = *str - 'A' + 10;
00105                 else if (*str >= 'a' && *str <= 'f')
00106                         intval.ar_i64.part4 = *str - 'a' + 10;
00107                 else
00108                         return AR_STAT_UNDEFINED;
00109                 status |= ar_multiply_integer (&temp, &u64type,
00110                                                result, &u64type,
00111                                                &baseval, &u64type);
00112                 status |= ar_add_integer (result, &u64type,
00113                                           &temp, &u64type,
00114                                           &intval, &u64type);
00115         }
00116 
00117         if (status & (AR_STAT_UNDEFINED | AR_STAT_INVALID_TYPE))
00118                 ar_internal_error (2002, __FILE__, __LINE__);
00119 
00120         /* Check for overflow of result size */
00121 
00122         switch(AR_INT_SIZE(*resulttype)) {
00123         case AR_INT_SIZE_8:
00124                 if(!IS_INT8_UPPER_ZERO(result))
00125                         status |= AR_STAT_OVERFLOW;
00126                 break;
00127 
00128         case AR_INT_SIZE_16:
00129                 if(!IS_INT16_UPPER_ZERO(result))
00130                         status |= AR_STAT_OVERFLOW;
00131                 break;
00132 
00133         case AR_INT_SIZE_24:
00134                 if(!IS_INT24_UPPER_ZERO(result))
00135                         status |= AR_STAT_OVERFLOW;
00136                 break;
00137 
00138         case AR_INT_SIZE_32:
00139                 if(!IS_INT32_UPPER_ZERO(result))
00140                         status |= AR_STAT_OVERFLOW;
00141                 break;
00142 
00143         case AR_INT_SIZE_46:
00144                 if(!IS_INT46_UPPER_ZERO(result))
00145                         status |= AR_STAT_OVERFLOW;
00146                 break;
00147         }
00148 
00149         /* Drop all flags but overflow */
00150         status &= AR_STAT_OVERFLOW;
00151 
00152         if(status)
00153                 ar_set_invalid_result(result, resulttype);
00154         else
00155                 ar_clear_unused_bits(result, resulttype);
00156 
00157         if (bits_used) {
00158                 AR_leadz ((AR_DATA*)&temp, &u64type, (AR_DATA*)result,
00159                           &u64type);
00160                 *bits_used = 64 - temp.ar_i64.part4;
00161         }
00162 
00163         switch(AR_INT_SIZE(*resulttype)) {
00164         case AR_INT_SIZE_8:
00165                 if (IS_INT8_ZERO(result))
00166                         status |= AR_STAT_ZERO;
00167                 break;
00168 
00169         case AR_INT_SIZE_16:
00170                 if (IS_INT16_ZERO(result))
00171                         status |= AR_STAT_ZERO;
00172                 break;
00173 
00174         case AR_INT_SIZE_24:
00175                 if (IS_INT24_ZERO(result))
00176                         status |= AR_STAT_ZERO;
00177                 break;
00178 
00179         case AR_INT_SIZE_32:
00180                 if (IS_INT32_ZERO(result))
00181                         status |= AR_STAT_ZERO;
00182                 break;
00183 
00184         case AR_INT_SIZE_46:
00185                 if (IS_INT46_ZERO(result))
00186                         status |= AR_STAT_ZERO;
00187                 break;
00188 
00189         case AR_INT_SIZE_64:
00190                 if (IS_INT64_ZERO(result))
00191                         status |= AR_STAT_ZERO;
00192                 break;
00193         }
00194 
00195         return status;
00196 }
00197 
00198 
00199 /* integer -> string */
00200 int
00201 AR_convert_int_to_str (char *resultstr, const int *base,
00202                        const AR_DATA *opd, const AR_TYPE *opndtype) {
00203 
00204         ar_data* opnd = (ar_data*)opd;
00205 
00206         ar_data baseval, intval, divresult, modresult;
00207         AR_TYPE intvaltype;
00208         int i, isnegative, status;
00209         char str [66];
00210 
00211         if (AR_CLASS (*opndtype) != AR_CLASS_INT)
00212                 return AR_STAT_INVALID_TYPE;
00213 
00214         /* normalize to a 64-bit value */
00215         if (*base == 10 && AR_SIGNEDNESS (*opndtype) == AR_SIGNED)
00216                 intvaltype = AR_Int_64_S;
00217         else
00218                 intvaltype = AR_Int_64_U;
00219         ar_convert_to_integral (&intval, &intvaltype, opnd, opndtype);
00220 
00221         ZERO_INT16_UPPER(&baseval);
00222 
00223         switch (*base) {
00224         case 2:
00225         case 8:
00226         case 10:
00227         case 16:
00228                 baseval.ar_i64.part4 = *base;
00229                 break;
00230         default:
00231                 return AR_STAT_UNDEFINED;
00232         }
00233 
00234         if (*base == 10 &&
00235             AR_SIGNEDNESS (intvaltype) == AR_SIGNED &&
00236             INT64_SIGN(&intval)) {
00237                 isnegative = 1;
00238                 intvaltype = AR_Int_64_U;
00239                 ar_negate_integer (&intval, &intvaltype, &intval, &intvaltype);
00240         } else
00241                 isnegative = 0;
00242 
00243         i = sizeof (str);
00244         str [--i] = '\0';
00245 
00246         do {
00247                 status = ar_divide_integer (&divresult, &intvaltype,
00248                                             &modresult, &intvaltype,
00249                                             &intval, &intvaltype,
00250                                             &baseval, &intvaltype);
00251                 if (status & (AR_STAT_UNDEFINED | AR_STAT_INVALID_TYPE))
00252                         ar_internal_error (2003, __FILE__, __LINE__);
00253                 str [--i] = modresult.ar_i64.part4 + '0';
00254                 intval = divresult;
00255         } while (!IS_INT64_ZERO(&intval));
00256 
00257         if (isnegative)
00258                 str [--i] = '-';
00259 
00260         strcpy (resultstr, str + i);
00261 
00262         return AR_STAT_OK;
00263 }
00264 
00265 /* string -> floating point (native only) */
00266 int
00267 ar_cvt_str_to_float (ar_data *result, const AR_TYPE *resulttype,
00268                                          const char *str)
00269 {
00270         int status = AR_STAT_OK;
00271         char *endptr;
00272 
00273 #if _CRAY
00274 
00275         /* Note:  ar_cvt_str_to_float is called on CRAY systems only when all
00276          * other intrinsic function evaluation has been disabled.
00277          */
00278 
00279         errno = 0;
00280 
00281         switch(AR_FLOAT_SIZE(*resulttype)) {
00282 
00283         case AR_FLOAT_64:
00284                 *((double*)result) = strtod (str, &endptr);
00285                 break;
00286 
00287         case AR_FLOAT_128:
00288                 *((long double*)result) = strtold (str, &endptr);
00289                 break;
00290 
00291         default:
00292                 return AR_STAT_INVALID_TYPE;
00293         }       
00294 
00295 /* Solaris porting
00296  * to workaround the "_defgu2sd" problem, cut off this
00297  * block and use the default - C standard library function
00298  */ 
00299 #elif _Solaris
00300 
00301 /* Input conversion precision mode flags */
00302 
00303 #define MODESP          000     /* Single-precision (64-bit) flag */
00304 #define MODEDP          004     /* Double-precision (128-bit) flag */
00305 #define MODEHP          020     /* Half-precision (32-bit) flag */
00306 
00307 /* Input conversion exit values */
00308 
00309 #define EX_REAL64       3       /* 64-bit real                  */
00310 #define EX_REAL128      4       /* 128-bit real                 */
00311 #define EX_REAL32       5       /* 32-bit real                  */
00312 #define EX_ILLCHAR      -1      /* invalid character            */
00313 #define EX_EXPUFLO      -3      /* floating-point underflow     */
00314 #define EX_EXPOFLO      -4      /* floating-point overflow      */
00315 #define EX_NULLFLD      -5      /* null field (no digits)       */
00316 
00317         long            fw, d, p;
00318 
00319         long*           lcap1;
00320         long            mode;
00321         long            stat;
00322 
00323         long            ichars[64];
00324 
00325         /* Unpack char string into top of simulated stack space */
00326 
00327         status = ar_unpack_float_str(ichars, 64, &fw, &d, &p, str);
00328         if (IS_ERROR_STATUS(status))
00329                 return status;
00330 
00331         switch(AR_FLOAT_SIZE(*resulttype)) {
00332         case AR_FLOAT_32:
00333                 ZEROIEEE32 (result->ar_ieee32);
00334                 mode = MODEHP;
00335                 break;
00336         case AR_FLOAT_64:
00337                 ZEROIEEE64 (result->ar_ieee64);
00338                 mode = MODESP;
00339                 break;
00340         case AR_FLOAT_128:
00341                 ZEROIEEE128 (result->ar_ieee128);
00342                 mode = MODEDP;
00343                 break;
00344         }
00345 
00346         if(status == AR_STAT_ZERO)
00347                 return AR_STAT_ZERO;
00348 
00349         lcap1 = &ichars[fw];
00350 
00351         _defgu2sd(ichars, &fw, &lcap1, &mode, result, &stat, &d, &p);
00352 
00353         /* 
00354          * Process results returned by defgu2sd.  Note that defgu2sd has
00355          * already stored the converted number into result.
00356          */
00357 
00358         switch (stat) {
00359         case EX_REAL32:
00360                 result[0].ar_i64.part3 = result[0].ar_i64.part1;
00361                 result[0].ar_i64.part4 = result[0].ar_i64.part2;
00362                 result[0].ar_i64.part1 = result[0].ar_i64.part2 = 0;
00363         case EX_REAL64:
00364         case EX_REAL128:
00365                 status = AR_status((AR_DATA*)result, resulttype);
00366                 break;
00367 
00368         case EX_EXPUFLO:
00369                 switch(AR_FLOAT_SIZE(*resulttype)) {
00370                 case AR_FLOAT_32:
00371                         ZEROIEEE32 (result->ar_ieee32);
00372                         break;
00373                 case AR_FLOAT_64:
00374                         ZEROIEEE64 (result->ar_ieee64);
00375                         break;
00376                 case AR_FLOAT_128:
00377                         ZEROIEEE128 (result->ar_ieee128);
00378                         break;
00379                 }
00380                 status = AR_STAT_UNDERFLOW|AR_STAT_ZERO;
00381                 break;
00382         case EX_EXPOFLO:
00383                 status = AR_STAT_OVERFLOW;
00384                 break;
00385         default:
00386                 status = AR_STAT_UNDEFINED;
00387                 break;
00388         }
00389 
00390         return status;
00391 
00392 #elif defined(__mips)
00393 
00394         ar_data dval;
00395         double d;
00396         long double ld;
00397         AR_TYPE float_64 = ((AR_TYPE) UNROUNDED_TYPE(AR_Float_IEEE_NR_64));
00398 
00399         /* Define strtod, which isn't defined in stdlib.h on MIPS.  */
00400         extern double strtod(const char *, char **);
00401         extern long double strtold(const char *, char **);
00402 
00403         errno = 0;
00404 
00405         switch(AR_FLOAT_SIZE(*resulttype)) {
00406 
00407         case AR_FLOAT_32:
00408                 d = strtod (str, &endptr);
00409                 status = AR_convert((AR_DATA*)result, resulttype,
00410                                     (AR_DATA*)&d, &float_64);
00411                 break;
00412 
00413         case AR_FLOAT_64:
00414                 d = strtod (str, &endptr);
00415                 memcpy(result,&d,sizeof(double));
00416                 break;
00417 
00418         case AR_FLOAT_128:
00419                 ld = strtold (str, &endptr);
00420                 memcpy(result,&ld,sizeof(long double));
00421                 break;
00422         }
00423 
00424         if (IS_ERROR_STATUS(status))
00425                 return status;
00426 
00427 #else
00428 
00429         ar_data dval;
00430         AR_TYPE float_64 = UNROUNDED_TYPE(AR_Float_IEEE_NR_64);
00431 
00432         /* Define strtod, which isn't defined in stdlib.h on Suns.  */
00433         extern double strtod(const char *, char **);
00434 
00435         errno = 0;
00436 
00437         switch(AR_FLOAT_SIZE(*resulttype)) {
00438 
00439         case AR_FLOAT_32:
00440                 *(double*)(&dval) = strtod (str, &endptr);
00441                 status = AR_convert((AR_DATA*)result, resulttype,
00442                                     (AR_DATA*)&dval, &float_64);
00443                 break;
00444 
00445         case AR_FLOAT_64:
00446                 *((double*)result) = strtod (str, &endptr);
00447                 break;
00448 
00449         case AR_FLOAT_128:
00450                 *(double*)(&dval) = strtod (str, &endptr);
00451                 status = AR_convert((AR_DATA*)result, resulttype,
00452                                     (AR_DATA*)&dval, &float_64);
00453                 break;
00454         }
00455 
00456         if (IS_ERROR_STATUS(status))
00457                 return status;
00458 #endif
00459 
00460         if (*endptr)
00461                 /* Conversion stopped before the end of the string */
00462                 return AR_STAT_UNDEFINED;
00463 
00464         if (errno == ERANGE)
00465                 return AR_STAT_OVERFLOW;
00466 
00467         return AR_status((AR_DATA*)result, resulttype) |
00468                (status & AR_STAT_UNDERFLOW);
00469 }
00470 
00471 int
00472 ar_unpack_float_str(long* ibuf, long maxbuflen, long* w, long* d, long *p,
00473                     const char *str)
00474 {
00475         int  i;                 /* index into unpacked buffer of chars */
00476         int  n;                 /* numeric value of decimal digit */
00477         int  t;                 /* power of 10 for converting to digits */
00478         int  x;                 /* exponent value */
00479         int  z;                 /* mantissa flag: 1=zero, 0=nonzero, -1=bad */
00480 
00481         *w = 0;                 /* index into string, width of string */
00482         *d = 0;                 /* number of digits after decimal pt */
00483         *p = 0;                 /* scale factor */
00484          i = 0;
00485 
00486         /* find first non-space character */
00487         while (*str == ' ' ||
00488                *str == '\f' ||
00489                *str == '\n' ||
00490                *str == '\r' ||
00491                *str == '\t' ||
00492                *str == '\v')
00493                 str++;
00494         if (*str == '+' || *str == '-')
00495                 ibuf[i++] = *str++;
00496 
00497         /* scan over leading zero digits */
00498         if(*str == '0') {
00499                 z = 1;                  /* Flag leading zero digits */
00500                 while(*(++str) == '0')
00501                         ;
00502         }
00503         else
00504                 z = -1;                 /* Flag no leading zero digits */
00505 
00506         /* move digits before decimal point to ibuf */
00507         if (*str >= '0' && *str <= '9'){
00508                 z = 0;                  /* Flag nonzero digit before dec pt */
00509                 ibuf[i++] = *str++;
00510                 while (*str >= '0' && *str <= '9'){
00511                         if (i < (maxbuflen-6))
00512                                 ibuf[i++] = *str++;
00513                         else {
00514                                 /*
00515                                  * Ignore trailing digits of long mantissa,
00516                                  * but adjust the exponent to compensate
00517                                  */
00518                                 (*p)--;
00519                                 str++;
00520                         }
00521                 }
00522         }
00523 
00524         /*
00525          * if present, move decimal point, digits after decimal point to ibuf
00526          */
00527         if (*str == '.') {
00528                 /* found decimal point */
00529                 if (i == (maxbuflen-6)) i--;    
00530                 ibuf[i++] = *str++;
00531                 if(z == 1) {            /* If all 0 digits before decimal pt */
00532                         while (*str == '0') {
00533                                 (*p)++; /* Use scale factor to ignore 0's */
00534                                 str++;
00535                         }
00536                 }
00537                 while (*str >= '0' && *str <= '9') {
00538                         if (i < (maxbuflen-6))  
00539                                 ibuf[i++] = *str;
00540                         str++;
00541                         (*d)++;
00542                         z = 0;          /* Flag nonzero mantissa */
00543                 }
00544         }
00545 
00546         if (z == -1)                    /* if no digits in mantissa */
00547                 return AR_STAT_UNDEFINED;
00548 
00549         if (z == 1)     {               /* if only zero digits in mantissa */
00550                 ibuf[i++] = '0';
00551                 *p = 0;
00552                 *w = i;
00553                 if(ibuf[0] == '-')
00554                         return AR_STAT_NEGATIVE | AR_STAT_ZERO;
00555                 else
00556                         return AR_STAT_ZERO;
00557         }
00558 
00559         /* if present or needs to be adjusted, move exponent to ibuf */
00560         if (*str == 'e' || *str == 'E') {
00561                 ibuf[i++] = 'E';
00562                 str++;
00563                 if(*p) {                /* If 0's before&after decimal point
00564                                          * or exp, inc for long mantissa */
00565                         x = atoi(str)-*p;
00566                         if(x < 0) {
00567                                 ibuf[i++] = '-';
00568                                 x = -x;
00569                         }
00570                         if      (x < 10)   t=1;
00571                         else if (x < 100)  t=10;
00572                         else if (x < 1000) t=100;
00573                         else               t=1000;
00574                         while(t > 1) {
00575                                 /*
00576                                  * Store scale-adjusted exponent chars
00577                                  */
00578                                 n = x/t;
00579                                 x -= (n*t);
00580                                 t = (t+1)/10;
00581                                 ibuf[i++] = '0'+n;
00582                         }
00583                         ibuf[i++] = '0'+x;
00584                         if (*str == '+' || *str == '-')
00585                                 str++;
00586                         while (*str >= '0' && *str <= '9')
00587                                 str++;
00588                         *p = 0;
00589                 }
00590                 else {
00591                         if (*str == '+' || *str == '-')
00592                                 ibuf[i++] = *str++;
00593                         while (*str=='0')
00594                                 str++;
00595                         while (*str >= '0' && *str <= '9') {
00596                                 if (i == maxbuflen) break;
00597                                 ibuf[i++] = *str++;
00598                         }
00599                         if ((ibuf[i-1] < '0' || ibuf[i-1] > '9')
00600                             && *(str-1)=='0')
00601                                 ibuf[i++] = '0';
00602                 }
00603         }
00604 
00605         if(*str != '\0')                /* if string not null-terminated */
00606                 return AR_STAT_UNDEFINED;
00607 
00608         *w = i;
00609 
00610         return AR_STAT_OK;
00611 }
00612 
00613 
00614 /* floating point -> string */
00615 int
00616 AR_convert_float_to_str (char *resultstr,
00617                          const AR_DATA *opd, const AR_TYPE *opndtype) {
00618 
00619         ar_data* opnd = (ar_data*)opd;
00620 
00621         ar_data temp, temp2;
00622         AR_TYPE temptype;
00623         int status = AR_STAT_OK;
00624 
00625 #if defined _CRAY && !defined _CRAYMPP
00626 
00627         switch (*opndtype) {
00628         case AR_Float_Cray1_64:
00629         case AR_Float_Cray1_64_F:
00630                 sprintf (resultstr, "%.14e", opnd->ar_f64);
00631                 break;
00632         case AR_Float_Cray1_128:
00633                 sprintf (resultstr, "%.27Le", opnd->ar_f128);
00634                 break;
00635         case AR_Float_IEEE_NR_32:
00636         case AR_Float_IEEE_ZE_32:
00637         case AR_Float_IEEE_UP_32:
00638         case AR_Float_IEEE_DN_32:
00639                 status = AR_status(opd, opndtype);
00640                 if (status & AR_STAT_OVERFLOW)
00641                         sprintf(resultstr, "%sInf",
00642                                 (status & AR_STAT_NEGATIVE) ? "-" : "+");
00643                 else if (status & AR_STAT_ZERO)
00644                         sprintf(resultstr, "%s%.7e",
00645                                 (status & AR_STAT_NEGATIVE) ? "-" : "", 0.0);
00646                 else if (status & AR_STAT_UNDEFINED)
00647                         strcpy(resultstr, "NaN");
00648                 else if (HOST_IS_IEEE_FLOAT) {
00649                         status = ar_i32to64 (&temp2.ar_ieee64,
00650                                              &opnd->ar_ieee32);
00651                         sprintf (resultstr, "%.7e",
00652                                  (*(double *) &temp2.ar_ieee64));
00653                 }
00654                 else {
00655                         status = ar_i32to64 (&temp2.ar_ieee64,
00656                                              &opnd->ar_ieee32);
00657                         status |= ar_i64toc128 (&temp.ar_f128,
00658                                                 &temp2.ar_ieee64);
00659                         sprintf (resultstr, "%.16Le", temp.ar_f128);
00660                 }
00661                 break;
00662         case AR_Float_IEEE_NR_64:
00663         case AR_Float_IEEE_ZE_64:
00664         case AR_Float_IEEE_UP_64:
00665         case AR_Float_IEEE_DN_64:
00666                 status = AR_status(opd, opndtype);
00667                 if (status & AR_STAT_OVERFLOW)
00668                         sprintf(resultstr, "%sInf",
00669                                 (status & AR_STAT_NEGATIVE) ? "-" : "+");
00670                 else if (status & AR_STAT_ZERO)
00671                         sprintf(resultstr, "%s%.16e",
00672                                 (status & AR_STAT_NEGATIVE) ? "-" : "", 0.0);
00673                 else if (status & AR_STAT_UNDEFINED)
00674                         strcpy(resultstr, "NaN");
00675                 else if (HOST_IS_IEEE_FLOAT) {
00676                         sprintf (resultstr, "%.16e",
00677                                  (*(double *) &opnd->ar_ieee64));
00678                 }
00679                 else
00680                 {
00681                         status = ar_i64toc128 (&temp.ar_f128,
00682                                                &opnd->ar_ieee64);
00683                         sprintf (resultstr, "%.16Le", temp.ar_f128);
00684                 }
00685                 break;
00686         case AR_Float_IEEE_NR_128:
00687         case AR_Float_IEEE_ZE_128:
00688         case AR_Float_IEEE_UP_128:
00689         case AR_Float_IEEE_DN_128:
00690                 status = AR_status(opd, opndtype);
00691                 if (status & AR_STAT_OVERFLOW)
00692                         sprintf(resultstr, "%sInf",
00693                                 (status & AR_STAT_NEGATIVE) ? "-" : "+");
00694                 else if (status & AR_STAT_ZERO)
00695                         sprintf(resultstr, "%s%.34e",
00696                                 (status & AR_STAT_NEGATIVE) ? "-" : "", 0.0);
00697                 else if (status & AR_STAT_UNDEFINED)
00698                         strcpy(resultstr, "NaN");
00699                 else if (HOST_IS_IEEE_FLOAT) {
00700                         sprintf (resultstr, "%.34Le",
00701                                  (*(long double *) &opnd->ar_ieee128));
00702                 }
00703                 else
00704                 {
00705                         status = ar_itoc128 (&temp.ar_f128, &opnd->ar_ieee128,
00706                                              ar_state_register.ar_rounding_mode);
00707                         sprintf (resultstr, "%.34Le", temp.ar_f128);
00708                 }
00709                 break;
00710         default:
00711                 return AR_STAT_INVALID_TYPE;
00712         }
00713 
00714         return status;
00715 
00716 #else
00717 
00718         switch (*opndtype) {
00719         case AR_Float_Cray1_64:
00720         case AR_Float_Cray1_64_F:
00721                 status |= ar_ctoi64 (&temp.ar_ieee64, &opnd->ar_f64);
00722                 sprintf (resultstr, "%.15e", *((double *) &temp.ar_ieee64));
00723                 break;
00724         case AR_Float_Cray1_128:
00725                 status |= ar_ctoi64 (&temp.ar_ieee64, &opnd->ar_f64);
00726                 sprintf (resultstr, "%.29e", *((double *) &temp.ar_ieee64));
00727                 break;
00728         case AR_Float_IEEE_NR_32:
00729         case AR_Float_IEEE_ZE_32:
00730         case AR_Float_IEEE_UP_32:
00731         case AR_Float_IEEE_DN_32:
00732                 status |= ar_i32to64 (&temp.ar_ieee64, &opnd->ar_ieee32);
00733                 sprintf(resultstr, "%.7e", *((double *) &temp.ar_ieee64));
00734                 break;
00735         case AR_Float_IEEE_NR_64:
00736         case AR_Float_IEEE_ZE_64:
00737         case AR_Float_IEEE_UP_64:
00738         case AR_Float_IEEE_DN_64:
00739                 sprintf(resultstr, "%.16le", *((double*) &opnd->ar_ieee64));
00740                 break;
00741         case AR_Float_IEEE_NR_128:
00742         case AR_Float_IEEE_ZE_128:
00743         case AR_Float_IEEE_UP_128:
00744         case AR_Float_IEEE_DN_128:
00745                 /* Use 64-bit output routine for now */
00746                 status |= ar_i128to64 (&temp.ar_ieee64, &opnd->ar_ieee128,
00747                                        AR_ROUND_NEAREST);
00748                 sprintf(resultstr, "%.34le", *((double*) &temp.ar_ieee64));
00749                 break;
00750         default:
00751                 return AR_STAT_INVALID_TYPE;
00752         }
00753 
00754         return status;
00755 
00756 #endif
00757 
00758 }
00759 
00760 
00761 /* string with hexadecimal floating point -> floating point */
00762 int
00763 AR_convert_hex_str_to_float (AR_DATA *result, const AR_TYPE *resulttype,
00764                              const char *str) {
00765 
00766 
00767         int status = AR_STAT_OK;
00768         AR_DATA temp;
00769         const int base = 16;
00770         int bitsused;
00771         const AR_TYPE result64 = AR_Int_64_U;
00772         char save_char;
00773         char temp_string[17];
00774 
00775         errno = 0;
00776 
00777         switch (*resulttype) {
00778         case AR_Float_Cray1_64:
00779         case AR_Float_Cray1_64_F:
00780         case AR_Float_IEEE_NR_32:
00781         case AR_Float_IEEE_ZE_32:
00782         case AR_Float_IEEE_UP_32:
00783         case AR_Float_IEEE_DN_32:
00784         case AR_Float_IEEE_NR_64:
00785         case AR_Float_IEEE_ZE_64:
00786         case AR_Float_IEEE_UP_64:
00787         case AR_Float_IEEE_DN_64:
00788                 status = AR_convert_str_to_int(result, &result64, &bitsused,
00789                                                str, &base);
00790                 break;
00791 
00792         case AR_Float_IEEE_NR_128:
00793         case AR_Float_IEEE_ZE_128:
00794         case AR_Float_IEEE_UP_128:
00795         case AR_Float_IEEE_DN_128:
00796         case AR_Float_Cray1_128:
00797                 strncpy(temp_string, str, 16);
00798                 temp_string[16] = '\0';
00799                 status = AR_convert_str_to_int(result, &result64, &bitsused,
00800                                                temp_string, &base);
00801                 status |= AR_convert_str_to_int(&temp, &result64, &bitsused,
00802                                                 str+16, &base);
00803 
00804                 result->ar_internal_data_item2 = temp.ar_internal_data_item1;
00805 
00806                 break;
00807 
00808         default:
00809                 return AR_STAT_INVALID_TYPE;
00810         }
00811 
00812         /* return only the AR_STAT_UNDEFINED flag */
00813         return (status & AR_STAT_UNDEFINED);
00814 }
00815 
00816 
00817 int
00818 AR_convert_host_sint64_to_int(AR_DATA *result, const AR_TYPE *resulttype,
00819                               AR_HOST_SINT64 i64val)
00820 {
00821 
00822    AR_TYPE s64type = AR_Int_64_S;
00823 
00824    if (AR_CLASS(*resulttype) != AR_CLASS_INT)
00825            return AR_STAT_INVALID_TYPE;
00826 
00827    result->ar_internal_data_item1 = i64val;
00828 
00829    return (AR_convert(result, resulttype, result, &s64type));
00830 }  /* AR_convert_host_sint64_to_int */
00831 
00832 
00833 int
00834 AR_convert_int_to_host_sint64(AR_HOST_SINT64 *i64val,
00835                               const AR_DATA *opnd, const AR_TYPE *opndtype)
00836 {
00837    int status;
00838    AR_TYPE s64type = AR_Int_64_S;
00839    AR_DATA s64val;
00840 
00841    if (AR_CLASS(*opndtype) != AR_CLASS_INT)
00842            return AR_STAT_INVALID_TYPE;
00843 
00844    status = AR_convert(&s64val, &s64type, opnd, opndtype);
00845 
00846    *i64val =  s64val.ar_internal_data_item1;
00847 
00848    return (status);
00849 }  /* AR_convert_int_to_host_int64 */
00850 
00851 
00852 static char USMID [] = "\n%Z%%M%        %I%     %G% %U%\n";
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines