@@ -958,49 +958,80 @@ function h$jsstringLenientReadInt(str) {
958958}
959959
960960function h$jsstringReadWord ( str ) {
961- if ( ! / ^ \d + / . test ( str ) ) return null ;
962- var x = parseInt ( str , 10 ) ;
963- var x0 = x | 0 ;
964- if ( x0 < 0 ) return ( x === x0 + 2147483648 ) ? x0 : null ;
965- else return ( x === x0 ) ? x0 : null ;
961+ if ( ! / ^ \d + / . test ( str ) ) return null ;
962+ var x = parseInt ( str , 10 ) ;
963+ var x0 = x | 0 ;
964+ if ( x0 < 0 ) return ( x === x0 + 2147483648 ) ? x0 : null ;
965+ else return ( x === x0 ) ? x0 : null ;
966966}
967967
968968function h$jsstringReadDouble ( str ) {
969-
969+ return parseFloat ( str , 10 ) ;
970970}
971971
972972function h$jsstringLenientReadDouble ( str ) {
973973 return parseFloat ( str , 10 ) ;
974974}
975975
976976function h$jsstringReadInteger ( str ) {
977- throw "h$jsstringReadInteger not implemented" ;
977+ TRACE_JSSTRING ( "readInteger: " + str ) ;
978+ if ( ! / ^ ( - ) ? \d + $ / . test ( str ) ) {
979+ return null ;
980+ } else if ( str . length <= 9 ) {
981+ return MK_INTEGER_S ( parseInt ( str , 10 ) ) ;
982+ } else {
983+ return MK_INTEGER_J ( new BigInteger ( str , 10 ) ) ;
984+ }
978985}
979986
980987function h$jsstringReadInt64 ( str ) {
981- throw "h4JsstringReadInt64 not implemented" ;
988+ if ( ! / ^ ( - ) ? \d + $ / . test ( str ) ) {
989+ RETURN_UBX_TUP3 ( 0 , 0 , 0 ) ;
990+ }
991+ if ( str . charCodeAt ( 0 ) === 45 ) { // '-'
992+ return h$jsstringReadValue64 ( str , 1 , true ) ;
993+ } else {
994+ return h$jsstringReadValue64 ( str , 0 , false ) ;
995+ }
982996}
983997
984998function h$jsstringReadWord64 ( str ) {
985- if ( ! / ^ \d + $ / . test ( str ) ) return 0 ;
986- var l = str . length , i = 0 ;
987- while ( i < l ) {
988- if ( str . charCodeAt ( i ) !== 48 ) break ;
989- i ++ ;
990- }
991- if ( i >= l ) RETURN_UBX_TUP3 ( 1 , 0 , 0 ) ; // only zeroes
992- var li = l - i ;
993- if ( li > 20 ) return 0 ; // too big
994- if ( li < 10 ) RETURN_UBX_TUP3 ( 1 , 0 , parseInt ( str . substr ( i ) , 10 ) ) ;
995- if ( li < 18 ) {
996- var x1 = parseInt ( str . substr ( i + 9 ) , 10 ) ;
997- var x2 = parseInt ( str . substr ( i , 9 ) , 10 ) ;
998- var x3 = ( ( x2 % 10 ) * 1000000000 + x1 ) | 0 ;
999- // var x4 = throw "jsstringReadWord64";
1000- throw "jsstringReadWord64" ; // fixme
1001- RETURN_UBX_TUP3 ( 1 , x4 , x3 ) ;
1002- }
1003-
999+ if ( ! / ^ \d + $ / . test ( str ) ) {
1000+ RETURN_UBX_TUP3 ( 0 , 0 , 0 ) ;
1001+ }
1002+ return h$jsstringReadValue64 ( str , 0 , false ) ;
1003+ }
1004+
1005+ var h$jsstringLongs = null ;
1006+
1007+ function h$jsstringReadValue64 ( str , start , negate ) {
1008+ var l = str . length , i = start ;
1009+ while ( i < l ) {
1010+ if ( str . charCodeAt ( i ) !== 48 ) break ;
1011+ i ++ ;
1012+ }
1013+ if ( i >= l ) RETURN_UBX_TUP3 ( 1 , 0 , 0 ) ; // only zeroes
1014+ if ( h$jsstringLongs === null ) {
1015+ h$jsstringLongs = [ ] ;
1016+ for ( var t = 10 ; t <= 1000000000 ; t *= 10 ) {
1017+ h$jsstringLongs . push ( goog . math . Long . fromInt ( t ) ) ;
1018+ }
1019+ }
1020+ var li = l - i ;
1021+ if ( li < 10 && ! negate ) {
1022+ RETURN_UBX_TUP3 ( 1 , 0 , parseInt ( str . substr ( i ) , 10 ) ) ;
1023+ }
1024+ var r = goog . math . Long . fromInt ( parseInt ( str . substr ( li , 9 ) , 10 ) ) ;
1025+ li += 9 ;
1026+ while ( li < l ) {
1027+ r = r . multiply ( h$jsstringLongs [ Math . min ( l - li - 1 , 8 ) ] )
1028+ . add ( goog . math . Long . fromInt ( parseInt ( str . substr ( li , 9 ) , 10 ) ) ) ;
1029+ li += 9 ;
1030+ }
1031+ if ( negate ) {
1032+ r = r . negate ( ) ;
1033+ }
1034+ RETURN_UBX_TUP3 ( 1 , r . getHighBits ( ) , r . getLowBits ( ) ) ;
10041035}
10051036
10061037function h$jsstringExecRE ( i , str , re ) {
0 commit comments