BUGGY_MAXIMUM_SSCANF_LENGTH - gcl.git - GNU Common Lisp

index : gcl.git
GNU Common Lisp
summary refs log tree commit diff
diff options
context:
space:
mode:
authorCamm Maguire <camm@debian.org>2014年09月05日 10:32:09 -0400
committerCamm Maguire <camm@debian.org>2014年09月05日 10:32:09 -0400
commit9d29d4a59066ec7b7bf9d356fe470cf6ce52e76c (patch)
treede78d10216b40a384d1ff1fec1b06d8198476942
parent9b7770107a39773566227dacf6bad297e7cad3f4 (diff)
downloadgcl-9d29d4a59066ec7b7bf9d356fe470cf6ce52e76c.tar.gz
BUGGY_MAXIMUM_SSCANF_LENGTH
Diffstat
-rwxr-xr-xgcl/configure 44
-rw-r--r--gcl/configure.in 30
-rw-r--r--gcl/h/gclincl.h.in 4
-rwxr-xr-xgcl/o/read.d 11
4 files changed, 66 insertions, 23 deletions
diff --git a/gcl/configure b/gcl/configure
index a7c6eb716..66bd4ee55 100755
--- a/gcl/configure
+++ b/gcl/configure
@@ -4282,7 +4282,11 @@ done
# Work around system/gprof mips/hppa hang
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking working gprof" >&5
+$as_echo_n "checking working gprof... " >&6; }
+old_enable_gprof=enable_gprof
case $use in
+ powerpc*) if test "$host_cpu" = "powerpc64le" ; then enable_gprof="no"; fi;;
sh4*) enable_gprof="no";;
ia64*) enable_gprof="no";;
# mips*) enable_gprof="no";;
@@ -4290,6 +4294,13 @@ case $use in
arm*) enable_gprof="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible
*gnu) enable_gprof="no";;
esac
+if test "$enable_gprof" = "$old_enable_gprof" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
+$as_echo "disabled" >&6; }
+fi
if test "$enable_gprof" = "yes" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for text start" >&5
@@ -7791,8 +7802,8 @@ else
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken windows sscanf" >&5
-$as_echo_n "checking for broken windows sscanf... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for buggy maximum sscanf length" >&5
+$as_echo_n "checking for buggy maximum sscanf length... " >&6; }
if test "$cross_compiling" = yes; then :
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -7803,25 +7814,37 @@ else
/* end confdefs.h. */
- int main() {
- char *s= "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161404";
+ #include <stdio.h>
+
+int
+main ()
+{
+
+ char *s= "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161404";
int n, m;
double f;
char *endptr;
+ FILE *fp=fopen("conftest1","w");
n=sscanf(s,"%lf%n",&f,&m);
+ fprintf(fp,"%d",m);
+ fclose(fp);
return s[m];
- }
+
+ ;
+ return 0;
+}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ buggy_maximum_sscanf_length=`cat conftest1`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $buggy_maximum_sscanf_length" >&5
+$as_echo "$buggy_maximum_sscanf_length" >&6; }
cat >>confdefs.h <<_ACEOF
-#define BROKEN_WINDOWS_SSCANF 1
+#define BUGGY_MAXIMUM_SSCANF_LENGTH $buggy_maximum_sscanf_length
_ACEOF
fi
@@ -7830,6 +7853,7 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
fi
+
EXTRA_LOBJS=
if test "$try_japi" = "yes" ; then
for ac_header in japi.h
diff --git a/gcl/configure.in b/gcl/configure.in
index 99e2416f1..502a6230d 100644
--- a/gcl/configure.in
+++ b/gcl/configure.in
@@ -533,7 +533,10 @@ esac
AC_CHECK_PROGS(AWK,[gawk nawk awk])
# Work around system/gprof mips/hppa hang
+AC_MSG_CHECKING([working gprof])
+old_enable_gprof=enable_gprof
case $use in
+ powerpc*) if test "$host_cpu" = "powerpc64le" ; then enable_gprof="no"; fi;;
sh4*) enable_gprof="no";;
ia64*) enable_gprof="no";;
# mips*) enable_gprof="no";;
@@ -541,6 +544,11 @@ case $use in
arm*) enable_gprof="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible
*gnu) enable_gprof="no";;
esac
+if test "$enable_gprof" = "$old_enable_gprof" ; then
+ AC_MSG_RESULT([ok])
+else
+ AC_MSG_RESULT([disabled])
+fi
if test "$enable_gprof" = "yes" ; then
AC_MSG_CHECKING(for text start)
@@ -2163,21 +2171,27 @@ AC_EGREP_HEADER([gettimeofday],
AC_CHECK_LIB(m,sin,LIBS="${LIBS} -lm",true)
AC_CHECK_LIB(mingwex,main,LIBS="${LIBS} -lmingwex",true)
-AC_MSG_CHECKING([for broken windows sscanf])
+AC_MSG_CHECKING([for buggy maximum sscanf length])
AC_RUN_IFELSE([
- AC_LANG_SOURCE([[
- int main() {
- char *s= "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161404";
+ AC_LANG_PROGRAM([[
+ #include <stdio.h>
+ ]],[[
+ char *s= "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161404";
int n, m;
double f;
char *endptr;
+ FILE *fp=fopen("conftest1","w");
n=sscanf(s,"%lf%n",&f,&m);
+ fprintf(fp,"%d",m);
+ fclose(fp);
return s[m];
- }]])],
- [AC_MSG_RESULT([no])],
- [AC_MSG_RESULT([yes])
- AC_DEFINE_UNQUOTED(BROKEN_WINDOWS_SSCANF,1,[sscanf terminates prematurely])])
+ ]])],
+ [AC_MSG_RESULT([none])],
+ [buggy_maximum_sscanf_length=`cat conftest1`
+ AC_MSG_RESULT([$buggy_maximum_sscanf_length])
+ AC_DEFINE_UNQUOTED(BUGGY_MAXIMUM_SSCANF_LENGTH,$buggy_maximum_sscanf_length,[sscanf terminates prematurely (Windows XP)])])
+
EXTRA_LOBJS=
if test "$try_japi" = "yes" ; then
diff --git a/gcl/h/gclincl.h.in b/gcl/h/gclincl.h.in
index 790da2e82..cfc0bd6d8 100644
--- a/gcl/h/gclincl.h.in
+++ b/gcl/h/gclincl.h.in
@@ -15,8 +15,8 @@
/* binding stack size */
#undef BDSSIZE
-/* sscanf terminates prematurely */
-#undef BROKEN_WINDOWS_SSCANF
+/* sscanf terminates prematurely (Windows XP) */
+#undef BUGGY_MAXIMUM_SSCANF_LENGTH
/* can prevent sbrk from returning random values */
#undef CAN_UNRANDOMIZE_SBRK
diff --git a/gcl/o/read.d b/gcl/o/read.d
index 8886fce6a..be079d896 100755
--- a/gcl/o/read.d
+++ b/gcl/o/read.d
@@ -142,11 +142,16 @@ parse_number(char *s,int radix) {
return OBJNULL;
*q='E';
}
+#ifdef BUGGY_MAXIMUM_SSCANF_LENGTH
+ if (strlen(s)>BUGGY_MAXIMUM_SSCANF_LENGTH) {
+ char *q1=s+BUGGY_MAXIMUM_SSCANF_LENGTH-strlen(q);
+ fprintf(stderr,"Chopping\n");fflush(stderr);
+ memmove(q1,q,strlen(q)+1);
+ q=q1;
+ }
+#endif
n=sscanf(s,"%lf%n",&f,&m);
*q=c;
-#ifdef BROKEN_WINDOWS_SSCANF
- for (;s[m]>='0' && s[m]<='9';m++);
-#endif
if (n!=1||s[m]) return OBJNULL;
switch (ch=='e' || ch=='E' ? READdefault_float_format : ch) {
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月05日 12:26:49 +0000

AltStyle によって変換されたページ (->オリジナル) /