comparison src/lread.c @ 1983:9c872f33ecbe

[xemacs-hg @ 2004-04-05 22:49:31 by james] Add bignum, ratio, and bigfloat support.
author james
date Mon, 05 Apr 2004 22:50:11 +0000
parents 21549d437f09
children 4e6a63799f08
comparison
equal deleted inserted replaced
1982:a748951fd4fb 1983:9c872f33ecbe
1846 #else 1846 #else
1847 return parse_integer ((Ibyte *) read_ptr, len, 10); 1847 return parse_integer ((Ibyte *) read_ptr, len, 10);
1848 #endif 1848 #endif
1849 } 1849 }
1850 } 1850 }
1851 #ifdef HAVE_RATIO
1852 if (isratio_string (read_ptr))
1853 {
1854 ratio_set_string (scratch_ratio, read_ptr, 0);
1855 ratio_canonicalize (scratch_ratio);
1856 return Fcanonicalize_number (make_ratio_rt (scratch_ratio));
1857 }
1858 #endif
1851 if (isfloat_string (read_ptr)) 1859 if (isfloat_string (read_ptr))
1852 return make_float (atof (read_ptr)); 1860 return make_float (atof (read_ptr));
1853 } 1861 }
1854 1862
1855 { 1863 {
1918 if (XINT (result) != int_result) 1926 if (XINT (result) != int_result)
1919 goto overflow; 1927 goto overflow;
1920 return result; 1928 return result;
1921 } 1929 }
1922 overflow: 1930 overflow:
1931 #ifdef HAVE_BIGNUM
1932 {
1933 bignum_set_string (scratch_bignum, buf, 0);
1934 return make_bignum_bg (scratch_bignum);
1935 }
1936 #else
1923 return Fsignal (Qinvalid_read_syntax, 1937 return Fsignal (Qinvalid_read_syntax,
1924 list3 (build_msg_string 1938 list3 (build_msg_string
1925 ("Integer constant overflow in reader"), 1939 ("Integer constant overflow in reader"),
1926 make_string (buf, len), 1940 make_string (buf, len),
1927 make_int (base))); 1941 make_int (base)));
1942 #endif /* HAVE_BIGNUM */
1928 loser: 1943 loser:
1929 return Fsignal (Qinvalid_read_syntax, 1944 return Fsignal (Qinvalid_read_syntax,
1930 list3 (build_msg_string 1945 list3 (build_msg_string
1931 ("Invalid integer constant in reader"), 1946 ("Invalid integer constant in reader"),
1932 make_string (buf, len), 1947 make_string (buf, len),
2651 || state == (DOT_CHAR|TRAIL_INT) 2666 || state == (DOT_CHAR|TRAIL_INT)
2652 || state == (LEAD_INT|E_CHAR|EXP_INT) 2667 || state == (LEAD_INT|E_CHAR|EXP_INT)
2653 || state == (LEAD_INT|DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT) 2668 || state == (LEAD_INT|DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)
2654 || state == (DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT))); 2669 || state == (DOT_CHAR|TRAIL_INT|E_CHAR|EXP_INT)));
2655 } 2670 }
2671
2672 #ifdef HAVE_RATIO
2673 int
2674 isratio_string (const char *cp)
2675 {
2676 /* Possible minus sign */
2677 if (*cp == '-')
2678 cp++;
2679
2680 /* Numerator */
2681 if (*cp < '0' || *cp > '9')
2682 return 0;
2683
2684 do {
2685 cp++;
2686 } while (*cp >= '0' && *cp <= '9');
2687
2688 /* Slash */
2689 if (*cp++ != '/')
2690 return 0;
2691
2692 /* Denominator */
2693 if (*cp < '0' || *cp > '9')
2694 return 0;
2695
2696 do {
2697 cp++;
2698 } while (*cp >= '0' && *cp <= '9');
2699
2700 return *cp == '\0' || *cp == ' ' || *cp =='\t' || *cp == '\n' ||
2701 *cp == '\r' || *cp == '\f';
2702 }
2703 #endif
2656 2704
2657 static void * 2705 static void *
2658 sequence_reader (Lisp_Object readcharfun, 2706 sequence_reader (Lisp_Object readcharfun,
2659 Ichar terminator, 2707 Ichar terminator,
2660 void *state, 2708 void *state,