Mercurial > hg > xemacs-beta
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, |