2000-06-29  Ulrich Drepper  <drepper@redhat.com>

	* stdio-common/printf_fp.c (__printf_fp): Don't clobber pointer which
	we later need to calling free().
	Patch by Matt Wilson <msw@redhat.com>.

2000-06-27  David Mosberger-Tang  <davidm@hpl.hp.com>

	* sysdeps/unix/sysv/linux/ia64/bits/ipc.h: New file.
	* sysdeps/unix/sysv/linux/ia64/bits/shm.h: New file.

2000-06-28  Jes Sorensen  <jes@linuxcare.com>

	* sysdeps/ieee754/dbl-64/s_exp2.c: Add include stdlib.h to get
	prototype for abs().
	* sysdeps/ieee754/flt-32/s_exp2f.c: ditto.
This commit is contained in:
Ulrich Drepper 2000-06-29 19:33:05 +00:00
parent 5ab0176021
commit a5707dad25
28 changed files with 505 additions and 62 deletions

View file

@ -1,3 +1,20 @@
2000-06-29 Ulrich Drepper <drepper@redhat.com>
* stdio-common/printf_fp.c (__printf_fp): Don't clobber pointer which
we later need to calling free().
Patch by Matt Wilson <msw@redhat.com>.
2000-06-27 David Mosberger-Tang <davidm@hpl.hp.com>
* sysdeps/unix/sysv/linux/ia64/bits/ipc.h: New file.
* sysdeps/unix/sysv/linux/ia64/bits/shm.h: New file.
2000-06-28 Jes Sorensen <jes@linuxcare.com>
* sysdeps/ieee754/dbl-64/s_exp2.c: Add include stdlib.h to get
prototype for abs().
* sysdeps/ieee754/flt-32/s_exp2f.c: ditto.
2000-06-23 Andreas Jaeger <aj@suse.de>
* config.h.in: Don't use regparm with bounded pointers.

View file

@ -135,10 +135,27 @@ do-tst-trans: tst-trans.sh $(objpfx)tst-trans
do-tst-mbswcs: tst-mbswcs.sh $(objpfx)tst-mbswcs1 $(objpfx)tst-mbswcs2 \
$(objpfx)tst-mbswcs3 $(objpfx)tst-mbswcs4 $(objpfx)tst-mbswcs5
$(SHELL) -e $< $(common-objpfx)
do-tst-ctype: tst-ctype.sh $(objpfx)tst-ctype do-collate-test do-tst-mbswcs
do-tst-ctype: tst-ctype.sh $(objpfx)tst-ctype do-collate-test
$(SHELL) -e $< $(common-objpfx)
$(addsuffix .out,$(addprefix $(objpfx),$(locale_test_suite))): %: do-tst-ctype\
do-tst-mbswcs
# Theses locales are generated by gen-locale.sh
LOCALES := de_DE.ISO-8859-1 de_DE.UTF-8 en_US.ANSI_X3.4-1968 \
en_US.ISO-8859-1 ja_JP.EUC-JP
LOCALE_FILES := LC_ADDRESS LC_IDENTIFICATION LC_MONETARY LC_PAPER \
LC_COLLATE LC_MEASUREMENT LC_NAME LC_TELEPHONE LC_CTYPE \
LC_NUMERIC LC_TIME LC_MESSAGES/SYS_LC_MESSAGES
ALL_LC_FILES := $(foreach locale, $(LOCALES), \
$(addprefix $(locale)/, $(LOCALE_FILES)))
ALL_OBJ_LC_FILES := $(addprefix $(objpfx), $(ALL_LC_FILES))
$(ALL_OBJ_LC_FILES): gen-locale.sh Makefile charmaps/* locales/*
$(SHELL) -e gen-locale.sh $(common-objpfx)
$(addsuffix .out,$(addprefix $(objpfx),$(locale_test_suite))): %: $(ALL_OBJ_LC_FILES)
endif
endif

45
localedata/gen-locale.sh Normal file
View file

@ -0,0 +1,45 @@
#! /bin/sh
# Generate test locale files
# Copyright (C) 2000 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
#
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with the GNU C Library; see the file COPYING.LIB. If
# not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
common_objpfx=$1; shift
generate_locale ()
{
charmap=$1
input=$2
out=$3
I18NPATH=. GCONV_PATH=${common_objpfx}iconvdata \
${common_objpfx}elf/ld.so --library-path $common_objpfx \
${common_objpfx}locale/localedef --quiet -c -f $charmap -i $input \
${common_objpfx}localedata/$out
if [ $? -ne 0 ]; then
echo "Charmap: \"${charmap}\" Inputfile: \"${input}\"" \
"Outputdir: \"${out}\" failed"
exit 1
fi
}
generate_locale UTF8 de_DE de_DE.UTF-8
generate_locale ISO-8859-1 de_DE de_DE.ISO-8859-1
generate_locale ISO-8859-1 en_US en_US.ISO-8859-1
generate_locale EUC-JP ja_JP ja_JP.EUC-JP
generate_locale ANSI_X3.4-1968 en_US en_US.ANSI_X3.4-1968

View file

@ -6,29 +6,18 @@ lang=$*
id=${PPID:-100}
here=`pwd`
# Generate data files.
for l in $lang; do
cns=`echo $l | sed 's/\(.*\)[.][^.]*/\1/'`
cn=locales/$cns
fn=charmaps/`echo $l | sed 's/.*[.]\([^.]*\)/\1/'`
I18NPATH=. GCONV_PATH=${common_objpfx}/iconvdata \
${common_objpfx}elf/ld.so --library-path $common_objpfx \
${common_objpfx}locale/localedef --quiet -i $cn -f $fn \
${common_objpfx}localedata/$cns
done
# Run collation tests.
status=0
for l in $lang; do
cns=`echo $l | sed 's/\(.*\)[.][^.]*/\1/'`
LOCPATH=${common_objpfx}localedata GCONV_PATH=${common_objpfx}/iconvdata \
LC_ALL=$cns ${common_objpfx}elf/ld.so --library-path $common_objpfx \
LC_ALL=$l ${common_objpfx}elf/ld.so --library-path $common_objpfx \
${common_objpfx}localedata/collate-test $id < $cns.in \
> ${common_objpfx}localedata/$cns.out || status=1
cmp -s $cns.in ${common_objpfx}localedata/$cns.out || status=1
LOCPATH=${common_objpfx}localedata GCONV_PATH=${common_objpfx}/iconvdata \
LC_ALL=$cns ${common_objpfx}elf/ld.so --library-path $common_objpfx \
LC_ALL=$l ${common_objpfx}elf/ld.so --library-path $common_objpfx \
${common_objpfx}localedata/xfrm-test $id < $cns.in \
> ${common_objpfx}localedata/$cns.xout || status=1
cmp -s $cns.in ${common_objpfx}localedata/$cns.xout || status=1

View file

@ -19,29 +19,6 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
common_objpfx=$1; shift
generate_locale ()
{
charmap=$1
input=$2
out=$3
I18NPATH=. GCONV_PATH=${common_objpfx}iconvdata \
${common_objpfx}elf/ld.so --library-path $common_objpfx \
${common_objpfx}locale/localedef --quiet -c -f $charmap -i $input \
${common_objpfx}localedata/$out
if [ $? -ne 0 ]; then
echo "Charmap: \"${charmap}\" Inputfile: \"${input}\"" \
"Outputdir: \"${out}\" failed"
exit 1
fi
}
generate_locale EUC-JP ja_JP ja_JP.EUC-JP
# XXX This is a hack for now. We need the en_US.ANSI_X3.4-1968 locale
# XXX elsewhere
generate_locale ANSI_X3.4-1968 en_US en_US.ANSI_X3.4-1968
status=0
# Run the test programs.

View file

@ -20,25 +20,6 @@
common_objpfx=$1; shift
generate_locale ()
{
charmap=$1
input=$2
out=$3
I18NPATH=. GCONV_PATH=${common_objpfx}iconvdata \
${common_objpfx}elf/ld.so --library-path $common_objpfx \
${common_objpfx}locale/localedef --quiet -c -f $charmap -i $input \
${common_objpfx}localedata/$out
if [ $? -ne 0 ]; then
echo "Charmap: \"${charmap}\" Inputfile: \"${input}\"" \
"Outputdir: \"${out}\" failed"
exit 1
fi
}
generate_locale UTF8 de_DE de_DE.UTF-8
status=0
# Run the test programs.

View file

@ -1072,6 +1072,7 @@ __printf_fp (FILE *fp,
{
char *buffer = NULL;
char *cp = NULL;
char *tmpptr;
if (! wide)
{
@ -1112,7 +1113,8 @@ __printf_fp (FILE *fp,
*cp++ = (char) *copywc;
}
PRINT (buffer, wstartp, wide ? wcp - wstartp : cp - buffer);
tmpptr = buffer;
PRINT (tmpptr, wstartp, wide ? wcp - wstartp : cp - tmpptr);
/* Free the memory if necessary. */
if (buffer_malloced)

View file

@ -1,5 +1,5 @@
/* Double-precision floating point 2^x.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <geoffk@ozemail.com.au>
@ -27,6 +27,7 @@
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdlib.h>
#include <float.h>
#include <ieee754.h>
#include <math.h>

View file

@ -1,5 +1,5 @@
/* Single-precision floating point 2^x.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <geoffk@ozemail.com.au>
@ -28,6 +28,7 @@
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <stdlib.h>
#include <float.h>
#include <ieee754.h>
#include <math.h>

View file

@ -0,0 +1,54 @@
/* Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _SYS_IPC_H
# error "Never use <bits/ipc.h> directly; include <sys/ipc.h> instead."
#endif
#include <sys/types.h>
/* Mode bits for `msgget', `semget', and `shmget'. */
#define IPC_CREAT 01000 /* Create key if key does not exist. */
#define IPC_EXCL 02000 /* Fail if key exists. */
#define IPC_NOWAIT 04000 /* Return error on wait. */
/* Control commands for `msgctl', `semctl', and `shmctl'. */
#define IPC_RMID 0 /* Remove identifier. */
#define IPC_SET 1 /* Set `ipc_perm' options. */
#define IPC_STAT 2 /* Get `ipc_perm' options. */
#define IPC_INFO 3 /* See ipcs. */
/* Special key values. */
#define IPC_PRIVATE ((__key_t) 0) /* Private key. */
/* Data structure used to pass permission information to IPC operations. */
struct ipc_perm
{
__key_t __key; /* Key. */
__uid_t uid; /* Owner's user ID. */
__gid_t gid; /* Owner's group ID. */
__uid_t cuid; /* Creator's user ID. */
__gid_t cgid; /* Creator's group ID. */
__mode_t mode; /* Read/write permission. */
unsigned short int __seq; /* Sequence number. */
unsigned short int __pad1;
unsigned long int __unused1;
unsigned long int __unused2;
};

View file

@ -0,0 +1,88 @@
/* Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _SYS_SHM_H
# error "Never include <bits/shm.h> directly; use <sys/shm.h> instead."
#endif
#include <sys/types.h>
/* Permission flag for shmget. */
#define SHM_R 0400 /* or S_IRUGO from <linux/stat.h> */
#define SHM_W 0200 /* or S_IWUGO from <linux/stat.h> */
/* Flags for `shmat'. */
#define SHM_RDONLY 010000 /* attach read-only else read-write */
#define SHM_RND 020000 /* round attach address to SHMLBA */
#define SHM_REMAP 040000 /* take-over region on attach */
/* Commands for `shmctl'. */
#define SHM_LOCK 11 /* lock segment (root only) */
#define SHM_UNLOCK 12 /* unlock segment (root only) */
/* Data structure describing a set of semaphores. */
struct shmid_ds
{
struct ipc_perm shm_perm; /* operation permission struct */
size_t shm_segsz; /* size of segment in bytes */
__time_t shm_atime; /* time of last shmat() */
__time_t shm_dtime; /* time of last shmdt() */
__time_t shm_ctime; /* time of last change by shmctl() */
__pid_t shm_cpid; /* pid of creator */
__pid_t shm_lpid; /* pid of last shmop */
unsigned long int shm_nattch; /* number of current attaches */
unsigned long int __unused1;
unsigned long int __unused2;
};
#ifdef __USE_MISC
/* ipcs ctl commands */
# define SHM_STAT 13
# define SHM_INFO 14
/* shm_mode upper byte flags */
# define SHM_DEST 01000 /* segment will be destroyed on last detach */
# define SHM_LOCKED 02000 /* segment will not be swapped */
struct shminfo
{
unsigned long int shmmax;
unsigned long int shmmin;
unsigned long int shmmni;
unsigned long int shmseg;
unsigned long int shmall;
unsigned long int __unused1;
unsigned long int __unused2;
unsigned long int __unused3;
unsigned long int __unused4;
};
struct shm_info
{
int used_ids;
unsigned long int shm_tot; /* total allocated shm */
unsigned long int shm_rss; /* total resident shm */
unsigned long int shm_swp; /* total swapped shm */
unsigned long int swap_attempts;
unsigned long int swap_successes;
};
#endif /* __USE_MISC */

View file

@ -0,0 +1 @@
/* fstatfs64 is the same as fstatfs. */

View file

@ -0,0 +1 @@
/* ftruncate64 is the same as ftruncate. */

View file

@ -0,0 +1 @@
/* getrlimit64 is the same as getrlimit. */

View file

@ -0,0 +1,7 @@
#define glob64 __no_glob64_decl
#define globfree64 __no_globfree64_decl
#include <sysdeps/generic/glob.c>
#undef glob64
#undef globfree64
weak_alias (glob, glob64)
weak_alias (globfree, globfree64)

View file

@ -0,0 +1 @@
/* glob64 is in glob.c */

View file

@ -0,0 +1,211 @@
/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* I/O access is restricted to ISA port space (ports 0..65535).
Modern devices hopefully are sane enough not to put any performance
critical registers in i/o space.
On the first call to ioperm() or iopl(), the entire (E)ISA port
space is mapped into the virtual address space at address io.base.
mprotect() calls are then used to enable/disable access to ports.
Per 4KB page, there are 4 I/O ports. */
#include <errno.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <asm/page.h>
#include <asm/system.h>
#define MAX_PORT 0x10000
/*
* Memory fence w/accept. This should never be used in code that is
* not IA-64 specific.
*/
#define __ia64_mf_a() __asm__ __volatile__ ("mf.a" ::: "memory")
static struct
{
unsigned long int base;
unsigned long int page_mask;
}
io;
__inline__ unsigned long int
io_offset (unsigned long int port)
{
return ((port >> 2) << 12) | (port & 0xfff);
}
int
_ioperm (unsigned long int from, unsigned long int num, int turn_on)
{
unsigned long int addr, len, base;
int prot;
/* this test isn't as silly as it may look like; consider overflows! */
if (from >= MAX_PORT || from + num > MAX_PORT)
{
__set_errno (EINVAL);
return -1;
}
if (turn_on)
{
if (!io.base)
{
unsigned long phys_io_base, len;
int fd;
io.page_mask = ~(getpagesize() - 1);
/* get I/O base physical address from ar.k0 as per PRM: */
__asm__ ("mov %0=ar.k0" : "=r"(phys_io_base));
/* The O_SYNC flag tells the /dev/mem driver to map the
memory uncached: */
fd = open ("/dev/mem", O_RDWR | O_SYNC);
if (fd < 0)
return -1;
len = io_offset (MAX_PORT);
#if 1
/* see comment below */
base = (unsigned long int) __mmap (0, len, PROT_READ | PROT_WRITE, MAP_SHARED,
fd, phys_io_base);
#else
base = (unsigned long int) __mmap (0, len, PROT_NONE, MAP_SHARED,
fd, phys_io_base);
#endif
close (fd);
if ((long) base == -1)
return -1;
io.base = base;
}
prot = PROT_READ | PROT_WRITE;
}
else
{
if (!io.base)
return 0; /* never was turned on... */
prot = PROT_NONE;
}
#if 0
/* We can't do mprotect because that would cause us to lose the
uncached flag that the /dev/mem driver turned on. A MAP_UNCACHED
flag seems so much cleaner... */
addr = (io.base + io_offset (from)) & io.page_mask;
len = io.base + io_offset (from + num) - addr;
return mprotect ((void *) addr, len, prot);
#else
return 0;
#endif
}
int
_iopl (unsigned int level)
{
if (level > 3)
{
__set_errno (EINVAL);
return -1;
}
if (level)
return _ioperm (0, MAX_PORT, 1);
return 0;
}
unsigned int
_inb (unsigned long int port)
{
volatile unsigned char *addr = (void *) io.base + io_offset (port);
unsigned char ret;
ret = *addr;
__ia64_mf_a();
return ret;
}
unsigned int
_inw (unsigned long int port)
{
volatile unsigned short *addr = (void *) io.base + io_offset (port);
unsigned short ret;
ret = *addr;
__ia64_mf_a();
return ret;
}
unsigned int
_inl (unsigned long int port)
{
volatile unsigned int *addr = (void *) io.base + io_offset (port);
unsigned int ret;
ret = *addr;
__ia64_mf_a();
return ret;
}
void
_outb (unsigned char val, unsigned long int port)
{
volatile unsigned char *addr = (void *) io.base + io_offset (port);
*addr = val;
__ia64_mf_a();
}
void
_outw (unsigned short val, unsigned long int port)
{
volatile unsigned short *addr = (void *) io.base + io_offset (port);
*addr = val;
__ia64_mf_a();
}
void
_outl (unsigned int val, unsigned long int port)
{
volatile unsigned int *addr = (void *) io.base + io_offset (port);
*addr = val;
__ia64_mf_a();
}
weak_alias (_ioperm, ioperm);
weak_alias (_iopl, iopl);
weak_alias (_inb, inb);
weak_alias (_inw, inw);
weak_alias (_inl, inl);
weak_alias (_outb, outb);
weak_alias (_outw, outw);
weak_alias (_outl, outl);

View file

@ -0,0 +1 @@
/* Empty since the pread syscall is equivalent. */

View file

@ -0,0 +1 @@
/* Empty since the pread syscall is equivalent. */

View file

@ -0,0 +1,7 @@
#define readdir64 __no_readdir64_decl
#define __readdir64 __no___readdir64_decl
#include <sysdeps/unix/readdir.c>
#undef __readdir64
strong_alias (__readdir, __readdir64)
#undef readdir64
weak_alias (__readdir, readdir64)

View file

@ -0,0 +1 @@
/* readdir64 is in readdir.c */

View file

@ -0,0 +1 @@
/* readdir64_r is in readdir_r.c */

View file

@ -0,0 +1,4 @@
#define readdir64_r __no_readdir64_r_decl
#include <sysdeps/unix/readdir_r.c>
#undef readdir64_r
weak_alias (__readdir_r, readdir64_r)

View file

@ -0,0 +1 @@
/* setrlimit64 is the same as setrlimit. */

View file

@ -0,0 +1,31 @@
/* Copyright (C) 1995, 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <sys/shm.h>
#include <ipc_priv.h>
#include <sysdep.h>
#include <sys/syscall.h>
int
shmctl (int shmid, int cmd, struct shmid_ds *buf)
{
return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl, shmid, cmd, 0, buf);
}

View file

@ -0,0 +1 @@
/* statfs64 is the same as statfs. */

View file

@ -6,7 +6,7 @@ umount2 - umount 2 __umount2 umount2
llseek EXTRA lseek 3 __llseek llseek __lseek64 lseek64
pread - pread 4 __syscall_pread __syscall_pread64 __pread pread __pread64 pread64
pwrite - pwrite 4 __syscall_pwrite __syscall_pwrite64 __pwrite pwrite __pwrite64 pwrite64
fstatfs - fstatfs i:ip __fstatfs fstatfs fstatfs64
fstatfs - fstatfs i:ip __fstatfs fstatfs fstatfs64 __fstatfs64
statfs - statfs i:sp __statfs statfs statfs64
mmap - mmap 6 __mmap mmap __mmap64 mmap64
getpeername - getpeername i:ipp __getpeername getpeername

View file

@ -0,0 +1 @@
/* truncate64 is the same as truncate. */