@@ -260,6 +260,43 @@ bad_hex: Trap0(RE_INVALID_CHARS);
260
260
else cp ++ ;
261
261
if (* cp == ',' || * cp == '.' ) cp ++ ;
262
262
* ep ++ = '.' ;
263
+
264
+ #ifndef USE_NO_INFINITY
265
+ if (cp [0 ] == '#' ) {
266
+ if (
267
+ (cp [1 ] == 'I' || cp [1 ] == 'i' )
268
+ && (cp [2 ] == 'N' || cp [2 ] == 'n' )
269
+ && (cp [3 ] == 'F' || cp [3 ] == 'f' )
270
+ ) {
271
+ cp += 4 ;
272
+ if ((REBCNT )(cp - bp ) != len ) return 0 ;
273
+ VAL_SET (value , REB_DECIMAL );
274
+ VAL_DECIMAL (value ) = (bp [0 ] == '-' ) ? - INFINITY : INFINITY ;
275
+ return cp ;
276
+ }
277
+ if (
278
+ (cp [1 ] == 'N' || cp [1 ] == 'n' )
279
+ && (cp [2 ] == 'a' || cp [2 ] == 'A' )
280
+ && (cp [3 ] == 'N' || cp [3 ] == 'n' )
281
+ ) {
282
+ cp += 4 ;
283
+ if ((REBCNT )(cp - bp ) != len ) return 0 ;
284
+ VAL_SET (value , REB_DECIMAL );
285
+
286
+ // NOTE: NAN sign may differ!
287
+ // VS (17) is producing negative NaN #{FFF8000000000000}, while GCC positive #{7FF8000000000000}!
288
+ // Is this an issue?
289
+ #if _MSC_VER
290
+ VAL_DECIMAL (value ) = (bp [0 ] == '-' ) ? NAN : - NAN ;
291
+ #else
292
+ VAL_DECIMAL (value ) = (bp [0 ] == '-' ) ? - NAN : NAN ;
293
+ #endif
294
+ return cp ;
295
+ }
296
+ return 0 ;
297
+ }
298
+ #endif // !USE_NO_INFINITY
299
+
263
300
while (IS_LEX_NUMBER (* cp ) || * cp == '\'' )
264
301
if (* cp != '\'' ) * ep ++ = * cp ++ , dig = 1 ;
265
302
else cp ++ ;
@@ -745,13 +782,67 @@ bad_hex: Trap0(RE_INVALID_CHARS);
745
782
//ep = Grab_Int(ep, &n);
746
783
ep = Scan_Dec_Buf (cp , MAX_NUM_LEN , & buf [0 ]);
747
784
if (!ep ) return 0 ;
785
+
786
+ #ifndef USE_NO_INFINITY
787
+ if (ep [0 ] == '#' ) {
788
+ if (!((buf [0 ] == '-' && buf [1 ] == '1' && buf [2 ] == '.' ) || (buf [0 ] == '1' && buf [1 ] == '.' ))) return 0 ; //don't allow numbers like 20.#INF or -2.#INF
789
+ if (
790
+ (ep [1 ] == 'I' || ep [1 ] == 'i' ) &&
791
+ (ep [2 ] == 'N' || ep [2 ] == 'n' ) &&
792
+ (ep [3 ] == 'F' || ep [3 ] == 'f' )
793
+ ) {
794
+ VAL_PAIR_X (value ) = buf [0 ] == '-' ? - INFINITY : INFINITY ;
795
+ ep += 4 ;
796
+ }
797
+ else if (
798
+ (ep [1 ] == 'N' || ep [1 ] == 'n' )
799
+ && (ep [2 ] == 'a' || ep [2 ] == 'A' )
800
+ && (ep [3 ] == 'N' || ep [3 ] == 'n' )
801
+ ) {
802
+ ep += 4 ;
803
+ VAL_PAIR_X (value ) = NAN ;
804
+ }
805
+ else return 0 ;
806
+ } else {
807
+ VAL_PAIR_X (value ) = (float )atof ((char * )(& buf [0 ])); //n;
808
+ }
809
+ #else
748
810
VAL_PAIR_X (value ) = (float )atof ((char * )(& buf [0 ])); //n;
811
+ #endif // !USE_NO_INFINITY
812
+
749
813
if (* ep != 'x' && * ep != 'X' ) return 0 ;
750
814
ep ++ ;
751
815
752
816
xp = Scan_Dec_Buf (ep , MAX_NUM_LEN , & buf [0 ]);
753
817
if (!xp ) return 0 ;
818
+
819
+ #ifndef USE_NO_INFINITY
820
+ if (xp [0 ] == '#' ) {
821
+ if (!((buf [0 ]== '-' && buf [1 ]== '1' && buf [2 ]== '.' ) || (buf [0 ]== '1' && buf [1 ]== '.' ))) return 0 ; //don't allow numbers like 20.#INF or -2.#INF
822
+ if (
823
+ (xp [1 ] == 'I' || xp [1 ] == 'i' ) &&
824
+ (xp [2 ] == 'N' || xp [2 ] == 'n' ) &&
825
+ (xp [3 ] == 'F' || xp [3 ] == 'f' )
826
+ ) {
827
+ VAL_PAIR_Y (value ) = buf [0 ] == '-' ? - INFINITY : INFINITY ;
828
+ xp += 4 ;
829
+ }
830
+ else if (
831
+ (xp [1 ] == 'N' || xp [1 ] == 'n' )
832
+ && (xp [2 ] == 'a' || xp [2 ] == 'A' )
833
+ && (xp [3 ] == 'N' || xp [3 ] == 'n' )
834
+ ) {
835
+ xp += 4 ;
836
+ VAL_PAIR_Y (value ) = NAN ;
837
+ }
838
+ else return 0 ;
839
+ }
840
+ else {
841
+ VAL_PAIR_Y (value ) = (float )atof ((char * )(& buf [0 ])); //n;
842
+ }
843
+ #else
754
844
VAL_PAIR_Y (value ) = (float )atof ((char * )(& buf [0 ])); //n;
845
+ #endif // !USE_NO_INFINITY
755
846
756
847
if (len > (REBCNT )(xp - cp )) return 0 ;
757
848
VAL_SET (value , REB_PAIR );
0 commit comments