This patch adds macros to the config.h file for INTVAL and NUMVAL printf
formats; I called them INTVAL_FMT and NUMVAL_FMT, although if those names
are not appropriate I won't sweat it.
The detection mechanism is not that fancy. It just reads what you have
in $c{iv} and $c{nv} and hopefully recognizes it. The goal here was to
pass some tests, and besides, we're replacing this whole configure thing
sometime (soon?) anyway.
I changed all the printfs that I could locate that print INTVALs and
NUMVALs to use the new format macros; now mixed 32-bit and 64-bit passes a
lot more tests. There's still one in stacks.t that's giving me trouble
though...
Index: Configure.pl
===================================================================
RCS file: /home/perlcvs/parrot/Configure.pl,v
retrieving revision 1.76
diff -u -r1.76 Configure.pl
--- Configure.pl 8 Jan 2002 17:24:29 -0000 1.76
+++ Configure.pl 9 Jan 2002 14:16:51 -0000
@@ -170,6 +170,9 @@
opcode_t => ($Config{ivtype} || 'long'),
longsize => undef,
+ intvalfmt => '%ld',
+ numvalfmt => '%f',
+
cc => $Config{cc},
#
@@ -542,6 +545,28 @@
die <<"AARGH";
Configure.pl: Unable to find an integer type that fits a pointer.
AARGH
+}
+
+#"
+# Determine format strings for INTVAL and FLOATVAL.
+#
+
+if ($c{iv} eq "int") {
+ $c{intvalfmt} = "%d";
+} elsif (($c{iv} eq "long") || ($c{iv} eq "long int")) {
+ $c{intvalfmt} = "%ld";
+} elsif (($c{iv} eq "long long") || ($c{iv} eq "long long int")) {
+ $c{intvalfmt} = "%lld";
+} else {
+ die "Configure.pl: Can't find a printf-style format specifier for type
+\"$c{iv}\"\n";
+}
+
+if ($c{nv} eq "double") {
+ $c{numvalfmt} = "%f";
+} elsif ($c{nv} eq "long double") {
+ $c{numvalfmt} = "%lf";
+} else {
+ die "Configure.pl: Can't find a printf-style format specifier for type
+\"$c{nv}\"\n";
}
#
Index: config_h.in
===================================================================
RCS file: /home/perlcvs/parrot/config_h.in,v
retrieving revision 1.14
diff -u -r1.14 config_h.in
--- config_h.in 1 Jan 2002 03:48:46 -0000 1.14
+++ config_h.in 9 Jan 2002 14:16:51 -0000
@@ -46,6 +46,9 @@
#define PARROT_CORE_OPLIB_NAME "core"
#define PARROT_CORE_OPLIB_INIT Parrot_DynOp_core_${MAJOR}_${MINOR}_${PATCH}
+#define INTVAL_FMT "${intvalfmt}"
+#define NUMVAL_FMT "${numvalfmt}"
+
${headers}
Index: core.ops
===================================================================
RCS file: /home/perlcvs/parrot/core.ops,v
retrieving revision 1.71
diff -u -r1.71 core.ops
--- core.ops 8 Jan 2002 16:33:29 -0000 1.71
+++ core.ops 9 Jan 2002 14:16:51 -0000
@@ -253,14 +253,12 @@
=cut
inline op print(in INT) {
- /* TODO: Configure for format */
- printf("%li", (long) $1);
+ printf(INTVAL_FMT, $1);
goto NEXT();
}
inline op print(in NUM) {
- /* TODO: Configure for format */
- printf("%f", $1);
+ printf(NUMVAL_FMT, $1);
goto NEXT();
}
@@ -303,8 +301,7 @@
break;
default: file = (FILE *)$1;
}
- /* TODO: Configure for format */
- fprintf(file, "%li", (long) $2);
+ fprintf(file, INTVAL_FMT, $2);
goto NEXT();
}
@@ -319,8 +316,7 @@
break;
default: file = (FILE *)$1;
}
- /* TODO: Configure for format */
- fprintf(file, "%f", $2);
+ fprintf(file, NUMVAL_FMT, $2);
goto NEXT();
}
Index: key.c
===================================================================
RCS file: /home/perlcvs/parrot/key.c,v
retrieving revision 1.10
diff -u -r1.10 key.c
--- key.c 8 Jan 2002 20:05:18 -0000 1.10
+++ key.c 9 Jan 2002 14:16:51 -0000
@@ -272,7 +272,7 @@
if(idx != NULL) {
INTVAL hash = key_hash(interpreter,idx);
hash = hash % NUM_BUCKETS;
- pair = find_bucket(interpreter,key->keys[hash].cache.struct_val,idx);
+ pair = find_bucket(interpreter,(BUCKET *)key->keys[hash].cache.struct_val,idx);
if(pair == NULL) {
fprintf(stderr,"*** key_element_value_s pair returning a null key\n");
}
@@ -336,7 +336,7 @@
}
else {
}
- key->keys[hash].cache.struct_val = bucket;
+ key->keys[hash].cache.struct_val = (STRING *)bucket;
key->keys[hash].type = enum_key_bucket;
}
else {
Index: classes/perlint.pmc
===================================================================
RCS file: /home/perlcvs/parrot/classes/perlint.pmc,v
retrieving revision 1.12
diff -u -r1.12 perlint.pmc
--- classes/perlint.pmc 4 Jan 2002 16:09:01 -0000 1.12
+++ classes/perlint.pmc 9 Jan 2002 14:16:51 -0000
@@ -64,9 +64,9 @@
char* buff = mem_sys_allocate(80);
STRING* s;
#ifdef HAS_SNPRINTF
- snprintf(buff,80,"%ld",SELF->cache.int_val);
+ snprintf(buff,80,INTVAL_FMT,SELF->cache.int_val);
#else
- sprintf(buff,"%ld",SELF->cache.int_val); /* XXX buffer overflow! */
+ sprintf(buff,INTVAL_FMT,SELF->cache.int_val); /* XXX buffer overflow! */
#endif
s = string_make(INTERP,buff,strlen(buff),NULL,0,NULL);
free(buff);
Index: classes/perlnum.pmc
===================================================================
RCS file: /home/perlcvs/parrot/classes/perlnum.pmc,v
retrieving revision 1.13
diff -u -r1.13 perlnum.pmc
--- classes/perlnum.pmc 4 Jan 2002 16:09:01 -0000 1.13
+++ classes/perlnum.pmc 9 Jan 2002 14:16:51 -0000
@@ -64,9 +64,9 @@
char* buff = mem_sys_allocate(80);
STRING* s;
#ifdef HAS_SNPRINTF
- snprintf(buff,80,"%f",SELF->cache.num_val);
+ snprintf(buff,80,NUMVAL_FMT,SELF->cache.num_val);
#else
- sprintf(buff,"%f",SELF->cache.num_val); /* XXX buffer overflow! */
+ sprintf(buff,NUMVAL_FMT,SELF->cache.num_val); /* XXX buffer overflow! */
#endif
s = string_make(INTERP,buff,strlen(buff),NULL,0,NULL);
free(buff);
- D
<[EMAIL PROTECTED]>