Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/lend/src/nf_stringToDoubles.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 /*
  2 # <<BEGIN-copyright>>
  3 # <<END-copyright>>
  4 */
  5 
  6 #include <stdlib.h>
  7 #include <float.h>
  8 #include <cmath>
  9 
 10 #include "nf_utilities.h"
 11 
 12 #if defined __cplusplus
 13 namespace GIDI {
 14 using namespace GIDI;
 15 #endif
 16 
 17 #define numberOfStaticDoubles ( 100 * 1000 )
 18 
 19 static nfu_status nfu_stringToListOfDoubles2( char const *str, int64_t *numberConverted, double **doublePtr, char **endCharacter );
 20 /*
 21 ========================================================================
 22 */
 23 nfu_status nfu_stringToListOfDoubles( char const *str, int64_t *numberConverted, double **doublePtr, char **endCharacter ) {
 24 
 25     *numberConverted = 0;
 26     *doublePtr = NULL;
 27     return( nfu_stringToListOfDoubles2( str, numberConverted, doublePtr, endCharacter ) );
 28 }
 29 /*
 30 ========================================================================
 31 */
 32 static nfu_status nfu_stringToListOfDoubles2( char const *str, int64_t *numberConverted, double **doublePtr, char **endCharacter ) {
 33 
 34     int64_t i1, i2, numberConverted_initial = *numberConverted;
 35     double staticDoubles[numberOfStaticDoubles];
 36     nfu_status status = nfu_Okay;
 37 
 38     for( i1 = 0; i1 < numberOfStaticDoubles; i1++, (*numberConverted)++ ) {
 39         staticDoubles[i1] = strtod( str, endCharacter );
 40         if( str == (char const *) *endCharacter ) {
 41             if( *numberConverted > 0 ) {
 42                 if( ( *doublePtr = (double *) nfu_malloc( (size_t) *numberConverted * sizeof( double ) ) ) == NULL ) status = nfu_mallocError;
 43             }
 44             break;
 45         }
 46         str = (char const *) *endCharacter;
 47     }
 48 
 49     if( ( status == nfu_Okay ) && ( *doublePtr == NULL ) ) status = nfu_stringToListOfDoubles2( str, numberConverted, doublePtr, endCharacter );
 50     if( *doublePtr != NULL ) {
 51         double *doublePtr2 = &((*doublePtr)[numberConverted_initial]);
 52 
 53         for( i2 = 0; i2 < i1; i2++, doublePtr2++ ) *doublePtr2 = staticDoubles[i2];
 54     }
 55     return( status );
 56 }
 57 /*
 58 ============================================================
 59 */
 60 char *nf_floatToShortestString( double value, int significantDigits, int favorEFormBy, int flags ) {
 61 
 62     int n1, ne, nf, digitsRightOfPeriod_f, exponent;
 63     char Str_e[512], Str_f[512], *Str_r = Str_e, Fmt[32], *e1, *e2;
 64     const char *sign = "";
 65 
 66     if( flags & nf_floatToShortestString_includeSign ) sign = "+";
 67 
 68     if( !std::isfinite( value ) ) {
 69         snprintf( Fmt, sizeof Fmt, "%%%sf", sign );
 70         snprintf( Str_e, sizeof Str_e, Fmt, value );
 71         return( strdup( Str_e ) );
 72     }
 73 
 74     significantDigits--;
 75     if( significantDigits < 0 ) significantDigits = 0;
 76     if( significantDigits > 24 ) significantDigits = 24;
 77 
 78     snprintf( Fmt, sizeof Fmt, "%%%s.%de", sign, significantDigits );
 79     snprintf( Str_e, sizeof Str_e, Fmt, value );
 80 
 81     e1 = strchr( Str_e, 'e' );
 82     if( significantDigits == 0 ) {
 83         if( *(e1 - 1) != '.' ) {
 84             char *e3;
 85 
 86             e2 = strchr( e1, 0 );
 87             e3 = e2 + 1;
 88             for( ; e2 != e1; e2--, e3-- ) *e3 = *e2;
 89             *(e1++) = '.';
 90         }
 91     }
 92     *e1 = 0;
 93     n1 = (int) strlen( Str_e ) - 1;
 94     if( flags & nf_floatToShortestString_trimZeros ) while( Str_e[n1] == '0' ) n1--; // Loop checking, 11.06.2015, T. Koi
 95     ne = flags & nf_floatToShortestString_keepPeriod;
 96     if( !( flags & nf_floatToShortestString_keepPeriod ) ) if( Str_e[n1] == '.' ) n1--;
 97     n1++;
 98     Str_e[n1] = 0;
 99 
100     e1++;
101     exponent = (int) strtol( e1, &e2, 10 );
102     if( exponent != 0 ) {               /* If 0, the exponent was "e+00". */
103         for( e1 = Str_e; *e1 != 0; e1++ ) ;
104         snprintf( e1, sizeof Str_e, "e%d", exponent );
105 
106         digitsRightOfPeriod_f = significantDigits - exponent;
107         if( ( digitsRightOfPeriod_f > 25 ) || ( exponent > 50 ) ) return( strdup( Str_r ) );
108         if( digitsRightOfPeriod_f < 0 ) digitsRightOfPeriod_f = 0;
109 
110         snprintf( Fmt, sizeof Fmt, "%%%s.%df", sign, digitsRightOfPeriod_f );
111         snprintf( Str_f, sizeof Str_f, Fmt, value );
112 
113         ne = (int) strlen( Str_e );
114         nf = (int) strlen( Str_f );
115         if( strchr( Str_f, '.' ) != NULL ) {        /* '.' in string. */
116             if( flags & nf_floatToShortestString_trimZeros ) while( Str_f[nf-1] == '0' ) nf--; // Loop checking, 11.06.2015, T. Koi
117             if( Str_f[nf-1] == '.' ) {
118                 if( !( flags & nf_floatToShortestString_keepPeriod ) ) nf--;
119             } }
120         else {      /* Maybe we want a '.' else it looks like an integer, "12345." vs "12345". */
121             if( flags & nf_floatToShortestString_keepPeriod ) {
122                 Str_f[nf] = '.';
123                 nf++;
124             }
125         }
126         Str_f[nf] = 0;
127 
128         if( ( nf + favorEFormBy ) < ne ) Str_r = Str_f;
129     }
130     return( strdup( Str_r ) );
131 }
132 
133 #if defined __cplusplus
134 }
135 #endif
136