Attachment "1805887.patch" to
ticket [1805887fff]
added by
dgp
2007-10-12 03:58:38.
Index: compat/strtoll.c
===================================================================
RCS file: compat/strtoll.c
diff -N compat/strtoll.c
--- compat/strtoll.c 16 Apr 2007 13:36:34 -0000 1.9
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,107 +0,0 @@
-/*
- * strtoll.c --
- *
- * Source code for the "strtoll" library procedure.
- *
- * Copyright (c) 1988 The Regents of the University of California.
- * Copyright (c) 1994 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution of
- * this file, and for a DISCLAIMER OF ALL WARRANTIES.
- *
- * RCS: @(#) $Id: strtoll.c,v 1.9 2007/04/16 13:36:34 dkf Exp $
- */
-
-#include "tclInt.h"
-#include <ctype.h>
-
-#define TCL_WIDEINT_MAX (((Tcl_WideUInt)Tcl_LongAsWide(-1))>>1)
-
-
-/*
- *----------------------------------------------------------------------
- *
- * strtoll --
- *
- * Convert an ASCII string into an integer.
- *
- * Results:
- * The return value is the integer equivalent of string. If endPtr is
- * non-NULL, then *endPtr is filled in with the character after the last
- * one that was part of the integer. If string doesn't contain a valid
- * integer value, then zero is returned and *endPtr is set to string.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-#if TCL_WIDE_INT_IS_LONG
-long long
-#else
-Tcl_WideInt
-#endif
-strtoll(
- CONST char *string, /* String of ASCII digits, possibly preceded
- * by white space. For bases greater than 10,
- * either lower- or upper-case digits may be
- * used. */
- char **endPtr, /* Where to store address of terminating
- * character, or NULL. */
- int base) /* Base for conversion. Must be less than 37.
- * If 0, then the base is chosen from the
- * leading characters of string: "0x" means
- * hex, "0" means octal, anything else means
- * decimal. */
-{
- register CONST char *p;
- Tcl_WideInt result = Tcl_LongAsWide(0);
- Tcl_WideUInt uwResult;
-
- /*
- * Skip any leading blanks.
- */
-
- p = string;
- while (isspace(UCHAR(*p))) {
- p += 1;
- }
-
- /*
- * Check for a sign.
- */
-
- errno = 0;
- if (*p == '-') {
- p += 1;
- uwResult = strtoull(p, endPtr, base);
- if (errno != ERANGE) {
- if (uwResult > TCL_WIDEINT_MAX+1) {
- errno = ERANGE;
- return Tcl_LongAsWide(-1);
- } else if (uwResult > TCL_WIDEINT_MAX) {
- return ~((Tcl_WideInt)TCL_WIDEINT_MAX);
- } else {
- result = -((Tcl_WideInt) uwResult);
- }
- }
- } else {
- if (*p == '+') {
- p += 1;
- }
- uwResult = strtoull(p, endPtr, base);
- if (errno != ERANGE) {
- if (uwResult > TCL_WIDEINT_MAX) {
- errno = ERANGE;
- return Tcl_LongAsWide(-1);
- } else {
- result = uwResult;
- }
- }
- }
- if ((result == 0) && (endPtr != 0) && (*endPtr == p)) {
- *endPtr = (char *) string;
- }
- return result;
-}
Index: compat/strtoull.c
===================================================================
RCS file: compat/strtoull.c
diff -N compat/strtoull.c
--- compat/strtoull.c 16 Apr 2007 13:36:34 -0000 1.9
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,255 +0,0 @@
-/*
- * strtoull.c --
- *
- * Source code for the "strtoull" library procedure.
- *
- * Copyright (c) 1988 The Regents of the University of California.
- * Copyright (c) 1994 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution of
- * this file, and for a DISCLAIMER OF ALL WARRANTIES.
- *
- * RCS: @(#) $Id: strtoull.c,v 1.9 2007/04/16 13:36:34 dkf Exp $
- */
-
-#include "tclInt.h"
-#include <ctype.h>
-
-/*
- * The table below is used to convert from ASCII digits to a numerical
- * equivalent. It maps from '0' through 'z' to integers (100 for non-digit
- * characters).
- */
-
-static char cvtIn[] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* '0' - '9' */
- 100, 100, 100, 100, 100, 100, 100, /* punctuation */
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 'A' - 'Z' */
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 33, 34, 35,
- 100, 100, 100, 100, 100, 100, /* punctuation */
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 'a' - 'z' */
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 33, 34, 35};
-
-
-/*
- *----------------------------------------------------------------------
- *
- * strtoull --
- *
- * Convert an ASCII string into an integer.
- *
- * Results:
- * The return value is the integer equivalent of string. If endPtr is
- * non-NULL, then *endPtr is filled in with the character after the last
- * one that was part of the integer. If string doesn't contain a valid
- * integer value, then zero is returned and *endPtr is set to string.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-#if TCL_WIDE_INT_IS_LONG
-unsigned long long
-#else
-Tcl_WideUInt
-#endif
-strtoull(
- CONST char *string, /* String of ASCII digits, possibly preceded
- * by white space. For bases greater than 10,
- * either lower- or upper-case digits may be
- * used. */
- char **endPtr, /* Where to store address of terminating
- * character, or NULL. */
- int base) /* Base for conversion. Must be less than 37.
- * If 0, then the base is chosen from the
- * leading characters of string: "0x" means
- * hex, "0" means octal, anything else means
- * decimal. */
-{
- register CONST char *p;
- register Tcl_WideUInt result = 0;
- register unsigned digit;
- register Tcl_WideUInt shifted;
- int anyDigits = 0, negative = 0;
-
- /*
- * Skip any leading blanks.
- */
-
- p = string;
- while (isspace(UCHAR(*p))) { /* INTL: locale-dependent */
- p += 1;
- }
-
- /*
- * Check for a sign.
- */
-
- if (*p == '-') {
- p += 1;
- negative = 1;
- } else {
- if (*p == '+') {
- p += 1;
- }
- }
-
- /*
- * If no base was provided, pick one from the leading characters of the
- * string.
- */
-
- if (base == 0) {
- if (*p == '0') {
- p += 1;
- if (*p == 'x' || *p == 'X') {
- p += 1;
- base = 16;
- } else {
- /*
- * Must set anyDigits here, otherwise "0" produces a "no
- * digits" error.
- */
-
- anyDigits = 1;
- base = 8;
- }
- } else {
- base = 10;
- }
- } else if (base == 16) {
- /*
- * Skip a leading "0x" from hex numbers.
- */
-
- if ((p[0] == '0') && (p[1] == 'x' || *p == 'X')) {
- p += 2;
- }
- }
-
- /*
- * Sorry this code is so messy, but speed seems important. Do different
- * things for base 8, 10, 16, and other.
- */
-
- if (base == 8) {
- for ( ; ; p += 1) {
- digit = *p - '0';
- if (digit > 7) {
- break;
- }
- shifted = result << 3;
- if ((shifted >> 3) != result) {
- goto overflow;
- }
- result = shifted + digit;
- if ( result < shifted ) {
- goto overflow;
- }
- anyDigits = 1;
- }
- } else if (base == 10) {
- for ( ; ; p += 1) {
- digit = *p - '0';
- if (digit > 9) {
- break;
- }
- shifted = 10 * result;
- if ((shifted / 10) != result) {
- goto overflow;
- }
- result = shifted + digit;
- if ( result < shifted ) {
- goto overflow;
- }
- anyDigits = 1;
- }
- } else if (base == 16) {
- for ( ; ; p += 1) {
- digit = *p - '0';
- if (digit > ('z' - '0')) {
- break;
- }
- digit = cvtIn[digit];
- if (digit > 15) {
- break;
- }
- shifted = result << 4;
- if ((shifted >> 4) != result) {
- goto overflow;
- }
- result = shifted + digit;
- if ( result < shifted ) {
- goto overflow;
- }
- anyDigits = 1;
- }
- } else if ( base >= 2 && base <= 36 ) {
- for ( ; ; p += 1) {
- digit = *p - '0';
- if (digit > ('z' - '0')) {
- break;
- }
- digit = cvtIn[digit];
- if (digit >= (unsigned) base) {
- break;
- }
- shifted = result * base;
- if ((shifted/base) != result) {
- goto overflow;
- }
- result = shifted + digit;
- if ( result < shifted ) {
- goto overflow;
- }
- anyDigits = 1;
- }
- }
-
- /*
- * Negate if we found a '-' earlier.
- */
-
- if (negative) {
- result = (Tcl_WideUInt)(-((Tcl_WideInt)result));
- }
-
- /*
- * See if there were any digits at all.
- */
-
- if (!anyDigits) {
- p = string;
- }
-
- if (endPtr != 0) {
- *endPtr = (char *) p;
- }
-
- return result;
-
- /*
- * On overflow generate the right output
- */
-
- overflow:
- errno = ERANGE;
- if (endPtr != 0) {
- for ( ; ; p += 1) {
- digit = *p - '0';
- if (digit > ('z' - '0')) {
- break;
- }
- digit = cvtIn[digit];
- if (digit >= (unsigned) base) {
- break;
- }
- }
- *endPtr = (char *) p;
- }
- return (Tcl_WideUInt)Tcl_LongAsWide(-1);
-}
Index: generic/tcl.h
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tcl.h,v
retrieving revision 1.238
diff -u -r1.238 tcl.h
--- generic/tcl.h 2 Oct 2007 21:54:06 -0000 1.238
+++ generic/tcl.h 11 Oct 2007 20:56:04 -0000
@@ -348,8 +348,9 @@
* longVal == Tcl_WideAsLong(Tcl_LongAsWide(longVal))
*
* Note on converting between Tcl_WideInt and strings. This implementation (in
- * tclObj.c) depends on the functions strtoull() and sprintf(...,"%"
- * TCL_LL_MODIFIER "d",...). TCL_LL_MODIFIER_SIZE is the length of the
+ * tclObj.c) depends on the function and
+ * sprintf(...,"%" TCL_LL_MODIFIER "d",...).
+ * TCL_LL_MODIFIER_SIZE is the length of the
* modifier string, which is "ll" on most 32-bit Unix systems. It has to be
* split up like this to allow for the more complex formats sometimes needed
* (e.g. in the format(n) command.)
Index: generic/tclCmdMZ.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclCmdMZ.c,v
retrieving revision 1.154
diff -u -r1.154 tclCmdMZ.c
--- generic/tclCmdMZ.c 12 Aug 2007 21:58:11 -0000 1.154
+++ generic/tclCmdMZ.c 11 Oct 2007 20:56:04 -0000
@@ -1401,7 +1401,7 @@
break;
}
case STR_IS: {
- char *end;
+ char *end, *stop;
Tcl_UniChar ch;
/*
@@ -1521,8 +1521,6 @@
chcomp = Tcl_UniCharIsDigit;
break;
case STR_IS_DOUBLE: {
- char *stop;
-
/* TODO */
if ((objPtr->typePtr == &tclDoubleType) ||
(objPtr->typePtr == &tclIntType) ||
@@ -1549,49 +1547,53 @@
case STR_IS_GRAPH:
chcomp = Tcl_UniCharIsGraph;
break;
- case STR_IS_INT: {
- char *stop;
- long int l = 0;
-
- if (TCL_OK == Tcl_GetIntFromObj(NULL, objPtr, &i)) {
+ case STR_IS_INT:
+ case STR_IS_WIDE:
+ if ((((enum isOptions) index) == STR_IS_INT)
+ && (TCL_OK == Tcl_GetIntFromObj(NULL, objPtr, &i))) {
+ break;
+ }
+ if ((((enum isOptions) index) == STR_IS_WIDE)
+ && (TCL_OK == Tcl_GetWideIntFromObj(NULL, objPtr, &w))) {
break;
}
-
- /*
- * Like STR_IS_DOUBLE, but we use strtoul. Since Tcl_GetIntFromObj
- * already failed, we set result to 0.
- */
result = 0;
- errno = 0;
- l = strtol(string1, &stop, 0); /* INTL: Tcl source. */
- if ((errno == ERANGE) || (l > INT_MAX) || (l < INT_MIN)) {
- /*
- * if (errno == ERANGE) or the long value won't fit in an int,
- * then it was an over/underflow problem, but in this method,
- * we only want to know yes or no, so bad flow returns 0
- * (false) and sets the failVarObj to the string length.
- */
- failat = -1;
- } else if (stop == string1) {
+ if (failVarObj == NULL) {
/*
- * In this case, nothing like a number was found
+ * Don't bother computing the failure point if we're not
+ * going to return it.
*/
-
- failat = 0;
+ break;
+ }
+ if (TclParseNumber(NULL, objPtr, NULL, NULL, -1,
+ (const char **) &stop, TCL_PARSE_INTEGER_ONLY) == TCL_OK) {
+ if (stop == end) {
+ /*
+ * Entire string parses as an integer, but rejected by
+ * Tcl_Get(Wide)IntFromObj() so we must have overflowed
+ * the target type, and our convention is to return
+ * failure at index -1 in that situation.
+ */
+ failat = -1;
+ } else {
+ /*
+ * Some prefix parsed as an integer, but not the whole
+ * string, so return failure index as the point where
+ * parsing stopped. Clear out the internal rep, since
+ * keeping it would leave *objPtr in an inconsistent
+ * state.
+ */
+ failat = stop - string1;
+ TclFreeIntRep(objPtr);
+ objPtr->typePtr = NULL;
+ }
} else {
- /*
- * Assume we sucked up one char per byte and then we go onto
- * SPACE, since we are allowed trailing whitespace.
- */
-
- failat = stop - string1;
- string1 = stop;
- chcomp = Tcl_UniCharIsSpace;
+ /* No prefix is a valid integer. Fail at beginning. */
+ failat = 0;
}
break;
- }
case STR_IS_LIST:
/*
* We ignore the strictness here, since empty strings are always
@@ -1661,47 +1663,6 @@
case STR_IS_UPPER:
chcomp = Tcl_UniCharIsUpper;
break;
- case STR_IS_WIDE: {
- char *stop;
-
- if (TCL_OK == Tcl_GetWideIntFromObj(NULL, objPtr, &w)) {
- break;
- }
-
- /*
- * Like STR_IS_DOUBLE, but we use strtoll. Since
- * Tcl_GetWideIntFromObj already failed, we set result to 0.
- */
-
- result = 0;
- errno = 0;
- w = strtoll(string1, &stop, 0); /* INTL: Tcl source. */
- if (errno == ERANGE) {
- /*
- * If (errno == ERANGE), then it was an over/underflow
- * problem, but in this method, we only want to know yes or
- * no, so bad flow returns 0 (false) and sets the failVarObj
- * to the string length.
- */
-
- failat = -1;
- } else if (stop == string1) {
- /*
- * In this case, nothing like a number was found
- */
- failat = 0;
- } else {
- /*
- * Assume we sucked up one char per byte and then we go onto
- * SPACE, since we are allowed trailing whitespace.
- */
-
- failat = stop - string1;
- string1 = stop;
- chcomp = Tcl_UniCharIsSpace;
- }
- break;
- }
case STR_IS_WORD:
chcomp = Tcl_UniCharIsWordChar;
break;
Index: tests/string.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/string.test,v
retrieving revision 1.63
diff -u -r1.63 string.test
--- tests/string.test 8 Jun 2007 20:56:42 -0000 1.63
+++ tests/string.test 11 Oct 2007 20:56:06 -0000
@@ -482,6 +482,9 @@
test string-6.58 {string is integer, false on bad octal} {
list [string is integer -fail var 036963] $var
} {0 3}
+test string-6.58.1 {string is integer, false on bad octal} {
+ list [string is integer -fail var 0o36963] $var
+} {0 4}
test string-6.59 {string is integer, false on bad hex} {
list [string is integer -fail var 0X345XYZ] $var
} {0 5}
@@ -649,6 +652,9 @@
test string-6.105 {string is wideinteger, false on bad octal} {
list [string is wideinteger -fail var 036963] $var
} {0 3}
+test string-6.105.1 {string is wideinteger, false on bad octal} {
+ list [string is wideinteger -fail var 0o36963] $var
+} {0 4}
test string-6.106 {string is wideinteger, false on bad hex} {
list [string is wideinteger -fail var 0X345XYZ] $var
} {0 5}
Index: unix/Makefile.in
===================================================================
RCS file: /cvsroot/tcl/tcl/unix/Makefile.in,v
retrieving revision 1.221
diff -u -r1.221 Makefile.in
--- unix/Makefile.in 17 Sep 2007 16:24:49 -0000 1.221
+++ unix/Makefile.in 11 Oct 2007 20:56:06 -0000
@@ -1501,15 +1501,9 @@
strtol.o: $(COMPAT_DIR)/strtol.c
$(CC) -c $(STUB_CC_SWITCHES) $(COMPAT_DIR)/strtol.c
-strtoll.o: $(COMPAT_DIR)/strtoll.c
- $(CC) -c $(STUB_CC_SWITCHES) $(COMPAT_DIR)/strtoll.c
-
strtoul.o: $(COMPAT_DIR)/strtoul.c
$(CC) -c $(STUB_CC_SWITCHES) $(COMPAT_DIR)/strtoul.c
-strtoull.o: $(COMPAT_DIR)/strtoull.c
- $(CC) -c $(STUB_CC_SWITCHES) $(COMPAT_DIR)/strtoull.c
-
tmpnam.o: $(COMPAT_DIR)/tmpnam.c
$(CC) -c $(STUB_CC_SWITCHES) $(COMPAT_DIR)/tmpnam.c
Index: unix/configure
===================================================================
RCS file: /cvsroot/tcl/tcl/unix/configure,v
retrieving revision 1.205
diff -u -r1.205 configure
--- unix/configure 2 Oct 2007 18:27:30 -0000 1.205
+++ unix/configure 11 Oct 2007 20:56:06 -0000
@@ -9654,9 +9654,7 @@
-
-
-for ac_func in opendir strtol strtoll strtoull tmpnam waitpid
+for ac_func in opendir strtol tmpnam waitpid
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:$LINENO: checking for $ac_func" >&5
Index: unix/configure.in
===================================================================
RCS file: /cvsroot/tcl/tcl/unix/configure.in,v
retrieving revision 1.163
diff -u -r1.163 configure.in
--- unix/configure.in 2 Oct 2007 18:27:30 -0000 1.163
+++ unix/configure.in 11 Oct 2007 20:56:06 -0000
@@ -151,7 +151,7 @@
# Nb: if getcwd uses popen and pwd(1) (like SunOS 4) we should really
# define USEGETWD even if the posix getcwd exists. Add a test ?
-AC_REPLACE_FUNCS(opendir strtol strtoll strtoull tmpnam waitpid)
+AC_REPLACE_FUNCS(opendir strtol tmpnam waitpid)
AC_CHECK_FUNC(strerror, , [AC_DEFINE(NO_STRERROR, 1, [Do we have strerror()])])
AC_CHECK_FUNC(getwd, , [AC_DEFINE(NO_GETWD, 1, [Do we have getwd()])])
AC_CHECK_FUNC(wait3, , [AC_DEFINE(NO_WAIT3, 1, [Do we have wait3()])])
Index: unix/tclUnixPort.h
===================================================================
RCS file: /cvsroot/tcl/tcl/unix/tclUnixPort.h,v
retrieving revision 1.57
diff -u -r1.57 tclUnixPort.h
--- unix/tclUnixPort.h 7 Aug 2007 05:04:21 -0000 1.57
+++ unix/tclUnixPort.h 11 Oct 2007 20:56:06 -0000
@@ -79,13 +79,6 @@
# define TclOSlstat lstat
#endif
-#if !HAVE_STRTOLL && defined(TCL_WIDE_INT_TYPE) && !TCL_WIDE_INT_IS_LONG
-EXTERN Tcl_WideInt strtoll _ANSI_ARGS_((CONST char *string,
- char **endPtr, int base));
-EXTERN Tcl_WideUInt strtoull _ANSI_ARGS_((CONST char *string,
- char **endPtr, int base));
-#endif
-
#include <sys/file.h>
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
Index: win/Makefile.in
===================================================================
RCS file: /cvsroot/tcl/tcl/win/Makefile.in,v
retrieving revision 1.118
diff -u -r1.118 Makefile.in
--- win/Makefile.in 12 Sep 2007 16:43:37 -0000 1.118
+++ win/Makefile.in 11 Oct 2007 20:56:06 -0000
@@ -359,9 +359,6 @@
tclWinThrd.$(OBJEXT) \
tclWinTime.$(OBJEXT)
-COMPAT_OBJS = \
- strtoll.$(OBJEXT) strtoull.$(OBJEXT)
-
PIPE_OBJS = stub16.$(OBJEXT)
DDE_OBJS = tclWinDde.$(OBJEXT)
@@ -372,7 +369,7 @@
TCLSH_OBJS = tclAppInit.$(OBJEXT)
-TCL_OBJS = ${GENERIC_OBJS} $(TOMMATH_OBJS) ${WIN_OBJS} ${COMPAT_OBJS}
+TCL_OBJS = ${GENERIC_OBJS} $(TOMMATH_OBJS) ${WIN_OBJS}
TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n]
Index: win/makefile.bc
===================================================================
RCS file: /cvsroot/tcl/tcl/win/makefile.bc,v
retrieving revision 1.29
diff -u -r1.29 makefile.bc
--- win/makefile.bc 28 Jun 2007 21:24:58 -0000 1.29
+++ win/makefile.bc 11 Oct 2007 20:56:07 -0000
@@ -193,8 +193,6 @@
$(TMPDIR)\regexec.obj \
$(TMPDIR)\regfree.obj \
$(TMPDIR)\regerror.obj \
- $(TMPDIR)\strtoll.obj \
- $(TMPDIR)\strtoull.obj \
$(TMPDIR)\tclAlloc.obj \
$(TMPDIR)\tclAsync.obj \
$(TMPDIR)\tclBasic.obj \
Index: win/makefile.vc
===================================================================
RCS file: /cvsroot/tcl/tcl/win/makefile.vc,v
retrieving revision 1.166
diff -u -r1.166 makefile.vc
--- win/makefile.vc 18 Sep 2007 16:07:51 -0000 1.166
+++ win/makefile.vc 11 Oct 2007 20:56:07 -0000
@@ -252,8 +252,6 @@
$(TMP_DIR)\regerror.obj \
$(TMP_DIR)\regexec.obj \
$(TMP_DIR)\regfree.obj \
- $(TMP_DIR)\strtoll.obj \
- $(TMP_DIR)\strtoull.obj \
$(TMP_DIR)\tclAlloc.obj \
$(TMP_DIR)\tclAsync.obj \
$(TMP_DIR)\tclBasic.obj \
Index: win/tclWinPort.h
===================================================================
RCS file: /cvsroot/tcl/tcl/win/tclWinPort.h,v
retrieving revision 1.48
diff -u -r1.48 tclWinPort.h
--- win/tclWinPort.h 27 Nov 2005 02:33:50 -0000 1.48
+++ win/tclWinPort.h 11 Oct 2007 20:56:07 -0000
@@ -520,13 +520,6 @@
#define TclpExit exit
-#ifdef TCL_WIDE_INT_TYPE
-MODULE_SCOPE Tcl_WideInt strtoll _ANSI_ARGS_((CONST char *string,
- char **endPtr, int base));
-MODULE_SCOPE Tcl_WideUInt strtoull _ANSI_ARGS_((CONST char *string,
- char **endPtr, int base));
-#endif /* TCL_WIDE_INT_TYPE */
-
#ifndef INVALID_SET_FILE_POINTER
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
#endif /* INVALID_SET_FILE_POINTER */