From loewis@users.sourceforge.net Thu May 1 06:05:11 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Wed, 30 Apr 2003 22:05:11 -0700 Subject: [Python-checkins] python/dist/src/Lib DocXMLRPCServer.py,1.2,1.3 SimpleXMLRPCServer.py,1.4,1.5 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv23617 Modified Files: DocXMLRPCServer.py SimpleXMLRPCServer.py Log Message: Patch #727805: Remove extra line ending from CGI responses. Index: DocXMLRPCServer.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/DocXMLRPCServer.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** DocXMLRPCServer.py 24 Apr 2003 16:02:41 -0000 1.2 --- DocXMLRPCServer.py 1 May 2003 05:05:08 -0000 1.3 *************** *** 15,18 **** --- 15,19 ---- import types import re + import sys from SimpleXMLRPCServer import SimpleXMLRPCServer,\ *************** *** 270,274 **** print 'Content-Length: %d' % len(response) print ! print response def __init__(self): --- 271,275 ---- print 'Content-Length: %d' % len(response) print ! sys.stdout.write(response) def __init__(self): Index: SimpleXMLRPCServer.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/SimpleXMLRPCServer.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** SimpleXMLRPCServer.py 29 Jan 2003 03:49:42 -0000 1.4 --- SimpleXMLRPCServer.py 1 May 2003 05:05:09 -0000 1.5 *************** *** 463,467 **** print 'Content-Length: %d' % len(response) print ! print response def handle_get(self): --- 463,467 ---- print 'Content-Length: %d' % len(response) print ! sys.stdout.write(response) def handle_get(self): *************** *** 486,490 **** print 'Content-Length: %d' % len(response) print ! print response def handle_request(self, request_text = None): --- 486,490 ---- print 'Content-Length: %d' % len(response) print ! sys.stdout.write(reponse) def handle_request(self, request_text = None): From loewis@users.sourceforge.net Thu May 1 06:20:48 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Wed, 30 Apr 2003 22:20:48 -0700 Subject: [Python-checkins] python/dist/src/Modules socketmodule.c,1.260,1.261 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv27238/Modules Modified Files: socketmodule.c Log Message: Patch #725942: Always rename emulation functions. Index: socketmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/socketmodule.c,v retrieving revision 1.260 retrieving revision 1.261 diff -C2 -d -r1.260 -r1.261 *** socketmodule.c 25 Apr 2003 05:48:32 -0000 1.260 --- socketmodule.c 1 May 2003 05:20:46 -0000 1.261 *************** *** 252,257 **** older releases don't have */ #undef HAVE_GETADDRINFO - /* avoid clashes with the C library definition of the symbol. */ - #define getaddrinfo fake_getaddrinfo #endif #endif --- 252,255 ---- *************** *** 259,265 **** --- 257,268 ---- /* I know this is a bad practice, but it is the easiest... */ #if !defined(HAVE_GETADDRINFO) + /* avoid clashes with the C library definition of the symbol. */ + #define getaddrinfo fake_getaddrinfo + #define gai_strerror fake_gai_strerror + #define freeaddrinfo fake_freeaddrinfo #include "getaddrinfo.c" #endif #if !defined(HAVE_GETNAMEINFO) + #define getnameinfo fake_getnameinfo #include "getnameinfo.c" #endif From loewis@users.sourceforge.net Thu May 1 06:25:32 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Wed, 30 Apr 2003 22:25:32 -0700 Subject: [Python-checkins] python/dist/src/Python pystate.c,2.26,2.27 Message-ID: Update of /cvsroot/python/python/dist/src/Python In directory sc8-pr-cvs1:/tmp/cvs-serv28542 Modified Files: pystate.c Log Message: Patch #729300: Disable error message if Python is not built for threads. Index: pystate.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/pystate.c,v retrieving revision 2.26 retrieving revision 2.27 diff -C2 -d -r2.26 -r2.27 *** pystate.c 19 Apr 2003 15:41:49 -0000 2.26 --- pystate.c 1 May 2003 05:25:29 -0000 2.27 *************** *** 265,269 **** builds. */ ! #if defined(Py_DEBUG) if (new) { PyThreadState *check = PyGILState_GetThisThreadState(); --- 265,269 ---- builds. */ ! #if defined(Py_DEBUG) && defined(WITH_THREAD) if (new) { PyThreadState *check = PyGILState_GetThisThreadState(); From loewis@users.sourceforge.net Thu May 1 06:47:03 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Wed, 30 Apr 2003 22:47:03 -0700 Subject: [Python-checkins] python/dist/src/Modules _tkinter.c,1.155,1.156 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv1108 Modified Files: _tkinter.c Log Message: Convert tcl objects to strings in getvar/setvar. Fixes #730506. Index: _tkinter.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/_tkinter.c,v retrieving revision 1.155 retrieving revision 1.156 diff -C2 -d -r1.155 -r1.156 *** _tkinter.c 16 Apr 2003 20:34:55 -0000 1.155 --- _tkinter.c 1 May 2003 05:47:00 -0000 1.156 *************** *** 743,746 **** --- 743,752 ---- } + static char* + PyTclObject_TclString(PyObject *self) + { + return Tcl_GetString(((PyTclObject*)self)->value); + } + /* Like _str, but create Unicode if necessary. */ PyDoc_STRVAR(PyTclObject_string__doc__, *************** *** 1467,1470 **** --- 1473,1492 ---- } VarEvent; + static int + varname_converter(PyObject *in, void *_out) + { + char **out = (char**)_out; + if (PyString_Check(in)) { + *out = PyString_AsString(in); + return 1; + } + if (PyTclObject_Check(in)) { + *out = PyTclObject_TclString(in); + return 1; + } + /* XXX: Should give diagnostics. */ + return 0; + } + void var_perform(VarEvent *ev) *************** *** 1543,1547 **** Tcl_Obj *newval, *ok; ! if (PyArg_ParseTuple(args, "sO:setvar", &name1, &newValue)) { /* XXX Acquire tcl lock??? */ newval = AsObj(newValue); --- 1565,1570 ---- Tcl_Obj *newval, *ok; ! if (PyArg_ParseTuple(args, "O&O:setvar", ! varname_converter, &name1, &newValue)) { /* XXX Acquire tcl lock??? */ newval = AsObj(newValue); *************** *** 1605,1609 **** Tcl_Obj *tres; ! if (!PyArg_ParseTuple(args, "s|s:getvar", &name1, &name2)) return NULL; --- 1628,1633 ---- Tcl_Obj *tres; ! if (!PyArg_ParseTuple(args, "O&|s:getvar", ! varname_converter, &name1, &name2)) return NULL; From doerwalter@users.sourceforge.net Thu May 1 14:12:37 2003 From: doerwalter@users.sourceforge.net (doerwalter@users.sourceforge.net) Date: Thu, 01 May 2003 06:12:37 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_bool.py,1.10,1.11 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv16487/Lib/test Modified Files: test_bool.py Log Message: Consistently use test_support.foo everywhere. Remove the last use of veris(). Remove now useless imports and functions. Index: test_bool.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_bool.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** test_bool.py 27 Apr 2003 07:54:23 -0000 1.10 --- test_bool.py 1 May 2003 13:12:34 -0000 1.11 *************** *** 6,19 **** import os - from test.test_support import verbose, TestFailed, TESTFN, vereq, have_unicode - - def veris(a, b): - if a is not b: - raise TestFailed, "%r is %r" % (a, b) - - def verisnot(a, b): - if a is b: - raise TestFailed, "%r is %r" % (a, b) - class BoolTest(unittest.TestCase): --- 6,9 ---- *************** *** 218,222 **** self.assertIs("xyz".startswith("z"), False) ! if have_unicode: self.assertIs(unicode("xyz", 'ascii').endswith(unicode("z", 'ascii')), True) self.assertIs(unicode("xyz", 'ascii').endswith(unicode("x", 'ascii')), False) --- 208,212 ---- self.assertIs("xyz".startswith("z"), False) ! if test_support.have_unicode: self.assertIs(unicode("xyz", 'ascii').endswith(unicode("z", 'ascii')), True) self.assertIs(unicode("xyz", 'ascii').endswith(unicode("x", 'ascii')), False) *************** *** 257,266 **** def test_fileclosed(self): try: ! f = file(TESTFN, "w") self.assertIs(f.closed, False) f.close() self.assertIs(f.closed, True) finally: ! os.remove(TESTFN) def test_operator(self): --- 247,256 ---- def test_fileclosed(self): try: ! f = file(test_support.TESTFN, "w") self.assertIs(f.closed, False) f.close() self.assertIs(f.closed, True) finally: ! os.remove(test_support.TESTFN) def test_operator(self): *************** *** 289,294 **** def test_marshal(self): import marshal ! veris(marshal.loads(marshal.dumps(True)), True) ! veris(marshal.loads(marshal.dumps(False)), False) def test_pickle(self): --- 279,284 ---- def test_marshal(self): import marshal ! self.assertIs(marshal.loads(marshal.dumps(True)), True) ! self.assertIs(marshal.loads(marshal.dumps(False)), False) def test_pickle(self): From doerwalter@users.sourceforge.net Thu May 1 18:46:11 2003 From: doerwalter@users.sourceforge.net (doerwalter@users.sourceforge.net) Date: Thu, 01 May 2003 10:46:11 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_StringIO.py,1.15,1.16 test___all__.py,1.29,1.30 test_base64.py,1.5,1.6 test_bisect.py,1.8,1.9 test_bool.py,1.11,1.12 test_builtin.py,1.18,1.19 test_bz2.py,1.13,1.14 test_calendar.py,1.4,1.5 test_call.py,1.3,1.4 test_cfgparser.py,1.19,1.20 test_charmapcodec.py,1.6,1.7 test_codeccallbacks.py,1.11,1.12 test_codecs.py,1.8,1.9 test_copy.py,1.7,1.8 test_cpickle.py,1.14,1.15 test_csv.py,1.5,1.6 test_dummy_thread.py,1.3,1.4 test_enumerate.py,1.3,1.4 test_filecmp.py,1.1,1.2 test_getargs2.py,1.4,1.5 test_grp.py,1.15,1.16 test_hexoct.py,1.3,1.4 test_hmac.py,1.6,1.7 test_isinstance.py,1.6,1.7 test_itertools.py,1.5,1.6 test_optparse.py,1.1,1.2 test_os.py,1.17,1.18 test_parser.py,1.16,1.17 test_pep277.py,1.5,1.6 test_pickle.py,1.17,1.18 test_posix.py,1.5,1.6 test_pow.py,1.17,1.18 test_profilehooks.py,1.9,1.10 test_pwd.py,1.16,1.17 test_re.py,1.41,1.42 test_richcmp.py,1.8,1.9 test_sets.py,1.23,1.24 test_shelve.py,1.4,1.5 test_shutil.py,1.1,1.2 test_socket.py,1.63,1.64 test_str.py,1.2,1.3 test_string.py,1.24,1.25 test_strptime.py,1.12,1.13 test_support.py,1.51,1.52 test_sys.py,1.6,1.7 test_tarfile.py,1.7,1.8 test_tempfile.py,1.13,1.14 test_textwrap.py,1.18,1.19 test_timeout.py,1.13,1.14 test_trace.py,1.8,1.9 test_ucn.py,1.13,1.14 test_unicode.py,1.82,1.83 test_unicodedata.py,1.8,1.9 test_univnewlines.py,1.4,1.5 test_urllib.py,1.12,1.13 test_urllibnet.py,1.1,1.2 test_userdict.py,1.14,1.15 test_userlist.py,1.8,1.9 test_userstring.py,1.10,1.11 test_weakref.py,1.22,1.23 test_xpickle.py,1.3,1.4 test_zipimport.py,1.7,1.8 test_zlib.py,1.22,1.23 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv18305 Modified Files: test_StringIO.py test___all__.py test_base64.py test_bisect.py test_bool.py test_builtin.py test_bz2.py test_calendar.py test_call.py test_cfgparser.py test_charmapcodec.py test_codeccallbacks.py test_codecs.py test_copy.py test_cpickle.py test_csv.py test_dummy_thread.py test_enumerate.py test_filecmp.py test_getargs2.py test_grp.py test_hexoct.py test_hmac.py test_isinstance.py test_itertools.py test_optparse.py test_os.py test_parser.py test_pep277.py test_pickle.py test_posix.py test_pow.py test_profilehooks.py test_pwd.py test_re.py test_richcmp.py test_sets.py test_shelve.py test_shutil.py test_socket.py test_str.py test_string.py test_strptime.py test_support.py test_sys.py test_tarfile.py test_tempfile.py test_textwrap.py test_timeout.py test_trace.py test_ucn.py test_unicode.py test_unicodedata.py test_univnewlines.py test_urllib.py test_urllibnet.py test_userdict.py test_userlist.py test_userstring.py test_weakref.py test_xpickle.py test_zipimport.py test_zlib.py Log Message: Combine the functionality of test_support.run_unittest() and test_support.run_classtests() into run_unittest() and use it wherever possible. Also don't use "from test.test_support import ...", but "from test import test_support" in a few spots. >From SF patch #662807. Index: test_StringIO.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_StringIO.py,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** test_StringIO.py 24 Apr 2003 15:50:10 -0000 1.15 --- test_StringIO.py 1 May 2003 17:45:30 -0000 1.16 *************** *** 106,113 **** def test_main(): ! test_support.run_unittest(TestStringIO) ! test_support.run_unittest(TestcStringIO) ! test_support.run_unittest(TestBufferStringIO) ! test_support.run_unittest(TestBuffercStringIO) if __name__ == '__main__': --- 106,115 ---- def test_main(): ! test_support.run_unittest( ! TestStringIO, ! TestcStringIO, ! TestBufferStringIO, ! TestBuffercStringIO ! ) if __name__ == '__main__': Index: test___all__.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test___all__.py,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** test___all__.py 15 Apr 2003 11:10:33 -0000 1.29 --- test___all__.py 1 May 2003 17:45:31 -0000 1.30 *************** *** 193,199 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(AllTest)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 193,197 ---- def test_main(): ! test_support.run_unittest(AllTest) if __name__ == "__main__": Index: test_base64.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_base64.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** test_base64.py 22 Aug 2002 19:18:56 -0000 1.5 --- test_base64.py 1 May 2003 17:45:31 -0000 1.6 *************** *** 1,15 **** ! from unittest import TestCase ! from test.test_support import vereq, run_unittest ! from base64 import encodestring, decodestring ! class Base64TestCase(TestCase): def test_encodestring(self): ! vereq(encodestring("www.python.org"), "d3d3LnB5dGhvbi5vcmc=\n") ! vereq(encodestring("a"), "YQ==\n") ! vereq(encodestring("ab"), "YWI=\n") ! vereq(encodestring("abc"), "YWJj\n") ! vereq(encodestring(""), "") ! vereq(encodestring("abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789!@#0^&*();:<>,. []{}"), --- 1,15 ---- ! import unittest ! from test import test_support ! import base64 ! class Base64TestCase(unittest.TestCase): def test_encodestring(self): ! self.assertEqual(base64.encodestring("www.python.org"), "d3d3LnB5dGhvbi5vcmc=\n") ! self.assertEqual(base64.encodestring("a"), "YQ==\n") ! self.assertEqual(base64.encodestring("ab"), "YWI=\n") ! self.assertEqual(base64.encodestring("abc"), "YWJj\n") ! self.assertEqual(base64.encodestring(""), "") ! self.assertEqual(base64.encodestring("abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789!@#0^&*();:<>,. []{}"), *************** *** 19,27 **** def test_decodestring(self): ! vereq(decodestring("d3d3LnB5dGhvbi5vcmc=\n"), "www.python.org") ! vereq(decodestring("YQ==\n"), "a") ! vereq(decodestring("YWI=\n"), "ab") ! vereq(decodestring("YWJj\n"), "abc") ! vereq(decodestring("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE" "RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT" "Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n"), --- 19,27 ---- def test_decodestring(self): ! self.assertEqual(base64.decodestring("d3d3LnB5dGhvbi5vcmc=\n"), "www.python.org") ! self.assertEqual(base64.decodestring("YQ==\n"), "a") ! self.assertEqual(base64.decodestring("YWI=\n"), "ab") ! self.assertEqual(base64.decodestring("YWJj\n"), "abc") ! self.assertEqual(base64.decodestring("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE" "RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT" "Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==\n"), *************** *** 29,36 **** "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789!@#0^&*();:<>,. []{}") ! vereq(decodestring(''), '') def test_main(): ! run_unittest(Base64TestCase) if __name__ == "__main__": --- 29,36 ---- "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789!@#0^&*();:<>,. []{}") ! self.assertEqual(base64.decodestring(''), '') def test_main(): ! test_support.run_unittest(Base64TestCase) if __name__ == "__main__": Index: test_bisect.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_bisect.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** test_bisect.py 27 Apr 2003 07:54:23 -0000 1.8 --- test_bisect.py 1 May 2003 17:45:32 -0000 1.9 *************** *** 199,204 **** def test_main(verbose=None): from test import test_bisect ! test_support.run_classtests(TestBisect, ! TestInsort) test_support.run_doctest(test_bisect, verbose) --- 199,203 ---- def test_main(verbose=None): from test import test_bisect ! test_support.run_unittest(TestBisect, TestInsort) test_support.run_doctest(test_bisect, verbose) Index: test_bool.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_bool.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** test_bool.py 1 May 2003 13:12:34 -0000 1.11 --- test_bool.py 1 May 2003 17:45:32 -0000 1.12 *************** *** 322,326 **** def test_main(): ! test_support.run_classtests(BoolTest) if __name__ == "__main__": --- 322,326 ---- def test_main(): ! test_support.run_unittest(BoolTest) if __name__ == "__main__": Index: test_builtin.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_builtin.py,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** test_builtin.py 22 Apr 2003 08:12:30 -0000 1.18 --- test_builtin.py 1 May 2003 17:45:33 -0000 1.19 *************** *** 1220,1226 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(BuiltinTest)) ! test.test_support.run_suite(suite) if __name__ == "__main__": --- 1220,1224 ---- def test_main(): ! test.test_support.run_unittest(BuiltinTest) if __name__ == "__main__": Index: test_bz2.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_bz2.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** test_bz2.py 29 Apr 2003 14:53:08 -0000 1.13 --- test_bz2.py 1 May 2003 17:45:34 -0000 1.14 *************** *** 310,320 **** def test_main(): ! suite = unittest.TestSuite() ! for test in (BZ2FileTest, ! BZ2CompressorTest, ! BZ2DecompressorTest, ! FuncTest): ! suite.addTest(unittest.makeSuite(test)) ! test_support.run_suite(suite) if __name__ == '__main__': --- 310,319 ---- def test_main(): ! test_support.run_unittest( ! BZ2FileTest, ! BZ2CompressorTest, ! BZ2DecompressorTest, ! FuncTest ! ) if __name__ == '__main__': Index: test_calendar.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_calendar.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** test_calendar.py 23 Jul 2002 19:03:45 -0000 1.4 --- test_calendar.py 1 May 2003 17:45:34 -0000 1.5 *************** *** 2,6 **** import unittest ! from test.test_support import run_unittest --- 2,6 ---- import unittest ! from test import test_support *************** *** 56,60 **** def test_main(): ! run_unittest(CalendarTestCase) if __name__ == "__main__": --- 56,60 ---- def test_main(): ! test_support.run_unittest(CalendarTestCase) if __name__ == "__main__": Index: test_call.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_call.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** test_call.py 23 Jul 2002 19:03:45 -0000 1.3 --- test_call.py 1 May 2003 17:45:34 -0000 1.4 *************** *** 1,4 **** import unittest ! from test.test_support import run_unittest # The test cases here cover several paths through the function calling --- 1,4 ---- import unittest ! from test import test_support # The test cases here cover several paths through the function calling *************** *** 125,129 **** def test_main(): ! run_unittest(CFunctionCalls) --- 125,129 ---- def test_main(): ! test_support.run_unittest(CFunctionCalls) Index: test_cfgparser.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_cfgparser.py,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** test_cfgparser.py 31 Dec 2002 06:57:25 -0000 1.19 --- test_cfgparser.py 1 May 2003 17:45:34 -0000 1.20 *************** *** 323,331 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTests([unittest.makeSuite(ConfigParserTestCase), ! unittest.makeSuite(RawConfigParserTestCase), ! unittest.makeSuite(SafeConfigParserTestCase)]) ! test_support.run_suite(suite) if __name__ == "__main__": --- 323,331 ---- def test_main(): ! test_support.run_unittest( ! ConfigParserTestCase, ! RawConfigParserTestCase, ! SafeConfigParserTestCase ! ) if __name__ == "__main__": Index: test_charmapcodec.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_charmapcodec.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** test_charmapcodec.py 14 Feb 2003 11:21:53 -0000 1.6 --- test_charmapcodec.py 1 May 2003 17:45:35 -0000 1.7 *************** *** 40,46 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(CharmapCodecTest)) ! test.test_support.run_suite(suite) if __name__ == "__main__": --- 40,44 ---- def test_main(): ! test.test_support.run_unittest(CharmapCodecTest) if __name__ == "__main__": Index: test_codeccallbacks.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_codeccallbacks.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** test_codeccallbacks.py 29 Apr 2003 20:59:55 -0000 1.11 --- test_codeccallbacks.py 1 May 2003 17:45:36 -0000 1.12 *************** *** 660,666 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(CodecCallbackTest)) ! test.test_support.run_suite(suite) if __name__ == "__main__": --- 660,664 ---- def test_main(): ! test.test_support.run_unittest(CodecCallbackTest) if __name__ == "__main__": Index: test_codecs.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_codecs.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** test_codecs.py 24 Apr 2003 16:02:51 -0000 1.8 --- test_codecs.py 1 May 2003 17:45:36 -0000 1.9 *************** *** 334,344 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(UTF16Test)) ! suite.addTest(unittest.makeSuite(EscapeDecodeTest)) ! suite.addTest(unittest.makeSuite(RecodingTest)) ! suite.addTest(unittest.makeSuite(PunycodeTest)) ! suite.addTest(unittest.makeSuite(NameprepTest)) ! test_support.run_suite(suite) --- 334,344 ---- def test_main(): ! test_support.run_unittest( ! UTF16Test, ! EscapeDecodeTest, ! RecodingTest, ! PunycodeTest, ! NameprepTest ! ) Index: test_copy.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_copy.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** test_copy.py 19 Feb 2003 01:19:28 -0000 1.7 --- test_copy.py 1 May 2003 17:45:36 -0000 1.8 *************** *** 517,523 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(TestCopy)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 517,521 ---- def test_main(): ! test_support.run_unittest(TestCopy) if __name__ == "__main__": Index: test_cpickle.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_cpickle.py,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** test_cpickle.py 21 Feb 2003 20:14:35 -0000 1.14 --- test_cpickle.py 1 May 2003 17:45:36 -0000 1.15 *************** *** 93,103 **** def test_main(): ! loader = unittest.TestLoader() ! suite = unittest.TestSuite() ! suite.addTest(loader.loadTestsFromTestCase(cPickleTests)) ! suite.addTest(loader.loadTestsFromTestCase(cPicklePicklerTests)) ! suite.addTest(loader.loadTestsFromTestCase(cPickleListPicklerTests)) ! suite.addTest(loader.loadTestsFromTestCase(cPickleFastPicklerTests)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 93,102 ---- def test_main(): ! test_support.run_unittest( ! cPickleTests, ! cPicklePicklerTests, ! cPickleListPicklerTests, ! cPickleFastPicklerTests ! ) if __name__ == "__main__": Index: test_csv.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_csv.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** test_csv.py 25 Apr 2003 14:43:14 -0000 1.5 --- test_csv.py 1 May 2003 17:45:36 -0000 1.6 *************** *** 7,11 **** import csv import gc ! from test.test_support import verbose class Test_Csv(unittest.TestCase): --- 7,11 ---- import csv import gc ! from test import test_support class Test_Csv(unittest.TestCase): *************** *** 569,573 **** if not hasattr(sys, "gettotalrefcount"): ! if verbose: print "*** skipping leakage tests ***" else: class NUL: --- 569,573 ---- if not hasattr(sys, "gettotalrefcount"): ! if test_support.verbose: print "*** skipping leakage tests ***" else: class NUL: *************** *** 641,654 **** self.assertEqual(delta < 5, True) ! def _testclasses(): mod = sys.modules[__name__] ! return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')] ! ! def suite(): ! suite = unittest.TestSuite() ! for testclass in _testclasses(): ! suite.addTest(unittest.makeSuite(testclass)) ! return suite if __name__ == '__main__': ! unittest.main(defaultTest='suite') --- 641,650 ---- self.assertEqual(delta < 5, True) ! def test_main(): mod = sys.modules[__name__] ! test_support.run_unittest( ! *[getattr(mod, name) for name in dir(mod) if name.startswith('Test')] ! ) if __name__ == '__main__': ! test_main() Index: test_dummy_thread.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_dummy_thread.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** test_dummy_thread.py 30 Apr 2003 03:03:37 -0000 1.3 --- test_dummy_thread.py 1 May 2003 17:45:36 -0000 1.4 *************** *** 163,171 **** print print "*** Using %s as _thread module ***" % _thread ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(LockTests)) ! suite.addTest(unittest.makeSuite(MiscTests)) ! suite.addTest(unittest.makeSuite(ThreadTests)) ! test_support.run_suite(suite) if __name__ == '__main__': --- 163,167 ---- print print "*** Using %s as _thread module ***" % _thread ! test_support.run_unittest(LockTests, MiscTests, ThreadTests) if __name__ == '__main__': Index: test_enumerate.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_enumerate.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** test_enumerate.py 23 Jul 2002 19:03:50 -0000 1.3 --- test_enumerate.py 1 May 2003 17:45:37 -0000 1.4 *************** *** 105,116 **** enum = MyEnum - def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(EnumerateTestCase)) - suite.addTest(unittest.makeSuite(SubclassTestCase)) - return suite - def test_main(): ! test_support.run_suite(suite()) if __name__ == "__main__": --- 105,110 ---- enum = MyEnum def test_main(): ! test_support.run_unittest(EnumerateTestCase, SubclassTestCase) if __name__ == "__main__": Index: test_filecmp.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_filecmp.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_filecmp.py 6 Feb 2003 17:42:45 -0000 1.1 --- test_filecmp.py 1 May 2003 17:45:37 -0000 1.2 *************** *** 120,127 **** def test_main(): ! suite = unittest.TestSuite() ! for cls in FileCompareTestCase, DirCompareTestCase: ! suite.addTest(unittest.makeSuite(cls)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 120,124 ---- def test_main(): ! test_support.run_unittest(FileCompareTestCase, DirCompareTestCase) if __name__ == "__main__": Index: test_getargs2.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_getargs2.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** test_getargs2.py 24 Apr 2003 16:15:29 -0000 1.4 --- test_getargs2.py 1 May 2003 17:45:37 -0000 1.5 *************** *** 224,230 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(Signed_TestCase)) ! suite.addTest(unittest.makeSuite(Unsigned_TestCase)) try: from _testcapi import getargs_L, getargs_K --- 224,228 ---- def test_main(): ! tests = [Signed_TestCase, Unsigned_TestCase] try: from _testcapi import getargs_L, getargs_K *************** *** 232,237 **** pass # PY_LONG_LONG not available else: ! suite.addTest(unittest.makeSuite(LongLong_TestCase)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 230,235 ---- pass # PY_LONG_LONG not available else: ! tests.append(LongLong_TestCase) ! test_support.run_unittest(*tests) if __name__ == "__main__": Index: test_grp.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_grp.py,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** test_grp.py 23 Apr 2003 19:50:24 -0000 1.15 --- test_grp.py 1 May 2003 17:45:37 -0000 1.16 *************** *** 98,104 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(GroupDatabaseTestCase)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 98,102 ---- def test_main(): ! test_support.run_unittest(GroupDatabaseTestCase) if __name__ == "__main__": Index: test_hexoct.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_hexoct.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** test_hexoct.py 18 Feb 2003 15:45:44 -0000 1.3 --- test_hexoct.py 1 May 2003 17:45:37 -0000 1.4 *************** *** 119,125 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(TextHexOct)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 119,123 ---- def test_main(): ! test_support.run_unittest(TextHexOct) if __name__ == "__main__": Index: test_hmac.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_hmac.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** test_hmac.py 22 Aug 2002 19:38:14 -0000 1.6 --- test_hmac.py 1 May 2003 17:45:37 -0000 1.7 *************** *** 104,113 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(TestVectorsTestCase)) ! suite.addTest(unittest.makeSuite(ConstructorTestCase)) ! suite.addTest(unittest.makeSuite(SanityTestCase)) ! suite.addTest(unittest.makeSuite(CopyTestCase)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 104,113 ---- def test_main(): ! test_support.run_unittest( ! TestVectorsTestCase, ! ConstructorTestCase, ! SanityTestCase, ! CopyTestCase ! ) if __name__ == "__main__": Index: test_isinstance.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_isinstance.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** test_isinstance.py 12 Dec 2002 19:14:07 -0000 1.6 --- test_isinstance.py 1 May 2003 17:45:37 -0000 1.7 *************** *** 249,257 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(TestIsInstanceExceptions)) ! suite.addTest(unittest.makeSuite(TestIsSubclassExceptions)) ! suite.addTest(unittest.makeSuite(TestIsInstanceIsSubclass)) ! test_support.run_suite(suite) --- 249,257 ---- def test_main(): ! test_support.run_unittest( ! TestIsInstanceExceptions, ! TestIsSubclassExceptions, ! TestIsInstanceIsSubclass ! ) Index: test_itertools.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_itertools.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** test_itertools.py 23 Feb 2003 04:40:07 -0000 1.5 --- test_itertools.py 1 May 2003 17:45:37 -0000 1.6 *************** *** 163,169 **** import test_itertools suite = unittest.TestSuite() ! for testclass in (TestBasicOps, ! ): ! suite.addTest(unittest.makeSuite(testclass)) test_support.run_suite(suite) test_support.run_doctest(test_itertools, verbose) --- 163,167 ---- import test_itertools suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(TestBasicOps)) test_support.run_suite(suite) test_support.run_doctest(test_itertools, verbose) Index: test_optparse.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_optparse.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_optparse.py 21 Apr 2003 02:41:25 -0000 1.1 --- test_optparse.py 1 May 2003 17:45:38 -0000 1.2 *************** *** 1194,1209 **** funcargs=[s, wordmap]) - def _testclasses(): - mod = sys.modules[__name__] - return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')] - - def suite(): - suite = unittest.TestSuite() - for testclass in _testclasses(): - suite.addTest(unittest.makeSuite(testclass)) - return suite - def test_main(): ! test_support.run_suite(suite()) if __name__ == '__main__': --- 1194,1202 ---- funcargs=[s, wordmap]) def test_main(): ! mod = sys.modules[__name__] ! test_support.run_unittest( ! *[getattr(mod, name) for name in dir(mod) if name.startswith('Test')] ! ) if __name__ == '__main__': Index: test_os.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_os.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** test_os.py 28 Apr 2003 03:13:03 -0000 1.17 --- test_os.py 1 May 2003 17:45:43 -0000 1.18 *************** *** 6,24 **** import unittest import warnings warnings.filterwarnings("ignore", "tempnam", RuntimeWarning, __name__) warnings.filterwarnings("ignore", "tmpnam", RuntimeWarning, __name__) - from test.test_support import TESTFN, run_classtests - class TemporaryFileTests(unittest.TestCase): def setUp(self): self.files = [] ! os.mkdir(TESTFN) def tearDown(self): for name in self.files: os.unlink(name) ! os.rmdir(TESTFN) def check_tempfile(self, name): --- 6,23 ---- import unittest import warnings + from test import test_support warnings.filterwarnings("ignore", "tempnam", RuntimeWarning, __name__) warnings.filterwarnings("ignore", "tmpnam", RuntimeWarning, __name__) class TemporaryFileTests(unittest.TestCase): def setUp(self): self.files = [] ! os.mkdir(test_support.TESTFN) def tearDown(self): for name in self.files: os.unlink(name) ! os.rmdir(test_support.TESTFN) def check_tempfile(self, name): *************** *** 37,44 **** self.check_tempfile(os.tempnam()) ! name = os.tempnam(TESTFN) self.check_tempfile(name) ! name = os.tempnam(TESTFN, "pfx") self.assert_(os.path.basename(name)[:3] == "pfx") self.check_tempfile(name) --- 36,43 ---- self.check_tempfile(os.tempnam()) ! name = os.tempnam(test_support.TESTFN) self.check_tempfile(name) ! name = os.tempnam(test_support.TESTFN, "pfx") self.assert_(os.path.basename(name)[:3] == "pfx") self.check_tempfile(name) *************** *** 85,90 **** class StatAttributeTests(unittest.TestCase): def setUp(self): ! os.mkdir(TESTFN) ! self.fname = os.path.join(TESTFN, "f1") f = open(self.fname, 'wb') f.write("ABC") --- 84,89 ---- class StatAttributeTests(unittest.TestCase): def setUp(self): ! os.mkdir(test_support.TESTFN) ! self.fname = os.path.join(test_support.TESTFN, "f1") f = open(self.fname, 'wb') f.write("ABC") *************** *** 93,97 **** def tearDown(self): os.unlink(self.fname) ! os.rmdir(TESTFN) def test_stat_attributes(self): --- 92,96 ---- def tearDown(self): os.unlink(self.fname) ! os.rmdir(test_support.TESTFN) def test_stat_attributes(self): *************** *** 239,246 **** # SUB2/ just a file kid # tmp3 ! sub1_path = join(TESTFN, "SUB1") sub11_path = join(sub1_path, "SUB11") ! sub2_path = join(TESTFN, "SUB2") ! tmp1_path = join(TESTFN, "tmp1") tmp2_path = join(sub1_path, "tmp2") tmp3_path = join(sub2_path, "tmp3") --- 238,245 ---- # SUB2/ just a file kid # tmp3 ! sub1_path = join(test_support.TESTFN, "SUB1") sub11_path = join(sub1_path, "SUB11") ! sub2_path = join(test_support.TESTFN, "SUB2") ! tmp1_path = join(test_support.TESTFN, "tmp1") tmp2_path = join(sub1_path, "tmp2") tmp3_path = join(sub2_path, "tmp3") *************** *** 255,259 **** # Walk top-down. ! all = list(os.walk(TESTFN)) self.assertEqual(len(all), 4) # We can't know which order SUB1 and SUB2 will appear in. --- 254,258 ---- # Walk top-down. ! all = list(os.walk(test_support.TESTFN)) self.assertEqual(len(all), 4) # We can't know which order SUB1 and SUB2 will appear in. *************** *** 262,266 **** flipped = all[0][1][0] != "SUB1" all[0][1].sort() ! self.assertEqual(all[0], (TESTFN, ["SUB1", "SUB2"], ["tmp1"])) self.assertEqual(all[1 + flipped], (sub1_path, ["SUB11"], ["tmp2"])) self.assertEqual(all[2 + flipped], (sub11_path, [], [])) --- 261,265 ---- flipped = all[0][1][0] != "SUB1" all[0][1].sort() ! self.assertEqual(all[0], (test_support.TESTFN, ["SUB1", "SUB2"], ["tmp1"])) self.assertEqual(all[1 + flipped], (sub1_path, ["SUB11"], ["tmp2"])) self.assertEqual(all[2 + flipped], (sub11_path, [], [])) *************** *** 269,273 **** # Prune the search. all = [] ! for root, dirs, files in os.walk(TESTFN): all.append((root, dirs, files)) # Don't descend into SUB1. --- 268,272 ---- # Prune the search. all = [] ! for root, dirs, files in os.walk(test_support.TESTFN): all.append((root, dirs, files)) # Don't descend into SUB1. *************** *** 276,284 **** dirs.remove('SUB1') self.assertEqual(len(all), 2) ! self.assertEqual(all[0], (TESTFN, ["SUB2"], ["tmp1"])) self.assertEqual(all[1], (sub2_path, [], ["tmp3"])) # Walk bottom-up. ! all = list(os.walk(TESTFN, topdown=False)) self.assertEqual(len(all), 4) # We can't know which order SUB1 and SUB2 will appear in. --- 275,283 ---- dirs.remove('SUB1') self.assertEqual(len(all), 2) ! self.assertEqual(all[0], (test_support.TESTFN, ["SUB2"], ["tmp1"])) self.assertEqual(all[1], (sub2_path, [], ["tmp3"])) # Walk bottom-up. ! all = list(os.walk(test_support.TESTFN, topdown=False)) self.assertEqual(len(all), 4) # We can't know which order SUB1 and SUB2 will appear in. *************** *** 287,291 **** flipped = all[3][1][0] != "SUB1" all[3][1].sort() ! self.assertEqual(all[3], (TESTFN, ["SUB1", "SUB2"], ["tmp1"])) self.assertEqual(all[flipped], (sub11_path, [], [])) self.assertEqual(all[flipped + 1], (sub1_path, ["SUB11"], ["tmp2"])) --- 286,290 ---- flipped = all[3][1][0] != "SUB1" all[3][1].sort() ! self.assertEqual(all[3], (test_support.TESTFN, ["SUB1", "SUB2"], ["tmp1"])) self.assertEqual(all[flipped], (sub11_path, [], [])) self.assertEqual(all[flipped + 1], (sub1_path, ["SUB11"], ["tmp2"])) *************** *** 296,311 **** # (not so) subtlety is that rmdir will fail unless the dir's # kids are removed first, so bottom up is essential. ! for root, dirs, files in os.walk(TESTFN, topdown=False): for name in files: os.remove(join(root, name)) for name in dirs: os.rmdir(join(root, name)) ! os.rmdir(TESTFN) def test_main(): ! run_classtests(TemporaryFileTests, ! StatAttributeTests, ! EnvironTests, ! WalkTests) if __name__ == "__main__": --- 295,312 ---- # (not so) subtlety is that rmdir will fail unless the dir's # kids are removed first, so bottom up is essential. ! for root, dirs, files in os.walk(test_support.TESTFN, topdown=False): for name in files: os.remove(join(root, name)) for name in dirs: os.rmdir(join(root, name)) ! os.rmdir(test_support.TESTFN) def test_main(): ! test_support.run_unittest( ! TemporaryFileTests, ! StatAttributeTests, ! EnvironTests, ! WalkTests ! ) if __name__ == "__main__": Index: test_parser.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_parser.py,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** test_parser.py 19 Feb 2003 02:35:06 -0000 1.16 --- test_parser.py 1 May 2003 17:45:44 -0000 1.17 *************** *** 375,383 **** def test_main(): ! loader = unittest.TestLoader() ! suite = unittest.TestSuite() ! suite.addTest(loader.loadTestsFromTestCase(RoundtripLegalSyntaxTestCase)) ! suite.addTest(loader.loadTestsFromTestCase(IllegalSyntaxTestCase)) ! test_support.run_suite(suite) --- 375,382 ---- def test_main(): ! test_support.run_unittest( ! RoundtripLegalSyntaxTestCase, ! IllegalSyntaxTestCase ! ) Index: test_pep277.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_pep277.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** test_pep277.py 9 Nov 2002 05:26:15 -0000 1.5 --- test_pep277.py 1 May 2003 17:45:44 -0000 1.6 *************** *** 2,8 **** # open, os.open, os.stat. os.listdir, os.rename, os.remove, os.mkdir, os.chdir, os.rmdir import os, unittest ! from test.test_support import TESTFN, TestSkipped, TestFailed, run_suite if not os.path.supports_unicode_filenames: ! raise TestSkipped, "test works only on NT+" filenames = [ --- 2,8 ---- # open, os.open, os.stat. os.listdir, os.rename, os.remove, os.mkdir, os.chdir, os.rmdir import os, unittest ! from test import test_support if not os.path.supports_unicode_filenames: ! raise test_support.TestSkipped, "test works only on NT+" filenames = [ *************** *** 29,37 **** class UnicodeFileTests(unittest.TestCase): ! files = [os.path.join(TESTFN, f) for f in filenames] def setUp(self): try: ! os.mkdir(TESTFN) except OSError: pass --- 29,37 ---- class UnicodeFileTests(unittest.TestCase): ! files = [os.path.join(test_support.TESTFN, f) for f in filenames] def setUp(self): try: ! os.mkdir(test_support.TESTFN) except OSError: pass *************** *** 43,47 **** def tearDown(self): ! deltree(TESTFN) def _apply_failure(self, fn, filename, expected_exception, --- 43,47 ---- def tearDown(self): ! deltree(test_support.TESTFN) def _apply_failure(self, fn, filename, expected_exception, *************** *** 49,57 **** try: fn(filename) ! raise TestFailed("Expected to fail calling '%s(%r)'" % (fn.__name__, filename)) except expected_exception, details: if check_fn_in_exception and details.filename != filename: ! raise TestFailed("Function '%s(%r) failed with " "bad filename in the exception: %r" % (fn.__name__, filename, --- 49,57 ---- try: fn(filename) ! raise test_support.TestFailed("Expected to fail calling '%s(%r)'" % (fn.__name__, filename)) except expected_exception, details: if check_fn_in_exception and details.filename != filename: ! raise test_support.TestFailed("Function '%s(%r) failed with " "bad filename in the exception: %r" % (fn.__name__, filename, *************** *** 78,84 **** def test_listdir(self): ! f1 = os.listdir(TESTFN) f1.sort() ! f2 = os.listdir(unicode(TESTFN,"mbcs")) f2.sort() print f1 --- 78,84 ---- def test_listdir(self): ! f1 = os.listdir(test_support.TESTFN) f1.sort() ! f2 = os.listdir(unicode(test_support.TESTFN,"mbcs")) f2.sort() print f1 *************** *** 91,95 **** def test_directory(self): ! dirname = os.path.join(TESTFN,u'Gr\xfc\xdf-\u66e8\u66e9\u66eb') filename = u'\xdf-\u66e8\u66e9\u66eb' oldwd = os.getcwd() --- 91,95 ---- def test_directory(self): ! dirname = os.path.join(test_support.TESTFN,u'Gr\xfc\xdf-\u66e8\u66e9\u66eb') filename = u'\xdf-\u66e8\u66e9\u66eb' oldwd = os.getcwd() *************** *** 105,114 **** def test_main(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(UnicodeFileTests)) try: ! run_suite(suite) finally: ! deltree(TESTFN) if __name__ == "__main__": --- 105,112 ---- def test_main(): try: ! test_support.run_unittest(UnicodeFileTests) finally: ! deltree(test_support.TESTFN) if __name__ == "__main__": Index: test_pickle.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_pickle.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** test_pickle.py 15 Feb 2003 03:01:09 -0000 1.17 --- test_pickle.py 1 May 2003 17:45:44 -0000 1.18 *************** *** 63,72 **** def test_main(): ! loader = unittest.TestLoader() ! suite = unittest.TestSuite() ! suite.addTest(loader.loadTestsFromTestCase(PickleTests)) ! suite.addTest(loader.loadTestsFromTestCase(PicklerTests)) ! suite.addTest(loader.loadTestsFromTestCase(PersPicklerTests)) ! test_support.run_suite(suite) test_support.run_doctest(pickle) --- 63,71 ---- def test_main(): ! test_support.run_unittest( ! PickleTests, ! PicklerTests, ! PersPicklerTests ! ) test_support.run_doctest(pickle) Index: test_posix.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_posix.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** test_posix.py 18 Mar 2003 13:30:14 -0000 1.5 --- test_posix.py 1 May 2003 17:45:45 -0000 1.6 *************** *** 1,10 **** "Test posix functions" ! from test.test_support import TestSkipped, TestFailed, TESTFN, run_suite try: import posix except ImportError: ! raise TestSkipped, "posix is not available" import time --- 1,10 ---- "Test posix functions" ! from test import test_support try: import posix except ImportError: ! raise test_support.TestSkipped, "posix is not available" import time *************** *** 20,28 **** def setUp(self): # create empty file ! fp = open(TESTFN, 'w+') fp.close() def tearDown(self): ! os.unlink(TESTFN) def testNoArgFunctions(self): --- 20,28 ---- def setUp(self): # create empty file ! fp = open(test_support.TESTFN, 'w+') fp.close() def tearDown(self): ! os.unlink(test_support.TESTFN) def testNoArgFunctions(self): *************** *** 47,51 **** def test_fstatvfs(self): if hasattr(posix, 'fstatvfs'): ! fp = open(TESTFN) try: self.assert_(posix.fstatvfs(fp.fileno())) --- 47,51 ---- def test_fstatvfs(self): if hasattr(posix, 'fstatvfs'): ! fp = open(test_support.TESTFN) try: self.assert_(posix.fstatvfs(fp.fileno())) *************** *** 55,59 **** def test_ftruncate(self): if hasattr(posix, 'ftruncate'): ! fp = open(TESTFN, 'w+') try: # we need to have some data to truncate --- 55,59 ---- def test_ftruncate(self): if hasattr(posix, 'ftruncate'): ! fp = open(test_support.TESTFN, 'w+') try: # we need to have some data to truncate *************** *** 66,70 **** def test_dup(self): if hasattr(posix, 'dup'): ! fp = open(TESTFN) try: fd = posix.dup(fp.fileno()) --- 66,70 ---- def test_dup(self): if hasattr(posix, 'dup'): ! fp = open(test_support.TESTFN) try: fd = posix.dup(fp.fileno()) *************** *** 76,81 **** def test_dup2(self): if hasattr(posix, 'dup2'): ! fp1 = open(TESTFN) ! fp2 = open(TESTFN) try: posix.dup2(fp1.fileno(), fp2.fileno()) --- 76,81 ---- def test_dup2(self): if hasattr(posix, 'dup2'): ! fp1 = open(test_support.TESTFN) ! fp2 = open(test_support.TESTFN) try: posix.dup2(fp1.fileno(), fp2.fileno()) *************** *** 85,89 **** def fdopen_helper(self, *args): ! fd = os.open(TESTFN, os.O_RDONLY) fp2 = posix.fdopen(fd, *args) fp2.close() --- 85,89 ---- def fdopen_helper(self, *args): ! fd = os.open(test_support.TESTFN, os.O_RDONLY) fp2 = posix.fdopen(fd, *args) fp2.close() *************** *** 97,101 **** def test_fstat(self): if hasattr(posix, 'fstat'): ! fp = open(TESTFN) try: self.assert_(posix.fstat(fp.fileno())) --- 97,101 ---- def test_fstat(self): if hasattr(posix, 'fstat'): ! fp = open(test_support.TESTFN) try: self.assert_(posix.fstat(fp.fileno())) *************** *** 105,122 **** def test_stat(self): if hasattr(posix, 'stat'): ! self.assert_(posix.stat(TESTFN)) def test_chdir(self): if hasattr(posix, 'chdir'): posix.chdir(os.curdir) ! self.assertRaises(OSError, posix.chdir, TESTFN) def test_lsdir(self): if hasattr(posix, 'lsdir'): ! self.assert_(TESTFN in posix.lsdir(os.curdir)) def test_access(self): if hasattr(posix, 'access'): ! self.assert_(posix.access(TESTFN, os.R_OK)) def test_umask(self): --- 105,122 ---- def test_stat(self): if hasattr(posix, 'stat'): ! self.assert_(posix.stat(test_support.TESTFN)) def test_chdir(self): if hasattr(posix, 'chdir'): posix.chdir(os.curdir) ! self.assertRaises(OSError, posix.chdir, test_support.TESTFN) def test_lsdir(self): if hasattr(posix, 'lsdir'): ! self.assert_(test_support.TESTFN in posix.lsdir(os.curdir)) def test_access(self): if hasattr(posix, 'access'): ! self.assert_(posix.access(test_support.TESTFN, os.R_OK)) def test_umask(self): *************** *** 150,160 **** if hasattr(posix, 'utime'): now = time.time() ! posix.utime(TESTFN, None) ! posix.utime(TESTFN, (now, now)) def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(PosixTester)) ! run_suite(suite) if __name__ == '__main__': --- 150,158 ---- if hasattr(posix, 'utime'): now = time.time() ! posix.utime(test_support.TESTFN, None) ! posix.utime(test_support.TESTFN, (now, now)) def test_main(): ! test_support.run_unittest(PosixTester) if __name__ == '__main__': Index: test_pow.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_pow.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** test_pow.py 3 Feb 2003 20:17:19 -0000 1.17 --- test_pow.py 1 May 2003 17:45:45 -0000 1.18 *************** *** 104,110 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(PowTest)) ! test.test_support.run_suite(suite) if __name__ == "__main__": --- 104,108 ---- def test_main(): ! test.test_support.run_unittest(PowTest) if __name__ == "__main__": Index: test_profilehooks.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_profilehooks.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** test_profilehooks.py 23 Jul 2002 19:03:59 -0000 1.9 --- test_profilehooks.py 1 May 2003 17:45:46 -0000 1.10 *************** *** 350,358 **** def test_main(): ! loader = unittest.TestLoader() ! suite = unittest.TestSuite() ! suite.addTest(loader.loadTestsFromTestCase(ProfileHookTestCase)) ! suite.addTest(loader.loadTestsFromTestCase(ProfileSimulatorTestCase)) ! test_support.run_suite(suite) --- 350,357 ---- def test_main(): ! test_support.run_unittest( ! ProfileHookTestCase, ! ProfileSimulatorTestCase ! ) Index: test_pwd.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_pwd.py,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** test_pwd.py 24 Apr 2003 16:02:52 -0000 1.16 --- test_pwd.py 1 May 2003 17:45:46 -0000 1.17 *************** *** 87,93 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(PwdTest)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 87,91 ---- def test_main(): ! test_support.run_unittest(PwdTest) if __name__ == "__main__": Index: test_re.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_re.py,v retrieving revision 1.41 retrieving revision 1.42 diff -C2 -d -r1.41 -r1.42 *** test_re.py 27 Apr 2003 13:25:20 -0000 1.41 --- test_re.py 1 May 2003 17:45:47 -0000 1.42 *************** *** 2,6 **** sys.path = ['.'] + sys.path ! from test.test_support import verbose, run_suite import re from sre import Scanner --- 2,6 ---- sys.path = ['.'] + sys.path ! from test.test_support import verbose, run_unittest import re from sre import Scanner *************** *** 433,439 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(ReTests)) ! run_suite(suite) run_re_tests() --- 433,437 ---- def test_main(): ! run_unittest(ReTests) run_re_tests() Index: test_richcmp.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_richcmp.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** test_richcmp.py 29 Apr 2003 21:31:18 -0000 1.8 --- test_richcmp.py 1 May 2003 17:45:47 -0000 1.9 *************** *** 353,357 **** def test_main(): ! test_support.run_classtests(VectorTest, NumberTest, MiscTest, DictTest, ListTest) if __name__ == "__main__": --- 353,357 ---- def test_main(): ! test_support.run_unittest(VectorTest, NumberTest, MiscTest, DictTest, ListTest) if __name__ == "__main__": Index: test_sets.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_sets.py,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** test_sets.py 2 Mar 2003 00:36:10 -0000 1.23 --- test_sets.py 1 May 2003 17:45:48 -0000 1.24 *************** *** 659,698 **** #============================================================================== - def makeAllTests(): - suite = unittest.TestSuite() - for klass in (TestSetOfSets, - TestExceptionPropagation, - TestBasicOpsEmpty, - TestBasicOpsSingleton, - TestBasicOpsTuple, - TestBasicOpsTriple, - TestBinaryOps, - TestUpdateOps, - TestMutate, - TestSubsetEqualEmpty, - TestSubsetEqualNonEmpty, - TestSubsetEmptyNonEmpty, - TestSubsetPartial, - TestSubsetNonOverlap, - TestOnlySetsNumeric, - TestOnlySetsDict, - TestOnlySetsOperator, - TestCopyingEmpty, - TestCopyingSingleton, - TestCopyingTriple, - TestCopyingTuple, - TestCopyingNested, - ): - suite.addTest(unittest.makeSuite(klass)) - return suite - - #------------------------------------------------------------------------------ - __test__ = {'libreftest' : libreftest} def test_main(verbose=None): from test import test_sets ! suite = makeAllTests() ! test_support.run_suite(suite) test_support.run_doctest(test_sets, verbose) --- 659,690 ---- #============================================================================== __test__ = {'libreftest' : libreftest} def test_main(verbose=None): from test import test_sets ! test_support.run_unittest( ! TestSetOfSets, ! TestExceptionPropagation, ! TestBasicOpsEmpty, ! TestBasicOpsSingleton, ! TestBasicOpsTuple, ! TestBasicOpsTriple, ! TestBinaryOps, ! TestUpdateOps, ! TestMutate, ! TestSubsetEqualEmpty, ! TestSubsetEqualNonEmpty, ! TestSubsetEmptyNonEmpty, ! TestSubsetPartial, ! TestSubsetNonOverlap, ! TestOnlySetsNumeric, ! TestOnlySetsDict, ! TestOnlySetsOperator, ! TestCopyingEmpty, ! TestCopyingSingleton, ! TestCopyingTriple, ! TestCopyingTuple, ! TestCopyingNested ! ) test_support.run_doctest(test_sets, verbose) Index: test_shelve.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_shelve.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** test_shelve.py 19 Apr 2003 20:59:02 -0000 1.4 --- test_shelve.py 1 May 2003 17:45:48 -0000 1.5 *************** *** 122,134 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(TestAsciiFileShelve)) ! suite.addTest(unittest.makeSuite(TestBinaryFileShelve)) ! suite.addTest(unittest.makeSuite(TestProto2FileShelve)) ! suite.addTest(unittest.makeSuite(TestAsciiMemShelve)) ! suite.addTest(unittest.makeSuite(TestBinaryMemShelve)) ! suite.addTest(unittest.makeSuite(TestProto2MemShelve)) ! suite.addTest(unittest.makeSuite(TestCase)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 122,134 ---- def test_main(): ! test_support.run_unittest( ! TestAsciiFileShelve, ! TestBinaryFileShelve, ! TestProto2FileShelve, ! TestAsciiMemShelve, ! TestBinaryMemShelve, ! TestProto2MemShelve, ! TestCase ! ) if __name__ == "__main__": Index: test_shutil.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_shutil.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_shutil.py 24 Jan 2003 17:34:13 -0000 1.1 --- test_shutil.py 1 May 2003 17:45:49 -0000 1.2 *************** *** 15,28 **** - def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(TestShutil)) - return suite - - def test_main(): ! test_support.run_suite(suite()) if __name__ == '__main__': ! unittest.main(defaultTest='suite') --- 15,22 ---- def test_main(): ! test_support.run_unittest(TestShutil) if __name__ == '__main__': ! test_main() Index: test_socket.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_socket.py,v retrieving revision 1.63 retrieving revision 1.64 diff -C2 -d -r1.63 -r1.64 *** test_socket.py 25 Apr 2003 15:11:23 -0000 1.63 --- test_socket.py 1 May 2003 17:45:49 -0000 1.64 *************** *** 684,698 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(GeneralModuleTests)) ! suite.addTest(unittest.makeSuite(BasicTCPTest)) if sys.platform != 'mac': ! suite.addTest(unittest.makeSuite(BasicUDPTest)) ! suite.addTest(unittest.makeSuite(NonBlockingTCPTests)) ! suite.addTest(unittest.makeSuite(FileObjectClassTestCase)) ! suite.addTest(unittest.makeSuite(UnbufferedFileObjectClassTestCase)) ! suite.addTest(unittest.makeSuite(LineBufferedFileObjectClassTestCase)) ! suite.addTest(unittest.makeSuite(SmallBufferedFileObjectClassTestCase)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 684,699 ---- def test_main(): ! tests = [ GeneralModuleTests, BasicTCPTest ] if sys.platform != 'mac': ! tests.append(BasicUDPTest) ! ! tests.extend([ ! NonBlockingTCPTests, ! FileObjectClassTestCase, ! UnbufferedFileObjectClassTestCase, ! LineBufferedFileObjectClassTestCase, ! SmallBufferedFileObjectClassTestCase ! ]) ! test_support.run_unittest(*tests) if __name__ == "__main__": Index: test_str.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_str.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** test_str.py 31 Mar 2003 18:07:49 -0000 1.2 --- test_str.py 1 May 2003 17:45:50 -0000 1.3 *************** *** 20,26 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(StrTest)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 20,24 ---- def test_main(): ! test_support.run_unittest(StrTest) if __name__ == "__main__": Index: test_string.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_string.py,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** test_string.py 21 Feb 2003 12:53:49 -0000 1.24 --- test_string.py 1 May 2003 17:45:50 -0000 1.25 *************** *** 96,103 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(StringTest)) ! suite.addTest(unittest.makeSuite(ModuleTest)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 96,100 ---- def test_main(): ! test_support.run_unittest(StringTest, ModuleTest) if __name__ == "__main__": Index: test_strptime.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_strptime.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** test_strptime.py 28 Apr 2003 21:30:13 -0000 1.12 --- test_strptime.py 1 May 2003 17:45:50 -0000 1.13 *************** *** 407,418 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(LocaleTime_Tests)) ! suite.addTest(unittest.makeSuite(TimeRETests)) ! suite.addTest(unittest.makeSuite(StrptimeTests)) ! suite.addTest(unittest.makeSuite(Strptime12AMPMTests)) ! suite.addTest(unittest.makeSuite(JulianTests)) ! suite.addTest(unittest.makeSuite(CalculationTests)) ! test_support.run_suite(suite) --- 407,418 ---- def test_main(): ! test_support.run_unittest( ! LocaleTime_Tests, ! TimeRETests, ! StrptimeTests, ! Strptime12AMPMTests, ! JulianTests, ! CalculationTests ! ) Index: test_support.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_support.py,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** test_support.py 27 Apr 2003 07:54:23 -0000 1.51 --- test_support.py 1 May 2003 17:45:51 -0000 1.52 *************** *** 230,242 **** ! def run_unittest(testclass): ! """Run tests from a unittest.TestCase-derived class.""" ! run_suite(unittest.makeSuite(testclass), testclass) ! ! def run_classtests(*classnames): suite = unittest.TestSuite() ! for cls in classnames: suite.addTest(unittest.makeSuite(cls)) ! run_suite(suite) --- 230,243 ---- ! def run_unittest(*classes): ! """Run tests from unittest.TestCase-derived classes.""" suite = unittest.TestSuite() ! for cls in classes: suite.addTest(unittest.makeSuite(cls)) ! if len(classes)==1: ! testclass = classes[0] ! else: ! testclass = None ! run_suite(suite, testclass) Index: test_sys.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_sys.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** test_sys.py 1 Mar 2003 03:25:41 -0000 1.6 --- test_sys.py 1 May 2003 17:45:51 -0000 1.7 *************** *** 248,254 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(SysModuleTest)) ! test.test_support.run_suite(suite) if __name__ == "__main__": --- 248,252 ---- def test_main(): ! test.test_support.run_unittest(SysModuleTest) if __name__ == "__main__": Index: test_tarfile.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_tarfile.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** test_tarfile.py 14 Apr 2003 01:18:32 -0000 1.7 --- test_tarfile.py 1 May 2003 17:45:51 -0000 1.8 *************** *** 241,265 **** bz2.BZ2File(tarname("bz2"), "wb").write(file(tarname(), "rb").read()) ! try: ! suite = unittest.TestSuite() ! ! suite.addTest(unittest.makeSuite(ReadTest)) ! suite.addTest(unittest.makeSuite(ReadStreamTest)) ! suite.addTest(unittest.makeSuite(WriteTest)) ! suite.addTest(unittest.makeSuite(WriteStreamTest)) ! ! if gzip: ! suite.addTest(unittest.makeSuite(ReadTestGzip)) ! suite.addTest(unittest.makeSuite(ReadStreamTestGzip)) ! suite.addTest(unittest.makeSuite(WriteTestGzip)) ! suite.addTest(unittest.makeSuite(WriteStreamTestGzip)) ! if bz2: ! suite.addTest(unittest.makeSuite(ReadTestBzip2)) ! suite.addTest(unittest.makeSuite(ReadStreamTestBzip2)) ! suite.addTest(unittest.makeSuite(WriteTestBzip2)) ! suite.addTest(unittest.makeSuite(WriteStreamTestBzip2)) ! test_support.run_suite(suite) finally: if gzip: --- 241,264 ---- bz2.BZ2File(tarname("bz2"), "wb").write(file(tarname(), "rb").read()) ! tests = [ ! ReadTest, ! ReadStreamTest, ! WriteTest, ! WriteStreamTest ! ] ! if gzip: ! tests.extend([ ! ReadTestGzip, ReadStreamTestGzip, ! WriteTestGzip, WriteStreamTestGzip ! ]) ! if bz2: ! tests.extend([ ! ReadTestBzip2, ReadStreamTestBzip2, ! WriteTestBzip2, WriteStreamTestBzip2 ! ]) ! try: ! test_support.run_unittest(*tests) finally: if gzip: Index: test_tempfile.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_tempfile.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** test_tempfile.py 8 Jan 2003 16:30:34 -0000 1.13 --- test_tempfile.py 1 May 2003 17:45:51 -0000 1.14 *************** *** 646,653 **** def test_main(): ! suite = unittest.TestSuite() ! for c in test_classes: ! suite.addTest(unittest.makeSuite(c)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 646,650 ---- def test_main(): ! test_support.run_unittest(*test_classes) if __name__ == "__main__": Index: test_textwrap.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_textwrap.py,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** test_textwrap.py 9 Dec 2002 16:32:41 -0000 1.18 --- test_textwrap.py 1 May 2003 17:45:51 -0000 1.19 *************** *** 353,361 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(WrapTestCase)) ! suite.addTest(unittest.makeSuite(LongWordTestCase)) ! suite.addTest(unittest.makeSuite(IndentTestCases)) ! test_support.run_suite(suite) if __name__ == '__main__': --- 353,357 ---- def test_main(): ! test_support.run_unittest(WrapTestCase, LongWordTestCase, IndentTestCases) if __name__ == '__main__': Index: test_timeout.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_timeout.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** test_timeout.py 11 Apr 2003 15:14:05 -0000 1.13 --- test_timeout.py 1 May 2003 17:45:51 -0000 1.14 *************** *** 187,194 **** def test_main(): test_support.requires('network') ! ! suite = unittest.makeSuite(CreationTestCase) ! suite.addTest(unittest.makeSuite(TimeoutTestCase)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 187,191 ---- def test_main(): test_support.requires('network') ! test_support.run_unittest(CreationTestCase, TimeoutTestCase) if __name__ == "__main__": Index: test_trace.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_trace.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** test_trace.py 29 Apr 2003 16:18:47 -0000 1.8 --- test_trace.py 1 May 2003 17:45:52 -0000 1.9 *************** *** 532,538 **** def test_main(): ! test_support.run_unittest(TraceTestCase) ! test_support.run_unittest(RaisingTraceFuncTestCase) ! test_support.run_unittest(JumpTestCase) if __name__ == "__main__": --- 532,540 ---- def test_main(): ! test_support.run_unittest( ! TraceTestCase, ! RaisingTraceFuncTestCase, ! JumpTestCase ! ) if __name__ == "__main__": Index: test_ucn.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_ucn.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** test_ucn.py 7 Mar 2003 17:30:48 -0000 1.13 --- test_ucn.py 1 May 2003 17:45:52 -0000 1.14 *************** *** 139,145 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(UnicodeNamesTest)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 139,143 ---- def test_main(): ! test_support.run_unittest(UnicodeNamesTest) if __name__ == "__main__": Index: test_unicode.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_unicode.py,v retrieving revision 1.82 retrieving revision 1.83 diff -C2 -d -r1.82 -r1.83 *** test_unicode.py 2 Apr 2003 16:37:24 -0000 1.82 --- test_unicode.py 1 May 2003 17:45:53 -0000 1.83 *************** *** 699,705 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(UnicodeTest)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 699,703 ---- def test_main(): ! test_support.run_unittest(UnicodeTest) if __name__ == "__main__": Index: test_unicodedata.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_unicodedata.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** test_unicodedata.py 7 Mar 2003 17:30:48 -0000 1.8 --- test_unicodedata.py 1 May 2003 17:45:53 -0000 1.9 *************** *** 204,212 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(UnicodeMiscTest)) ! suite.addTest(unittest.makeSuite(UnicodeMethodsTest)) ! suite.addTest(unittest.makeSuite(UnicodeFunctionsTest)) ! test.test_support.run_suite(suite) if __name__ == "__main__": --- 204,212 ---- def test_main(): ! test.test_support.run_unittest( ! UnicodeMiscTest, ! UnicodeMethodsTest, ! UnicodeFunctionsTest ! ) if __name__ == "__main__": Index: test_univnewlines.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_univnewlines.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** test_univnewlines.py 23 Jul 2002 19:04:08 -0000 1.4 --- test_univnewlines.py 1 May 2003 17:45:53 -0000 1.5 *************** *** 112,120 **** def test_main(): ! test_support.run_unittest(TestNativeNewlines) ! test_support.run_unittest(TestCRNewlines) ! test_support.run_unittest(TestLFNewlines) ! test_support.run_unittest(TestCRLFNewlines) ! test_support.run_unittest(TestMixedNewlines) if __name__ == '__main__': --- 112,122 ---- def test_main(): ! test_support.run_unittest( ! TestNativeNewlines, ! TestCRNewlines, ! TestLFNewlines, ! TestCRLFNewlines, ! TestMixedNewlines ! ) if __name__ == '__main__': Index: test_urllib.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_urllib.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** test_urllib.py 29 Apr 2003 05:08:06 -0000 1.12 --- test_urllib.py 1 May 2003 17:45:53 -0000 1.13 *************** *** 409,420 **** def test_main(): ! test_suite = unittest.TestSuite() ! test_suite.addTest(unittest.makeSuite(urlopen_FileTests)) ! test_suite.addTest(unittest.makeSuite(urlretrieve_FileTests)) ! test_suite.addTest(unittest.makeSuite(QuotingTests)) ! test_suite.addTest(unittest.makeSuite(UnquotingTests)) ! test_suite.addTest(unittest.makeSuite(urlencode_Tests)) ! test_suite.addTest(unittest.makeSuite(Pathname_Tests)) ! test_support.run_suite(test_suite) --- 409,420 ---- def test_main(): ! test_support.run_unittest( ! urlopen_FileTests, ! urlretrieve_FileTests, ! QuotingTests, ! UnquotingTests, ! urlencode_Tests, ! Pathname_Tests ! ) Index: test_urllibnet.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_urllibnet.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_urllibnet.py 30 Mar 2003 04:54:24 -0000 1.1 --- test_urllibnet.py 1 May 2003 17:45:54 -0000 1.2 *************** *** 24,31 **** def test_main(): test_support.requires('network') ! ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(URLTimeoutTest)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 24,28 ---- def test_main(): test_support.requires('network') ! test_support.run_unittest(URLTimeoutTest) if __name__ == "__main__": Index: test_userdict.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_userdict.py,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** test_userdict.py 9 Mar 2003 07:05:14 -0000 1.14 --- test_userdict.py 1 May 2003 17:45:54 -0000 1.15 *************** *** 396,404 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(TestMappingProtocol)) ! suite.addTest(unittest.makeSuite(UserDictTest)) ! suite.addTest(unittest.makeSuite(UserDictMixinTest)) ! test.test_support.run_suite(suite) if __name__ == "__main__": --- 396,404 ---- def test_main(): ! test.test_support.run_unittest( ! TestMappingProtocol, ! UserDictTest, ! UserDictMixinTest ! ) if __name__ == "__main__": Index: test_userlist.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_userlist.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** test_userlist.py 19 Feb 2003 02:35:06 -0000 1.8 --- test_userlist.py 1 May 2003 17:45:54 -0000 1.9 *************** *** 253,259 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(UserListTest)) ! test.test_support.run_suite(suite) if __name__ == "__main__": --- 253,257 ---- def test_main(): ! test.test_support.run_unittest(UserListTest) if __name__ == "__main__": Index: test_userstring.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_userstring.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** test_userstring.py 21 Feb 2003 12:53:49 -0000 1.10 --- test_userstring.py 1 May 2003 17:45:55 -0000 1.11 *************** *** 45,51 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(UserStringTest)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 45,49 ---- def test_main(): ! test_support.run_unittest(UserStringTest) if __name__ == "__main__": Index: test_weakref.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_weakref.py,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** test_weakref.py 9 Mar 2003 07:05:14 -0000 1.22 --- test_weakref.py 1 May 2003 17:45:55 -0000 1.23 *************** *** 535,544 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(ReferencesTestCase)) ! suite.addTest(unittest.makeSuite(MappingTestCase)) ! suite.addTest(unittest.makeSuite(WeakValueDictionaryTestCase)) ! suite.addTest(unittest.makeSuite(WeakKeyDictionaryTestCase)) ! test_support.run_suite(suite) --- 535,544 ---- def test_main(): ! test_support.run_unittest( ! ReferencesTestCase, ! MappingTestCase, ! WeakValueDictionaryTestCase, ! WeakKeyDictionaryTestCase ! ) Index: test_xpickle.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_xpickle.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** test_xpickle.py 19 Feb 2003 02:35:06 -0000 1.3 --- test_xpickle.py 1 May 2003 17:45:56 -0000 1.4 *************** *** 36,45 **** def test_main(): ! suite = unittest.TestSuite() ! for test in (DumpCPickle_LoadPickle, ! DumpPickle_LoadCPickle, ! ): ! suite.addTest(unittest.makeSuite(test)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 36,43 ---- def test_main(): ! test_support.run_unittest( ! DumpCPickle_LoadPickle, ! DumpPickle_LoadCPickle ! ) if __name__ == "__main__": Index: test_zipimport.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_zipimport.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** test_zipimport.py 19 Feb 2003 02:35:06 -0000 1.7 --- test_zipimport.py 1 May 2003 17:45:56 -0000 1.8 *************** *** 188,193 **** def test_main(): ! test_support.run_unittest(UncompressedZipImportTestCase) ! test_support.run_unittest(CompressedZipImportTestCase) if __name__ == "__main__": --- 188,195 ---- def test_main(): ! test_support.run_unittest( ! UncompressedZipImportTestCase, ! CompressedZipImportTestCase ! ) if __name__ == "__main__": Index: test_zlib.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_zlib.py,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** test_zlib.py 27 Feb 2003 18:39:18 -0000 1.22 --- test_zlib.py 1 May 2003 17:45:56 -0000 1.23 *************** *** 480,489 **** def test_main(): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(ChecksumTestCase)) ! suite.addTest(unittest.makeSuite(ExceptionTestCase)) ! suite.addTest(unittest.makeSuite(CompressTestCase)) ! suite.addTest(unittest.makeSuite(CompressObjectTestCase)) ! test_support.run_suite(suite) if __name__ == "__main__": --- 480,489 ---- def test_main(): ! test_support.run_unittest( ! ChecksumTestCase, ! ExceptionTestCase, ! CompressTestCase, ! CompressObjectTestCase ! ) if __name__ == "__main__": *************** *** 492,501 **** def test(tests=''): if not tests: tests = 'o' ! suite = unittest.TestSuite() ! if 'k' in tests: suite.addTest(unittest.makeSuite(ChecksumTestCase)) ! if 'x' in tests: suite.addTest(unittest.makeSuite(ExceptionTestCase)) ! if 'c' in tests: suite.addTest(unittest.makeSuite(CompressTestCase)) ! if 'o' in tests: suite.addTest(unittest.makeSuite(CompressObjectTestCase)) ! test_support.run_suite(suite) if False: --- 492,501 ---- def test(tests=''): if not tests: tests = 'o' ! testcases = [] ! if 'k' in tests: testcases.append(ChecksumTestCase) ! if 'x' in tests: testcases.append(ExceptionTestCase) ! if 'c' in tests: testcases.append(CompressTestCase) ! if 'o' in tests: testcases.append(CompressObjectTestCase) ! test_support.run_unittest(*testcases) if False: From klm@users.sourceforge.net Thu May 1 21:46:17 2003 From: klm@users.sourceforge.net (klm@users.sourceforge.net) Date: Thu, 01 May 2003 13:46:17 -0700 Subject: [Python-checkins] python/dist/src/Misc python-mode.el,4.32,4.33 Message-ID: Update of /cvsroot/python/python/dist/src/Misc In directory sc8-pr-cvs1:/tmp/cvs-serv11225 Modified Files: python-mode.el Log Message: Allow for multiple parens around pdb prompt for (new) nested debugging sessions (and some cosmetic wording changes). Index: python-mode.el =================================================================== RCS file: /cvsroot/python/python/dist/src/Misc/python-mode.el,v retrieving revision 4.32 retrieving revision 4.33 diff -C2 -d -r4.32 -r4.33 *** python-mode.el 3 Mar 2003 17:09:44 -0000 4.32 --- python-mode.el 1 May 2003 20:46:14 -0000 4.33 *************** *** 484,488 **** "Regular expression pdbtrack uses to find a stack trace entry.") ! (defconst py-pdbtrack-input-prompt "\n[(<]?pdb[>)]? " "Regular expression pdbtrack uses to recognize a pdb prompt.") --- 484,488 ---- "Regular expression pdbtrack uses to find a stack trace entry.") ! (defconst py-pdbtrack-input-prompt "\n[(<]+pdb[>)]+ " "Regular expression pdbtrack uses to recognize a pdb prompt.") *************** *** 1291,1296 **** current function \(or class) or which defines the function \(or class). This is to provide for remote scripts, eg, Zope's 'Script ! (Python)' - put a _copy_ of the script in a python-mode buffer named ! for the script and pdbtrack will find it.)" ;; Instead of trying to piece things together from partial text ;; (which can be almost useless depending on Emacs version), we --- 1291,1296 ---- current function \(or class) or which defines the function \(or class). This is to provide for remote scripts, eg, Zope's 'Script ! (Python)' - put a _copy_ of the script in a buffer named for the ! script, and set to python-mode, and pdbtrack will find it.)" ;; Instead of trying to piece things together from partial text ;; (which can be almost useless depending on Emacs version), we *************** *** 1379,1383 **** (format "(Non-file source: '%s')" filename)) ! (t (format "Function/file not found: %s(), %s" funcname filename))) ) ) --- 1379,1383 ---- (format "(Non-file source: '%s')" filename)) ! (t (format "Not found: %s(), %s" funcname filename))) ) ) From klm@users.sourceforge.net Thu May 1 22:07:40 2003 From: klm@users.sourceforge.net (klm@users.sourceforge.net) Date: Thu, 01 May 2003 14:07:40 -0700 Subject: [Python-checkins] python/dist/src/Misc python-mode.el,4.33,4.34 Message-ID: Update of /cvsroot/python/python/dist/src/Misc In directory sc8-pr-cvs1:/tmp/cvs-serv21236 Modified Files: python-mode.el Log Message: Slightly more lenient pdbtrack prompt recognition, for people who use eg "pdb>". Index: python-mode.el =================================================================== RCS file: /cvsroot/python/python/dist/src/Misc/python-mode.el,v retrieving revision 4.33 retrieving revision 4.34 diff -C2 -d -r4.33 -r4.34 *** python-mode.el 1 May 2003 20:46:14 -0000 4.33 --- python-mode.el 1 May 2003 21:07:32 -0000 4.34 *************** *** 484,488 **** "Regular expression pdbtrack uses to find a stack trace entry.") ! (defconst py-pdbtrack-input-prompt "\n[(<]+pdb[>)]+ " "Regular expression pdbtrack uses to recognize a pdb prompt.") --- 484,488 ---- "Regular expression pdbtrack uses to find a stack trace entry.") ! (defconst py-pdbtrack-input-prompt "\n[(<]*pdb[>)]+ " "Regular expression pdbtrack uses to recognize a pdb prompt.") From jhylton@users.sourceforge.net Thu May 1 22:31:58 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Thu, 01 May 2003 14:31:58 -0700 Subject: [Python-checkins] python/dist/src/Objects longobject.c,1.158,1.159 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv32103 Modified Files: longobject.c Log Message: Silence compiler warnings in VC 7. Index: longobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/longobject.c,v retrieving revision 1.158 retrieving revision 1.159 diff -C2 -d -r1.158 -r1.159 *** longobject.c 17 Apr 2003 18:55:36 -0000 1.158 --- longobject.c 1 May 2003 21:31:53 -0000 1.159 *************** *** 1441,1445 **** carry += v->ob_digit[i+k] - z + ((twodigits)zz << SHIFT); ! v->ob_digit[i+k] = carry & MASK; carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE, carry, SHIFT); --- 1441,1445 ---- carry += v->ob_digit[i+k] - z + ((twodigits)zz << SHIFT); ! v->ob_digit[i+k] = (digit)(carry & MASK); carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE, carry, SHIFT); *************** *** 1460,1464 **** for (i = 0; i < size_w && i+k < size_v; ++i) { carry += v->ob_digit[i+k] + w->ob_digit[i]; ! v->ob_digit[i+k] = carry & MASK; carry = Py_ARITHMETIC_RIGHT_SHIFT( BASE_TWODIGITS_TYPE, --- 1460,1464 ---- for (i = 0; i < size_w && i+k < size_v; ++i) { carry += v->ob_digit[i+k] + w->ob_digit[i]; ! v->ob_digit[i+k] = (digit)(carry & MASK); carry = Py_ARITHMETIC_RIGHT_SHIFT( BASE_TWODIGITS_TYPE, From jackjansen@users.sourceforge.net Thu May 1 23:06:18 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Thu, 01 May 2003 15:06:18 -0700 Subject: [Python-checkins] python/dist/src/Lib/plat-mac/lib-scriptpackages/SystemEvents Disk_Folder_File_Suite.py,NONE,1.1 System_Events_Suite.py,1.3,1.4 __init__.py,1.3,1.4 Disk_2d_Folder_2d_File_Suite.py,1.3,NONE Message-ID: Update of /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/SystemEvents In directory sc8-pr-cvs1:/tmp/cvs-serv13075/Lib/plat-mac/lib-scriptpackages/SystemEvents Modified Files: System_Events_Suite.py __init__.py Added Files: Disk_Folder_File_Suite.py Removed Files: Disk_2d_Folder_2d_File_Suite.py Log Message: Rename funny long suite to Disk_File_Folder. --- NEW FILE: Disk_Folder_File_Suite.py --- """Suite Disk-Folder-File Suite: Terms and Events for controlling Disks, Folders, and Files Level 1, version 1 Generated from /System/Library/CoreServices/System Events.app AETE/AEUT resource version 1/0, language 0, script 0 """ import aetools import MacOS _code = 'cdis' class Disk_Folder_File_Suite_Events: _argmap_move = { 'to' : 'insh', } def move(self, _object, _attributes={}, **_arguments): """move: Move disk item(s) to a new location. Required argument: the object for the command Keyword argument to: The new location for the disk item(s). Keyword argument _attributes: AppleEvent attribute dictionary Returns: the reply for the command """ _code = 'core' _subcode = 'move' aetools.keysubst(_arguments, self._argmap_move) _arguments['----'] = _object _reply, _arguments, _attributes = self.send(_code, _subcode, _arguments, _attributes) if _arguments.get('errn', 0): raise aetools.Error, aetools.decodeerror(_arguments) # XXXX Optionally decode result if _arguments.has_key('----'): return _arguments['----'] class alias(aetools.ComponentItem): """alias - An alias in the file system """ want = 'alis' class _Prop__3c_Inheritance_3e_(aetools.NProperty): """ - All of the properties of the superclass. """ which = 'c@#^' want = 'cobj' class _Prop_properties(aetools.NProperty): """properties - every property of the alias """ which = 'pALL' want = '****' class _Prop_version(aetools.NProperty): """version - the version of the application bundle referenced by the alias (visible at the bottom of the "Get Info" window) """ which = 'vers' want = 'utxt' # element 'alis' as ['name', 'indx', 'rele', 'rang', 'test'] # element 'cfol' as ['name', 'indx', 'rele', 'rang', 'test'] # element 'cobj' as ['name', 'indx', 'rele', 'rang', 'test'] # element 'file' as ['name', 'indx', 'rele', 'rang', 'test'] aliases = alias class disk(aetools.ComponentItem): """disk - A disk in the file system """ want = 'cdis' class _Prop_capacity(aetools.NProperty): """capacity - the total number of bytes (free or used) on the disk """ which = 'capa' want = 'magn' class _Prop_ejectable(aetools.NProperty): """ejectable - Can the media be ejected (floppies, CD's, and so on)? """ which = 'isej' want = 'bool' class _Prop_format(aetools.NProperty): """format - the file system format of this disk """ which = 'dfmt' want = 'edfm' class _Prop_free_space(aetools.NProperty): """free space - the number of free bytes left on the disk """ which = 'frsp' want = 'magn' class _Prop_ignore_privileges(aetools.NProperty): """ignore privileges - Ignore permissions on this disk? """ which = 'igpr' want = 'bool' class _Prop_local_volume(aetools.NProperty): """local volume - Is the media a local volume (as opposed to a file server)? """ which = 'isrv' want = 'bool' class _Prop_startup(aetools.NProperty): """startup - Is this disk the boot disk? """ which = 'istd' want = 'bool' # element 'alis' as ['name', 'indx', 'rele', 'rang', 'test'] # element 'cfol' as ['name', 'indx', 'rele', 'rang', 'test'] # element 'cobj' as ['name', 'indx', 'rele', 'rang', 'test'] # element 'file' as ['name', 'indx', 'rele', 'rang', 'test'] disks = disk class folder(aetools.ComponentItem): """folder - A folder in the file system """ want = 'cfol' # element 'alis' as ['name', 'indx', 'rele', 'rang', 'test'] # element 'cfol' as ['name', 'indx', 'rele', 'rang', 'test'] # element 'cobj' as ['name', 'indx', 'rele', 'rang', 'test'] # element 'file' as ['name', 'indx', 'rele', 'rang', 'test'] folders = folder class item(aetools.ComponentItem): """item - An item in the file system """ want = 'cobj' class _Prop_POSIX_path(aetools.NProperty): """POSIX path - the POSIX file system path of the item """ which = 'posx' want = 'utxt' class _Prop_busy_status(aetools.NProperty): """busy status - Is the item busy? """ which = 'busy' want = 'bool' class _Prop_creation_date(aetools.NProperty): """creation date - the date on which the item was created """ which = 'ascd' want = '****' class _Prop_displayed_name(aetools.NProperty): """displayed name - the name of the item as displayed in the User Interface """ which = 'dnam' want = 'utxt' class _Prop_modification_date(aetools.NProperty): """modification date - the date on which the item was last modified """ which = 'asmo' want = '****' class _Prop_name(aetools.NProperty): """name - the name of the item """ which = 'pnam' want = 'utxt' class _Prop_name_extension(aetools.NProperty): """name extension - the extension portion of the name """ which = 'extn' want = 'utxt' class _Prop_package_folder(aetools.NProperty): """package folder - Is the item a package? """ which = 'pkgf' want = 'bool' class _Prop_path(aetools.NProperty): """path - the file system path of the item """ which = 'ppth' want = 'utxt' class _Prop_url(aetools.NProperty): """url - the url of the item """ which = 'url ' want = 'utxt' class _Prop_visible(aetools.NProperty): """visible - Is the item visible? """ which = 'pvis' want = 'bool' class _Prop_volume(aetools.NProperty): """volume - the volume on which the item resides """ which = 'volu' want = 'utxt' items = item class file(aetools.ComponentItem): """file - A file in the file system """ want = 'file' class _Prop_creator_type(aetools.NProperty): """creator type - the OSType identifying the application that created the file """ which = 'fcrt' want = 'utxt' class _Prop_file_type(aetools.NProperty): """file type - the OSType identifying the type of data contained in the file """ which = 'asty' want = 'utxt' class _Prop_physical_size(aetools.NProperty): """physical size - the actual space used by the file on disk """ which = 'phys' want = '****' class _Prop_product_version(aetools.NProperty): """product version - the version of the product (visible at the top of the "Get Info" window) """ which = 'ver2' want = 'utxt' class _Prop_size(aetools.NProperty): """size - the logical size of the file """ which = 'ptsz' want = '****' class _Prop_stationery(aetools.NProperty): """stationery - Is the file a stationery pad? """ which = 'pspd' want = 'bool' files = file alias._superclassnames = ['item'] alias._privpropdict = { '_3c_Inheritance_3e_' : _Prop__3c_Inheritance_3e_, 'properties' : _Prop_properties, 'version' : _Prop_version, } alias._privelemdict = { 'alias' : alias, 'file' : file, 'folder' : folder, 'item' : item, } disk._superclassnames = ['item'] disk._privpropdict = { '_3c_Inheritance_3e_' : _Prop__3c_Inheritance_3e_, 'capacity' : _Prop_capacity, 'ejectable' : _Prop_ejectable, 'format' : _Prop_format, 'free_space' : _Prop_free_space, 'ignore_privileges' : _Prop_ignore_privileges, 'local_volume' : _Prop_local_volume, 'properties' : _Prop_properties, 'startup' : _Prop_startup, } disk._privelemdict = { 'alias' : alias, 'file' : file, 'folder' : folder, 'item' : item, } folder._superclassnames = ['item'] folder._privpropdict = { '_3c_Inheritance_3e_' : _Prop__3c_Inheritance_3e_, 'properties' : _Prop_properties, } folder._privelemdict = { 'alias' : alias, 'file' : file, 'folder' : folder, 'item' : item, } item._superclassnames = [] item._privpropdict = { 'POSIX_path' : _Prop_POSIX_path, '_3c_Inheritance_3e_' : _Prop__3c_Inheritance_3e_, 'busy_status' : _Prop_busy_status, 'creation_date' : _Prop_creation_date, 'displayed_name' : _Prop_displayed_name, 'modification_date' : _Prop_modification_date, 'name' : _Prop_name, 'name_extension' : _Prop_name_extension, 'package_folder' : _Prop_package_folder, 'path' : _Prop_path, 'properties' : _Prop_properties, 'url' : _Prop_url, 'visible' : _Prop_visible, 'volume' : _Prop_volume, } item._privelemdict = { } file._superclassnames = ['item'] file._privpropdict = { '_3c_Inheritance_3e_' : _Prop__3c_Inheritance_3e_, 'creator_type' : _Prop_creator_type, 'file_type' : _Prop_file_type, 'physical_size' : _Prop_physical_size, 'product_version' : _Prop_product_version, 'properties' : _Prop_properties, 'size' : _Prop_size, 'stationery' : _Prop_stationery, 'version' : _Prop_version, } file._privelemdict = { } _Enum_edfm = { 'MS_2d_DOS_format' : 'dfms', # MS-DOS format 'Apple_Photo_format' : 'dfph', # Apple Photo format 'ISO_9660_format' : 'df96', # ISO 9660 format 'QuickTake_format' : 'dfqt', # QuickTake format 'AppleShare_format' : 'dfas', # AppleShare format 'High_Sierra_format' : 'dfhs', # High Sierra format 'Mac_OS_Extended_format' : 'dfh+', # Mac OS Extended format 'UDF_format' : 'dfud', # UDF format 'unknown_format' : 'df??', # unknown format 'audio_format' : 'dfau', # audio format 'Mac_OS_format' : 'dfhf', # Mac OS format 'UFS_format' : 'dfuf', # UFS format 'NFS_format' : 'dfnf', # NFS format 'ProDOS_format' : 'dfpr', # ProDOS format 'WebDAV_format' : 'dfwd', # WebDAV format } # # Indices of types declared in this module # _classdeclarations = { 'alis' : alias, 'cdis' : disk, 'cfol' : folder, 'cobj' : item, 'file' : file, } _propdeclarations = { 'ascd' : _Prop_creation_date, 'asmo' : _Prop_modification_date, 'asty' : _Prop_file_type, 'busy' : _Prop_busy_status, 'c@#^' : _Prop__3c_Inheritance_3e_, 'capa' : _Prop_capacity, 'dfmt' : _Prop_format, 'dnam' : _Prop_displayed_name, 'extn' : _Prop_name_extension, 'fcrt' : _Prop_creator_type, 'frsp' : _Prop_free_space, 'igpr' : _Prop_ignore_privileges, 'isej' : _Prop_ejectable, 'isrv' : _Prop_local_volume, 'istd' : _Prop_startup, 'pALL' : _Prop_properties, 'phys' : _Prop_physical_size, 'pkgf' : _Prop_package_folder, 'pnam' : _Prop_name, 'posx' : _Prop_POSIX_path, 'ppth' : _Prop_path, 'pspd' : _Prop_stationery, 'ptsz' : _Prop_size, 'pvis' : _Prop_visible, 'url ' : _Prop_url, 'ver2' : _Prop_product_version, 'vers' : _Prop_version, 'volu' : _Prop_volume, } _compdeclarations = { } _enumdeclarations = { 'edfm' : _Enum_edfm, } Index: System_Events_Suite.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/SystemEvents/System_Events_Suite.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** System_Events_Suite.py 12 Apr 2003 22:27:10 -0000 1.3 --- System_Events_Suite.py 1 May 2003 22:06:15 -0000 1.4 *************** *** 51,55 **** applications = application application._superclassnames = [] ! import Disk_2d_Folder_2d_File_Suite import Standard_Suite import Folder_Actions_Suite --- 51,55 ---- applications = application application._superclassnames = [] ! import Disk_Folder_File_Suite import Standard_Suite import Folder_Actions_Suite *************** *** 64,76 **** application._privelemdict = { 'UI_element' : Processes_Suite.UI_element, ! 'alias' : Disk_2d_Folder_2d_File_Suite.alias, 'application_process' : Processes_Suite.application_process, 'desk_accessory_process' : Processes_Suite.desk_accessory_process, ! 'disk' : Disk_2d_Folder_2d_File_Suite.disk, 'document' : Standard_Suite.document, ! 'file' : Disk_2d_Folder_2d_File_Suite.file, ! 'folder' : Disk_2d_Folder_2d_File_Suite.folder, 'folder_action' : Folder_Actions_Suite.folder_action, ! 'item' : Disk_2d_Folder_2d_File_Suite.item, 'login_item' : Login_Items_Suite.login_item, 'process' : Processes_Suite.process, --- 64,76 ---- application._privelemdict = { 'UI_element' : Processes_Suite.UI_element, ! 'alias' : Disk_Folder_File_Suite.alias, 'application_process' : Processes_Suite.application_process, 'desk_accessory_process' : Processes_Suite.desk_accessory_process, ! 'disk' : Disk_Folder_File_Suite.disk, 'document' : Standard_Suite.document, ! 'file' : Disk_Folder_File_Suite.file, ! 'folder' : Disk_Folder_File_Suite.folder, 'folder_action' : Folder_Actions_Suite.folder_action, ! 'item' : Disk_Folder_File_Suite.item, 'login_item' : Login_Items_Suite.login_item, 'process' : Processes_Suite.process, Index: __init__.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/SystemEvents/__init__.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** __init__.py 12 Apr 2003 22:27:10 -0000 1.3 --- __init__.py 1 May 2003 22:06:15 -0000 1.4 *************** *** 6,10 **** import Standard_Suite import Text_Suite ! import Disk_2d_Folder_2d_File_Suite import Folder_Actions_Suite import Login_Items_Suite --- 6,10 ---- import Standard_Suite import Text_Suite ! import Disk_Folder_File_Suite import Folder_Actions_Suite import Login_Items_Suite *************** *** 18,22 **** '????' : Standard_Suite, '????' : Text_Suite, ! 'cdis' : Disk_2d_Folder_2d_File_Suite, 'faco' : Folder_Actions_Suite, 'logi' : Login_Items_Suite, --- 18,22 ---- '????' : Standard_Suite, '????' : Text_Suite, ! 'cdis' : Disk_Folder_File_Suite, 'faco' : Folder_Actions_Suite, 'logi' : Login_Items_Suite, *************** *** 32,36 **** '????' : ('SystemEvents.Standard_Suite', 'Standard_Suite'), '????' : ('SystemEvents.Text_Suite', 'Text_Suite'), ! 'cdis' : ('SystemEvents.Disk_2d_Folder_2d_File_Suite', 'Disk_2d_Folder_2d_File_Suite'), 'faco' : ('SystemEvents.Folder_Actions_Suite', 'Folder_Actions_Suite'), 'logi' : ('SystemEvents.Login_Items_Suite', 'Login_Items_Suite'), --- 32,36 ---- '????' : ('SystemEvents.Standard_Suite', 'Standard_Suite'), '????' : ('SystemEvents.Text_Suite', 'Text_Suite'), ! 'cdis' : ('SystemEvents.Disk_Folder_File_Suite', 'Disk_Folder_File_Suite'), 'faco' : ('SystemEvents.Folder_Actions_Suite', 'Folder_Actions_Suite'), 'logi' : ('SystemEvents.Login_Items_Suite', 'Login_Items_Suite'), *************** *** 43,47 **** from Standard_Suite import * from Text_Suite import * ! from Disk_2d_Folder_2d_File_Suite import * from Folder_Actions_Suite import * from Login_Items_Suite import * --- 43,47 ---- from Standard_Suite import * from Text_Suite import * ! from Disk_Folder_File_Suite import * from Folder_Actions_Suite import * from Login_Items_Suite import * *************** *** 68,76 **** # Set property and element dictionaries now that all classes have been defined # - getbaseclasses(color) - getbaseclasses(window) - getbaseclasses(application) - getbaseclasses(item) - getbaseclasses(document) getbaseclasses(character) getbaseclasses(attachment) --- 68,71 ---- *************** *** 79,82 **** --- 74,83 ---- getbaseclasses(attribute_run) getbaseclasses(text) + getbaseclasses(color) + getbaseclasses(window) + getbaseclasses(application) + getbaseclasses(item) + getbaseclasses(document) + getbaseclasses(application) getbaseclasses(login_item) getbaseclasses(file) *************** *** 171,175 **** getbaseclasses(combo_box) getbaseclasses(browser) - getbaseclasses(application) # --- 172,175 ---- *************** *** 177,185 **** # _classdeclarations = { - 'colr' : color, - 'cwin' : window, - 'capp' : application, - 'cobj' : item, - 'docu' : document, 'cha ' : character, 'atts' : attachment, --- 177,180 ---- *************** *** 188,191 **** --- 183,192 ---- 'catr' : attribute_run, 'ctxt' : text, + 'colr' : color, + 'cwin' : window, + 'capp' : application, + 'cobj' : item, + 'docu' : document, + 'capp' : application, 'logi' : login_item, 'file' : file, *************** *** 280,284 **** 'comB' : combo_box, 'broW' : browser, - 'capp' : application, } --- 281,284 ---- *************** *** 286,290 **** class SystemEvents(Standard_Suite_Events, Text_Suite_Events, ! Disk_2d_Folder_2d_File_Suite_Events, Folder_Actions_Suite_Events, Login_Items_Suite_Events, --- 286,290 ---- class SystemEvents(Standard_Suite_Events, Text_Suite_Events, ! Disk_Folder_File_Suite_Events, Folder_Actions_Suite_Events, Login_Items_Suite_Events, --- Disk_2d_Folder_2d_File_Suite.py DELETED --- From jackjansen@users.sourceforge.net Thu May 1 23:06:45 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Thu, 01 May 2003 15:06:45 -0700 Subject: [Python-checkins] python/dist/src/Lib/plat-mac/lib-scriptpackages/Netscape __init__.py,1.7,1.8 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/Netscape In directory sc8-pr-cvs1:/tmp/cvs-serv13075/Lib/plat-mac/lib-scriptpackages/Netscape Modified Files: __init__.py Log Message: Rename funny long suite to Disk_File_Folder. Index: __init__.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/Netscape/__init__.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** __init__.py 12 Apr 2003 22:27:09 -0000 1.7 --- __init__.py 1 May 2003 22:06:12 -0000 1.8 *************** *** 62,67 **** getbaseclasses(window) getbaseclasses(application) - getbaseclasses(text) - getbaseclasses(styleset) getbaseclasses(StdSuites.Text_Suite.text_flow) getbaseclasses(StdSuites.Text_Suite.character) --- 62,65 ---- *************** *** 71,74 **** --- 69,74 ---- getbaseclasses(StdSuites.Text_Suite.paragraph) getbaseclasses(StdSuites.Text_Suite.text) + getbaseclasses(text) + getbaseclasses(styleset) # *************** *** 78,83 **** 'cwin' : window, 'capp' : application, - 'ctxt' : text, - 'stys' : styleset, 'cflo' : StdSuites.Text_Suite.text_flow, 'cha ' : StdSuites.Text_Suite.character, --- 78,81 ---- *************** *** 87,90 **** --- 85,90 ---- 'cpar' : StdSuites.Text_Suite.paragraph, 'ctxt' : StdSuites.Text_Suite.text, + 'ctxt' : text, + 'stys' : styleset, } From jackjansen@users.sourceforge.net Thu May 1 23:06:43 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Thu, 01 May 2003 15:06:43 -0700 Subject: [Python-checkins] python/dist/src/Mac/scripts genallsuites.py,1.3,1.4 Message-ID: Update of /cvsroot/python/python/dist/src/Mac/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv13075/Mac/scripts Modified Files: genallsuites.py Log Message: Rename funny long suite to Disk_File_Folder. Index: genallsuites.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/scripts/genallsuites.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** genallsuites.py 29 Apr 2003 21:46:31 -0000 1.3 --- genallsuites.py 1 May 2003 22:06:10 -0000 1.4 *************** *** 29,33 **** output=os.path.join(DSTDIR, 'SystemEvents'), basepkgname='StdSuites', ! edit_modnames=[], verbose=verbose) gensuitemodule.processfile(CODEWARRIOR, output=os.path.join(DSTDIR, 'CodeWarrior'), --- 29,34 ---- output=os.path.join(DSTDIR, 'SystemEvents'), basepkgname='StdSuites', ! edit_modnames=[('Disk_2d_Folder_2d_File_Suite', 'Disk_Folder_File_Suite')], ! verbose=verbose) gensuitemodule.processfile(CODEWARRIOR, output=os.path.join(DSTDIR, 'CodeWarrior'), From jackjansen@users.sourceforge.net Thu May 1 23:06:45 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Thu, 01 May 2003 15:06:45 -0700 Subject: [Python-checkins] python/dist/src/Lib/plat-mac/lib-scriptpackages/CodeWarrior __init__.py,1.8,1.9 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/CodeWarrior In directory sc8-pr-cvs1:/tmp/cvs-serv13075/Lib/plat-mac/lib-scriptpackages/CodeWarrior Modified Files: __init__.py Log Message: Rename funny long suite to Disk_File_Folder. Index: __init__.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/CodeWarrior/__init__.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** __init__.py 12 Apr 2003 22:27:06 -0000 1.8 --- __init__.py 1 May 2003 22:06:11 -0000 1.9 *************** *** 48,51 **** --- 48,60 ---- # Set property and element dictionaries now that all classes have been defined # + getbaseclasses(character) + getbaseclasses(text) + getbaseclasses(window) + getbaseclasses(file) + getbaseclasses(line) + getbaseclasses(selection_2d_object) + getbaseclasses(application) + getbaseclasses(insertion_point) + getbaseclasses(document) getbaseclasses(single_class_browser) getbaseclasses(project_document) *************** *** 101,113 **** getbaseclasses(Debugger_Display) getbaseclasses(class_) - getbaseclasses(character) - getbaseclasses(text) - getbaseclasses(window) - getbaseclasses(file) - getbaseclasses(line) - getbaseclasses(selection_2d_object) - getbaseclasses(application) - getbaseclasses(insertion_point) - getbaseclasses(document) # --- 110,113 ---- *************** *** 115,118 **** --- 115,127 ---- # _classdeclarations = { + 'cha ' : character, + 'ctxt' : text, + 'cwin' : window, + 'file' : file, + 'clin' : line, + 'csel' : selection_2d_object, + 'capp' : application, + 'cins' : insertion_point, + 'docu' : document, '1BRW' : single_class_browser, 'PRJD' : project_document, *************** *** 168,180 **** 'DbDS' : Debugger_Display, 'Clas' : class_, - 'cha ' : character, - 'ctxt' : text, - 'cwin' : window, - 'file' : file, - 'clin' : line, - 'csel' : selection_2d_object, - 'capp' : application, - 'cins' : insertion_point, - 'docu' : document, } --- 177,180 ---- From jackjansen@users.sourceforge.net Thu May 1 23:06:44 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Thu, 01 May 2003 15:06:44 -0700 Subject: [Python-checkins] python/dist/src/Lib/plat-mac/lib-scriptpackages/Finder __init__.py,1.8,1.9 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/Finder In directory sc8-pr-cvs1:/tmp/cvs-serv13075/Lib/plat-mac/lib-scriptpackages/Finder Modified Files: __init__.py Log Message: Rename funny long suite to Disk_File_Folder. Index: __init__.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/Finder/__init__.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** __init__.py 12 Apr 2003 22:27:09 -0000 1.8 --- __init__.py 1 May 2003 22:06:12 -0000 1.9 *************** *** 68,82 **** # Set property and element dictionaries now that all classes have been defined # - getbaseclasses(process) - getbaseclasses(application_process) - getbaseclasses(desk_accessory_process) - getbaseclasses(application) - getbaseclasses(package) - getbaseclasses(file) - getbaseclasses(application_file) - getbaseclasses(alias_file) - getbaseclasses(internet_location_file) - getbaseclasses(document_file) - getbaseclasses(clipping) getbaseclasses(icon_view_options) getbaseclasses(label) --- 68,71 ---- *************** *** 86,96 **** getbaseclasses(icon_family) getbaseclasses(list_view_options) - getbaseclasses(application) getbaseclasses(item) ! getbaseclasses(trash_2d_object) ! getbaseclasses(desktop_2d_object) ! getbaseclasses(container) ! getbaseclasses(folder) ! getbaseclasses(disk) getbaseclasses(preferences_window) getbaseclasses(Finder_window) --- 75,86 ---- getbaseclasses(icon_family) getbaseclasses(list_view_options) getbaseclasses(item) ! getbaseclasses(package) ! getbaseclasses(file) ! getbaseclasses(application_file) ! getbaseclasses(alias_file) ! getbaseclasses(internet_location_file) ! getbaseclasses(document_file) ! getbaseclasses(clipping) getbaseclasses(preferences_window) getbaseclasses(Finder_window) *************** *** 98,101 **** --- 88,101 ---- getbaseclasses(clipping_window) getbaseclasses(information_window) + getbaseclasses(application) + getbaseclasses(process) + getbaseclasses(application_process) + getbaseclasses(desk_accessory_process) + getbaseclasses(application) + getbaseclasses(trash_2d_object) + getbaseclasses(desktop_2d_object) + getbaseclasses(container) + getbaseclasses(folder) + getbaseclasses(disk) getbaseclasses(StdSuites.Type_Names_Suite.double_integer) getbaseclasses(StdSuites.Type_Names_Suite.version) *************** *** 143,157 **** # _classdeclarations = { - 'prcs' : process, - 'pcap' : application_process, - 'pcda' : desk_accessory_process, - 'capp' : application, - 'pack' : package, - 'file' : file, - 'appf' : application_file, - 'alia' : alias_file, - 'inlf' : internet_location_file, - 'docf' : document_file, - 'clpf' : clipping, 'icop' : icon_view_options, 'clbl' : label, --- 143,146 ---- *************** *** 161,171 **** 'ifam' : icon_family, 'lvop' : list_view_options, - 'capp' : application, 'cobj' : item, ! 'ctrs' : trash_2d_object, ! 'cdsk' : desktop_2d_object, ! 'ctnr' : container, ! 'cfol' : folder, ! 'cdis' : disk, 'pwnd' : preferences_window, 'brow' : Finder_window, --- 150,161 ---- 'ifam' : icon_family, 'lvop' : list_view_options, 'cobj' : item, ! 'pack' : package, ! 'file' : file, ! 'appf' : application_file, ! 'alia' : alias_file, ! 'inlf' : internet_location_file, ! 'docf' : document_file, ! 'clpf' : clipping, 'pwnd' : preferences_window, 'brow' : Finder_window, *************** *** 173,176 **** --- 163,176 ---- 'lwnd' : clipping_window, 'iwnd' : information_window, + 'capp' : application, + 'prcs' : process, + 'pcap' : application_process, + 'pcda' : desk_accessory_process, + 'capp' : application, + 'ctrs' : trash_2d_object, + 'cdsk' : desktop_2d_object, + 'ctnr' : container, + 'cfol' : folder, + 'cdis' : disk, 'comp' : StdSuites.Type_Names_Suite.double_integer, 'vers' : StdSuites.Type_Names_Suite.version, From jackjansen@users.sourceforge.net Thu May 1 23:06:46 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Thu, 01 May 2003 15:06:46 -0700 Subject: [Python-checkins] python/dist/src/Lib/plat-mac/lib-scriptpackages/StdSuites __init__.py,1.7,1.8 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/StdSuites In directory sc8-pr-cvs1:/tmp/cvs-serv13075/Lib/plat-mac/lib-scriptpackages/StdSuites Modified Files: __init__.py Log Message: Rename funny long suite to Disk_File_Folder. Index: __init__.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/lib-scriptpackages/StdSuites/__init__.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** __init__.py 12 Apr 2003 22:27:10 -0000 1.7 --- __init__.py 1 May 2003 22:06:13 -0000 1.8 *************** *** 221,231 **** getbaseclasses(null) getbaseclasses(target_id) - getbaseclasses(paragraph) - getbaseclasses(character) - getbaseclasses(text_flow) - getbaseclasses(text_style_info) - getbaseclasses(line) - getbaseclasses(word) - getbaseclasses(text) getbaseclasses(graphic_group) getbaseclasses(oval) --- 221,224 ---- *************** *** 241,246 **** --- 234,250 ---- getbaseclasses(pixel_map) getbaseclasses(rectangle) + getbaseclasses(paragraph) + getbaseclasses(character) + getbaseclasses(text_flow) + getbaseclasses(text_style_info) + getbaseclasses(line) + getbaseclasses(word) + getbaseclasses(text) getbaseclasses(graphic_group) getbaseclasses(drawing_area) + getbaseclasses(cell) + getbaseclasses(column) + getbaseclasses(table) + getbaseclasses(row) getbaseclasses(AppleTalk_address) getbaseclasses(address_specification) *************** *** 255,262 **** getbaseclasses(IP_address) getbaseclasses(Ethernet_address) - getbaseclasses(cell) - getbaseclasses(column) - getbaseclasses(table) - getbaseclasses(row) # --- 259,262 ---- *************** *** 416,426 **** 'null' : null, 'targ' : target_id, - 'cpar' : paragraph, - 'cha ' : character, - 'cflo' : text_flow, - 'tsty' : text_style_info, - 'clin' : line, - 'cwor' : word, - 'ctxt' : text, 'cpic' : graphic_group, 'covl' : oval, --- 416,419 ---- *************** *** 436,441 **** --- 429,445 ---- 'cpix' : pixel_map, 'crec' : rectangle, + 'cpar' : paragraph, + 'cha ' : character, + 'cflo' : text_flow, + 'tsty' : text_style_info, + 'clin' : line, + 'cwor' : word, + 'ctxt' : text, 'cpic' : graphic_group, 'cdrw' : drawing_area, + 'ccel' : cell, + 'ccol' : column, + 'ctbl' : table, + 'crow' : row, 'cat ' : AppleTalk_address, 'cadr' : address_specification, *************** *** 450,457 **** 'cip ' : IP_address, 'cen ' : Ethernet_address, - 'ccel' : cell, - 'ccol' : column, - 'ctbl' : table, - 'crow' : row, } --- 454,457 ---- From rhettinger@users.sourceforge.net Fri May 2 10:06:36 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 02:06:36 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test___all__.py,1.30,1.31 test_builtin.py,1.19,1.20 test_glob.py,1.4,1.5 test_pyclbr.py,1.17,1.18 test_userdict.py,1.15,1.16 test_weakref.py,1.23,1.24 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv14447 Modified Files: test___all__.py test_builtin.py test_glob.py test_pyclbr.py test_userdict.py test_weakref.py Log Message: Used sets.Set() to compare unordered sequences. Improves clarity and brevity. Index: test___all__.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test___all__.py,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** test___all__.py 1 May 2003 17:45:31 -0000 1.30 --- test___all__.py 2 May 2003 09:06:23 -0000 1.31 *************** *** 3,6 **** --- 3,7 ---- from test.test_support import verify, verbose + from sets import Set import sys import warnings *************** *** 43,50 **** if names.has_key("__builtins__"): del names["__builtins__"] ! keys = names.keys() ! keys.sort() ! all = list(sys.modules[modname].__all__) # in case it's a tuple ! all.sort() verify(keys==all, "%s != %s" % (keys, all)) --- 44,49 ---- if names.has_key("__builtins__"): del names["__builtins__"] ! keys = Set(names) ! all = Set(sys.modules[modname].__all__) verify(keys==all, "%s != %s" % (keys, all)) Index: test_builtin.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_builtin.py,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** test_builtin.py 1 May 2003 17:45:33 -0000 1.19 --- test_builtin.py 2 May 2003 09:06:25 -0000 1.20 *************** *** 3,6 **** --- 3,7 ---- import test.test_support, unittest from test.test_support import fcmp, have_unicode, TESTFN, unlink + from sets import Set import sys, warnings, cStringIO *************** *** 1160,1175 **** def test_vars(self): ! a = b = None ! a = vars().keys() ! b = dir() ! a.sort() ! b.sort() ! self.assertEqual(a, b) import sys ! a = vars(sys).keys() ! b = dir(sys) ! a.sort() ! b.sort() ! self.assertEqual(a, b) self.assertEqual(self.get_vars_f0(), {}) self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2}) --- 1161,1167 ---- def test_vars(self): ! self.assertEqual(Set(vars()), Set(dir())) import sys ! self.assertEqual(Set(vars(sys)), Set(dir(sys))) self.assertEqual(self.get_vars_f0(), {}) self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2}) Index: test_glob.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_glob.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** test_glob.py 23 Jul 2002 19:03:54 -0000 1.4 --- test_glob.py 2 May 2003 09:06:26 -0000 1.5 *************** *** 3,6 **** --- 3,7 ---- import glob import os + from sets import Set def mkdirs(fname): *************** *** 62,70 **** def assertSequencesEqual_noorder(self, l1, l2): ! l1 = list(l1) ! l2 = list(l2) ! l1.sort() ! l2.sort() ! self.assertEqual(l1, l2) def test_glob_literal(self): --- 63,67 ---- def assertSequencesEqual_noorder(self, l1, l2): ! self.assertEqual(Set(l1), Set(l2)) def test_glob_literal(self): Index: test_pyclbr.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_pyclbr.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** test_pyclbr.py 30 Dec 2002 07:21:32 -0000 1.17 --- test_pyclbr.py 2 May 2003 09:06:26 -0000 1.18 *************** *** 8,11 **** --- 8,12 ---- import pyclbr from unittest import TestCase + from sets import Set # This next line triggers an error on old versions of pyclbr. *************** *** 24,38 **** def assertListEq(self, l1, l2, ignore): ''' succeed iff {l1} - {ignore} == {l2} - {ignore} ''' ! l1.sort() ! l2.sort() ! try: ! for p1, p2 in (l1, l2), (l2, l1): ! for item in p1: ! ok = (item in p2) or (item in ignore) ! if not ok: ! self.fail("%r missing" % item) ! except: print >>sys.stderr, "l1=%r\nl2=%r\nignore=%r" % (l1, l2, ignore) ! raise def assertHasattr(self, obj, attr, ignore): --- 25,32 ---- def assertListEq(self, l1, l2, ignore): ''' succeed iff {l1} - {ignore} == {l2} - {ignore} ''' ! missing = (Set(l1) ^ Set(l2)) - Set(ignore) ! if missing: print >>sys.stderr, "l1=%r\nl2=%r\nignore=%r" % (l1, l2, ignore) ! self.fail("%r missing" % missing.pop()) def assertHasattr(self, obj, attr, ignore): Index: test_userdict.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_userdict.py,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** test_userdict.py 1 May 2003 17:45:54 -0000 1.15 --- test_userdict.py 2 May 2003 09:06:27 -0000 1.16 *************** *** 2,5 **** --- 2,6 ---- import test.test_support, unittest + from sets import Set import UserDict *************** *** 69,76 **** self.assert_(hasattr(iter, '__iter__')) x = list(iter) ! x.sort() ! lst.sort() ! ref.sort() ! self.assert_(x==lst==ref) check_iterandlist(d.iterkeys(), d.keys(), self.reference.keys()) check_iterandlist(iter(d), d.keys(), self.reference.keys()) --- 70,74 ---- self.assert_(hasattr(iter, '__iter__')) x = list(iter) ! self.assert_(Set(x)==Set(lst)==Set(ref)) check_iterandlist(d.iterkeys(), d.keys(), self.reference.keys()) check_iterandlist(iter(d), d.keys(), self.reference.keys()) *************** *** 244,251 **** for k in u2: ikeys.append(k) - ikeys.sort() keys = u2.keys() ! keys.sort() ! self.assertEqual(ikeys, keys) # Test setdefault --- 242,247 ---- for k in u2: ikeys.append(k) keys = u2.keys() ! self.assertEqual(Set(ikeys), Set(keys)) # Test setdefault Index: test_weakref.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_weakref.py,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** test_weakref.py 1 May 2003 17:45:55 -0000 1.23 --- test_weakref.py 2 May 2003 09:06:28 -0000 1.24 *************** *** 5,8 **** --- 5,9 ---- from test import test_support + from sets import Set *************** *** 341,347 **** items1 = dict.items() items2 = dict.copy().items() ! items1.sort() ! items2.sort() ! self.assert_(items1 == items2, "cloning of weak-keyed dictionary did not work!") del items1, items2 --- 342,346 ---- items1 = dict.items() items2 = dict.copy().items() ! self.assert_(Set(items1) == Set(items2), "cloning of weak-keyed dictionary did not work!") del items1, items2 From rhettinger@users.sourceforge.net Fri May 2 10:36:12 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 02:36:12 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test___all__.py,1.31,1.32 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv25887 Modified Files: test___all__.py Log Message: Added missing modules to __all__ check. Index: test___all__.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test___all__.py,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** test___all__.py 2 May 2003 09:06:23 -0000 1.31 --- test___all__.py 2 May 2003 09:36:07 -0000 1.32 *************** *** 55,58 **** --- 55,59 ---- self.check_all("BaseHTTPServer") + self.check_all("Bastion") self.check_all("CGIHTTPServer") self.check_all("ConfigParser") *************** *** 144,147 **** --- 145,149 ---- self.check_all("rexec") self.check_all("rfc822") + self.check_all("rlcompleter") self.check_all("robotparser") self.check_all("sched") *************** *** 156,159 **** --- 158,162 ---- self.check_all("socket") self.check_all("sre") + self.check_all("_strptime") self.check_all("statcache") self.check_all("symtable") *************** *** 164,167 **** --- 167,171 ---- self.check_all("textwrap") self.check_all("threading") + self.check_all("timeit") self.check_all("toaiff") self.check_all("tokenize") From montanaro@users.sourceforge.net Fri May 2 16:28:06 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Fri, 02 May 2003 08:28:06 -0700 Subject: [Python-checkins] python/dist/src README,1.170,1.171 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv18892 Modified Files: README Log Message: add note about building with bsddb185 and making it appear as bsddb. Index: README =================================================================== RCS file: /cvsroot/python/python/dist/src/README,v retrieving revision 1.170 retrieving revision 1.171 diff -C2 -d -r1.170 -r1.171 *** README 25 Apr 2003 19:19:51 -0000 1.170 --- README 2 May 2003 15:27:59 -0000 1.171 *************** *** 256,259 **** --- 256,274 ---- above) so we can remove them!) + Unix platforms: If your vendor still ships (and you still use) Berkeley DB + 1.85 you will need to edit Modules/Setup to build the bsddb185 + module and add a line to sitecustomize.py which makes it the + default. In Modules/Setup a line like + + bsddb185 bsddbmodule.c + + should work. (You may need to add -I, -L or -l flags to direct the + compiler and linker to your include files and libraries.) You can + then force it to be the version people import by adding + + import bsddb185 as bsddb + + in sitecustomize.py. + 64-bit platforms: The modules audioop, imageop and rgbimg don't work. The setup.py script disables them on 64-bit installations. From anthonybaxter@users.sourceforge.net Fri May 2 16:40:53 2003 From: anthonybaxter@users.sourceforge.net (anthonybaxter@users.sourceforge.net) Date: Fri, 02 May 2003 08:40:53 -0700 Subject: [Python-checkins] python/dist/src/Modules socketmodule.c,1.261,1.262 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv24297 Modified Files: socketmodule.c Log Message: Patch 731209: Restore socketmodule's behaviour with dotted quad addresses to that of Python2.1. Such nnn.nnn.nnn.nnn addresses are just used directly, not passed to the resolver for a pointless lookup. Index: socketmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/socketmodule.c,v retrieving revision 1.261 retrieving revision 1.262 diff -C2 -d -r1.261 -r1.262 *** socketmodule.c 1 May 2003 05:20:46 -0000 1.261 --- socketmodule.c 2 May 2003 15:40:46 -0000 1.262 *************** *** 627,630 **** --- 627,632 ---- struct addrinfo hints, *res; int error; + int d1, d2, d3, d4; + char ch; memset((void *) addr_ret, '\0', sizeof(*addr_ret)); *************** *** 682,685 **** --- 684,701 ---- sin->sin_addr.s_addr = INADDR_BROADCAST; return sizeof(sin->sin_addr); + } + if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 && + 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 && + 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) { + struct sockaddr_in *sin; + sin = (struct sockaddr_in *)addr_ret; + sin->sin_addr.s_addr = htonl( + ((long) d1 << 24) | ((long) d2 << 16) | + ((long) d3 << 8) | ((long) d4 << 0)); + sin->sin_family = AF_INET; + #ifdef HAVE_SOCKADDR_SA_LEN + sin->sin_len = sizeof(*sin); + #endif + return 4; } memset(&hints, 0, sizeof(hints)); From fdrake@users.sourceforge.net Fri May 2 19:08:20 2003 From: fdrake@users.sourceforge.net (fdrake@users.sourceforge.net) Date: Fri, 02 May 2003 11:08:20 -0700 Subject: [Python-checkins] python/dist/src/Doc/perl l2hinit.perl,1.68,1.69 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/perl In directory sc8-pr-cvs1:/tmp/cvs-serv29005 Modified Files: l2hinit.perl Log Message: Remove section number from the title for use in the element in the document head. Index: l2hinit.perl =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/perl/l2hinit.perl,v retrieving revision 1.68 retrieving revision 1.69 diff -C2 -d -r1.68 -r1.69 *** l2hinit.perl 30 Oct 2002 21:51:18 -0000 1.68 --- l2hinit.perl 2 May 2003 18:08:16 -0000 1.69 *************** *** 664,670 **** $charset =~ s/_/\-/go; } join('', $MY_PARTIAL_HEADER, ! &meta_information($title), "", $title, "\n\n"); } --- 664,675 ---- $charset =~ s/_/\-/go; } + # Remove section number from the title for use in the + # element in the document head. + my $metatitle = "$title"; + $metatitle =~ s/^\d+(\.\d+)*\s*//; + join('', $MY_PARTIAL_HEADER, ! &meta_information($metatitle), "", $title, "\n\n"); } From fdrake@users.sourceforge.net Fri May 2 19:21:27 2003 From: fdrake@users.sourceforge.net (fdrake@users.sourceforge.net) Date: Fri, 02 May 2003 11:21:27 -0700 Subject: [Python-checkins] python/dist/src/Doc/perl l2hinit.perl,1.69,1.70 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/perl In directory sc8-pr-cvs1:/tmp/cvs-serv5701 Modified Files: l2hinit.perl Log Message: Avoid extraneous blank line generated in the middle of the document head. Index: l2hinit.perl =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/perl/l2hinit.perl,v retrieving revision 1.69 retrieving revision 1.70 diff -C2 -d -r1.69 -r1.70 *** l2hinit.perl 2 May 2003 18:08:16 -0000 1.69 --- l2hinit.perl 2 May 2003 18:21:22 -0000 1.70 *************** *** 615,638 **** $MY_PARTIAL_HEADER = join('', ($DOCTYPE ? $DTDcomment : ''), ! "\n\n", ! ($BASE ? "\n" : ''), ! "\n", ($FAVORITES_ICON ! ? ('\n") : ''), ($EXTERNAL_UP_LINK ! ? ('\n") : ''), ! "\n", ($HAVE_TABLE_OF_CONTENTS ! ? ('' ! . ($HAVE_GENERAL_INDEX ? "\n" : '')) : ''), ($HAVE_GENERAL_INDEX ! ? '' . "\n" : ''), # disable for now -- Mozilla doesn't do well with multiple indexes --- 615,637 ---- $MY_PARTIAL_HEADER = join('', ($DOCTYPE ? $DTDcomment : ''), ! "\n", ! ($BASE ? "\n" : ''), ! "\n", ($FAVORITES_ICON ! ? ("\n") : ''), ($EXTERNAL_UP_LINK ! ? ("\n" : "'>")) : ''), ! "\n', ($HAVE_TABLE_OF_CONTENTS ! ? "\n" : ''), ($HAVE_GENERAL_INDEX ! ? "\n" : ''), # disable for now -- Mozilla doesn't do well with multiple indexes *************** *** 646,653 **** # generated node###.html page names. Won't work with the # rest of the Python doc tools. ! ? ("\n" ! . "\n") : ''), $more_links_mark, --- 645,652 ---- # generated node###.html page names. Won't work with the # rest of the Python doc tools. ! ? ("\n" ! . "\n") : ''), $more_links_mark, From tim_one@users.sourceforge.net Fri May 2 19:39:58 2003 From: tim_one@users.sourceforge.net (tim_one@users.sourceforge.net) Date: Fri, 02 May 2003 11:39:58 -0700 Subject: [Python-checkins] python/dist/src/Modules datetimemodule.c,1.60,1.61 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv17845/python/Modules Modified Files: datetimemodule.c Log Message: SF patch 731504: Typo in datetimemodule.c comment. s/isofomat/isoformat/, by Steven Taschuk. Index: datetimemodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/datetimemodule.c,v retrieving revision 1.60 retrieving revision 1.61 diff -C2 -d -r1.60 -r1.61 *** datetimemodule.c 14 Apr 2003 22:01:57 -0000 1.60 --- datetimemodule.c 2 May 2003 18:39:55 -0000 1.61 *************** *** 2380,2384 **** } ! /* str() calls the appropriate isofomat() method. */ static PyObject * date_str(PyDateTime_Date *self) --- 2380,2384 ---- } ! /* str() calls the appropriate isoformat() method. */ static PyObject * date_str(PyDateTime_Date *self) From rhettinger@users.sourceforge.net Fri May 2 20:04:40 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 12:04:40 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_itertools.py,1.6,1.7 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv30623/Lib/test Modified Files: test_itertools.py Log Message: SF bug #730685: itertools.islice stop argument is not optional * itertools.islice() stop argument did not perform as documented. * beefed-up test suite Index: test_itertools.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_itertools.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** test_itertools.py 1 May 2003 17:45:37 -0000 1.6 --- test_itertools.py 2 May 2003 19:04:37 -0000 1.7 *************** *** 78,82 **** self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs)) ! self.assertRaises(TypeError, islice, xrange(10)) self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4) self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1) --- 78,88 ---- self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs)) ! # Test stop=None ! self.assertEqual(list(islice(xrange(10))), range(10)) ! self.assertEqual(list(islice(xrange(10), None)), range(10)) ! self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10)) ! self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2)) ! ! # Test invalid arguments self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4) self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1) *************** *** 84,87 **** --- 90,98 ---- self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1) self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0) + self.assertRaises(ValueError, islice, xrange(10), 'a') + self.assertRaises(ValueError, islice, xrange(10), 'a', 1) + self.assertRaises(ValueError, islice, xrange(10), 1, 'a') + self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1) + self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1) self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1) *************** *** 156,159 **** --- 167,225 ---- ... return izip(seq, islice(seq,1,len(seq))) + >>> def padnone(seq): + ... "Returns the sequence elements and then returns None indefinitely" + ... return chain(seq, repeat(None)) + + >>> def ncycles(seq, n): + ... "Returns the sequence elements n times" + ... return chain(*repeat(seq, n)) + + >>> def dotproduct(vec1, vec2): + ... return sum(imap(operator.mul, vec1, vec2)) + + + This is not part of the examples but it tests to make sure the definitions + perform as purported. + + >>> list(enumerate('abc')) + [(0, 'a'), (1, 'b'), (2, 'c')] + + >>> list(islice(tabulate(lambda x: 2*x), 4)) + [0, 2, 4, 6] + + >>> nth('abcde', 3) + ['d'] + + >>> all(lambda x: x%2==0, [2, 4, 6, 8]) + True + + >>> all(lambda x: x%2==0, [2, 3, 6, 8]) + False + + >>> some(lambda x: x%2==0, [2, 4, 6, 8]) + True + + >>> some(lambda x: x%2==0, [1, 3, 5, 9]) + False + + >>> no(lambda x: x%2==0, [1, 3, 5, 9]) + True + + >>> no(lambda x: x%2==0, [1, 2, 5, 9]) + False + + >>> list(pairwise('abc')) + [('a', 'b'), ('b', 'c')] + + >>> list(islice(padnone('abc'), 0, 6)) + ['a', 'b', 'c', None, None, None] + + >>> list(ncycles('abc', 3)) + ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'] + + >>> dotproduct([1,2,3], [4,5,6]) + 32 + + """ *************** *** 161,169 **** def test_main(verbose=None): - import test_itertools suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestBasicOps)) test_support.run_suite(suite) - test_support.run_doctest(test_itertools, verbose) # verify reference counting --- 227,233 ---- *************** *** 175,178 **** --- 239,246 ---- counts.append(sys.gettotalrefcount()-i) print counts + + # doctest the examples in the library reference + import doctest + doctest.testmod(sys.modules[__name__]) if __name__ == "__main__": From rhettinger@users.sourceforge.net Fri May 2 20:04:39 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 12:04:39 -0700 Subject: [Python-checkins] python/dist/src/Modules itertoolsmodule.c,1.10,1.11 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv30623/Modules Modified Files: itertoolsmodule.c Log Message: SF bug #730685: itertools.islice stop argument is not optional * itertools.islice() stop argument did not perform as documented. * beefed-up test suite Index: itertoolsmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/itertoolsmodule.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** itertoolsmodule.c 14 Apr 2003 15:31:27 -0000 1.10 --- itertoolsmodule.c 2 May 2003 19:04:37 -0000 1.11 *************** *** 472,496 **** { PyObject *seq; ! long a1=0, a2=0, a3=0, start=0, stop=0, step=1; ! PyObject *it; int numargs; isliceobject *lz; numargs = PyTuple_Size(args); ! if (!PyArg_ParseTuple(args, "Ol|ll:islice", &seq, &a1, &a2, &a3)) return NULL; if (numargs == 2) { ! stop = a1; ! } else if (numargs == 3) { ! start = a1; ! stop = a2; ! } else { ! start = a1; ! stop = a2; ! step = a3; } ! if (start<0 || stop<0) { PyErr_SetString(PyExc_ValueError, "Indices for islice() must be positive."); --- 472,516 ---- { PyObject *seq; ! long start=0, stop=-1, step=1; ! PyObject *it, *a1=NULL, *a2=NULL; int numargs; isliceobject *lz; numargs = PyTuple_Size(args); ! if (!PyArg_ParseTuple(args, "O|OOl:islice", &seq, &a1, &a2, &step)) return NULL; if (numargs == 2) { ! if (a1 != Py_None) { ! stop = PyInt_AsLong(a1); ! if (stop == -1) { ! if (PyErr_Occurred()) ! PyErr_Clear(); ! PyErr_SetString(PyExc_ValueError, ! "Stop argument must be an integer or None."); ! return NULL; ! } ! } ! } else if (numargs == 3 || numargs == 4) { ! start = PyInt_AsLong(a1); ! if (start == -1 && PyErr_Occurred()) { ! PyErr_Clear(); ! PyErr_SetString(PyExc_ValueError, ! "Start argument must be an integer."); ! return NULL; ! } ! if (a2 != Py_None) { ! stop = PyInt_AsLong(a2); ! if (stop == -1) { ! if (PyErr_Occurred()) ! PyErr_Clear(); ! PyErr_SetString(PyExc_ValueError, ! "Stop argument must be an integer or None."); ! return NULL; ! } ! } } ! if (start<0 || stop<-1) { PyErr_SetString(PyExc_ValueError, "Indices for islice() must be positive."); *************** *** 555,559 **** lz->cnt++; } ! if (lz->cnt >= lz->stop) return NULL; assert(PyIter_Check(it)); --- 575,579 ---- lz->cnt++; } ! if (lz->stop != -1 && lz->cnt >= lz->stop) return NULL; assert(PyIter_Check(it)); From rhettinger@users.sourceforge.net Fri May 2 20:04:40 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 12:04:40 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libitertools.tex,1.7,1.8 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv30623/Doc/lib Modified Files: libitertools.tex Log Message: SF bug #730685: itertools.islice stop argument is not optional * itertools.islice() stop argument did not perform as documented. * beefed-up test suite Index: libitertools.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libitertools.tex,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** libitertools.tex 23 Apr 2003 00:09:42 -0000 1.7 --- libitertools.tex 2 May 2003 19:04:37 -0000 1.8 *************** *** 198,204 **** until start is reached. Afterward, elements are returned consecutively unless \var{step} is set higher than one which results in items being ! skipped. If \var{stop} is specified, then iteration stops at the ! specified element position; otherwise, it continues indefinitely or ! until the iterable is exhausted. Unlike regular slicing, \function{islice()} does not support negative values for \var{start}, \var{stop}, or \var{step}. Can be used to extract related fields --- 198,204 ---- until start is reached. Afterward, elements are returned consecutively unless \var{step} is set higher than one which results in items being ! skipped. If \var{stop} is not specified or is \code{None}, then iteration ! continues indefinitely; otherwise, it stops at the specified position. ! Unlike regular slicing, \function{islice()} does not support negative values for \var{start}, \var{stop}, or \var{step}. Can be used to extract related fields *************** *** 209,223 **** \begin{verbatim} def islice(iterable, *args): ! s = slice(*args) ! next = s.start or 0 ! stop = s.stop ! step = s.step or 1 for cnt, element in enumerate(iterable): if cnt < next: continue ! if cnt >= stop: break yield element ! next += step \end{verbatim} \end{funcdesc} --- 209,226 ---- \begin{verbatim} def islice(iterable, *args): ! if args: ! s = slice(*args) ! next = s.start or 0 ! stop = s.stop ! step = s.step or 1 ! else: ! next, stop, step = 0, None, 1 for cnt, element in enumerate(iterable): if cnt < next: continue ! if stop is not None and cnt >= stop: break yield element ! next += step \end{verbatim} \end{funcdesc} *************** *** 361,365 **** >>> def pairwise(seq): ... "s -> (s0,s1), (s1,s2), (s2, s3), ..." ! ... return izip(seq, islice(seq,1,len(seq))) >>> def padnone(seq): --- 364,368 ---- >>> def pairwise(seq): ... "s -> (s0,s1), (s1,s2), (s2, s3), ..." ! ... return izip(seq, islice(seq,1,None)) >>> def padnone(seq): From rhettinger@users.sourceforge.net Fri May 2 20:44:22 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 12:44:22 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libitertools.tex,1.8,1.9 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv25408/Doc/lib Modified Files: libitertools.tex Log Message: The previous made the stop argument optional. It is better to be explicit and just allow stop to be None. Index: libitertools.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libitertools.tex,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** libitertools.tex 2 May 2003 19:04:37 -0000 1.8 --- libitertools.tex 2 May 2003 19:44:20 -0000 1.9 *************** *** 198,204 **** until start is reached. Afterward, elements are returned consecutively unless \var{step} is set higher than one which results in items being ! skipped. If \var{stop} is not specified or is \code{None}, then iteration ! continues indefinitely; otherwise, it stops at the specified position. ! Unlike regular slicing, \function{islice()} does not support negative values for \var{start}, \var{stop}, or \var{step}. Can be used to extract related fields --- 198,204 ---- until start is reached. Afterward, elements are returned consecutively unless \var{step} is set higher than one which results in items being ! skipped. If \var{stop} is \code{None}, then iteration continues until ! the iterator is exhausted, if at all; otherwise, it stops at the specified ! position. Unlike regular slicing, \function{islice()} does not support negative values for \var{start}, \var{stop}, or \var{step}. Can be used to extract related fields *************** *** 209,219 **** \begin{verbatim} def islice(iterable, *args): ! if args: ! s = slice(*args) ! next = s.start or 0 ! stop = s.stop ! step = s.step or 1 ! else: ! next, stop, step = 0, None, 1 for cnt, element in enumerate(iterable): if cnt < next: --- 209,216 ---- \begin{verbatim} def islice(iterable, *args): ! s = slice(*args) ! next = s.start or 0 ! stop = s.stop ! step = s.step or 1 for cnt, element in enumerate(iterable): if cnt < next: From rhettinger@users.sourceforge.net Fri May 2 20:44:23 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 12:44:23 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_itertools.py,1.7,1.8 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv25408/Lib/test Modified Files: test_itertools.py Log Message: The previous made the stop argument optional. It is better to be explicit and just allow stop to be None. Index: test_itertools.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_itertools.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** test_itertools.py 2 May 2003 19:04:37 -0000 1.7 --- test_itertools.py 2 May 2003 19:44:20 -0000 1.8 *************** *** 79,83 **** # Test stop=None - self.assertEqual(list(islice(xrange(10))), range(10)) self.assertEqual(list(islice(xrange(10), None)), range(10)) self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10)) --- 79,82 ---- *************** *** 85,88 **** --- 84,88 ---- # Test invalid arguments + self.assertRaises(TypeError, islice, xrange(10)) self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4) self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1) From rhettinger@users.sourceforge.net Fri May 2 20:44:22 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 12:44:22 -0700 Subject: [Python-checkins] python/dist/src/Modules itertoolsmodule.c,1.11,1.12 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv25408/Modules Modified Files: itertoolsmodule.c Log Message: The previous made the stop argument optional. It is better to be explicit and just allow stop to be None. Index: itertoolsmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/itertoolsmodule.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** itertoolsmodule.c 2 May 2003 19:04:37 -0000 1.11 --- itertoolsmodule.c 2 May 2003 19:44:20 -0000 1.12 *************** *** 478,482 **** numargs = PyTuple_Size(args); ! if (!PyArg_ParseTuple(args, "O|OOl:islice", &seq, &a1, &a2, &step)) return NULL; --- 478,482 ---- numargs = PyTuple_Size(args); ! if (!PyArg_ParseTuple(args, "OO|Ol:islice", &seq, &a1, &a2, &step)) return NULL; *************** *** 492,496 **** } } ! } else if (numargs == 3 || numargs == 4) { start = PyInt_AsLong(a1); if (start == -1 && PyErr_Occurred()) { --- 492,496 ---- } } ! } else { start = PyInt_AsLong(a1); if (start == -1 && PyErr_Occurred()) { From rhettinger@users.sourceforge.net Fri May 2 21:11:32 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 13:11:32 -0700 Subject: [Python-checkins] python/dist/src/Objects dictnotes.txt,NONE,1.1 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv11623 Added Files: dictnotes.txt Log Message: Research notes and explorations for optimizing Python dictionaries. --- NEW FILE: dictnotes.txt --- NOTES ON OPTIMIZING DICTIONARIES ================================ Principal Use Cases for Dictionaries ------------------------------------ Passing keyword arguments Typically, one read and one write for 1 to 3 elements. Occurs frequently in normal python code. Class method lookup Dictionaries vary in size with 8 to 16 elements being common. Usually written once with many lookups. When base classes are used, there are many failed lookups followed by a lookup in a base class. Instance attribute lookup and Global variables Dictionaries vary in size. 4 to 10 elements are common. Both reads and writes are common. Builtins Frequent reads. Almost never written. Size 126 interned strings (as of Py2.3b1). A few keys are accessed much more frequently than others. Uniquification Dictionaries of any size. Bulk of work is in creation. Repeated writes to a smaller set of keys. Single read of each key. * Removing duplicates from a sequence. dict.fromkeys(seqn).keys() * Counting elements in a sequence. for e in seqn: d[e]=d.get(e,0) + 1 * Accumulating items in a dictionary of lists. for k, v in itemseqn: d.setdefault(k, []).append(v) Membership Testing Dictionaries of any size. Created once and then rarely changes. Single write to each key. Many calls to __contains__() or has_key(). Similar access patterns occur with replacement dictionaries such as with the % formatting operator. Data Layout (assuming a 32-bit box with 64 bytes per cache line) ---------------------------------------------------------------- Smalldicts (8 entries) are attached to the dictobject structure and the whole group nearly fills two consecutive cache lines. Larger dicts use the first half of the dictobject structure (one cache line) and a separate, continuous block of entries (at 12 bytes each for a total of 5.333 entries per cache line). Tunable Dictionary Parameters ----------------------------- * PyDict_MINSIZE. Currently set to 8. Must be a power of two. New dicts have to zero-out every cell. Each additional 8 consumes 1.5 cache lines. Increasing improves the sparseness of small dictionaries but costs time to read in the additional cache lines if they are not already in cache. That case is common when keyword arguments are passed. * Maximum dictionary load in PyDict_SetItem. Currently set to 2/3. Increasing this ratio makes dictionaries more dense resulting in more collisions. Decreasing it improves sparseness at the expense of spreading entries over more cache lines and at the cost of total memory consumed. The load test occurs in highly time sensitive code. Efforts to make the test more complex (for example, varying the load for different sizes) have degraded performance. * Growth rate upon hitting maximum load. Currently set to *2. Raising this to *4 results in half the number of resizes, less effort to resize, better sparseness for some (but not all dict sizes), and potentially double memory consumption depending on the size of the dictionary. Setting to *4 eliminates every other resize step. Tune-ups should be measured across a broad range of applications and use cases. A change to any parameter will help in some situations and hurt in others. The key is to find settings that help the most common cases and do the least damage to the less common cases. Results will vary dramatically depending on the exact number of keys, whether the keys are all strings, whether reads or writes dominate, the exact hash values of the keys (some sets of values have fewer collisions than others). Any one test or benchmark is likely to prove misleading. Results of Cache Locality Experiments ------------------------------------- When an entry is retrieved from memory, 4.333 adjacent entries are also retrieved into a cache line. Since accessing items in cache is *much* cheaper than a cache miss, an enticing idea is to probe the adjacent entries as a first step in collision resolution. Unfortunately, the introduction of any regularity into collision searches results in more collisions than the current random chaining approach. Exploiting cache locality at the expense of additional collisions fails to payoff when the entries are already loaded in cache (the expense is paid with no compensating benefit). This occurs in small dictionaries where the whole dictionary fits into a pair of cache lines. It also occurs frequently in large dictionaries which have a common access pattern where some keys are accessed much more frequently than others. The more popular entries *and* their collision chains tend to remain in cache. To exploit cache locality, change the collision resolution section in lookdict() and lookdict_string(). Set i^=1 at the top of the loop and move the i = (i << 2) + i + perturb + 1 to an unrolled version of the loop. This optimization strategy can be leveraged in several ways: * If the dictionary is kept sparse (through the tunable parameters), then the occurrence of additional collisions is lessened. * If lookdict() and lookdict_string() are specialized for small dicts and for largedicts, then the versions for large_dicts can be given an alternate search strategy without increasing collisions in small dicts which already have the maximum benefit of cache locality. * If the use case for a dictionary is known to have a random key access pattern (as opposed to a more common pattern with a Zipf's law distribution), then there will be more benefit for large dictionaries because any given key is no more likely than another to already be in cache. Optimizing the Search of Small Dictionaries ------------------------------------------- If lookdict() and lookdict_string() are specialized for smaller dictionaries, then a custom search approach can be implemented that exploits the small search space and cache locality. * The simplest example is a linear search of contiguous entries. This is simple to implement, guaranteed to terminate rapidly, never searches the same entry twice, and precludes the need to check for dummy entries. * A more advanced example is a self-organizing search so that the most frequently accessed entries get probed first. The organization adapts if the access pattern changes over time. Treaps are ideally suited for self-organization with the most common entries at the top of the heap and a rapid binary search pattern. Most probes and results are all located at the top of the tree allowing them all to be located in one or two cache lines. * Also, small dictionaries may be made more dense, perhaps filling all eight cells to take the maximum advantage of two cache lines. Strategy Pattern ---------------- Consider allowing the user to set the tunable parameters or to select a particular search method. Since some dictionary use cases have known sizes and access patterns, the user may be able to provide useful hints. 1) For example, if membership testing or lookups dominate runtime and memory is not at a premium, the user may benefit from setting the maximum load ratio at 5% or 10% instead of the usual 66.7%. This will sharply curtail the number of collisions. 2) Dictionary creation time can be shortened in cases where the ultimate size of the dictionary is known in advance. The dictionary can be pre-sized so that no resize operations are required during creation. Not only does this save resizes, but the key insertion will go more quickly because the first half of the keys will be inserted into a more sparse environment than before. The preconditions for this strategy arise whenever a dictionary is created from a key or item sequence of known length. 3) If the key space is large and the access pattern is known to be random, then search strategies exploiting cache locality can be fruitful. The preconditions for this strategy arise in simulations and numerical analysis. 4) If the keys are fixed and the access pattern strongly favors some of the keys, then the entries can be stored contiguously and accessed with a linear search or treap. This exploits knowledge of the data, cache locality, and a simplified search routine. It also eliminates the need to test for dummy entries on each probe. The preconditions for this strategy arise in symbol tables and in the builtin dictionary. From fdrake@users.sourceforge.net Fri May 2 21:18:04 2003 From: fdrake@users.sourceforge.net (fdrake@users.sourceforge.net) Date: Fri, 02 May 2003 13:18:04 -0700 Subject: [Python-checkins] python/dist/src/Doc/perl l2hinit.perl,1.70,1.71 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/perl In directory sc8-pr-cvs1:/tmp/cvs-serv14534 Modified Files: l2hinit.perl Log Message: - add link relationships to some of the links in the navigation panels - implement custom_REL_hook() so LaTeX2HTML uses currently recommended link types; those work fine with tools like the Mozilla Site Navigation Bar Index: l2hinit.perl =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/perl/l2hinit.perl,v retrieving revision 1.70 retrieving revision 1.71 diff -C2 -d -r1.70 -r1.71 *** l2hinit.perl 2 May 2003 18:21:22 -0000 1.70 --- l2hinit.perl 2 May 2003 20:18:01 -0000 1.71 *************** *** 100,113 **** $CUSTOM_BUTTONS = ''; ! sub make_nav_sectref($$) { ! my($label, $title) = @_; if ($title) { if ($title =~ /\<[aA] /) { ! $title =~ s/\<[aA] /$title"; } ! return "$label: $title\n"; } return ''; --- 100,113 ---- $CUSTOM_BUTTONS = ''; ! sub make_nav_sectref($$$) { ! my($label, $linktype, $title) = @_; if ($title) { if ($title =~ /\<[aA] /) { ! $title =~ s/\<[aA] /$title"; } ! return "$label:\n$title\n"; } return ''; *************** *** 176,182 **** . "\n\n" # textual navigation ! . make_nav_sectref("Previous", $PREVIOUS_TITLE) ! . make_nav_sectref("Up", $UP_TITLE) ! . make_nav_sectref("Next", $NEXT_TITLE) ); # remove these; they are unnecessary and cause errors from validation --- 176,182 ---- . "\n\n" # textual navigation ! . make_nav_sectref("Previous", "prev", $PREVIOUS_TITLE) ! . make_nav_sectref("Up", "parent", $UP_TITLE) ! . make_nav_sectref("Next", "next", $NEXT_TITLE) ); # remove these; they are unnecessary and cause errors from validation *************** *** 581,584 **** --- 581,593 ---- %declarations); + + # This is used to map the link rel attributes LaTeX2HTML uses to those + # currently recommended by the W3C. + sub custom_REL_hook { + my($rel,$junk) = @_; + return 'parent' if $rel eq 'up'; + return 'prev' if $rel eq 'previous'; + return $rel; + } # This is added to get rid of the long comment that follows the From rhettinger@users.sourceforge.net Fri May 2 21:24:59 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 13:24:59 -0700 Subject: [Python-checkins] python/dist/src/Misc NEWS,1.753,1.754 Message-ID: Update of /cvsroot/python/python/dist/src/Misc In directory sc8-pr-cvs1:/tmp/cvs-serv17775 Modified Files: NEWS Log Message: Note itertools.islice() bugfix. Index: NEWS =================================================================== RCS file: /cvsroot/python/python/dist/src/Misc/NEWS,v retrieving revision 1.753 retrieving revision 1.754 diff -C2 -d -r1.753 -r1.754 *** NEWS 29 Apr 2003 21:07:16 -0000 1.753 --- NEWS 2 May 2003 20:24:56 -0000 1.754 *************** *** 16,19 **** --- 16,22 ---- ----------------- + - itertools.islice() now accepts stop=None as documented. + Fixes SF bug #730685. + Library ------- From jackjansen@users.sourceforge.net Fri May 2 21:27:45 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Fri, 02 May 2003 13:27:45 -0700 Subject: [Python-checkins] python/dist/src/Lib/plat-mac pimp.py,1.18,1.19 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/plat-mac In directory sc8-pr-cvs1:/tmp/cvs-serv19010 Modified Files: pimp.py Log Message: CWI moved websites around without me knowing it, and together with a bug in urllib2 this caused pimp to stop working. Fixed the URL to make it work again. Index: pimp.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/pimp.py,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** pimp.py 22 Apr 2003 13:56:19 -0000 1.18 --- pimp.py 2 May 2003 20:27:40 -0000 1.19 *************** *** 44,48 **** DEFAULT_BUILDDIR='/tmp' DEFAULT_INSTALLDIR=distutils.sysconfig.get_python_lib() ! DEFAULT_PIMPDATABASE="http://www.cwi.nl/~jack/pimp/pimp-%s.plist" % distutils.util.get_platform() def _cmd(output, dir, *cmditems): --- 44,48 ---- DEFAULT_BUILDDIR='/tmp' DEFAULT_INSTALLDIR=distutils.sysconfig.get_python_lib() ! DEFAULT_PIMPDATABASE="http://homepages.cwi.nl/~jack/pimp/pimp-%s.plist" % distutils.util.get_platform() def _cmd(output, dir, *cmditems): From fdrake@users.sourceforge.net Fri May 2 21:30:21 2003 From: fdrake@users.sourceforge.net (fdrake@users.sourceforge.net) Date: Fri, 02 May 2003 13:30:21 -0700 Subject: [Python-checkins] python/dist/src/Doc/perl l2hinit.perl,1.71,1.72 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/perl In directory sc8-pr-cvs1:/tmp/cvs-serv20854 Modified Files: l2hinit.perl Log Message: add link types for the remaining links in the navigation panels Index: l2hinit.perl =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/perl/l2hinit.perl,v retrieving revision 1.71 retrieving revision 1.72 diff -C2 -d -r1.71 -r1.72 *** l2hinit.perl 2 May 2003 20:18:01 -0000 1.71 --- l2hinit.perl 2 May 2003 20:30:18 -0000 1.72 *************** *** 142,151 **** } ! sub use_my_icon($) { ! my $s = $_[0]; if ($s =~ /\/) { my $r = get_my_icon($1); $s =~ s/\/$r/; } return $s; } --- 142,152 ---- } ! sub use_my_icon($$) { ! my($s,$rel) = @_; if ($s =~ /\/) { my $r = get_my_icon($1); $s =~ s/\/$r/; } + $s =~ s/<[aA] / Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv22160 Modified Files: pep-0001.txt Log Message: add proactive review power for BDFL; add a description of acceptance criteria; and take some credit ;-) Index: pep-0001.txt =================================================================== RCS file: /cvsroot/python/python/nondist/peps/pep-0001.txt,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** pep-0001.txt 8 Nov 2002 04:48:16 -0000 1.40 --- pep-0001.txt 2 May 2003 21:34:44 -0000 1.41 *************** *** 3,7 **** Version: $Revision$ Last-Modified: $Date$ ! Author: Barry A. Warsaw, Jeremy Hylton Status: Active Type: Informational --- 3,7 ---- Version: $Revision$ Last-Modified: $Date$ ! Author: Barry A. Warsaw, Jeremy Hylton, David Goodger Status: Active Type: Informational *************** *** 111,115 **** editor that it is ready for review. PEPs are reviewed by the BDFL and his chosen consultants, who may accept or reject a PEP or send ! it back to the author(s) for revision. Once a PEP has been accepted, the reference implementation must be --- 111,130 ---- editor that it is ready for review. PEPs are reviewed by the BDFL and his chosen consultants, who may accept or reject a PEP or send ! it back to the author(s) for revision. For a PEP that is ! pre-determined to be acceptable (e.g., it is an obvious win as-is ! and/or its implementation has already been checked in) the BDFL ! may also initiate a PEP review, first notifying the PEP author(s) ! and giving them a chance to make revisions. ! ! For a PEP to be accepted it must meet certain minimum criteria. ! It must be a clear and complete description of the proposed ! enhancement. The enhancement must represent a net improvement. ! The proposed implementation, if applicable, must be solid and must ! not complicate the interpreter unduly. Finally, a proposed ! enhancement must be "pythonic" in order to be accepted by the ! BDFL. (However, "pythonic" is an imprecise term; it may be ! defined as whatever is acceptable to the BDFL. This logic is ! intentionally circular.) See PEP 2 [10] for standard library ! module acceptance criteria. Once a PEP has been accepted, the reference implementation must be *************** *** 383,386 **** --- 398,404 ---- [9] http://docutils.sourceforge.net/ + + [10] PEP 2, Procedure for Adding New Modules, Faassen + http://www.python.org/peps/pep-0002.html From rhettinger@users.sourceforge.net Fri May 2 23:38:09 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 15:38:09 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_itertools.py,1.8,1.9 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv26154 Modified Files: test_itertools.py Log Message: Add StopIteration tests. Simplify test_main(). Index: test_itertools.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_itertools.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** test_itertools.py 2 May 2003 19:44:20 -0000 1.8 --- test_itertools.py 2 May 2003 22:38:07 -0000 1.9 *************** *** 107,110 **** --- 107,132 ---- self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8]) + def test_StopIteration(self): + class StopNow: + """Test support class . Emulates an empty iterable.""" + def __iter__(self): + return self + def next(self): + raise StopIteration + + for f in (chain, cycle, izip): + self.assertRaises(StopIteration, f([]).next) + self.assertRaises(StopIteration, f(StopNow()).next) + + self.assertRaises(StopIteration, islice([], None).next) + self.assertRaises(StopIteration, islice(StopNow(), None).next) + + self.assertRaises(StopIteration, repeat(None, 0).next) + + for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap): + self.assertRaises(StopIteration, f(lambda x:x, []).next) + self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next) + + libreftest = """ Doctest for examples in the library reference, libitertools.tex *************** *** 227,241 **** def test_main(verbose=None): ! suite = unittest.TestSuite() ! suite.addTest(unittest.makeSuite(TestBasicOps)) ! test_support.run_suite(suite) # verify reference counting import sys if verbose and hasattr(sys, "gettotalrefcount"): ! counts = [] ! for i in xrange(5): ! test_support.run_suite(suite) ! counts.append(sys.gettotalrefcount()-i) print counts --- 249,261 ---- def test_main(verbose=None): ! test_support.run_unittest(TestBasicOps) # verify reference counting import sys if verbose and hasattr(sys, "gettotalrefcount"): ! counts = [None] * 5 ! for i in xrange(len(counts)): ! test_support.run_unittest(TestBasicOps) ! counts[i] = sys.gettotalrefcount() print counts From rhettinger@users.sourceforge.net Fri May 2 23:45:02 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 15:45:02 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_random.py,1.9,1.10 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv31341 Modified Files: test_random.py Log Message: Simplify ref count test. Index: test_random.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_random.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** test_random.py 21 Feb 2003 01:41:36 -0000 1.9 --- test_random.py 2 May 2003 22:44:59 -0000 1.10 *************** *** 284,291 **** import sys if verbose and hasattr(sys, "gettotalrefcount"): ! counts = [] ! for i in xrange(5): test_support.run_suite(suite) ! counts.append(sys.gettotalrefcount()-i) print counts --- 284,291 ---- import sys if verbose and hasattr(sys, "gettotalrefcount"): ! counts = [None] * 5 ! for i in xrange(len(counts)): test_support.run_suite(suite) ! counts[i] = sys.gettotalrefcount() print counts From jhylton@users.sourceforge.net Fri May 2 23:48:18 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Fri, 02 May 2003 15:48:18 -0700 Subject: [Python-checkins] python/nondist/sandbox/decimal - New directory Message-ID: Update of /cvsroot/python/python/nondist/sandbox/decimal In directory sc8-pr-cvs1:/tmp/cvs-serv464/decimal Log Message: Directory /cvsroot/python/python/nondist/sandbox/decimal added to the repository From eprice@users.sourceforge.net Fri May 2 23:50:11 2003 From: eprice@users.sourceforge.net (eprice@users.sourceforge.net) Date: Fri, 02 May 2003 15:50:11 -0700 Subject: [Python-checkins] python/nondist/sandbox/decimal Decimal.py,NONE,1.1 Message-ID: Update of /cvsroot/python/python/nondist/sandbox/decimal In directory sc8-pr-cvs1:/tmp/cvs-serv1450 Added Files: Decimal.py Log Message: Initial checkin of a floating point decimal arithmetic package. --- NEW FILE: Decimal.py --- # Class Decimal, version 0.7.0 # Written by Eric Price # Based on code written by Aahz (aahz@pobox.com) # Currently under BSD-style license (copyright 2003) """ This is a stab at a decimal arithmetic module based on the decimal arithmetic ANSI standard X3.274-1996. Most of the information used to create this module was helpfully provided by Mike Cowlishaw's work at http://www2.hursley.ibm.com/decimal/ The rest comes from Tim Peters's FixedPoint.py, particularly the string conversion routine and general Pythonic practices. In the current form of Decimal(), precision is finite but unbounded, with the exception of division and square roots. Here are some simple test cases that show how to use Decimal. There is a separate full-blown test harness (run Test(testdatadir).test()) [...2868 lines suppressed...] def change_precision(self, prec): self.context.prec = prec def change_rounding_method(self, rounding): self.context.rounding = rounding def change_min_exponent(self, exp): self.context.Emin = exp def change_max_exponent(self, exp): self.context.Emax = exp def change_clamp(self, clamp): self.context.clamp = clamp def _test(): t = Test('./') t.test() if __name__ == '__main__': _test() From jhylton@users.sourceforge.net Fri May 2 23:51:28 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Fri, 02 May 2003 15:51:28 -0700 Subject: [Python-checkins] python/nondist/sandbox/decimal/tests - New directory Message-ID: Update of /cvsroot/python/python/nondist/sandbox/decimal/tests In directory sc8-pr-cvs1:/tmp/cvs-serv2480/tests Log Message: Directory /cvsroot/python/python/nondist/sandbox/decimal/tests added to the repository From goodger@users.sourceforge.net Fri May 2 23:53:34 2003 From: goodger@users.sourceforge.net (goodger@users.sourceforge.net) Date: Fri, 02 May 2003 15:53:34 -0700 Subject: [Python-checkins] python/nondist/peps pep-0315.txt,NONE,1.1 Message-ID: Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv3935 Added Files: pep-0315.txt Log Message: "Enhanced While Loop", by W Isaac Carroll --- NEW FILE: pep-0315.txt --- PEP: 315 Title: Enhanced While Loop Version: $Revision: 1.1 $ Last-Modified: $Date: 2003/05/02 22:53:32 $ Author: W Isaac Carroll Status: Draft Type: Standards Track Content-Type: text/plain Created: 25-Apr-2003 Python-Version: 2.4 Post-History: Abstract This PEP proposes adding an optional "do" clause to the beginning of the while loop to make loop code clearer and reduce errors caused by code duplication. Motivation It is often necessary for some code to be executed before each evaluation of the while loop condition. This code is often duplicated outside the loop, as setup code that executes once before entering the loop: while : The problem is that duplicated code can be a source of errors if one instance is changed but the other is not. Also, the purpose of the second instance of the setup code is not clear because it comes at the end of the loop. It is possible to prevent code duplication by moving the loop condition into a helper function, or an if statement in the loop body. However, separating the loop condition from the while keyword makes the behavior of the loop less clear: def helper(args): return while helper(args): This last form has the additional drawback of requiring the loop's else clause to be added to the body of the if statement, further obscuring the loop's behavior: while True: if not : break This PEP proposes to solve these problems by adding an optional clause to the while loop, which allows the setup code to be expressed in a natural way: do: while : This keeps the loop condition with the while keyword where it belongs, and does not require code to be duplicated. Syntax The syntax of the while statement while_stmt : "while" expression ":" suite ["else" ":" suite] is extended as follows: while_stmt : ["do" ":" suite] "while" expression ":" suite ["else" ":" suite] Semantics of break and continue In the do-while loop the break statement will behave the same as in the standard while loop: It will immediately terminate the loop without evaluating the loop condition or executing the else clause. A continue statement in the do-while loop will behave somewhat differently than in the standard while loop. Instead of jumping back to the loop condition, it will jump to the beginning of the first suite of the loop. This is to ensure that the setup code has a chance to do its job before the condition is evaluated. Future Statement Because of the new keyword "do", the statement from __future__ import do_while will initially be required to use the do-while form. Implementation The first implementation of this PEP can compile the do-while loop as an infinite loop with a test that exits the loop. Copyright This document is placed in the public domain. Local Variables: mode: indented-text indent-tabs-mode: nil sentence-end-double-space: t fill-column: 75 End: From goodger@users.sourceforge.net Fri May 2 23:53:57 2003 From: goodger@users.sourceforge.net (goodger@users.sourceforge.net) Date: Fri, 02 May 2003 15:53:57 -0700 Subject: [Python-checkins] python/nondist/peps pep-0000.txt,1.239,1.240 Message-ID: Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv4217 Modified Files: pep-0000.txt Log Message: added PEP 315; updated Index: pep-0000.txt =================================================================== RCS file: /cvsroot/python/python/nondist/peps/pep-0000.txt,v retrieving revision 1.239 retrieving revision 1.240 diff -C2 -d -r1.239 -r1.240 *** pep-0000.txt 21 Apr 2003 15:25:14 -0000 1.239 --- pep-0000.txt 2 May 2003 22:53:55 -0000 1.240 *************** *** 31,35 **** I 0 Index of Python Enhancement Proposals Goodger, Warsaw ! I 1 PEP Guidelines Warsaw, Hylton I 2 Procedure for Adding New Modules Faassen I 3 Guidelines for Handling Bug Reports Hylton --- 31,35 ---- I 0 Index of Python Enhancement Proposals Goodger, Warsaw ! I 1 PEP Guidelines Warsaw, Hylton, Goodger I 2 Procedure for Adding New Modules Faassen I 3 Guidelines for Handling Bug Reports Hylton *************** *** 116,119 **** --- 116,120 ---- S 313 Adding Roman Numeral Literals to Python Meyer S 314 Metadata for Python Software Packages v1.1 Kuchling + S 315 Enhanced While Loop Carroll S 754 IEEE 754 Floating Point Special Values Warnes *************** *** 188,193 **** num title owner --- ----- ----- ! I 0 Index of Python Enhancement Proposals Warsaw ! I 1 PEP Guidelines Warsaw, Hylton I 2 Procedure for Adding New Modules Faassen I 3 Guidelines for Handling Bug Reports Hylton --- 189,194 ---- num title owner --- ----- ----- ! I 0 Index of Python Enhancement Proposals Goodger, Warsaw ! I 1 PEP Guidelines Warsaw, Hylton, Goodger I 2 Procedure for Adding New Modules Faassen I 3 Guidelines for Handling Bug Reports Hylton *************** *** 322,325 **** --- 323,327 ---- S 313 Adding Roman Numeral Literals to Python Meyer S 314 Metadata for Python Software Packages v1.1 Kuchling + S 315 Enhanced While Loop Carroll SR 666 Reject Foolish Indentation Creighton S 754 IEEE 754 Floating Point Special Values Warnes *************** *** 348,351 **** --- 350,354 ---- Baxter, Anthony anthony@interlink.com.au Bellman, Thomas bellman+pep-divmod@lysator.liu.se + Carroll, W Isaac icarroll@pobox.com Cole, Dave djc@object-craft.com.au Craig, Christopher python-pep@ccraig.org From rhettinger@users.sourceforge.net Sat May 3 00:01:26 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 16:01:26 -0700 Subject: [Python-checkins] python/nondist/sandbox/itertools NEWS,1.1,NONE itertools.c,1.21,NONE libitertools.tex,1.20,NONE setup.py,1.1,NONE test_itertools.py,1.13,NONE todo.txt,1.16,NONE Message-ID: Update of /cvsroot/python/python/nondist/sandbox/itertools In directory sc8-pr-cvs1:/tmp/cvs-serv8623/itertools Removed Files: NEWS itertools.c libitertools.tex setup.py test_itertools.py todo.txt Log Message: Clean out sandbox. --- NEWS DELETED --- --- itertools.c DELETED --- --- libitertools.tex DELETED --- --- setup.py DELETED --- --- test_itertools.py DELETED --- --- todo.txt DELETED --- From jhylton@users.sourceforge.net Sat May 3 00:07:38 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Fri, 02 May 2003 16:07:38 -0700 Subject: [Python-checkins] python/nondist/sandbox/decimal/tests trim.decTest,NONE,1.1 testall.decTest,NONE,1.1 subtract.decTest,NONE,1.1 squareroot.decTest,NONE,1.1 rounding.decTest,NONE,1.1 rescale.decTest,NONE,1.1 remainderNear.decTest,NONE,1.1 remainder.decTest,NONE,1.1 randoms.decTest,NONE,1.1 randomBound32.decTest,NONE,1.1 power.decTest,NONE,1.1 plus.decTest,NONE,1.1 normalize.decTest,NONE,1.1 multiply.decTest,NONE,1.1 minus.decTest,NONE,1.1 min.decTest,NONE,1.1 max.decTest,NONE,1.1 integer.decTest,NONE,1.1 inexact.decTest,NONE,1.1 divideint.decTest,NONE,1.1 divide.decTest,NONE,1.1 decimal64.decTest,NONE,1.1 compare.decTest,NONE,1.1 clamp.decTest,NONE,1.1 base.decTest,NONE,1.1 add.decTest,NONE,1.1 abs.decTest,NONE,1.1 Message-ID: Update of /cvsroot/python/python/nondist/sandbox/decimal/tests In directory sc8-pr-cvs1:/tmp/cvs-serv11296/tests Added Files: trim.decTest testall.decTest subtract.decTest squareroot.decTest rounding.decTest rescale.decTest remainderNear.decTest remainder.decTest randoms.decTest randomBound32.decTest power.decTest plus.decTest normalize.decTest multiply.decTest minus.decTest min.decTest max.decTest integer.decTest inexact.decTest divideint.decTest divide.decTest decimal64.decTest compare.decTest clamp.decTest base.decTest add.decTest abs.decTest Log Message: Add tests code from IBM web page, http://www2.hursley.ibm.com/decimal/ --- NEW FILE: trim.decTest --- ------------------------------------------------------------------------ -- trim.decTest -- remove insignificant trailing zeros -- -- Copyright (c) IBM Corporation, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 trmx001 trim '1' -> '1' trmx002 trim '-1' -> '-1' trmx003 trim '1.00' -> '1' trmx004 trim '-1.00' -> '-1' trmx005 trim '0' -> '0' trmx006 trim '0.00' -> '0' trmx007 trim '00.0' -> '0' trmx008 trim '00.00' -> '0' trmx009 trim '00' -> '0' trmx010 trim '-2' -> '-2' trmx011 trim '2' -> '2' trmx012 trim '-2.00' -> '-2' trmx013 trim '2.00' -> '2' trmx014 trim '-0' -> '-0' trmx015 trim '-0.00' -> '-0' trmx016 trim '-00.0' -> '-0' trmx017 trim '-00.00' -> '-0' trmx018 trim '-00' -> '-0' trmx019 trim '0E+5' -> '0' trmx020 trim '-0E+1' -> '-0' trmx030 trim '+0.1' -> '0.1' trmx031 trim '-0.1' -> '-0.1' trmx032 trim '+0.01' -> '0.01' trmx033 trim '-0.01' -> '-0.01' trmx034 trim '+0.001' -> '0.001' trmx035 trim '-0.001' -> '-0.001' trmx036 trim '+0.000001' -> '0.000001' trmx037 trim '-0.000001' -> '-0.000001' trmx038 trim '+0.000000000001' -> '1E-12' trmx039 trim '-0.000000000001' -> '-1E-12' trmx041 trim 1.1 -> 1.1 trmx042 trim 1.10 -> 1.1 trmx043 trim 1.100 -> 1.1 trmx044 trim 1.110 -> 1.11 trmx045 trim -1.1 -> -1.1 trmx046 trim -1.10 -> -1.1 trmx047 trim -1.100 -> -1.1 trmx048 trim -1.110 -> -1.11 trmx049 trim 9.9 -> 9.9 trmx050 trim 9.90 -> 9.9 trmx051 trim 9.900 -> 9.9 trmx052 trim 9.990 -> 9.99 trmx053 trim -9.9 -> -9.9 trmx054 trim -9.90 -> -9.9 trmx055 trim -9.900 -> -9.9 trmx056 trim -9.990 -> -9.99 -- some insignificant trailing fractional zeros trmx060 trim 10.0 -> 10 trmx061 trim 10.00 -> 10 trmx062 trim 100.0 -> 100 trmx063 trim 100.00 -> 100 trmx064 trim 1.1000E+3 -> 1100 trmx065 trim 1.10000E+3 -> 1100 trmx066 trim -10.0 -> -10 trmx067 trim -10.00 -> -10 trmx068 trim -100.0 -> -100 trmx069 trim -100.00 -> -100 trmx070 trim -1.1000E+3 -> -1100 trmx071 trim -1.10000E+3 -> -1100 -- some insignificant trailing zeros with positive exponent trmx080 trim 10E+1 -> 1E+2 trmx081 trim 100E+1 -> 1E+3 trmx082 trim 1.0E+2 -> 1E+2 trmx083 trim 1.0E+3 -> 1E+3 trmx084 trim 1.1E+3 -> 1.1E+3 trmx085 trim 1.00E+3 -> 1E+3 trmx086 trim 1.10E+3 -> 1.1E+3 trmx087 trim -10E+1 -> -1E+2 trmx088 trim -100E+1 -> -1E+3 trmx089 trim -1.0E+2 -> -1E+2 trmx090 trim -1.0E+3 -> -1E+3 trmx091 trim -1.1E+3 -> -1.1E+3 trmx092 trim -1.00E+3 -> -1E+3 trmx093 trim -1.10E+3 -> -1.1E+3 -- some significant trailing zeros trmx100 trim 11 -> 11 trmx101 trim 10 -> 10 trmx102 trim 10. -> 10 trmx103 trim 1.1E+1 -> 11 trmx104 trim 1.0E+1 -> 10 trmx105 trim 1.10E+2 -> 110 trmx106 trim 1.00E+2 -> 100 trmx107 trim 1.100E+3 -> 1100 trmx108 trim 1.000E+3 -> 1000 trmx109 trim 1.000000E+6 -> 1000000 trmx110 trim -11 -> -11 trmx111 trim -10 -> -10 trmx112 trim -10. -> -10 trmx113 trim -1.1E+1 -> -11 trmx114 trim -1.0E+1 -> -10 trmx115 trim -1.10E+2 -> -110 trmx116 trim -1.00E+2 -> -100 trmx117 trim -1.100E+3 -> -1100 trmx118 trim -1.000E+3 -> -1000 trmx119 trim -1.00000E+5 -> -100000 trmx120 trim -1.000000E+6 -> -1000000 -- examples from decArith trmx140 trim '2.1' -> '2.1' trmx141 trim '-2.0' -> '-2' trmx142 trim '1.200' -> '1.2' trmx143 trim '-120' -> '-120' trmx144 trim '120.00' -> '120' trmx145 trim '0.00' -> '0' -- utilities pass through specials without raising exceptions trmx320 trim 'Inf' -> 'Infinity' trmx321 trim '-Inf' -> '-Infinity' trmx322 trim NaN -> NaN trmx323 trim sNaN -> sNaN -- Null test trmx900 trim # -> NaN Invalid_operation --- NEW FILE: testall.decTest --- ------------------------------------------------------------------------ -- testall.decTest -- run all general decimal arithmetic testcases -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- core tests (using Extended: 1) -------------------------------------- dectest: base dectest: abs dectest: add dectest: clamp dectest: compare dectest: divide dectest: divideint dectest: inexact dectest: integer dectest: max dectest: min dectest: minus dectest: multiply dectest: normalize dectest: plus dectest: power dectest: randoms dectest: remainder dectest: remaindernear dectest: rescale dectest: rounding dectest: squareroot dectest: subtract dectest: trim -- The next are for the Strawman 4d concrete representations dectest: decimal32 dectest: decimal64 dectest: decimal128 -- General 31->33-digit boundary tests dectest: randomBound32 --- NEW FILE: subtract.decTest --- ------------------------------------------------------------------------ -- subtract.decTest -- decimal subtraction -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- [first group are 'quick confidence check'] subx001 subtract 0 0 -> '0' subx002 subtract 1 1 -> '0' subx003 subtract 1 2 -> '-1' subx004 subtract 2 1 -> '1' subx005 subtract 2 2 -> '0' subx006 subtract 3 2 -> '1' subx007 subtract 2 3 -> '-1' subx011 subtract -0 0 -> '-0' subx012 subtract -1 1 -> '-2' subx013 subtract -1 2 -> '-3' subx014 subtract -2 1 -> '-3' subx015 subtract -2 2 -> '-4' subx016 subtract -3 2 -> '-5' subx017 subtract -2 3 -> '-5' subx021 subtract 0 -0 -> '0' subx022 subtract 1 -1 -> '2' subx023 subtract 1 -2 -> '3' subx024 subtract 2 -1 -> '3' subx025 subtract 2 -2 -> '4' subx026 subtract 3 -2 -> '5' subx027 subtract 2 -3 -> '5' subx030 subtract 11 1 -> 10 subx031 subtract 10 1 -> 9 subx032 subtract 9 1 -> 8 subx033 subtract 1 1 -> 0 subx034 subtract 0 1 -> -1 subx035 subtract -1 1 -> -2 subx036 subtract -9 1 -> -10 subx037 subtract -10 1 -> -11 subx038 subtract -11 1 -> -12 subx040 subtract '5.75' '3.3' -> '2.45' subx041 subtract '5' '-3' -> '8' subx042 subtract '-5' '-3' -> '-2' subx043 subtract '-7' '2.5' -> '-9.5' subx044 subtract '0.7' '0.3' -> '0.4' subx045 subtract '1.3' '0.3' -> '1.0' subx046 subtract '1.25' '1.25' -> '0.00' subx050 subtract '1.23456789' '1.00000000' -> '0.23456789' subx051 subtract '1.23456789' '1.00000089' -> '0.23456700' subx052 subtract '0.5555555559' '0.0000000001' -> '0.555555556' Inexact Rounded subx053 subtract '0.5555555559' '0.0000000005' -> '0.555555555' Inexact Rounded subx054 subtract '0.4444444444' '0.1111111111' -> '0.333333333' Inexact Rounded subx055 subtract '1.0000000000' '0.00000001' -> '0.999999990' Rounded subx056 subtract '0.4444444444999' '0' -> '0.444444444' Inexact Rounded subx057 subtract '0.4444444445000' '0' -> '0.444444445' Inexact Rounded subx060 subtract '70' '10000e+9' -> '-1.00000000E+13' Inexact Rounded subx061 subtract '700' '10000e+9' -> '-1.00000000E+13' Inexact Rounded subx062 subtract '7000' '10000e+9' -> '-9.99999999E+12' Inexact Rounded subx063 subtract '70000' '10000e+9' -> '-9.99999993E+12' Rounded subx064 subtract '700000' '10000e+9' -> '-9.99999930E+12' Rounded -- symmetry: subx065 subtract '10000e+9' '70' -> '1.00000000E+13' Inexact Rounded subx066 subtract '10000e+9' '700' -> '1.00000000E+13' Inexact Rounded subx067 subtract '10000e+9' '7000' -> '9.99999999E+12' Inexact Rounded subx068 subtract '10000e+9' '70000' -> '9.99999993E+12' Rounded subx069 subtract '10000e+9' '700000' -> '9.99999930E+12' Rounded -- change precision subx080 subtract '10000e+9' '70000' -> '9.99999993E+12' Rounded precision: 6 subx081 subtract '10000e+9' '70000' -> '1.00000E+13' Inexact Rounded precision: 9 -- some of the next group are really constructor tests subx090 subtract '00.0' '0.0' -> '0.0' subx091 subtract '00.0' '0.00' -> '0.00' subx092 subtract '0.00' '00.0' -> '0.00' subx093 subtract '00.0' '0.00' -> '0.00' subx094 subtract '0.00' '00.0' -> '0.00' subx095 subtract '3' '.3' -> '2.7' subx096 subtract '3.' '.3' -> '2.7' subx097 subtract '3.0' '.3' -> '2.7' subx098 subtract '3.00' '.3' -> '2.70' subx099 subtract '3' '3' -> '0' subx100 subtract '3' '+3' -> '0' subx101 subtract '3' '-3' -> '6' subx102 subtract '3' '0.3' -> '2.7' subx103 subtract '3.' '0.3' -> '2.7' subx104 subtract '3.0' '0.3' -> '2.7' subx105 subtract '3.00' '0.3' -> '2.70' subx106 subtract '3' '3.0' -> '0.0' subx107 subtract '3' '+3.0' -> '0.0' subx108 subtract '3' '-3.0' -> '6.0' -- the above all from add; massaged and extended. Now some new ones... -- [particularly important for comparisons] -- NB: -xE-8 below were non-exponents pre-ANSI X3-274, and -1E-7 or 0E-7 -- with input rounding. subx120 subtract '10.23456784' '10.23456789' -> '-5E-8' subx121 subtract '10.23456785' '10.23456789' -> '-4E-8' subx122 subtract '10.23456786' '10.23456789' -> '-3E-8' subx123 subtract '10.23456787' '10.23456789' -> '-2E-8' subx124 subtract '10.23456788' '10.23456789' -> '-1E-8' subx125 subtract '10.23456789' '10.23456789' -> '0E-8' subx126 subtract '10.23456790' '10.23456789' -> '1E-8' subx127 subtract '10.23456791' '10.23456789' -> '2E-8' subx128 subtract '10.23456792' '10.23456789' -> '3E-8' subx129 subtract '10.23456793' '10.23456789' -> '4E-8' subx130 subtract '10.23456794' '10.23456789' -> '5E-8' subx131 subtract '10.23456781' '10.23456786' -> '-5E-8' subx132 subtract '10.23456782' '10.23456786' -> '-4E-8' subx133 subtract '10.23456783' '10.23456786' -> '-3E-8' subx134 subtract '10.23456784' '10.23456786' -> '-2E-8' subx135 subtract '10.23456785' '10.23456786' -> '-1E-8' subx136 subtract '10.23456786' '10.23456786' -> '0E-8' subx137 subtract '10.23456787' '10.23456786' -> '1E-8' subx138 subtract '10.23456788' '10.23456786' -> '2E-8' subx139 subtract '10.23456789' '10.23456786' -> '3E-8' subx140 subtract '10.23456790' '10.23456786' -> '4E-8' subx141 subtract '10.23456791' '10.23456786' -> '5E-8' subx142 subtract '1' '0.999999999' -> '1E-9' subx143 subtract '0.999999999' '1' -> '-1E-9' subx144 subtract '-10.23456780' '-10.23456786' -> '6E-8' subx145 subtract '-10.23456790' '-10.23456786' -> '-4E-8' subx146 subtract '-10.23456791' '-10.23456786' -> '-5E-8' precision: 3 subx150 subtract '12345678900000' '9999999999999' -> 2.35E+12 Inexact Rounded subx151 subtract '9999999999999' '12345678900000' -> -2.35E+12 Inexact Rounded precision: 6 subx152 subtract '12345678900000' '9999999999999' -> 2.34568E+12 Inexact Rounded subx153 subtract '9999999999999' '12345678900000' -> -2.34568E+12 Inexact Rounded precision: 9 subx154 subtract '12345678900000' '9999999999999' -> 2.34567890E+12 Inexact Rounded subx155 subtract '9999999999999' '12345678900000' -> -2.34567890E+12 Inexact Rounded precision: 12 subx156 subtract '12345678900000' '9999999999999' -> 2.34567890000E+12 Inexact Rounded subx157 subtract '9999999999999' '12345678900000' -> -2.34567890000E+12 Inexact Rounded precision: 15 subx158 subtract '12345678900000' '9999999999999' -> 2345678900001 subx159 subtract '9999999999999' '12345678900000' -> -2345678900001 precision: 9 -- additional scaled arithmetic tests [0.97 problem] subx160 subtract '0' '.1' -> '-0.1' subx161 subtract '00' '.97983' -> '-0.97983' subx162 subtract '0' '.9' -> '-0.9' subx163 subtract '0' '0.102' -> '-0.102' subx164 subtract '0' '.4' -> '-0.4' subx165 subtract '0' '.307' -> '-0.307' subx166 subtract '0' '.43822' -> '-0.43822' subx167 subtract '0' '.911' -> '-0.911' subx168 subtract '.0' '.02' -> '-0.02' subx169 subtract '00' '.392' -> '-0.392' subx170 subtract '0' '.26' -> '-0.26' subx171 subtract '0' '0.51' -> '-0.51' subx172 subtract '0' '.2234' -> '-0.2234' subx173 subtract '0' '.2' -> '-0.2' subx174 subtract '.0' '.0008' -> '-0.0008' -- 0. on left subx180 subtract '0.0' '-.1' -> '0.1' subx181 subtract '0.00' '-.97983' -> '0.97983' subx182 subtract '0.0' '-.9' -> '0.9' subx183 subtract '0.0' '-0.102' -> '0.102' subx184 subtract '0.0' '-.4' -> '0.4' subx185 subtract '0.0' '-.307' -> '0.307' subx186 subtract '0.0' '-.43822' -> '0.43822' subx187 subtract '0.0' '-.911' -> '0.911' subx188 subtract '0.0' '-.02' -> '0.02' subx189 subtract '0.00' '-.392' -> '0.392' subx190 subtract '0.0' '-.26' -> '0.26' subx191 subtract '0.0' '-0.51' -> '0.51' subx192 subtract '0.0' '-.2234' -> '0.2234' subx193 subtract '0.0' '-.2' -> '0.2' subx194 subtract '0.0' '-.0008' -> '0.0008' -- negatives of same subx200 subtract '0' '-.1' -> '0.1' subx201 subtract '00' '-.97983' -> '0.97983' subx202 subtract '0' '-.9' -> '0.9' subx203 subtract '0' '-0.102' -> '0.102' subx204 subtract '0' '-.4' -> '0.4' subx205 subtract '0' '-.307' -> '0.307' subx206 subtract '0' '-.43822' -> '0.43822' subx207 subtract '0' '-.911' -> '0.911' subx208 subtract '.0' '-.02' -> '0.02' subx209 subtract '00' '-.392' -> '0.392' subx210 subtract '0' '-.26' -> '0.26' subx211 subtract '0' '-0.51' -> '0.51' subx212 subtract '0' '-.2234' -> '0.2234' subx213 subtract '0' '-.2' -> '0.2' subx214 subtract '.0' '-.0008' -> '0.0008' -- more fixed, LHS swaps [really the same as testcases under add] subx220 subtract '-56267E-12' 0 -> '-5.6267E-8' subx221 subtract '-56267E-11' 0 -> '-5.6267E-7' subx222 subtract '-56267E-10' 0 -> '-0.0000056267' subx223 subtract '-56267E-9' 0 -> '-0.000056267' subx224 subtract '-56267E-8' 0 -> '-0.00056267' subx225 subtract '-56267E-7' 0 -> '-0.0056267' subx226 subtract '-56267E-6' 0 -> '-0.056267' subx227 subtract '-56267E-5' 0 -> '-0.56267' subx228 subtract '-56267E-2' 0 -> '-562.67' subx229 subtract '-56267E-1' 0 -> '-5626.7' subx230 subtract '-56267E-0' 0 -> '-56267' -- symmetry ... subx240 subtract 0 '-56267E-12' -> '5.6267E-8' subx241 subtract 0 '-56267E-11' -> '5.6267E-7' subx242 subtract 0 '-56267E-10' -> '0.0000056267' subx243 subtract 0 '-56267E-9' -> '0.000056267' subx244 subtract 0 '-56267E-8' -> '0.00056267' subx245 subtract 0 '-56267E-7' -> '0.0056267' subx246 subtract 0 '-56267E-6' -> '0.056267' subx247 subtract 0 '-56267E-5' -> '0.56267' subx248 subtract 0 '-56267E-2' -> '562.67' subx249 subtract 0 '-56267E-1' -> '5626.7' subx250 subtract 0 '-56267E-0' -> '56267' -- now some more from the 'new' add precision: 9 subx301 subtract '1.23456789' '1.00000000' -> '0.23456789' subx302 subtract '1.23456789' '1.00000011' -> '0.23456778' subx311 subtract '0.4444444444' '0.5555555555' -> '-0.111111111' Inexact Rounded subx312 subtract '0.4444444440' '0.5555555555' -> '-0.111111112' Inexact Rounded subx313 subtract '0.4444444444' '0.5555555550' -> '-0.111111111' Inexact Rounded subx314 subtract '0.44444444449' '0' -> '0.444444444' Inexact Rounded subx315 subtract '0.444444444499' '0' -> '0.444444444' Inexact Rounded subx316 subtract '0.4444444444999' '0' -> '0.444444444' Inexact Rounded subx317 subtract '0.4444444445000' '0' -> '0.444444445' Inexact Rounded subx318 subtract '0.4444444445001' '0' -> '0.444444445' Inexact Rounded subx319 subtract '0.444444444501' '0' -> '0.444444445' Inexact Rounded subx320 subtract '0.44444444451' '0' -> '0.444444445' Inexact Rounded -- some carrying effects subx321 subtract '0.9998' '0.0000' -> '0.9998' subx322 subtract '0.9998' '0.0001' -> '0.9997' subx323 subtract '0.9998' '0.0002' -> '0.9996' subx324 subtract '0.9998' '0.0003' -> '0.9995' subx325 subtract '0.9998' '-0.0000' -> '0.9998' subx326 subtract '0.9998' '-0.0001' -> '0.9999' subx327 subtract '0.9998' '-0.0002' -> '1.0000' subx328 subtract '0.9998' '-0.0003' -> '1.0001' subx330 subtract '70' '10000e+9' -> '-1.00000000E+13' Inexact Rounded subx331 subtract '700' '10000e+9' -> '-1.00000000E+13' Inexact Rounded subx332 subtract '7000' '10000e+9' -> '-9.99999999E+12' Inexact Rounded subx333 subtract '70000' '10000e+9' -> '-9.99999993E+12' Rounded subx334 subtract '700000' '10000e+9' -> '-9.99999930E+12' Rounded subx335 subtract '7000000' '10000e+9' -> '-9.99999300E+12' Rounded -- symmetry: subx340 subtract '10000e+9' '70' -> '1.00000000E+13' Inexact Rounded subx341 subtract '10000e+9' '700' -> '1.00000000E+13' Inexact Rounded subx342 subtract '10000e+9' '7000' -> '9.99999999E+12' Inexact Rounded subx343 subtract '10000e+9' '70000' -> '9.99999993E+12' Rounded subx344 subtract '10000e+9' '700000' -> '9.99999930E+12' Rounded subx345 subtract '10000e+9' '7000000' -> '9.99999300E+12' Rounded -- same, higher precision precision: 15 subx346 subtract '10000e+9' '7' -> '9999999999993' subx347 subtract '10000e+9' '70' -> '9999999999930' subx348 subtract '10000e+9' '700' -> '9999999999300' subx349 subtract '10000e+9' '7000' -> '9999999993000' subx350 subtract '10000e+9' '70000' -> '9999999930000' subx351 subtract '10000e+9' '700000' -> '9999999300000' subx352 subtract '7' '10000e+9' -> '-9999999999993' subx353 subtract '70' '10000e+9' -> '-9999999999930' subx354 subtract '700' '10000e+9' -> '-9999999999300' subx355 subtract '7000' '10000e+9' -> '-9999999993000' subx356 subtract '70000' '10000e+9' -> '-9999999930000' subx357 subtract '700000' '10000e+9' -> '-9999999300000' -- zero preservation precision: 6 subx360 subtract '10000e+9' '70000' -> '1.00000E+13' Inexact Rounded subx361 subtract 1 '0.0001' -> '0.9999' subx362 subtract 1 '0.00001' -> '0.99999' subx363 subtract 1 '0.000001' -> '0.999999' subx364 subtract 1 '0.0000001' -> '1.00000' Inexact Rounded subx365 subtract 1 '0.00000001' -> '1.00000' Inexact Rounded -- some funny zeros [in case of bad signum] subx370 subtract 1 0 -> 1 subx371 subtract 1 0. -> 1 subx372 subtract 1 .0 -> 1.0 subx373 subtract 1 0.0 -> 1.0 subx374 subtract 0 1 -> -1 subx375 subtract 0. 1 -> -1 subx376 subtract .0 1 -> -1.0 subx377 subtract 0.0 1 -> -1.0 precision: 9 -- leading 0 digit before round subx910 subtract -103519362 -51897955.3 -> -51621406.7 subx911 subtract 159579.444 89827.5229 -> 69751.9211 subx920 subtract 333.123456 33.1234566 -> 299.999999 Inexact Rounded subx921 subtract 333.123456 33.1234565 -> 300.000000 Inexact Rounded subx922 subtract 133.123456 33.1234565 -> 99.9999995 subx923 subtract 133.123456 33.1234564 -> 99.9999996 subx924 subtract 133.123456 33.1234540 -> 100.000002 Rounded subx925 subtract 133.123456 43.1234560 -> 90.0000000 subx926 subtract 133.123456 43.1234561 -> 89.9999999 subx927 subtract 133.123456 43.1234566 -> 89.9999994 subx928 subtract 101.123456 91.1234566 -> 9.9999994 subx929 subtract 101.123456 99.1234566 -> 1.9999994 -- more of the same; probe for cluster boundary problems precision: 1 subx930 subtract 11 2 -> 9 precision: 2 subx932 subtract 101 2 -> 99 precision: 3 subx934 subtract 101 2.1 -> 98.9 subx935 subtract 101 92.01 -> 8.99 precision: 4 subx936 subtract 101 2.01 -> 98.99 subx937 subtract 101 92.01 -> 8.99 subx938 subtract 101 92.006 -> 8.994 precision: 5 subx939 subtract 101 2.001 -> 98.999 subx940 subtract 101 92.001 -> 8.999 subx941 subtract 101 92.0006 -> 8.9994 precision: 6 subx942 subtract 101 2.0001 -> 98.9999 subx943 subtract 101 92.0001 -> 8.9999 subx944 subtract 101 92.00006 -> 8.99994 precision: 7 subx945 subtract 101 2.00001 -> 98.99999 subx946 subtract 101 92.00001 -> 8.99999 subx947 subtract 101 92.000006 -> 8.999994 precision: 8 subx948 subtract 101 2.000001 -> 98.999999 subx949 subtract 101 92.000001 -> 8.999999 subx950 subtract 101 92.0000006 -> 8.9999994 precision: 9 subx951 subtract 101 2.0000001 -> 98.9999999 subx952 subtract 101 92.0000001 -> 8.9999999 subx953 subtract 101 92.00000006 -> 8.99999994 precision: 9 -- more LHS swaps [were fixed] subx390 subtract '-56267E-10' 0 -> '-0.0000056267' subx391 subtract '-56267E-6' 0 -> '-0.056267' subx392 subtract '-56267E-5' 0 -> '-0.56267' subx393 subtract '-56267E-4' 0 -> '-5.6267' subx394 subtract '-56267E-3' 0 -> '-56.267' subx395 subtract '-56267E-2' 0 -> '-562.67' subx396 subtract '-56267E-1' 0 -> '-5626.7' subx397 subtract '-56267E-0' 0 -> '-56267' subx398 subtract '-5E-10' 0 -> '-5E-10' subx399 subtract '-5E-7' 0 -> '-5E-7' subx400 subtract '-5E-6' 0 -> '-0.000005' subx401 subtract '-5E-5' 0 -> '-0.00005' subx402 subtract '-5E-4' 0 -> '-0.0005' subx403 subtract '-5E-1' 0 -> '-0.5' subx404 subtract '-5E0' 0 -> '-5' subx405 subtract '-5E1' 0 -> '-50' subx406 subtract '-5E5' 0 -> '-500000' subx407 subtract '-5E8' 0 -> '-500000000' subx408 subtract '-5E9' 0 -> '-5.00000000E+9' Rounded subx409 subtract '-5E10' 0 -> '-5.00000000E+10' Rounded subx410 subtract '-5E11' 0 -> '-5.00000000E+11' Rounded subx411 subtract '-5E100' 0 -> '-5.00000000E+100' Rounded -- more RHS swaps [were fixed] subx420 subtract 0 '-56267E-10' -> '0.0000056267' subx421 subtract 0 '-56267E-6' -> '0.056267' subx422 subtract 0 '-56267E-5' -> '0.56267' subx423 subtract 0 '-56267E-4' -> '5.6267' subx424 subtract 0 '-56267E-3' -> '56.267' subx425 subtract 0 '-56267E-2' -> '562.67' subx426 subtract 0 '-56267E-1' -> '5626.7' subx427 subtract 0 '-56267E-0' -> '56267' subx428 subtract 0 '-5E-10' -> '5E-10' subx429 subtract 0 '-5E-7' -> '5E-7' subx430 subtract 0 '-5E-6' -> '0.000005' subx431 subtract 0 '-5E-5' -> '0.00005' subx432 subtract 0 '-5E-4' -> '0.0005' subx433 subtract 0 '-5E-1' -> '0.5' subx434 subtract 0 '-5E0' -> '5' subx435 subtract 0 '-5E1' -> '50' subx436 subtract 0 '-5E5' -> '500000' subx437 subtract 0 '-5E8' -> '500000000' subx438 subtract 0 '-5E9' -> '5.00000000E+9' Rounded subx439 subtract 0 '-5E10' -> '5.00000000E+10' Rounded subx440 subtract 0 '-5E11' -> '5.00000000E+11' Rounded subx441 subtract 0 '-5E100' -> '5.00000000E+100' Rounded -- try borderline precision, with carries, etc. precision: 15 subx461 subtract '1E+12' '1' -> '999999999999' subx462 subtract '1E+12' '-1.11' -> '1000000000001.11' subx463 subtract '1.11' '-1E+12' -> '1000000000001.11' subx464 subtract '-1' '-1E+12' -> '999999999999' subx465 subtract '7E+12' '1' -> '6999999999999' subx466 subtract '7E+12' '-1.11' -> '7000000000001.11' subx467 subtract '1.11' '-7E+12' -> '7000000000001.11' subx468 subtract '-1' '-7E+12' -> '6999999999999' -- 123456789012345 123456789012345 1 23456789012345 subx470 subtract '0.444444444444444' '-0.555555555555563' -> '1.00000000000001' Inexact Rounded subx471 subtract '0.444444444444444' '-0.555555555555562' -> '1.00000000000001' Inexact Rounded subx472 subtract '0.444444444444444' '-0.555555555555561' -> '1.00000000000001' Inexact Rounded subx473 subtract '0.444444444444444' '-0.555555555555560' -> '1.00000000000000' Inexact Rounded subx474 subtract '0.444444444444444' '-0.555555555555559' -> '1.00000000000000' Inexact Rounded subx475 subtract '0.444444444444444' '-0.555555555555558' -> '1.00000000000000' Inexact Rounded subx476 subtract '0.444444444444444' '-0.555555555555557' -> '1.00000000000000' Inexact Rounded subx477 subtract '0.444444444444444' '-0.555555555555556' -> '1.00000000000000' Rounded subx478 subtract '0.444444444444444' '-0.555555555555555' -> '0.999999999999999' subx479 subtract '0.444444444444444' '-0.555555555555554' -> '0.999999999999998' subx480 subtract '0.444444444444444' '-0.555555555555553' -> '0.999999999999997' subx481 subtract '0.444444444444444' '-0.555555555555552' -> '0.999999999999996' subx482 subtract '0.444444444444444' '-0.555555555555551' -> '0.999999999999995' subx483 subtract '0.444444444444444' '-0.555555555555550' -> '0.999999999999994' -- and some more, including residue effects and different roundings precision: 9 rounding: half_up subx500 subtract '123456789' 0 -> '123456789' subx501 subtract '123456789' 0.000000001 -> '123456789' Inexact Rounded subx502 subtract '123456789' 0.000001 -> '123456789' Inexact Rounded subx503 subtract '123456789' 0.1 -> '123456789' Inexact Rounded subx504 subtract '123456789' 0.4 -> '123456789' Inexact Rounded subx505 subtract '123456789' 0.49 -> '123456789' Inexact Rounded subx506 subtract '123456789' 0.499999 -> '123456789' Inexact Rounded subx507 subtract '123456789' 0.499999999 -> '123456789' Inexact Rounded subx508 subtract '123456789' 0.5 -> '123456789' Inexact Rounded subx509 subtract '123456789' 0.500000001 -> '123456788' Inexact Rounded subx510 subtract '123456789' 0.500001 -> '123456788' Inexact Rounded subx511 subtract '123456789' 0.51 -> '123456788' Inexact Rounded subx512 subtract '123456789' 0.6 -> '123456788' Inexact Rounded subx513 subtract '123456789' 0.9 -> '123456788' Inexact Rounded subx514 subtract '123456789' 0.99999 -> '123456788' Inexact Rounded subx515 subtract '123456789' 0.999999999 -> '123456788' Inexact Rounded subx516 subtract '123456789' 1 -> '123456788' subx517 subtract '123456789' 1.000000001 -> '123456788' Inexact Rounded subx518 subtract '123456789' 1.00001 -> '123456788' Inexact Rounded subx519 subtract '123456789' 1.1 -> '123456788' Inexact Rounded rounding: half_even subx520 subtract '123456789' 0 -> '123456789' subx521 subtract '123456789' 0.000000001 -> '123456789' Inexact Rounded subx522 subtract '123456789' 0.000001 -> '123456789' Inexact Rounded subx523 subtract '123456789' 0.1 -> '123456789' Inexact Rounded subx524 subtract '123456789' 0.4 -> '123456789' Inexact Rounded subx525 subtract '123456789' 0.49 -> '123456789' Inexact Rounded subx526 subtract '123456789' 0.499999 -> '123456789' Inexact Rounded subx527 subtract '123456789' 0.499999999 -> '123456789' Inexact Rounded subx528 subtract '123456789' 0.5 -> '123456788' Inexact Rounded subx529 subtract '123456789' 0.500000001 -> '123456788' Inexact Rounded subx530 subtract '123456789' 0.500001 -> '123456788' Inexact Rounded subx531 subtract '123456789' 0.51 -> '123456788' Inexact Rounded subx532 subtract '123456789' 0.6 -> '123456788' Inexact Rounded subx533 subtract '123456789' 0.9 -> '123456788' Inexact Rounded subx534 subtract '123456789' 0.99999 -> '123456788' Inexact Rounded subx535 subtract '123456789' 0.999999999 -> '123456788' Inexact Rounded subx536 subtract '123456789' 1 -> '123456788' subx537 subtract '123456789' 1.00000001 -> '123456788' Inexact Rounded subx538 subtract '123456789' 1.00001 -> '123456788' Inexact Rounded subx539 subtract '123456789' 1.1 -> '123456788' Inexact Rounded -- critical few with even bottom digit... subx540 subtract '123456788' 0.499999999 -> '123456788' Inexact Rounded subx541 subtract '123456788' 0.5 -> '123456788' Inexact Rounded subx542 subtract '123456788' 0.500000001 -> '123456787' Inexact Rounded rounding: down subx550 subtract '123456789' 0 -> '123456789' subx551 subtract '123456789' 0.000000001 -> '123456788' Inexact Rounded subx552 subtract '123456789' 0.000001 -> '123456788' Inexact Rounded subx553 subtract '123456789' 0.1 -> '123456788' Inexact Rounded subx554 subtract '123456789' 0.4 -> '123456788' Inexact Rounded subx555 subtract '123456789' 0.49 -> '123456788' Inexact Rounded subx556 subtract '123456789' 0.499999 -> '123456788' Inexact Rounded subx557 subtract '123456789' 0.499999999 -> '123456788' Inexact Rounded subx558 subtract '123456789' 0.5 -> '123456788' Inexact Rounded subx559 subtract '123456789' 0.500000001 -> '123456788' Inexact Rounded subx560 subtract '123456789' 0.500001 -> '123456788' Inexact Rounded subx561 subtract '123456789' 0.51 -> '123456788' Inexact Rounded subx562 subtract '123456789' 0.6 -> '123456788' Inexact Rounded subx563 subtract '123456789' 0.9 -> '123456788' Inexact Rounded subx564 subtract '123456789' 0.99999 -> '123456788' Inexact Rounded subx565 subtract '123456789' 0.999999999 -> '123456788' Inexact Rounded subx566 subtract '123456789' 1 -> '123456788' subx567 subtract '123456789' 1.00000001 -> '123456787' Inexact Rounded subx568 subtract '123456789' 1.00001 -> '123456787' Inexact Rounded subx569 subtract '123456789' 1.1 -> '123456787' Inexact Rounded -- symmetry... rounding: half_up subx600 subtract 0 '123456789' -> '-123456789' subx601 subtract 0.000000001 '123456789' -> '-123456789' Inexact Rounded subx602 subtract 0.000001 '123456789' -> '-123456789' Inexact Rounded subx603 subtract 0.1 '123456789' -> '-123456789' Inexact Rounded subx604 subtract 0.4 '123456789' -> '-123456789' Inexact Rounded subx605 subtract 0.49 '123456789' -> '-123456789' Inexact Rounded subx606 subtract 0.499999 '123456789' -> '-123456789' Inexact Rounded subx607 subtract 0.499999999 '123456789' -> '-123456789' Inexact Rounded subx608 subtract 0.5 '123456789' -> '-123456789' Inexact Rounded subx609 subtract 0.500000001 '123456789' -> '-123456788' Inexact Rounded subx610 subtract 0.500001 '123456789' -> '-123456788' Inexact Rounded subx611 subtract 0.51 '123456789' -> '-123456788' Inexact Rounded subx612 subtract 0.6 '123456789' -> '-123456788' Inexact Rounded subx613 subtract 0.9 '123456789' -> '-123456788' Inexact Rounded subx614 subtract 0.99999 '123456789' -> '-123456788' Inexact Rounded subx615 subtract 0.999999999 '123456789' -> '-123456788' Inexact Rounded subx616 subtract 1 '123456789' -> '-123456788' subx617 subtract 1.000000001 '123456789' -> '-123456788' Inexact Rounded subx618 subtract 1.00001 '123456789' -> '-123456788' Inexact Rounded subx619 subtract 1.1 '123456789' -> '-123456788' Inexact Rounded rounding: half_even subx620 subtract 0 '123456789' -> '-123456789' subx621 subtract 0.000000001 '123456789' -> '-123456789' Inexact Rounded subx622 subtract 0.000001 '123456789' -> '-123456789' Inexact Rounded subx623 subtract 0.1 '123456789' -> '-123456789' Inexact Rounded subx624 subtract 0.4 '123456789' -> '-123456789' Inexact Rounded subx625 subtract 0.49 '123456789' -> '-123456789' Inexact Rounded subx626 subtract 0.499999 '123456789' -> '-123456789' Inexact Rounded subx627 subtract 0.499999999 '123456789' -> '-123456789' Inexact Rounded subx628 subtract 0.5 '123456789' -> '-123456788' Inexact Rounded subx629 subtract 0.500000001 '123456789' -> '-123456788' Inexact Rounded subx630 subtract 0.500001 '123456789' -> '-123456788' Inexact Rounded subx631 subtract 0.51 '123456789' -> '-123456788' Inexact Rounded subx632 subtract 0.6 '123456789' -> '-123456788' Inexact Rounded subx633 subtract 0.9 '123456789' -> '-123456788' Inexact Rounded subx634 subtract 0.99999 '123456789' -> '-123456788' Inexact Rounded subx635 subtract 0.999999999 '123456789' -> '-123456788' Inexact Rounded subx636 subtract 1 '123456789' -> '-123456788' subx637 subtract 1.00000001 '123456789' -> '-123456788' Inexact Rounded subx638 subtract 1.00001 '123456789' -> '-123456788' Inexact Rounded subx639 subtract 1.1 '123456789' -> '-123456788' Inexact Rounded -- critical few with even bottom digit... subx640 subtract 0.499999999 '123456788' -> '-123456788' Inexact Rounded subx641 subtract 0.5 '123456788' -> '-123456788' Inexact Rounded subx642 subtract 0.500000001 '123456788' -> '-123456787' Inexact Rounded rounding: down subx650 subtract 0 '123456789' -> '-123456789' subx651 subtract 0.000000001 '123456789' -> '-123456788' Inexact Rounded subx652 subtract 0.000001 '123456789' -> '-123456788' Inexact Rounded subx653 subtract 0.1 '123456789' -> '-123456788' Inexact Rounded subx654 subtract 0.4 '123456789' -> '-123456788' Inexact Rounded subx655 subtract 0.49 '123456789' -> '-123456788' Inexact Rounded subx656 subtract 0.499999 '123456789' -> '-123456788' Inexact Rounded subx657 subtract 0.499999999 '123456789' -> '-123456788' Inexact Rounded subx658 subtract 0.5 '123456789' -> '-123456788' Inexact Rounded subx659 subtract 0.500000001 '123456789' -> '-123456788' Inexact Rounded subx660 subtract 0.500001 '123456789' -> '-123456788' Inexact Rounded subx661 subtract 0.51 '123456789' -> '-123456788' Inexact Rounded subx662 subtract 0.6 '123456789' -> '-123456788' Inexact Rounded subx663 subtract 0.9 '123456789' -> '-123456788' Inexact Rounded subx664 subtract 0.99999 '123456789' -> '-123456788' Inexact Rounded subx665 subtract 0.999999999 '123456789' -> '-123456788' Inexact Rounded subx666 subtract 1 '123456789' -> '-123456788' subx667 subtract 1.00000001 '123456789' -> '-123456787' Inexact Rounded subx668 subtract 1.00001 '123456789' -> '-123456787' Inexact Rounded subx669 subtract 1.1 '123456789' -> '-123456787' Inexact Rounded -- lots of leading zeros in intermediate result, and showing effects of -- input rounding would have affected the following precision: 9 rounding: half_up subx670 subtract '123456789' '123456788.1' -> 0.9 subx671 subtract '123456789' '123456788.9' -> 0.1 subx672 subtract '123456789' '123456789.1' -> -0.1 subx673 subtract '123456789' '123456789.5' -> -0.5 subx674 subtract '123456789' '123456789.9' -> -0.9 rounding: half_even subx680 subtract '123456789' '123456788.1' -> 0.9 subx681 subtract '123456789' '123456788.9' -> 0.1 subx682 subtract '123456789' '123456789.1' -> -0.1 subx683 subtract '123456789' '123456789.5' -> -0.5 subx684 subtract '123456789' '123456789.9' -> -0.9 subx685 subtract '123456788' '123456787.1' -> 0.9 subx686 subtract '123456788' '123456787.9' -> 0.1 subx687 subtract '123456788' '123456788.1' -> -0.1 subx688 subtract '123456788' '123456788.5' -> -0.5 subx689 subtract '123456788' '123456788.9' -> -0.9 rounding: down subx690 subtract '123456789' '123456788.1' -> 0.9 subx691 subtract '123456789' '123456788.9' -> 0.1 subx692 subtract '123456789' '123456789.1' -> -0.1 subx693 subtract '123456789' '123456789.5' -> -0.5 subx694 subtract '123456789' '123456789.9' -> -0.9 -- input preparation tests rounding: half_up precision: 3 subx700 subtract '12345678900000' -9999999999999 -> '2.23E+13' Inexact Rounded subx701 subtract '9999999999999' -12345678900000 -> '2.23E+13' Inexact Rounded subx702 subtract '12E+3' '-3456' -> '1.55E+4' Inexact Rounded subx703 subtract '12E+3' '-3446' -> '1.54E+4' Inexact Rounded subx704 subtract '12E+3' '-3454' -> '1.55E+4' Inexact Rounded subx705 subtract '12E+3' '-3444' -> '1.54E+4' Inexact Rounded subx706 subtract '3456' '-12E+3' -> '1.55E+4' Inexact Rounded subx707 subtract '3446' '-12E+3' -> '1.54E+4' Inexact Rounded subx708 subtract '3454' '-12E+3' -> '1.55E+4' Inexact Rounded subx709 subtract '3444' '-12E+3' -> '1.54E+4' Inexact Rounded -- overflow and underflow tests [subnormals now possible] maxexponent: 999999999 minexponent: -999999999 precision: 9 rounding: down subx710 subtract 1E+999999999 -9E+999999999 -> 9.99999999E+999999999 Overflow Inexact Rounded subx711 subtract 9E+999999999 -1E+999999999 -> 9.99999999E+999999999 Overflow Inexact Rounded rounding: half_up subx712 subtract 1E+999999999 -9E+999999999 -> Infinity Overflow Inexact Rounded subx713 subtract 9E+999999999 -1E+999999999 -> Infinity Overflow Inexact Rounded subx714 subtract -1.1E-999999999 -1E-999999999 -> -1E-1000000000 Subnormal subx715 subtract 1E-999999999 +1.1e-999999999 -> -1E-1000000000 Subnormal subx716 subtract -1E+999999999 +9E+999999999 -> -Infinity Overflow Inexact Rounded subx717 subtract -9E+999999999 +1E+999999999 -> -Infinity Overflow Inexact Rounded subx718 subtract +1.1E-999999999 +1E-999999999 -> 1E-1000000000 Subnormal subx719 subtract -1E-999999999 -1.1e-999999999 -> 1E-1000000000 Subnormal precision: 3 subx720 subtract 1 9.999E+999999999 -> -Infinity Inexact Overflow Rounded subx721 subtract 1 -9.999E+999999999 -> Infinity Inexact Overflow Rounded subx722 subtract 9.999E+999999999 1 -> Infinity Inexact Overflow Rounded subx723 subtract -9.999E+999999999 1 -> -Infinity Inexact Overflow Rounded subx724 subtract 1 9.999E+999999999 -> -Infinity Inexact Overflow Rounded subx725 subtract 1 -9.999E+999999999 -> Infinity Inexact Overflow Rounded subx726 subtract 9.999E+999999999 1 -> Infinity Inexact Overflow Rounded subx727 subtract -9.999E+999999999 1 -> -Infinity Inexact Overflow Rounded -- [more below] -- long operand checks maxexponent: 999 minexponent: -999 precision: 9 sub731 subtract 12345678000 0 -> 1.23456780E+10 Rounded sub732 subtract 0 12345678000 -> -1.23456780E+10 Rounded sub733 subtract 1234567800 0 -> 1.23456780E+9 Rounded sub734 subtract 0 1234567800 -> -1.23456780E+9 Rounded sub735 subtract 1234567890 0 -> 1.23456789E+9 Rounded sub736 subtract 0 1234567890 -> -1.23456789E+9 Rounded sub737 subtract 1234567891 0 -> 1.23456789E+9 Inexact Rounded sub738 subtract 0 1234567891 -> -1.23456789E+9 Inexact Rounded sub739 subtract 12345678901 0 -> 1.23456789E+10 Inexact Rounded sub740 subtract 0 12345678901 -> -1.23456789E+10 Inexact Rounded sub741 subtract 1234567896 0 -> 1.23456790E+9 Inexact Rounded sub742 subtract 0 1234567896 -> -1.23456790E+9 Inexact Rounded precision: 15 sub751 subtract 12345678000 0 -> 12345678000 sub752 subtract 0 12345678000 -> -12345678000 sub753 subtract 1234567800 0 -> 1234567800 sub754 subtract 0 1234567800 -> -1234567800 sub755 subtract 1234567890 0 -> 1234567890 sub756 subtract 0 1234567890 -> -1234567890 sub757 subtract 1234567891 0 -> 1234567891 sub758 subtract 0 1234567891 -> -1234567891 sub759 subtract 12345678901 0 -> 12345678901 sub760 subtract 0 12345678901 -> -12345678901 sub761 subtract 1234567896 0 -> 1234567896 sub762 subtract 0 1234567896 -> -1234567896 -- Specials subx780 subtract -Inf Inf -> -Infinity subx781 subtract -Inf 1000 -> -Infinity subx782 subtract -Inf 1 -> -Infinity subx783 subtract -Inf -0 -> -Infinity subx784 subtract -Inf -1 -> -Infinity subx785 subtract -Inf -1000 -> -Infinity subx787 subtract -1000 Inf -> -Infinity subx788 subtract -Inf Inf -> -Infinity subx789 subtract -1 Inf -> -Infinity subx790 subtract 0 Inf -> -Infinity subx791 subtract 1 Inf -> -Infinity subx792 subtract 1000 Inf -> -Infinity subx800 subtract Inf Inf -> NaN Invalid_operation subx801 subtract Inf 1000 -> Infinity subx802 subtract Inf 1 -> Infinity subx803 subtract Inf 0 -> Infinity subx804 subtract Inf -0 -> Infinity subx805 subtract Inf -1 -> Infinity subx806 subtract Inf -1000 -> Infinity subx807 subtract Inf -Inf -> Infinity subx808 subtract -1000 -Inf -> Infinity subx809 subtract -Inf -Inf -> NaN Invalid_operation subx810 subtract -1 -Inf -> Infinity subx811 subtract -0 -Inf -> Infinity subx812 subtract 0 -Inf -> Infinity subx813 subtract 1 -Inf -> Infinity subx814 subtract 1000 -Inf -> Infinity subx815 subtract Inf -Inf -> Infinity subx821 subtract NaN Inf -> NaN subx822 subtract NaN 1000 -> NaN subx823 subtract NaN 1 -> NaN subx824 subtract NaN 0 -> NaN subx825 subtract NaN -0 -> NaN subx826 subtract NaN -1 -> NaN subx827 subtract NaN -1000 -> NaN subx828 subtract NaN -Inf -> NaN subx829 subtract NaN NaN -> NaN subx830 subtract -Inf NaN -> NaN subx831 subtract -1000 NaN -> NaN subx832 subtract -1 NaN -> NaN subx833 subtract -0 NaN -> NaN subx834 subtract 0 NaN -> NaN subx835 subtract 1 NaN -> NaN subx836 subtract 1000 NaN -> NaN subx837 subtract Inf NaN -> NaN subx841 subtract sNaN Inf -> NaN Invalid_operation subx842 subtract sNaN 1000 -> NaN Invalid_operation subx843 subtract sNaN 1 -> NaN Invalid_operation subx844 subtract sNaN 0 -> NaN Invalid_operation subx845 subtract sNaN -0 -> NaN Invalid_operation subx846 subtract sNaN -1 -> NaN Invalid_operation subx847 subtract sNaN -1000 -> NaN Invalid_operation subx848 subtract sNaN NaN -> NaN Invalid_operation subx849 subtract sNaN sNaN -> NaN Invalid_operation subx850 subtract NaN sNaN -> NaN Invalid_operation subx851 subtract -Inf sNaN -> NaN Invalid_operation subx852 subtract -1000 sNaN -> NaN Invalid_operation subx853 subtract -1 sNaN -> NaN Invalid_operation subx854 subtract -0 sNaN -> NaN Invalid_operation subx855 subtract 0 sNaN -> NaN Invalid_operation subx856 subtract 1 sNaN -> NaN Invalid_operation subx857 subtract 1000 sNaN -> NaN Invalid_operation subx858 subtract Inf sNaN -> NaN Invalid_operation subx859 subtract NaN sNaN -> NaN Invalid_operation -- subnormals and underflows precision: 3 maxexponent: 999 minexponent: -999 subx1010 subtract 0 1.00E-999 -> -1.00E-999 subx1011 subtract 0 0.1E-999 -> -1E-1000 Subnormal subx1012 subtract 0 0.10E-999 -> -1.0E-1000 Subnormal subx1013 subtract 0 0.100E-999 -> -1.0E-1000 Subnormal Rounded subx1014 subtract 0 0.01E-999 -> -1E-1001 Subnormal -- next is rounded to Emin subx1015 subtract 0 0.999E-999 -> -1.00E-999 Inexact Rounded Subnormal Underflow subx1016 subtract 0 0.099E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow subx1017 subtract 0 0.009E-999 -> -1E-1001 Inexact Rounded Subnormal Underflow subx1018 subtract 0 0.001E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow subx1019 subtract 0 0.0009E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow subx1020 subtract 0 0.0001E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow subx1030 subtract 0 -1.00E-999 -> 1.00E-999 subx1031 subtract 0 -0.1E-999 -> 1E-1000 Subnormal subx1032 subtract 0 -0.10E-999 -> 1.0E-1000 Subnormal subx1033 subtract 0 -0.100E-999 -> 1.0E-1000 Subnormal Rounded subx1034 subtract 0 -0.01E-999 -> 1E-1001 Subnormal -- next is rounded to Emin subx1035 subtract 0 -0.999E-999 -> 1.00E-999 Inexact Rounded Subnormal Underflow subx1036 subtract 0 -0.099E-999 -> 1.0E-1000 Inexact Rounded Subnormal Underflow subx1037 subtract 0 -0.009E-999 -> 1E-1001 Inexact Rounded Subnormal Underflow subx1038 subtract 0 -0.001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow subx1039 subtract 0 -0.0009E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow subx1040 subtract 0 -0.0001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow -- some non-zero subnormal subtracts -- subx1056 is a tricky case rounding: half_up subx1050 subtract 1.00E-999 0.1E-999 -> 9.0E-1000 Subnormal subx1051 subtract 0.1E-999 0.1E-999 -> 0E-1000 subx1052 subtract 0.10E-999 0.1E-999 -> 0E-1001 subx1053 subtract 0.100E-999 0.1E-999 -> 0E-1001 Clamped subx1054 subtract 0.01E-999 0.1E-999 -> -9E-1001 Subnormal subx1055 subtract 0.999E-999 0.1E-999 -> 9.0E-1000 Inexact Rounded Subnormal Underflow subx1056 subtract 0.099E-999 0.1E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow subx1057 subtract 0.009E-999 0.1E-999 -> -9E-1001 Inexact Rounded Subnormal Underflow subx1058 subtract 0.001E-999 0.1E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow subx1059 subtract 0.0009E-999 0.1E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow subx1060 subtract 0.0001E-999 0.1E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow -- check for double-rounded subnormals precision: 5 maxexponent: 79 minexponent: -79 subx1101 subtract 0 1.52444E-80 -> -1.524E-80 Inexact Rounded Subnormal Underflow subx1102 subtract 0 1.52445E-80 -> -1.524E-80 Inexact Rounded Subnormal Underflow subx1103 subtract 0 1.52446E-80 -> -1.524E-80 Inexact Rounded Subnormal Underflow subx1104 subtract 1.52444E-80 0 -> 1.524E-80 Inexact Rounded Subnormal Underflow subx1105 subtract 1.52445E-80 0 -> 1.524E-80 Inexact Rounded Subnormal Underflow subx1106 subtract 1.52446E-80 0 -> 1.524E-80 Inexact Rounded Subnormal Underflow subx1111 subtract 1.2345678E-80 1.2345671E-80 -> 0E-83 Inexact Rounded Subnormal Underflow subx1112 subtract 1.2345678E-80 1.2345618E-80 -> 0E-83 Inexact Rounded Subnormal Underflow subx1113 subtract 1.2345678E-80 1.2345178E-80 -> 0E-83 Inexact Rounded Subnormal Underflow subx1114 subtract 1.2345678E-80 1.2341678E-80 -> 0E-83 Inexact Rounded Subnormal Underflow subx1115 subtract 1.2345678E-80 1.2315678E-80 -> 3E-83 Rounded Subnormal subx1116 subtract 1.2345678E-80 1.2145678E-80 -> 2.0E-82 Rounded Subnormal subx1117 subtract 1.2345678E-80 1.1345678E-80 -> 1.00E-81 Rounded Subnormal subx1118 subtract 1.2345678E-80 0.2345678E-80 -> 1.000E-80 Rounded Subnormal -- Null tests subx9990 subtract 10 # -> NaN Invalid_operation subx9991 subtract # 10 -> NaN Invalid_operation --- NEW FILE: squareroot.decTest --- ------------------------------------------------------------------------ -- squareroot.decTest -- decimal square root -- -- Copyright (c) IBM Corporation, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ [...2891 lines suppressed...] precision: 13 -- Etiny=-21 sqtx808 squareroot 1E-21 -> 3.1622776602E-11 Underflow Subnormal Inexact Rounded sqtx809 squareroot 10E-21 -> 1E-10 Subnormal Rounded precision: 14 -- Etiny=-22 sqtx810 squareroot 1E-21 -> 3.16227766017E-11 Underflow Subnormal Inexact Rounded sqtx811 squareroot 10E-22 -> 3.16227766017E-11 Underflow Subnormal Inexact Rounded sqtx812 squareroot 1E-22 -> 1E-11 Subnormal -- Exact Subnormal case -- special values maxexponent: 999 minexponent: -999 sqtx820 squareroot Inf -> Infinity sqtx821 squareroot -Inf -> NaN Invalid_operation sqtx822 squareroot NaN -> NaN sqtx823 squareroot sNaN -> NaN Invalid_operation -- Null test sqtx900 squareroot # -> NaN Invalid_operation --- NEW FILE: rounding.decTest --- ------------------------------------------------------------------------ -- rounding.decTest -- decimal rounding modes testcases -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ [...1040 lines suppressed...] rmex401 multiply 9.999E+999999999 10 -> Infinity Overflow Inexact Rounded rounding: half_down rmex402 multiply -9.999E+999999999 10 -> -Infinity Overflow Inexact Rounded rmex403 multiply 9.999E+999999999 10 -> Infinity Overflow Inexact Rounded rounding: half_even rmex404 multiply -9.999E+999999999 10 -> -Infinity Overflow Inexact Rounded rmex405 multiply 9.999E+999999999 10 -> Infinity Overflow Inexact Rounded rounding: floor rmex406 multiply -9.999E+999999999 10 -> -Infinity Overflow Inexact Rounded rmex407 multiply 9.999E+999999999 10 -> 9.99999999E+999999999 Overflow Inexact Rounded rounding: ceiling rmex408 multiply -9.999E+999999999 10 -> -9.99999999E+999999999 Overflow Inexact Rounded rmex409 multiply 9.999E+999999999 10 -> Infinity Overflow Inexact Rounded rounding: up rmex410 multiply -9.999E+999999999 10 -> -Infinity Overflow Inexact Rounded rmex411 multiply 9.999E+999999999 10 -> Infinity Overflow Inexact Rounded rounding: down rmex412 multiply -9.999E+999999999 10 -> -9.99999999E+999999999 Overflow Inexact Rounded rmex413 multiply 9.999E+999999999 10 -> 9.99999999E+999999999 Overflow Inexact Rounded --- NEW FILE: rescale.decTest --- ------------------------------------------------------------------------ -- rescale.decTest -- decimal rescale operation -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- sanity checks (as base, above) resx001 rescale 0 0 -> 0 resx002 rescale 1 0 -> 1 resx003 rescale 0.1 +2 -> 0E+2 Inexact Rounded resx005 rescale 0.1 +1 -> 0E+1 Inexact Rounded resx006 rescale 0.1 0 -> 0 Inexact Rounded resx007 rescale 0.1 -1 -> 0.1 resx008 rescale 0.1 -2 -> 0.10 resx009 rescale 0.1 -3 -> 0.100 resx010 rescale 0.9 +2 -> 0E+2 Inexact Rounded resx011 rescale 0.9 +1 -> 0E+1 Inexact Rounded resx012 rescale 0.9 +0 -> 1 Inexact Rounded resx013 rescale 0.9 -1 -> 0.9 resx014 rescale 0.9 -2 -> 0.90 resx015 rescale 0.9 -3 -> 0.900 -- negatives resx021 rescale -0 0 -> -0 resx022 rescale -1 0 -> -1 resx023 rescale -0.1 +2 -> -0E+2 Inexact Rounded resx025 rescale -0.1 +1 -> -0E+1 Inexact Rounded resx026 rescale -0.1 0 -> -0 Inexact Rounded resx027 rescale -0.1 -1 -> -0.1 resx028 rescale -0.1 -2 -> -0.10 resx029 rescale -0.1 -3 -> -0.100 resx030 rescale -0.9 +2 -> -0E+2 Inexact Rounded resx031 rescale -0.9 +1 -> -0E+1 Inexact Rounded resx032 rescale -0.9 +0 -> -1 Inexact Rounded resx033 rescale -0.9 -1 -> -0.9 resx034 rescale -0.9 -2 -> -0.90 resx035 rescale -0.9 -3 -> -0.900 resx036 rescale -0.5 +2 -> -0E+2 Inexact Rounded resx037 rescale -0.5 +1 -> -0E+1 Inexact Rounded resx038 rescale -0.5 +0 -> -1 Inexact Rounded resx039 rescale -0.5 -1 -> -0.5 resx040 rescale -0.5 -2 -> -0.50 resx041 rescale -0.5 -3 -> -0.500 resx042 rescale -0.9 +2 -> -0E+2 Inexact Rounded resx043 rescale -0.9 +1 -> -0E+1 Inexact Rounded resx044 rescale -0.9 +0 -> -1 Inexact Rounded resx045 rescale -0.9 -1 -> -0.9 resx046 rescale -0.9 -2 -> -0.90 resx047 rescale -0.9 -3 -> -0.900 -- examples from Specification resx060 rescale 2.17 -3 -> 2.170 resx061 rescale 2.17 -2 -> 2.17 resx062 rescale 2.17 -1 -> 2.2 Inexact Rounded resx063 rescale 2.17 0 -> 2 Inexact Rounded resx064 rescale 2.17 +1 -> 0E+1 Inexact Rounded resx065 rescale 2 Inf -> NaN Invalid_operation resx066 rescale -0.1 0 -> -0 Inexact Rounded resx067 rescale -0 5 -> -0E+5 resx068 rescale +35236450.6 -2 -> Infinity Overflow Inexact Rounded resx069 rescale -35236450.6 -2 -> -Infinity Overflow Inexact Rounded resx070 rescale 217 -1 -> 217.0 resx071 rescale 217 0 -> 217 resx072 rescale 217 +1 -> 2.2E+2 Inexact Rounded resx073 rescale 217 +2 -> 2E+2 Inexact Rounded -- general tests .. resx089 rescale 12 +4 -> 0E+4 Inexact Rounded resx090 rescale 12 +3 -> 0E+3 Inexact Rounded resx091 rescale 12 +2 -> 0E+2 Inexact Rounded resx092 rescale 12 +1 -> 1E+1 Inexact Rounded resx093 rescale 1.2345 -2 -> 1.23 Inexact Rounded resx094 rescale 1.2355 -2 -> 1.24 Inexact Rounded resx095 rescale 1.2345 -6 -> 1.234500 resx096 rescale 9.9999 -2 -> 10.00 Inexact Rounded resx097 rescale 0.0001 -2 -> 0.00 Inexact Rounded resx098 rescale 0.001 -2 -> 0.00 Inexact Rounded resx099 rescale 0.009 -2 -> 0.01 Inexact Rounded resx100 rescale 92 +2 -> 1E+2 Inexact Rounded resx101 rescale -1 0 -> -1 resx102 rescale -1 -1 -> -1.0 resx103 rescale -1 -2 -> -1.00 resx104 rescale 0 0 -> 0 resx105 rescale 0 -1 -> 0.0 resx106 rescale 0 -2 -> 0.00 resx107 rescale 0.00 0 -> 0 resx108 rescale 0 +1 -> 0E+1 resx109 rescale 0 +2 -> 0E+2 resx110 rescale +1 0 -> 1 resx111 rescale +1 -1 -> 1.0 resx112 rescale +1 -2 -> 1.00 resx120 rescale 1.04 -3 -> 1.040 resx121 rescale 1.04 -2 -> 1.04 resx122 rescale 1.04 -1 -> 1.0 Inexact Rounded resx123 rescale 1.04 0 -> 1 Inexact Rounded resx124 rescale 1.05 -3 -> 1.050 resx125 rescale 1.05 -2 -> 1.05 resx126 rescale 1.05 -1 -> 1.1 Inexact Rounded resx127 rescale 1.05 0 -> 1 Inexact Rounded resx128 rescale 1.05 -3 -> 1.050 resx129 rescale 1.05 -2 -> 1.05 resx130 rescale 1.05 -1 -> 1.1 Inexact Rounded resx131 rescale 1.05 0 -> 1 Inexact Rounded resx132 rescale 1.06 -3 -> 1.060 resx133 rescale 1.06 -2 -> 1.06 resx134 rescale 1.06 -1 -> 1.1 Inexact Rounded resx135 rescale 1.06 0 -> 1 Inexact Rounded resx140 rescale -10 -2 -> -10.00 resx141 rescale +1 -2 -> 1.00 resx142 rescale +10 -2 -> 10.00 resx143 rescale 1E+10 -2 -> Infinity Overflow Inexact Rounded resx144 rescale 1E-10 -2 -> 0.00 Inexact Rounded resx145 rescale 1E-3 -2 -> 0.00 Inexact Rounded resx146 rescale 1E-2 -2 -> 0.01 resx147 rescale 1E-1 -2 -> 0.10 resx148 rescale 0E-10 -2 -> 0.00 resx150 rescale 1.0600 -5 -> 1.06000 resx151 rescale 1.0600 -4 -> 1.0600 resx152 rescale 1.0600 -3 -> 1.060 Rounded resx153 rescale 1.0600 -2 -> 1.06 Rounded resx154 rescale 1.0600 -1 -> 1.1 Inexact Rounded resx155 rescale 1.0600 0 -> 1 Inexact Rounded -- +ve exponents .. resx201 rescale -1 +0 -> -1 resx202 rescale -1 +1 -> -0E+1 Inexact Rounded resx203 rescale -1 +2 -> -0E+2 Inexact Rounded resx204 rescale 0 +0 -> 0 resx205 rescale 0 +1 -> 0E+1 resx206 rescale 0 +2 -> 0E+2 resx207 rescale +1 +0 -> 1 resx208 rescale +1 +1 -> 0E+1 Inexact Rounded resx209 rescale +1 +2 -> 0E+2 Inexact Rounded resx220 rescale 1.04 +3 -> 0E+3 Inexact Rounded resx221 rescale 1.04 +2 -> 0E+2 Inexact Rounded resx222 rescale 1.04 +1 -> 0E+1 Inexact Rounded resx223 rescale 1.04 +0 -> 1 Inexact Rounded resx224 rescale 1.05 +3 -> 0E+3 Inexact Rounded resx225 rescale 1.05 +2 -> 0E+2 Inexact Rounded resx226 rescale 1.05 +1 -> 0E+1 Inexact Rounded resx227 rescale 1.05 +0 -> 1 Inexact Rounded resx228 rescale 1.05 +3 -> 0E+3 Inexact Rounded resx229 rescale 1.05 +2 -> 0E+2 Inexact Rounded resx230 rescale 1.05 +1 -> 0E+1 Inexact Rounded resx231 rescale 1.05 +0 -> 1 Inexact Rounded resx232 rescale 1.06 +3 -> 0E+3 Inexact Rounded resx233 rescale 1.06 +2 -> 0E+2 Inexact Rounded resx234 rescale 1.06 +1 -> 0E+1 Inexact Rounded resx235 rescale 1.06 +0 -> 1 Inexact Rounded resx240 rescale -10 +1 -> -1E+1 Rounded resx241 rescale +1 +1 -> 0E+1 Inexact Rounded resx242 rescale +10 +1 -> 1E+1 Rounded resx243 rescale 1E+1 +1 -> 1E+1 -- underneath this is E+1 resx244 rescale 1E+2 +1 -> 1.0E+2 -- underneath this is E+1 resx245 rescale 1E+3 +1 -> 1.00E+3 -- underneath this is E+1 resx246 rescale 1E+4 +1 -> 1.000E+4 -- underneath this is E+1 resx247 rescale 1E+5 +1 -> 1.0000E+5 -- underneath this is E+1 resx248 rescale 1E+6 +1 -> 1.00000E+6 -- underneath this is E+1 resx249 rescale 1E+7 +1 -> 1.000000E+7 -- underneath this is E+1 resx250 rescale 1E+8 +1 -> 1.0000000E+8 -- underneath this is E+1 resx251 rescale 1E+9 +1 -> 1.00000000E+9 -- underneath this is E+1 -- next one tries to add 9 zeros resx252 rescale 1E+10 +1 -> Infinity Overflow Inexact Rounded resx253 rescale 1E-10 +1 -> 0E+1 Inexact Rounded resx254 rescale 1E-2 +1 -> 0E+1 Inexact Rounded resx255 rescale 0E-10 +1 -> 0E+1 resx256 rescale -0E-10 +1 -> -0E+1 resx257 rescale -0E-1 +1 -> -0E+1 resx258 rescale -0 +1 -> -0E+1 resx259 rescale -0E+1 +1 -> -0E+1 resx260 rescale -10 +2 -> -0E+2 Inexact Rounded resx261 rescale +1 +2 -> 0E+2 Inexact Rounded resx262 rescale +10 +2 -> 0E+2 Inexact Rounded resx263 rescale 1E+1 +2 -> 0E+2 Inexact Rounded resx264 rescale 1E+2 +2 -> 1E+2 resx265 rescale 1E+3 +2 -> 1.0E+3 resx266 rescale 1E+4 +2 -> 1.00E+4 resx267 rescale 1E+5 +2 -> 1.000E+5 resx268 rescale 1E+6 +2 -> 1.0000E+6 resx269 rescale 1E+7 +2 -> 1.00000E+7 resx270 rescale 1E+8 +2 -> 1.000000E+8 resx271 rescale 1E+9 +2 -> 1.0000000E+9 resx272 rescale 1E+10 +2 -> 1.00000000E+10 resx273 rescale 1E-10 +2 -> 0E+2 Inexact Rounded resx274 rescale 1E-2 +2 -> 0E+2 Inexact Rounded resx275 rescale 0E-10 +2 -> 0E+2 resx280 rescale -10 +3 -> -0E+3 Inexact Rounded resx281 rescale +1 +3 -> 0E+3 Inexact Rounded resx282 rescale +10 +3 -> 0E+3 Inexact Rounded resx283 rescale 1E+1 +3 -> 0E+3 Inexact Rounded resx284 rescale 1E+2 +3 -> 0E+3 Inexact Rounded resx285 rescale 1E+3 +3 -> 1E+3 resx286 rescale 1E+4 +3 -> 1.0E+4 resx287 rescale 1E+5 +3 -> 1.00E+5 resx288 rescale 1E+6 +3 -> 1.000E+6 resx289 rescale 1E+7 +3 -> 1.0000E+7 resx290 rescale 1E+8 +3 -> 1.00000E+8 resx291 rescale 1E+9 +3 -> 1.000000E+9 resx292 rescale 1E+10 +3 -> 1.0000000E+10 resx293 rescale 1E-10 +3 -> 0E+3 Inexact Rounded resx294 rescale 1E-2 +3 -> 0E+3 Inexact Rounded resx295 rescale 0E-10 +3 -> 0E+3 -- round up from below [sign wrong in JIT compiler once] resx300 rescale 0.0078 -5 -> 0.00780 resx301 rescale 0.0078 -4 -> 0.0078 resx302 rescale 0.0078 -3 -> 0.008 Inexact Rounded resx303 rescale 0.0078 -2 -> 0.01 Inexact Rounded resx304 rescale 0.0078 -1 -> 0.0 Inexact Rounded resx305 rescale 0.0078 0 -> 0 Inexact Rounded resx306 rescale 0.0078 +1 -> 0E+1 Inexact Rounded resx307 rescale 0.0078 +2 -> 0E+2 Inexact Rounded resx310 rescale -0.0078 -5 -> -0.00780 resx311 rescale -0.0078 -4 -> -0.0078 resx312 rescale -0.0078 -3 -> -0.008 Inexact Rounded resx313 rescale -0.0078 -2 -> -0.01 Inexact Rounded resx314 rescale -0.0078 -1 -> -0.0 Inexact Rounded resx315 rescale -0.0078 0 -> -0 Inexact Rounded resx316 rescale -0.0078 +1 -> -0E+1 Inexact Rounded resx317 rescale -0.0078 +2 -> -0E+2 Inexact Rounded resx320 rescale 0.078 -5 -> 0.07800 resx321 rescale 0.078 -4 -> 0.0780 resx322 rescale 0.078 -3 -> 0.078 resx323 rescale 0.078 -2 -> 0.08 Inexact Rounded resx324 rescale 0.078 -1 -> 0.1 Inexact Rounded resx325 rescale 0.078 0 -> 0 Inexact Rounded resx326 rescale 0.078 +1 -> 0E+1 Inexact Rounded resx327 rescale 0.078 +2 -> 0E+2 Inexact Rounded resx330 rescale -0.078 -5 -> -0.07800 resx331 rescale -0.078 -4 -> -0.0780 resx332 rescale -0.078 -3 -> -0.078 resx333 rescale -0.078 -2 -> -0.08 Inexact Rounded resx334 rescale -0.078 -1 -> -0.1 Inexact Rounded resx335 rescale -0.078 0 -> -0 Inexact Rounded resx336 rescale -0.078 +1 -> -0E+1 Inexact Rounded resx337 rescale -0.078 +2 -> -0E+2 Inexact Rounded resx340 rescale 0.78 -5 -> 0.78000 resx341 rescale 0.78 -4 -> 0.7800 resx342 rescale 0.78 -3 -> 0.780 resx343 rescale 0.78 -2 -> 0.78 resx344 rescale 0.78 -1 -> 0.8 Inexact Rounded resx345 rescale 0.78 0 -> 1 Inexact Rounded resx346 rescale 0.78 +1 -> 0E+1 Inexact Rounded resx347 rescale 0.78 +2 -> 0E+2 Inexact Rounded resx350 rescale -0.78 -5 -> -0.78000 resx351 rescale -0.78 -4 -> -0.7800 resx352 rescale -0.78 -3 -> -0.780 resx353 rescale -0.78 -2 -> -0.78 resx354 rescale -0.78 -1 -> -0.8 Inexact Rounded resx355 rescale -0.78 0 -> -1 Inexact Rounded resx356 rescale -0.78 +1 -> -0E+1 Inexact Rounded resx357 rescale -0.78 +2 -> -0E+2 Inexact Rounded resx360 rescale 7.8 -5 -> 7.80000 resx361 rescale 7.8 -4 -> 7.8000 resx362 rescale 7.8 -3 -> 7.800 resx363 rescale 7.8 -2 -> 7.80 resx364 rescale 7.8 -1 -> 7.8 resx365 rescale 7.8 0 -> 8 Inexact Rounded resx366 rescale 7.8 +1 -> 1E+1 Inexact Rounded resx367 rescale 7.8 +2 -> 0E+2 Inexact Rounded resx368 rescale 7.8 +3 -> 0E+3 Inexact Rounded resx370 rescale -7.8 -5 -> -7.80000 resx371 rescale -7.8 -4 -> -7.8000 resx372 rescale -7.8 -3 -> -7.800 resx373 rescale -7.8 -2 -> -7.80 resx374 rescale -7.8 -1 -> -7.8 resx375 rescale -7.8 0 -> -8 Inexact Rounded resx376 rescale -7.8 +1 -> -1E+1 Inexact Rounded resx377 rescale -7.8 +2 -> -0E+2 Inexact Rounded resx378 rescale -7.8 +3 -> -0E+3 Inexact Rounded -- some individuals precision: 9 resx380 rescale 352364.506 -2 -> 352364.51 Inexact Rounded resx381 rescale 3523645.06 -2 -> 3523645.06 resx382 rescale 35236450.6 -2 -> Infinity Overflow Inexact Rounded resx383 rescale 352364506 -2 -> Infinity Overflow Inexact Rounded resx384 rescale -352364.506 -2 -> -352364.51 Inexact Rounded resx385 rescale -3523645.06 -2 -> -3523645.06 resx386 rescale -35236450.6 -2 -> -Infinity Overflow Inexact Rounded resx387 rescale -352364506 -2 -> -Infinity Overflow Inexact Rounded -- some 9999 round-up cases resx400 rescale 9.999 -5 -> 9.99900 resx401 rescale 9.999 -4 -> 9.9990 resx402 rescale 9.999 -3 -> 9.999 resx403 rescale 9.999 -2 -> 10.00 Inexact Rounded resx404 rescale 9.999 -1 -> 10.0 Inexact Rounded resx405 rescale 9.999 0 -> 10 Inexact Rounded resx406 rescale 9.999 1 -> 1E+1 Inexact Rounded resx407 rescale 9.999 2 -> 0E+2 Inexact Rounded resx410 rescale 0.999 -5 -> 0.99900 resx411 rescale 0.999 -4 -> 0.9990 resx412 rescale 0.999 -3 -> 0.999 resx413 rescale 0.999 -2 -> 1.00 Inexact Rounded resx414 rescale 0.999 -1 -> 1.0 Inexact Rounded resx415 rescale 0.999 0 -> 1 Inexact Rounded resx416 rescale 0.999 1 -> 0E+1 Inexact Rounded resx420 rescale 0.0999 -5 -> 0.09990 resx421 rescale 0.0999 -4 -> 0.0999 resx422 rescale 0.0999 -3 -> 0.100 Inexact Rounded resx423 rescale 0.0999 -2 -> 0.10 Inexact Rounded resx424 rescale 0.0999 -1 -> 0.1 Inexact Rounded resx425 rescale 0.0999 0 -> 0 Inexact Rounded resx426 rescale 0.0999 1 -> 0E+1 Inexact Rounded resx430 rescale 0.00999 -5 -> 0.00999 resx431 rescale 0.00999 -4 -> 0.0100 Inexact Rounded resx432 rescale 0.00999 -3 -> 0.010 Inexact Rounded resx433 rescale 0.00999 -2 -> 0.01 Inexact Rounded resx434 rescale 0.00999 -1 -> 0.0 Inexact Rounded resx435 rescale 0.00999 0 -> 0 Inexact Rounded resx436 rescale 0.00999 1 -> 0E+1 Inexact Rounded resx440 rescale 0.000999 -5 -> 0.00100 Inexact Rounded resx441 rescale 0.000999 -4 -> 0.0010 Inexact Rounded resx442 rescale 0.000999 -3 -> 0.001 Inexact Rounded resx443 rescale 0.000999 -2 -> 0.00 Inexact Rounded resx444 rescale 0.000999 -1 -> 0.0 Inexact Rounded resx445 rescale 0.000999 0 -> 0 Inexact Rounded resx446 rescale 0.000999 1 -> 0E+1 Inexact Rounded precision: 8 resx449 rescale 9.999E-15 -23 -> Infinity Inexact Rounded Overflow resx450 rescale 9.999E-15 -22 -> 9.9990000E-15 resx451 rescale 9.999E-15 -21 -> 9.999000E-15 resx452 rescale 9.999E-15 -20 -> 9.99900E-15 resx453 rescale 9.999E-15 -19 -> 9.9990E-15 resx454 rescale 9.999E-15 -18 -> 9.999E-15 resx455 rescale 9.999E-15 -17 -> 1.000E-14 Inexact Rounded resx456 rescale 9.999E-15 -16 -> 1.00E-14 Inexact Rounded resx457 rescale 9.999E-15 -15 -> 1.0E-14 Inexact Rounded resx458 rescale 9.999E-15 -14 -> 1E-14 Inexact Rounded resx459 rescale 9.999E-15 -13 -> 0E-13 Inexact Rounded resx460 rescale 9.999E-15 -12 -> 0E-12 Inexact Rounded resx461 rescale 9.999E-15 -11 -> 0E-11 Inexact Rounded resx462 rescale 9.999E-15 -10 -> 0E-10 Inexact Rounded resx463 rescale 9.999E-15 -9 -> 0E-9 Inexact Rounded resx464 rescale 9.999E-15 -8 -> 0E-8 Inexact Rounded resx465 rescale 9.999E-15 -7 -> 0E-7 Inexact Rounded resx466 rescale 9.999E-15 -6 -> 0.000000 Inexact Rounded resx467 rescale 9.999E-15 -5 -> 0.00000 Inexact Rounded resx468 rescale 9.999E-15 -4 -> 0.0000 Inexact Rounded resx469 rescale 9.999E-15 -3 -> 0.000 Inexact Rounded resx470 rescale 9.999E-15 -2 -> 0.00 Inexact Rounded resx471 rescale 9.999E-15 -1 -> 0.0 Inexact Rounded resx472 rescale 9.999E-15 0 -> 0 Inexact Rounded resx473 rescale 9.999E-15 1 -> 0E+1 Inexact Rounded -- long operand checks [rhs checks removed] maxexponent: 999 minexponent: -999 precision: 9 resx481 rescale 12345678000 +3 -> 1.2345678E+10 Rounded resx482 rescale 1234567800 +1 -> 1.23456780E+9 Rounded resx483 rescale 1234567890 +1 -> 1.23456789E+9 Rounded resx484 rescale 1234567891 +1 -> 1.23456789E+9 Inexact Rounded resx485 rescale 12345678901 +2 -> 1.23456789E+10 Inexact Rounded resx486 rescale 1234567896 +1 -> 1.23456790E+9 Inexact Rounded -- a potential double-round resx487 rescale 1234.987643 -4 -> 1234.9876 Inexact Rounded resx488 rescale 1234.987647 -4 -> 1234.9876 Inexact Rounded precision: 15 resx491 rescale 12345678000 +3 -> 1.2345678E+10 Rounded resx492 rescale 1234567800 +1 -> 1.23456780E+9 Rounded resx493 rescale 1234567890 +1 -> 1.23456789E+9 Rounded resx494 rescale 1234567891 +1 -> 1.23456789E+9 Inexact Rounded resx495 rescale 12345678901 +2 -> 1.23456789E+10 Inexact Rounded resx496 rescale 1234567896 +1 -> 1.23456790E+9 Inexact Rounded resx497 rescale 1234.987643 -4 -> 1234.9876 Inexact Rounded resx498 rescale 1234.987647 -4 -> 1234.9876 Inexact Rounded -- Zeros resx500 rescale 0 1 -> 0E+1 resx501 rescale 0 0 -> 0 resx502 rescale 0 -1 -> 0.0 resx503 rescale 0.0 -1 -> 0.0 resx504 rescale 0.0 0 -> 0 resx505 rescale 0.0 +1 -> 0E+1 resx506 rescale 0E+1 -1 -> 0.0 resx507 rescale 0E+1 0 -> 0 resx508 rescale 0E+1 +1 -> 0E+1 resx509 rescale -0 1 -> -0E+1 resx510 rescale -0 0 -> -0 resx511 rescale -0 -1 -> -0.0 resx512 rescale -0.0 -1 -> -0.0 resx513 rescale -0.0 0 -> -0 resx514 rescale -0.0 +1 -> -0E+1 resx515 rescale -0E+1 -1 -> -0.0 resx516 rescale -0E+1 0 -> -0 resx517 rescale -0E+1 +1 -> -0E+1 -- Suspicious RHS values maxexponent: 999999999 minexponent: -999999999 precision: 15 resx521 rescale 1.234 999999E+3 -> 0E+999999000 Inexact Rounded resx522 rescale 123.456 999999E+3 -> 0E+999999000 Inexact Rounded resx523 rescale 1.234 999999999 -> 0E+999999999 Inexact Rounded resx524 rescale 123.456 999999999 -> 0E+999999999 Inexact Rounded resx525 rescale 123.456 1000000000 -> NaN Invalid_operation resx526 rescale 123.456 12345678903 -> NaN Invalid_operation -- next four are "won't fit" overflows resx527 rescale 1.234 -999999E+3 -> Infinity Overflow Inexact Rounded resx528 rescale 123.456 -999999E+3 -> Infinity Overflow Inexact Rounded resx529 rescale 1.234 -999999999 -> Infinity Overflow Inexact Rounded resx530 rescale 123.456 -999999999 -> Infinity Overflow Inexact Rounded resx531 rescale 123.456 -1000000014 -> NaN Invalid_operation resx532 rescale 123.456 -12345678903 -> NaN Invalid_operation maxexponent: 999 minexponent: -999 precision: 15 resx540 rescale 1.234E+999 999 -> 1E+999 Inexact Rounded resx541 rescale 1.234E+998 999 -> 0E+999 Inexact Rounded resx542 rescale 1.234 999 -> 0E+999 Inexact Rounded resx543 rescale 1.234 1000 -> NaN Invalid_operation resx544 rescale 1.234 5000 -> NaN Invalid_operation resx545 rescale 0 -999 -> 0E-999 -- next two are "won't fit" overflows resx546 rescale 1.234 -999 -> Infinity Overflow Inexact Rounded resx547 rescale 1.234 -1000 -> Infinity Overflow Inexact Rounded resx548 rescale 1.234 -5000 -> NaN Invalid_operation -- [more below] -- fractional RHS, some good and some bad precision: 9 resx549 rescale 222 +2.0 -> 2E+2 Inexact Rounded resx550 rescale 222 +2.00000000 -> 2E+2 Inexact Rounded resx551 rescale 222 +2.00100000000 -> NaN Invalid_operation resx552 rescale 222 +2.000001 -> NaN Invalid_operation resx553 rescale 222 +2.000000001 -> NaN Invalid_operation resx554 rescale 222 +2.0000000001 -> NaN Invalid_operation resx555 rescale 222 +2.00000000001 -> NaN Invalid_operation resx556 rescale 222 +2.99999999999 -> NaN Invalid_operation resx557 rescale 222 -2.00000000 -> 222.00 resx558 rescale 222 -2.00100000000 -> NaN Invalid_operation resx559 rescale 222 -2.0000001000 -> NaN Invalid_operation resx560 rescale 222 -2.00000000001 -> NaN Invalid_operation resx561 rescale 222 -2.99999999999 -> NaN Invalid_operation -- Specials resx580 rescale Inf -Inf -> NaN Invalid_operation resx581 rescale Inf -1000 -> Infinity resx582 rescale Inf -1 -> Infinity resx583 rescale Inf 0 -> Infinity resx584 rescale Inf 1 -> Infinity resx585 rescale Inf 1000 -> Infinity resx586 rescale Inf Inf -> NaN Invalid_operation resx587 rescale -1000 Inf -> NaN Invalid_operation resx588 rescale -Inf Inf -> NaN Invalid_operation resx589 rescale -1 Inf -> NaN Invalid_operation resx590 rescale 0 Inf -> NaN Invalid_operation resx591 rescale 1 Inf -> NaN Invalid_operation resx592 rescale 1000 Inf -> NaN Invalid_operation resx593 rescale Inf Inf -> NaN Invalid_operation resx594 rescale Inf -0 -> Infinity resx595 rescale -0 Inf -> NaN Invalid_operation resx600 rescale -Inf -Inf -> NaN Invalid_operation resx601 rescale -Inf -1000 -> -Infinity resx602 rescale -Inf -1 -> -Infinity resx603 rescale -Inf 0 -> -Infinity resx604 rescale -Inf 1 -> -Infinity resx605 rescale -Inf 1000 -> -Infinity resx606 rescale -Inf Inf -> NaN Invalid_operation resx607 rescale -1000 Inf -> NaN Invalid_operation resx608 rescale -Inf -Inf -> NaN Invalid_operation resx609 rescale -1 -Inf -> NaN Invalid_operation resx610 rescale 0 -Inf -> NaN Invalid_operation resx611 rescale 1 -Inf -> NaN Invalid_operation resx612 rescale 1000 -Inf -> NaN Invalid_operation resx613 rescale Inf -Inf -> NaN Invalid_operation resx614 rescale -Inf -0 -> -Infinity resx615 rescale -0 -Inf -> NaN Invalid_operation resx621 rescale NaN -Inf -> NaN Invalid_operation resx622 rescale NaN -1000 -> NaN resx623 rescale NaN -1 -> NaN resx624 rescale NaN 0 -> NaN resx625 rescale NaN 1 -> NaN resx626 rescale NaN 1000 -> NaN resx627 rescale NaN Inf -> NaN Invalid_operation resx628 rescale NaN NaN -> NaN resx629 rescale -Inf NaN -> NaN resx630 rescale -1000 NaN -> NaN resx631 rescale -1 NaN -> NaN resx632 rescale 0 NaN -> NaN resx633 rescale 1 NaN -> NaN resx634 rescale 1000 NaN -> NaN resx635 rescale Inf NaN -> NaN resx636 rescale NaN -0 -> NaN resx637 rescale -0 NaN -> NaN resx641 rescale sNaN -Inf -> NaN Invalid_operation resx642 rescale sNaN -1000 -> NaN Invalid_operation resx643 rescale sNaN -1 -> NaN Invalid_operation resx644 rescale sNaN 0 -> NaN Invalid_operation resx645 rescale sNaN 1 -> NaN Invalid_operation resx646 rescale sNaN 1000 -> NaN Invalid_operation resx647 rescale sNaN NaN -> NaN Invalid_operation resx648 rescale sNaN sNaN -> NaN Invalid_operation resx649 rescale NaN sNaN -> NaN Invalid_operation resx650 rescale -Inf sNaN -> NaN Invalid_operation resx651 rescale -1000 sNaN -> NaN Invalid_operation resx652 rescale -1 sNaN -> NaN Invalid_operation resx653 rescale 0 sNaN -> NaN Invalid_operation resx654 rescale 1 sNaN -> NaN Invalid_operation resx655 rescale 1000 sNaN -> NaN Invalid_operation resx656 rescale Inf sNaN -> NaN Invalid_operation resx657 rescale NaN sNaN -> NaN Invalid_operation resx658 rescale sNaN -0 -> NaN Invalid_operation resx659 rescale -0 sNaN -> NaN Invalid_operation -- subnormals and underflow precision: 4 maxexponent: 999 minexponent: -999 resx710 rescale 1.00E-999 -999 -> 1E-999 Rounded resx711 rescale 0.1E-999 -1000 -> 1E-1000 Subnormal resx712 rescale 0.10E-999 -1000 -> 1E-1000 Subnormal Rounded resx713 rescale 0.100E-999 -1000 -> 1E-1000 Subnormal Rounded resx714 rescale 0.01E-999 -1001 -> 1E-1001 Subnormal -- next is rounded to Emin resx715 rescale 0.999E-999 -999 -> 1E-999 Inexact Rounded resx716 rescale 0.099E-999 -1000 -> 1E-1000 Inexact Rounded Subnormal Underflow resx717 rescale 0.009E-999 -1001 -> 1E-1001 Inexact Rounded Subnormal Underflow resx718 rescale 0.001E-999 -1001 -> 0E-1001 Inexact Rounded resx719 rescale 0.0009E-999 -1001 -> 0E-1001 Inexact Rounded resx720 rescale 0.0001E-999 -1001 -> 0E-1001 Inexact Rounded resx730 rescale -1.00E-999 -999 -> -1E-999 Rounded resx731 rescale -0.1E-999 -999 -> -0E-999 Rounded Inexact resx732 rescale -0.10E-999 -999 -> -0E-999 Rounded Inexact resx733 rescale -0.100E-999 -999 -> -0E-999 Rounded Inexact resx734 rescale -0.01E-999 -999 -> -0E-999 Inexact Rounded -- next is rounded to Emin resx735 rescale -0.999E-999 -999 -> -1E-999 Inexact Rounded resx736 rescale -0.099E-999 -999 -> -0E-999 Inexact Rounded resx737 rescale -0.009E-999 -999 -> -0E-999 Inexact Rounded resx738 rescale -0.001E-999 -999 -> -0E-999 Inexact Rounded resx739 rescale -0.0001E-999 -999 -> -0E-999 Inexact Rounded resx740 rescale -1.00E-999 -1000 -> -1.0E-999 Rounded resx741 rescale -0.1E-999 -1000 -> -1E-1000 Subnormal resx742 rescale -0.10E-999 -1000 -> -1E-1000 Subnormal Rounded resx743 rescale -0.100E-999 -1000 -> -1E-1000 Subnormal Rounded resx744 rescale -0.01E-999 -1000 -> -0E-1000 Inexact Rounded -- next is rounded to Emin resx745 rescale -0.999E-999 -1000 -> -1.0E-999 Inexact Rounded resx746 rescale -0.099E-999 -1000 -> -1E-1000 Inexact Rounded Subnormal Underflow resx747 rescale -0.009E-999 -1000 -> -0E-1000 Inexact Rounded resx748 rescale -0.001E-999 -1000 -> -0E-1000 Inexact Rounded resx749 rescale -0.0001E-999 -1000 -> -0E-1000 Inexact Rounded resx750 rescale -1.00E-999 -1001 -> -1.00E-999 resx751 rescale -0.1E-999 -1001 -> -1.0E-1000 Subnormal resx752 rescale -0.10E-999 -1001 -> -1.0E-1000 Subnormal resx753 rescale -0.100E-999 -1001 -> -1.0E-1000 Subnormal Rounded resx754 rescale -0.01E-999 -1001 -> -1E-1001 Subnormal -- next is rounded to Emin resx755 rescale -0.999E-999 -1001 -> -1.00E-999 Inexact Rounded resx756 rescale -0.099E-999 -1001 -> -1.0E-1000 Inexact Rounded Subnormal Underflow resx757 rescale -0.009E-999 -1001 -> -1E-1001 Inexact Rounded Subnormal Underflow resx758 rescale -0.001E-999 -1001 -> -0E-1001 Inexact Rounded resx759 rescale -0.0001E-999 -1001 -> -0E-1001 Inexact Rounded resx760 rescale -1.00E-999 -1002 -> -1.000E-999 resx761 rescale -0.1E-999 -1002 -> -1.00E-1000 Subnormal resx762 rescale -0.10E-999 -1002 -> -1.00E-1000 Subnormal resx763 rescale -0.100E-999 -1002 -> -1.00E-1000 Subnormal resx764 rescale -0.01E-999 -1002 -> -1.0E-1001 Subnormal resx765 rescale -0.999E-999 -1002 -> -9.99E-1000 Subnormal resx766 rescale -0.099E-999 -1002 -> -9.9E-1001 Subnormal resx767 rescale -0.009E-999 -1002 -> -9E-1002 Subnormal resx768 rescale -0.001E-999 -1002 -> -1E-1002 Subnormal resx769 rescale -0.0001E-999 -1002 -> -0E-1002 Inexact Rounded -- rhs must be no less than Etiny resx770 rescale -1.00E-999 -1003 -> NaN Invalid_operation resx771 rescale -0.1E-999 -1003 -> NaN Invalid_operation resx772 rescale -0.10E-999 -1003 -> NaN Invalid_operation resx773 rescale -0.100E-999 -1003 -> NaN Invalid_operation resx774 rescale -0.01E-999 -1003 -> NaN Invalid_operation resx775 rescale -0.999E-999 -1003 -> NaN Invalid_operation resx776 rescale -0.099E-999 -1003 -> NaN Invalid_operation resx777 rescale -0.009E-999 -1003 -> NaN Invalid_operation resx778 rescale -0.001E-999 -1003 -> NaN Invalid_operation resx779 rescale -0.0001E-999 -1003 -> NaN Invalid_operation precision: 9 maxExponent: 999999999 minexponent: -999999999 -- getInt worries resx801 rescale 0 1000000000 -> NaN Invalid_operation resx802 rescale 0 -1000000000 -> 0E-1000000000 resx803 rescale 0 2000000000 -> NaN Invalid_operation resx804 rescale 0 -2000000000 -> NaN Invalid_operation resx805 rescale 0 3000000000 -> NaN Invalid_operation resx806 rescale 0 -3000000000 -> NaN Invalid_operation resx807 rescale 0 4000000000 -> NaN Invalid_operation resx808 rescale 0 -4000000000 -> NaN Invalid_operation resx809 rescale 0 5000000000 -> NaN Invalid_operation resx810 rescale 0 -5000000000 -> NaN Invalid_operation resx811 rescale 0 6000000000 -> NaN Invalid_operation resx812 rescale 0 -6000000000 -> NaN Invalid_operation resx813 rescale 0 7000000000 -> NaN Invalid_operation resx814 rescale 0 -7000000000 -> NaN Invalid_operation resx815 rescale 0 8000000000 -> NaN Invalid_operation resx816 rescale 0 -8000000000 -> NaN Invalid_operation resx817 rescale 0 9000000000 -> NaN Invalid_operation resx818 rescale 0 -9000000000 -> NaN Invalid_operation resx819 rescale 0 9999999999 -> NaN Invalid_operation resx820 rescale 0 -9999999999 -> NaN Invalid_operation resx821 rescale 0 10000000000 -> NaN Invalid_operation resx822 rescale 0 -10000000000 -> NaN Invalid_operation resx831 rescale 1 0E-1 -> 1 resx832 rescale 1 0E-2 -> 1 resx833 rescale 1 0E-3 -> 1 resx834 rescale 1 0E-4 -> 1 resx835 rescale 1 0E-100 -> 1 resx836 rescale 1 0E-100000 -> 1 resx837 rescale 1 0E+100 -> 1 resx838 rescale 1 0E+100000 -> 1 resx841 rescale 0 5E-1000000 -> NaN Invalid_operation resx842 rescale 0 5E-1000000 -> NaN Invalid_operation resx843 rescale 0 999999999 -> 0E+999999999 resx844 rescale 0 1000000000 -> NaN Invalid_operation resx845 rescale 0 -999999999 -> 0E-999999999 resx846 rescale 0 -1000000000 -> 0E-1000000000 resx847 rescale 0 -1000000001 -> 0E-1000000001 resx848 rescale 0 -1000000002 -> 0E-1000000002 resx849 rescale 0 -1000000003 -> 0E-1000000003 resx850 rescale 0 -1000000004 -> 0E-1000000004 resx851 rescale 0 -1000000005 -> 0E-1000000005 resx852 rescale 0 -1000000006 -> 0E-1000000006 resx853 rescale 0 -1000000007 -> 0E-1000000007 resx854 rescale 0 -1000000008 -> NaN Invalid_operation resx861 rescale 1 +2147483649 -> NaN Invalid_operation resx862 rescale 1 +2147483648 -> NaN Invalid_operation resx863 rescale 1 +2147483647 -> NaN Invalid_operation resx864 rescale 1 -2147483647 -> NaN Invalid_operation resx865 rescale 1 -2147483648 -> NaN Invalid_operation resx866 rescale 1 -2147483649 -> NaN Invalid_operation -- Null tests res900 rescale 10 # -> NaN Invalid_operation res901 rescale # 10 -> NaN Invalid_operation --- NEW FILE: remainderNear.decTest --- ------------------------------------------------------------------------ -- remainderNear.decTest -- decimal remainder-near (IEEE remainder) -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 rmnx001 remaindernear 1 1 -> 0 rmnx002 remaindernear 2 1 -> 0 rmnx003 remaindernear 1 2 -> 1 rmnx004 remaindernear 2 2 -> 0 rmnx005 remaindernear 0 1 -> 0 rmnx006 remaindernear 0 2 -> 0 rmnx007 remaindernear 1 3 -> 1 rmnx008 remaindernear 2 3 -> -1 rmnx009 remaindernear 3 3 -> 0 rmnx010 remaindernear 2.4 1 -> 0.4 rmnx011 remaindernear 2.4 -1 -> 0.4 rmnx012 remaindernear -2.4 1 -> -0.4 rmnx013 remaindernear -2.4 -1 -> -0.4 rmnx014 remaindernear 2.40 1 -> 0.40 rmnx015 remaindernear 2.400 1 -> 0.400 rmnx016 remaindernear 2.4 2 -> 0.4 rmnx017 remaindernear 2.400 2 -> 0.400 rmnx018 remaindernear 2. 2 -> 0 rmnx019 remaindernear 20 20 -> 0 rmnx020 remaindernear 187 187 -> 0 rmnx021 remaindernear 5 2 -> 1 rmnx022 remaindernear 5 2.0 -> 1.0 rmnx023 remaindernear 5 2.000 -> 1.000 rmnx024 remaindernear 5 0.200 -> 0 rmnx025 remaindernear 5 0.200 -> 0 rmnx030 remaindernear 1 2 -> 1 rmnx031 remaindernear 1 4 -> 1 rmnx032 remaindernear 1 8 -> 1 rmnx033 remaindernear 1 16 -> 1 rmnx034 remaindernear 1 32 -> 1 rmnx035 remaindernear 1 64 -> 1 rmnx040 remaindernear 1 -2 -> 1 rmnx041 remaindernear 1 -4 -> 1 rmnx042 remaindernear 1 -8 -> 1 rmnx043 remaindernear 1 -16 -> 1 rmnx044 remaindernear 1 -32 -> 1 rmnx045 remaindernear 1 -64 -> 1 rmnx050 remaindernear -1 2 -> -1 rmnx051 remaindernear -1 4 -> -1 rmnx052 remaindernear -1 8 -> -1 rmnx053 remaindernear -1 16 -> -1 rmnx054 remaindernear -1 32 -> -1 rmnx055 remaindernear -1 64 -> -1 rmnx060 remaindernear -1 -2 -> -1 rmnx061 remaindernear -1 -4 -> -1 rmnx062 remaindernear -1 -8 -> -1 rmnx063 remaindernear -1 -16 -> -1 rmnx064 remaindernear -1 -32 -> -1 rmnx065 remaindernear -1 -64 -> -1 rmnx066 remaindernear 999999997 1 -> 0 rmnx067 remaindernear 999999997.4 1 -> 0.4 rmnx068 remaindernear 999999997.5 1 -> -0.5 rmnx069 remaindernear 999999997.9 1 -> -0.1 rmnx070 remaindernear 999999997.999 1 -> -0.001 rmnx071 remaindernear 999999998 1 -> 0 rmnx072 remaindernear 999999998.4 1 -> 0.4 rmnx073 remaindernear 999999998.5 1 -> 0.5 rmnx074 remaindernear 999999998.9 1 -> -0.1 rmnx075 remaindernear 999999998.999 1 -> -0.001 rmnx076 remaindernear 999999999 1 -> 0 rmnx077 remaindernear 999999999.4 1 -> 0.4 rmnx078 remaindernear 999999999.5 1 -> NaN Division_impossible rmnx079 remaindernear 999999999.9 1 -> NaN Division_impossible rmnx080 remaindernear 999999999.999 1 -> NaN Division_impossible precision: 6 rmnx081 remaindernear 999999999 1 -> NaN Division_impossible rmnx082 remaindernear 99999999 1 -> NaN Division_impossible rmnx083 remaindernear 9999999 1 -> NaN Division_impossible rmnx084 remaindernear 999999 1 -> 0 rmnx085 remaindernear 99999 1 -> 0 rmnx086 remaindernear 9999 1 -> 0 rmnx087 remaindernear 999 1 -> 0 rmnx088 remaindernear 99 1 -> 0 rmnx089 remaindernear 9 1 -> 0 precision: 9 rmnx090 remaindernear 0. 1 -> 0 rmnx091 remaindernear .0 1 -> 0.0 rmnx092 remaindernear 0.00 1 -> 0.00 rmnx093 remaindernear 0.00E+9 1 -> 0 rmnx094 remaindernear 0.0000E-50 1 -> 0E-54 -- Various flavours of remaindernear by 0 precision: 9 maxexponent: 999999999 minexponent: -999999999 rmnx101 remaindernear 0 0 -> NaN Division_undefined rmnx102 remaindernear 0 -0 -> NaN Division_undefined rmnx103 remaindernear -0 0 -> NaN Division_undefined rmnx104 remaindernear -0 -0 -> NaN Division_undefined rmnx105 remaindernear 0.0E5 0 -> NaN Division_undefined rmnx106 remaindernear 0.000 0 -> NaN Division_undefined -- [Some think this next group should be Division_by_zero exception, -- but IEEE 854 is explicit that it is Invalid operation .. for -- remaindernear-near, anyway] rmnx107 remaindernear 0.0001 0 -> NaN Invalid_operation rmnx108 remaindernear 0.01 0 -> NaN Invalid_operation rmnx109 remaindernear 0.1 0 -> NaN Invalid_operation rmnx110 remaindernear 1 0 -> NaN Invalid_operation rmnx111 remaindernear 1 0.0 -> NaN Invalid_operation rmnx112 remaindernear 10 0.0 -> NaN Invalid_operation rmnx113 remaindernear 1E+100 0.0 -> NaN Invalid_operation rmnx114 remaindernear 1E+1000 0 -> NaN Invalid_operation rmnx115 remaindernear 0.0001 -0 -> NaN Invalid_operation rmnx116 remaindernear 0.01 -0 -> NaN Invalid_operation rmnx119 remaindernear 0.1 -0 -> NaN Invalid_operation rmnx120 remaindernear 1 -0 -> NaN Invalid_operation rmnx121 remaindernear 1 -0.0 -> NaN Invalid_operation rmnx122 remaindernear 10 -0.0 -> NaN Invalid_operation rmnx123 remaindernear 1E+100 -0.0 -> NaN Invalid_operation rmnx124 remaindernear 1E+1000 -0 -> NaN Invalid_operation -- and zeros on left rmnx130 remaindernear 0 1 -> 0 rmnx131 remaindernear 0 -1 -> 0 rmnx132 remaindernear 0.0 1 -> 0.0 rmnx133 remaindernear 0.0 -1 -> 0.0 rmnx134 remaindernear -0 1 -> -0 rmnx135 remaindernear -0 -1 -> -0 rmnx136 remaindernear -0.0 1 -> -0.0 rmnx137 remaindernear -0.0 -1 -> -0.0 -- 0.5ers rmmx143 remaindernear 0.5 2 -> 0.5 rmmx144 remaindernear 0.5 2.1 -> 0.5 rmmx145 remaindernear 0.5 2.01 -> 0.5 rmmx146 remaindernear 0.5 2.001 -> 0.5 rmmx147 remaindernear 0.50 2 -> 0.50 rmmx148 remaindernear 0.50 2.01 -> 0.50 rmmx149 remaindernear 0.50 2.001 -> 0.50 -- some differences from remainder rmnx150 remaindernear 0.4 1.020 -> 0.4 rmnx151 remaindernear 0.50 1.020 -> 0.50 rmnx152 remaindernear 0.51 1.020 -> 0.51 rmnx153 remaindernear 0.52 1.020 -> -0.500 rmnx154 remaindernear 0.6 1.020 -> -0.420 rmnx155 remaindernear 0.49 1 -> 0.49 rmnx156 remaindernear 0.50 1 -> 0.50 rmnx157 remaindernear 1.50 1 -> -0.50 rmnx158 remaindernear 2.50 1 -> 0.50 rmnx159 remaindernear 9.50 1 -> -0.50 rmnx160 remaindernear 0.51 1 -> -0.49 -- the nasty division-by-1 cases rmnx161 remaindernear 0.4 1 -> 0.4 rmnx162 remaindernear 0.45 1 -> 0.45 rmnx163 remaindernear 0.455 1 -> 0.455 rmnx164 remaindernear 0.4555 1 -> 0.4555 rmnx165 remaindernear 0.45555 1 -> 0.45555 rmnx166 remaindernear 0.455555 1 -> 0.455555 rmnx167 remaindernear 0.4555555 1 -> 0.4555555 rmnx168 remaindernear 0.45555555 1 -> 0.45555555 rmnx169 remaindernear 0.455555555 1 -> 0.455555555 -- with spill... rmnx171 remaindernear 0.5 1 -> 0.5 rmnx172 remaindernear 0.55 1 -> -0.45 rmnx173 remaindernear 0.555 1 -> -0.445 rmnx174 remaindernear 0.5555 1 -> -0.4445 rmnx175 remaindernear 0.55555 1 -> -0.44445 rmnx176 remaindernear 0.555555 1 -> -0.444445 rmnx177 remaindernear 0.5555555 1 -> -0.4444445 rmnx178 remaindernear 0.55555555 1 -> -0.44444445 rmnx179 remaindernear 0.555555555 1 -> -0.444444445 -- progression rmnx180 remaindernear 1 1 -> 0 rmnx181 remaindernear 1 2 -> 1 rmnx182 remaindernear 1 3 -> 1 rmnx183 remaindernear 1 4 -> 1 rmnx184 remaindernear 1 5 -> 1 rmnx185 remaindernear 1 6 -> 1 rmnx186 remaindernear 1 7 -> 1 rmnx187 remaindernear 1 8 -> 1 rmnx188 remaindernear 1 9 -> 1 rmnx189 remaindernear 1 10 -> 1 rmnx190 remaindernear 1 1 -> 0 rmnx191 remaindernear 2 1 -> 0 rmnx192 remaindernear 3 1 -> 0 rmnx193 remaindernear 4 1 -> 0 rmnx194 remaindernear 5 1 -> 0 rmnx195 remaindernear 6 1 -> 0 rmnx196 remaindernear 7 1 -> 0 rmnx197 remaindernear 8 1 -> 0 rmnx198 remaindernear 9 1 -> 0 rmnx199 remaindernear 10 1 -> 0 -- Various flavours of remaindernear by 0 maxexponent: 999999999 minexponent: -999999999 rmnx201 remaindernear 0 0 -> NaN Division_undefined rmnx202 remaindernear 0.0E5 0 -> NaN Division_undefined rmnx203 remaindernear 0.000 0 -> NaN Division_undefined rmnx204 remaindernear 0.0001 0 -> NaN Invalid_operation rmnx205 remaindernear 0.01 0 -> NaN Invalid_operation rmnx206 remaindernear 0.1 0 -> NaN Invalid_operation rmnx207 remaindernear 1 0 -> NaN Invalid_operation rmnx208 remaindernear 1 0.0 -> NaN Invalid_operation rmnx209 remaindernear 10 0.0 -> NaN Invalid_operation rmnx210 remaindernear 1E+100 0.0 -> NaN Invalid_operation rmnx211 remaindernear 1E+1000 0 -> NaN Invalid_operation -- tests from the extended specification rmnx221 remaindernear 2.1 3 -> -0.9 rmnx222 remaindernear 10 6 -> -2 rmnx223 remaindernear 10 3 -> 1 rmnx224 remaindernear -10 3 -> -1 rmnx225 remaindernear 10.2 1 -> 0.2 rmnx226 remaindernear 10 0.3 -> 0.1 rmnx227 remaindernear 3.6 1.3 -> -0.3 -- some differences from remainder rmnx231 remaindernear 0.4 1.020 -> 0.4 rmnx232 remaindernear 0.50 1.020 -> 0.50 rmnx233 remaindernear 0.51 1.020 -> 0.51 rmnx234 remaindernear 0.52 1.020 -> -0.500 rmnx235 remaindernear 0.6 1.020 -> -0.420 -- test some cases that are close to exponent overflow maxexponent: 999999999 minexponent: -999999999 rmnx270 remaindernear 1 1e999999999 -> 1 rmnx271 remaindernear 1 0.9e999999999 -> 1 rmnx272 remaindernear 1 0.99e999999999 -> 1 rmnx273 remaindernear 1 0.999999999e999999999 -> 1 rmnx274 remaindernear 9e999999999 1 -> NaN Division_impossible rmnx275 remaindernear 9.9e999999999 1 -> NaN Division_impossible rmnx276 remaindernear 9.99e999999999 1 -> NaN Division_impossible rmnx277 remaindernear 9.99999999e999999999 1 -> NaN Division_impossible rmnx280 remaindernear 0.1 9e-999999999 -> NaN Division_impossible rmnx281 remaindernear 0.1 99e-999999999 -> NaN Division_impossible rmnx282 remaindernear 0.1 999e-999999999 -> NaN Division_impossible rmnx283 remaindernear 0.1 9e-999999998 -> NaN Division_impossible rmnx284 remaindernear 0.1 99e-999999998 -> NaN Division_impossible rmnx285 remaindernear 0.1 999e-999999998 -> NaN Division_impossible rmnx286 remaindernear 0.1 999e-999999997 -> NaN Division_impossible rmnx287 remaindernear 0.1 9999e-999999997 -> NaN Division_impossible rmnx288 remaindernear 0.1 99999e-999999997 -> NaN Division_impossible -- rmnx3xx are from DiagBigDecimal rmnx301 remaindernear 1 3 -> 1 rmnx302 remaindernear 5 5 -> 0 rmnx303 remaindernear 13 10 -> 3 rmnx304 remaindernear 13 50 -> 13 rmnx305 remaindernear 13 100 -> 13 rmnx306 remaindernear 13 1000 -> 13 rmnx307 remaindernear .13 1 -> 0.13 rmnx308 remaindernear 0.133 1 -> 0.133 rmnx309 remaindernear 0.1033 1 -> 0.1033 rmnx310 remaindernear 1.033 1 -> 0.033 rmnx311 remaindernear 10.33 1 -> 0.33 rmnx312 remaindernear 10.33 10 -> 0.33 rmnx313 remaindernear 103.3 1 -> 0.3 rmnx314 remaindernear 133 10 -> 3 rmnx315 remaindernear 1033 10 -> 3 rmnx316 remaindernear 1033 50 -> -17 rmnx317 remaindernear 101.0 3 -> -1.0 rmnx318 remaindernear 102.0 3 -> 0 rmnx319 remaindernear 103.0 3 -> 1.0 rmnx320 remaindernear 2.40 1 -> 0.40 rmnx321 remaindernear 2.400 1 -> 0.400 rmnx322 remaindernear 2.4 1 -> 0.4 rmnx323 remaindernear 2.4 2 -> 0.4 rmnx324 remaindernear 2.400 2 -> 0.400 rmnx325 remaindernear 1 0.3 -> 0.1 rmnx326 remaindernear 1 0.30 -> 0.10 rmnx327 remaindernear 1 0.300 -> 0.100 rmnx328 remaindernear 1 0.3000 -> 0.1000 rmnx329 remaindernear 1.0 0.3 -> 0.1 rmnx330 remaindernear 1.00 0.3 -> 0.10 rmnx331 remaindernear 1.000 0.3 -> 0.100 rmnx332 remaindernear 1.0000 0.3 -> 0.1000 rmnx333 remaindernear 0.5 2 -> 0.5 rmnx334 remaindernear 0.5 2.1 -> 0.5 rmnx335 remaindernear 0.5 2.01 -> 0.5 rmnx336 remaindernear 0.5 2.001 -> 0.5 rmnx337 remaindernear 0.50 2 -> 0.50 rmnx338 remaindernear 0.50 2.01 -> 0.50 rmnx339 remaindernear 0.50 2.001 -> 0.50 rmnx340 remaindernear 0.5 0.5000001 -> -1E-7 rmnx341 remaindernear 0.5 0.50000001 -> -1E-8 rmnx342 remaindernear 0.5 0.500000001 -> -1E-9 rmnx343 remaindernear 0.5 0.5000000001 -> -1E-10 rmnx344 remaindernear 0.5 0.50000000001 -> -1E-11 rmnx345 remaindernear 0.5 0.4999999 -> 1E-7 rmnx346 remaindernear 0.5 0.49999999 -> 1E-8 rmnx347 remaindernear 0.5 0.499999999 -> 1E-9 rmnx348 remaindernear 0.5 0.4999999999 -> 1E-10 rmnx349 remaindernear 0.5 0.49999999999 -> 1E-11 rmnx350 remaindernear 0.03 7 -> 0.03 rmnx351 remaindernear 5 2 -> 1 rmnx352 remaindernear 4.1 2 -> 0.1 rmnx353 remaindernear 4.01 2 -> 0.01 rmnx354 remaindernear 4.001 2 -> 0.001 rmnx355 remaindernear 4.0001 2 -> 0.0001 rmnx356 remaindernear 4.00001 2 -> 0.00001 rmnx357 remaindernear 4.000001 2 -> 0.000001 rmnx358 remaindernear 4.0000001 2 -> 1E-7 rmnx360 remaindernear 1.2 0.7345 -> -0.2690 rmnx361 remaindernear 0.8 12 -> 0.8 rmnx362 remaindernear 0.8 0.2 -> 0 rmnx363 remaindernear 0.8 0.3 -> -0.1 rmnx364 remaindernear 0.800 12 -> 0.800 rmnx365 remaindernear 0.800 1.7 -> 0.800 rmnx366 remaindernear 2.400 2 -> 0.400 precision: 6 rmnx371 remaindernear 2.400 2 -> 0.400 precision: 3 rmnx372 remaindernear 12345678900000 12e+12 -> 3.46E+11 Inexact Rounded precision: 5 rmnx381 remaindernear 12345 1 -> 0 rmnx382 remaindernear 12345 1.0001 -> -0.2344 rmnx383 remaindernear 12345 1.001 -> -0.333 rmnx384 remaindernear 12345 1.01 -> -0.23 rmnx385 remaindernear 12345 1.1 -> -0.3 rmnx386 remaindernear 12355 4 -> -1 rmnx387 remaindernear 12345 4 -> 1 rmnx388 remaindernear 12355 4.0001 -> -1.3089 rmnx389 remaindernear 12345 4.0001 -> 0.6914 rmnx390 remaindernear 12345 4.9 -> 1.9 rmnx391 remaindernear 12345 4.99 -> -0.26 rmnx392 remaindernear 12345 4.999 -> 2.469 rmnx393 remaindernear 12345 4.9999 -> 0.2469 rmnx394 remaindernear 12345 5 -> 0 rmnx395 remaindernear 12345 5.0001 -> -0.2469 rmnx396 remaindernear 12345 5.001 -> -2.469 rmnx397 remaindernear 12345 5.01 -> 0.36 rmnx398 remaindernear 12345 5.1 -> -2.1 precision: 9 -- some nasty division-by-1 cases [some similar above] rmnx401 remaindernear 0.4 1 -> 0.4 rmnx402 remaindernear 0.45 1 -> 0.45 rmnx403 remaindernear 0.455 1 -> 0.455 rmnx404 remaindernear 0.4555 1 -> 0.4555 rmnx405 remaindernear 0.45555 1 -> 0.45555 rmnx406 remaindernear 0.455555 1 -> 0.455555 rmnx407 remaindernear 0.4555555 1 -> 0.4555555 rmnx408 remaindernear 0.45555555 1 -> 0.45555555 rmnx409 remaindernear 0.455555555 1 -> 0.455555555 -- some tricky LHSs rmnx420 remaindernear 99999999.999999999 1E+8 -> -1E-9 rmnx421 remaindernear 999999999.999999999 1E+9 -> -1E-9 precision: 9 rmnx430 remaindernear 0.455555555 1 -> 0.455555555 precision: 8 rmnx431 remaindernear 0.455555555 1 -> 0.45555556 Inexact Rounded precision: 7 rmnx432 remaindernear 0.455555555 1 -> 0.4555556 Inexact Rounded precision: 6 rmnx433 remaindernear 0.455555555 1 -> 0.455556 Inexact Rounded precision: 5 rmnx434 remaindernear 0.455555555 1 -> 0.45556 Inexact Rounded precision: 4 rmnx435 remaindernear 0.455555555 1 -> 0.4556 Inexact Rounded precision: 3 rmnx436 remaindernear 0.455555555 1 -> 0.456 Inexact Rounded precision: 2 rmnx437 remaindernear 0.455555555 1 -> 0.46 Inexact Rounded precision: 1 rmnx438 remaindernear 0.455555555 1 -> 0.5 Inexact Rounded -- early tests; from text descriptions precision: 9 rmnx601 remaindernear 10 6 -> -2 rmnx602 remaindernear -10 6 -> 2 rmnx603 remaindernear 11 3 -> -1 rmnx604 remaindernear 11 5 -> 1 rmnx605 remaindernear 7.7 8 -> -0.3 rmnx606 remaindernear 31.5 3 -> 1.5 -- i=10 rmnx607 remaindernear 34.5 3 -> -1.5 -- i=11 -- Specials rmnx680 remaindernear Inf -Inf -> NaN Invalid_operation rmnx681 remaindernear Inf -1000 -> NaN Invalid_operation rmnx682 remaindernear Inf -1 -> NaN Invalid_operation rmnx683 remaindernear Inf 0 -> NaN Invalid_operation rmnx684 remaindernear Inf -0 -> NaN Invalid_operation rmnx685 remaindernear Inf 1 -> NaN Invalid_operation rmnx686 remaindernear Inf 1000 -> NaN Invalid_operation rmnx687 remaindernear Inf Inf -> NaN Invalid_operation rmnx688 remaindernear -1000 Inf -> -1000 rmnx689 remaindernear -Inf Inf -> NaN Invalid_operation rmnx691 remaindernear -1 Inf -> -1 rmnx692 remaindernear 0 Inf -> 0 rmnx693 remaindernear -0 Inf -> -0 rmnx694 remaindernear 1 Inf -> 1 rmnx695 remaindernear 1000 Inf -> 1000 rmnx696 remaindernear Inf Inf -> NaN Invalid_operation rmnx700 remaindernear -Inf -Inf -> NaN Invalid_operation rmnx701 remaindernear -Inf -1000 -> NaN Invalid_operation rmnx702 remaindernear -Inf -1 -> NaN Invalid_operation rmnx703 remaindernear -Inf -0 -> NaN Invalid_operation rmnx704 remaindernear -Inf 0 -> NaN Invalid_operation rmnx705 remaindernear -Inf 1 -> NaN Invalid_operation rmnx706 remaindernear -Inf 1000 -> NaN Invalid_operation rmnx707 remaindernear -Inf Inf -> NaN Invalid_operation rmnx708 remaindernear -Inf -Inf -> NaN Invalid_operation rmnx709 remaindernear -1000 Inf -> -1000 rmnx710 remaindernear -1 -Inf -> -1 rmnx711 remaindernear -0 -Inf -> -0 rmnx712 remaindernear 0 -Inf -> 0 rmnx713 remaindernear 1 -Inf -> 1 rmnx714 remaindernear 1000 -Inf -> 1000 rmnx715 remaindernear Inf -Inf -> NaN Invalid_operation rmnx721 remaindernear NaN -Inf -> NaN rmnx722 remaindernear NaN -1000 -> NaN rmnx723 remaindernear NaN -1 -> NaN rmnx724 remaindernear NaN -0 -> NaN rmnx725 remaindernear NaN 0 -> NaN rmnx726 remaindernear NaN 1 -> NaN rmnx727 remaindernear NaN 1000 -> NaN rmnx728 remaindernear NaN Inf -> NaN rmnx729 remaindernear NaN NaN -> NaN rmnx730 remaindernear -Inf NaN -> NaN rmnx731 remaindernear -1000 NaN -> NaN rmnx732 remaindernear -1 NaN -> NaN rmnx733 remaindernear -0 NaN -> NaN rmnx734 remaindernear 0 NaN -> NaN rmnx735 remaindernear 1 NaN -> NaN rmnx736 remaindernear 1000 NaN -> NaN rmnx737 remaindernear Inf NaN -> NaN rmnx741 remaindernear sNaN -Inf -> NaN Invalid_operation rmnx742 remaindernear sNaN -1000 -> NaN Invalid_operation rmnx743 remaindernear sNaN -1 -> NaN Invalid_operation rmnx744 remaindernear sNaN -0 -> NaN Invalid_operation rmnx745 remaindernear sNaN 0 -> NaN Invalid_operation rmnx746 remaindernear sNaN 1 -> NaN Invalid_operation rmnx747 remaindernear sNaN 1000 -> NaN Invalid_operation rmnx749 remaindernear sNaN NaN -> NaN Invalid_operation rmnx750 remaindernear sNaN sNaN -> NaN Invalid_operation rmnx751 remaindernear NaN sNaN -> NaN Invalid_operation rmnx752 remaindernear -Inf sNaN -> NaN Invalid_operation rmnx753 remaindernear -1000 sNaN -> NaN Invalid_operation rmnx754 remaindernear -1 sNaN -> NaN Invalid_operation rmnx755 remaindernear -0 sNaN -> NaN Invalid_operation rmnx756 remaindernear 0 sNaN -> NaN Invalid_operation rmnx757 remaindernear 1 sNaN -> NaN Invalid_operation rmnx758 remaindernear 1000 sNaN -> NaN Invalid_operation rmnx759 remaindernear Inf sNaN -> NaN Invalid_operation rmnx760 remaindernear NaN sNaN -> NaN Invalid_operation -- test some cases that are close to exponent overflow maxexponent: 999999999 minexponent: -999999999 rmnx770 remaindernear 1 1e999999999 -> 1 rmnx771 remaindernear 1 0.9e999999999 -> 1 rmnx772 remaindernear 1 0.99e999999999 -> 1 rmnx773 remaindernear 1 0.999999999e999999999 -> 1 rmnx774 remaindernear 9e999999999 1 -> NaN Division_impossible rmnx775 remaindernear 9.9e999999999 1 -> NaN Division_impossible rmnx776 remaindernear 9.99e999999999 1 -> NaN Division_impossible rmnx777 remaindernear 9.99999999e999999999 1 -> NaN Division_impossible -- overflow and underflow tests [from divide] precision: 9 maxexponent: 999999999 minexponent: -999999999 rmnx780 remaindernear +1.23456789012345E-0 9E+999999999 -> 1.23456789 Inexact Rounded rmnx781 remaindernear 9E+999999999 +0.23456789012345E-0 -> NaN Division_impossible rmnx782 remaindernear +0.100 9E+999999999 -> 0.100 rmnx783 remaindernear 9E-999999999 +9.100 -> 9E-999999999 rmnx785 remaindernear -1.23456789012345E-0 9E+999999999 -> -1.23456789 Inexact Rounded rmnx786 remaindernear 9E+999999999 -0.83456789012345E-0 -> NaN Division_impossible rmnx787 remaindernear -0.100 9E+999999999 -> -0.100 rmnx788 remaindernear 9E-999999999 -9.100 -> 9E-999999999 -- long operands checks maxexponent: 999 minexponent: -999 precision: 9 rmnx801 remaindernear 12345678000 100 -> 0 rmnx802 remaindernear 1 12345678000 -> 1 rmnx803 remaindernear 1234567800 10 -> 0 rmnx804 remaindernear 1 1234567800 -> 1 rmnx805 remaindernear 1234567890 10 -> 0 rmnx806 remaindernear 1 1234567890 -> 1 rmnx807 remaindernear 1234567891 10 -> 1 rmnx808 remaindernear 1 1234567891 -> 1 rmnx809 remaindernear 12345678901 100 -> 1 rmnx810 remaindernear 1 12345678901 -> 1 rmnx811 remaindernear 1234567896 10 -> -4 rmnx812 remaindernear 1 1234567896 -> 1 precision: 15 rmnx841 remaindernear 12345678000 100 -> 0 rmnx842 remaindernear 1 12345678000 -> 1 rmnx843 remaindernear 1234567800 10 -> 0 rmnx844 remaindernear 1 1234567800 -> 1 rmnx845 remaindernear 1234567890 10 -> 0 rmnx846 remaindernear 1 1234567890 -> 1 rmnx847 remaindernear 1234567891 10 -> 1 rmnx848 remaindernear 1 1234567891 -> 1 rmnx849 remaindernear 12345678901 100 -> 1 rmnx850 remaindernear 1 12345678901 -> 1 rmnx851 remaindernear 1234567896 10 -> -4 rmnx852 remaindernear 1 1234567896 -> 1 -- Null tests rmnx900 remaindernear 10 # -> NaN Invalid_operation rmnx901 remaindernear # 10 -> NaN Invalid_operation --- NEW FILE: remainder.decTest --- ------------------------------------------------------------------------ -- remainder.decTest -- decimal remainder -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- sanity checks (as base, above) remx001 remainder 1 1 -> 0 remx002 remainder 2 1 -> 0 remx003 remainder 1 2 -> 1 remx004 remainder 2 2 -> 0 remx005 remainder 0 1 -> 0 remx006 remainder 0 2 -> 0 remx007 remainder 1 3 -> 1 remx008 remainder 2 3 -> 2 remx009 remainder 3 3 -> 0 remx010 remainder 2.4 1 -> 0.4 remx011 remainder 2.4 -1 -> 0.4 remx012 remainder -2.4 1 -> -0.4 remx013 remainder -2.4 -1 -> -0.4 remx014 remainder 2.40 1 -> 0.40 remx015 remainder 2.400 1 -> 0.400 remx016 remainder 2.4 2 -> 0.4 remx017 remainder 2.400 2 -> 0.400 remx018 remainder 2. 2 -> 0 remx019 remainder 20 20 -> 0 remx020 remainder 187 187 -> 0 remx021 remainder 5 2 -> 1 remx022 remainder 5 2.0 -> 1.0 remx023 remainder 5 2.000 -> 1.000 remx024 remainder 5 0.200 -> 0 remx025 remainder 5 0.200 -> 0 remx030 remainder 1 2 -> 1 remx031 remainder 1 4 -> 1 remx032 remainder 1 8 -> 1 remx033 remainder 1 16 -> 1 remx034 remainder 1 32 -> 1 remx035 remainder 1 64 -> 1 remx040 remainder 1 -2 -> 1 remx041 remainder 1 -4 -> 1 remx042 remainder 1 -8 -> 1 remx043 remainder 1 -16 -> 1 remx044 remainder 1 -32 -> 1 remx045 remainder 1 -64 -> 1 remx050 remainder -1 2 -> -1 remx051 remainder -1 4 -> -1 remx052 remainder -1 8 -> -1 remx053 remainder -1 16 -> -1 remx054 remainder -1 32 -> -1 remx055 remainder -1 64 -> -1 remx060 remainder -1 -2 -> -1 remx061 remainder -1 -4 -> -1 remx062 remainder -1 -8 -> -1 remx063 remainder -1 -16 -> -1 remx064 remainder -1 -32 -> -1 remx065 remainder -1 -64 -> -1 remx066 remainder 999999999 1 -> 0 remx067 remainder 999999999.4 1 -> 0.4 remx068 remainder 999999999.5 1 -> 0.5 remx069 remainder 999999999.9 1 -> 0.9 remx070 remainder 999999999.999 1 -> 0.999 precision: 6 remx071 remainder 999999999 1 -> NaN Division_impossible remx072 remainder 99999999 1 -> NaN Division_impossible remx073 remainder 9999999 1 -> NaN Division_impossible remx074 remainder 999999 1 -> 0 remx075 remainder 99999 1 -> 0 remx076 remainder 9999 1 -> 0 remx077 remainder 999 1 -> 0 remx078 remainder 99 1 -> 0 remx079 remainder 9 1 -> 0 precision: 9 remx080 remainder 0. 1 -> 0 remx081 remainder .0 1 -> 0.0 remx082 remainder 0.00 1 -> 0.00 remx083 remainder 0.00E+9 1 -> 0 remx084 remainder 0.00E+3 1 -> 0 remx085 remainder 0.00E+2 1 -> 0 remx086 remainder 0.00E+1 1 -> 0.0 remx087 remainder 0.00E+0 1 -> 0.00 remx088 remainder 0.00E-0 1 -> 0.00 remx089 remainder 0.00E-1 1 -> 0.000 remx090 remainder 0.00E-2 1 -> 0.0000 remx091 remainder 0.00E-3 1 -> 0.00000 remx092 remainder 0.00E-4 1 -> 0.000000 remx093 remainder 0.00E-5 1 -> 0E-7 remx094 remainder 0.00E-6 1 -> 0E-8 remx095 remainder 0.0000E-50 1 -> 0E-54 -- Various flavours of remainder by 0 precision: 9 maxexponent: 999999999 minexponent: -999999999 remx101 remainder 0 0 -> NaN Division_undefined remx102 remainder 0 -0 -> NaN Division_undefined remx103 remainder -0 0 -> NaN Division_undefined remx104 remainder -0 -0 -> NaN Division_undefined remx105 remainder 0.0E5 0 -> NaN Division_undefined remx106 remainder 0.000 0 -> NaN Division_undefined -- [Some think this next group should be Division_by_zero exception, but -- IEEE 854 is explicit that it is Invalid operation .. for -- remainder-near, anyway] remx107 remainder 0.0001 0 -> NaN Invalid_operation remx108 remainder 0.01 0 -> NaN Invalid_operation remx109 remainder 0.1 0 -> NaN Invalid_operation remx110 remainder 1 0 -> NaN Invalid_operation remx111 remainder 1 0.0 -> NaN Invalid_operation remx112 remainder 10 0.0 -> NaN Invalid_operation remx113 remainder 1E+100 0.0 -> NaN Invalid_operation remx114 remainder 1E+1000 0 -> NaN Invalid_operation remx115 remainder 0.0001 -0 -> NaN Invalid_operation remx116 remainder 0.01 -0 -> NaN Invalid_operation remx119 remainder 0.1 -0 -> NaN Invalid_operation remx120 remainder 1 -0 -> NaN Invalid_operation remx121 remainder 1 -0.0 -> NaN Invalid_operation remx122 remainder 10 -0.0 -> NaN Invalid_operation remx123 remainder 1E+100 -0.0 -> NaN Invalid_operation remx124 remainder 1E+1000 -0 -> NaN Invalid_operation -- and zeros on left remx130 remainder 0 1 -> 0 remx131 remainder 0 -1 -> 0 remx132 remainder 0.0 1 -> 0.0 remx133 remainder 0.0 -1 -> 0.0 remx134 remainder -0 1 -> -0 remx135 remainder -0 -1 -> -0 remx136 remainder -0.0 1 -> -0.0 remx137 remainder -0.0 -1 -> -0.0 -- 0.5ers remx143 remainder 0.5 2 -> 0.5 remx144 remainder 0.5 2.1 -> 0.5 remx145 remainder 0.5 2.01 -> 0.5 remx146 remainder 0.5 2.001 -> 0.5 remx147 remainder 0.50 2 -> 0.50 remx148 remainder 0.50 2.01 -> 0.50 remx149 remainder 0.50 2.001 -> 0.50 -- steadies remx150 remainder 1 1 -> 0 remx151 remainder 1 2 -> 1 remx152 remainder 1 3 -> 1 remx153 remainder 1 4 -> 1 remx154 remainder 1 5 -> 1 remx155 remainder 1 6 -> 1 remx156 remainder 1 7 -> 1 remx157 remainder 1 8 -> 1 remx158 remainder 1 9 -> 1 remx159 remainder 1 10 -> 1 remx160 remainder 1 1 -> 0 remx161 remainder 2 1 -> 0 remx162 remainder 3 1 -> 0 remx163 remainder 4 1 -> 0 remx164 remainder 5 1 -> 0 remx165 remainder 6 1 -> 0 remx166 remainder 7 1 -> 0 remx167 remainder 8 1 -> 0 remx168 remainder 9 1 -> 0 remx169 remainder 10 1 -> 0 -- some differences from remainderNear remx171 remainder 0.4 1.020 -> 0.4 remx172 remainder 0.50 1.020 -> 0.50 remx173 remainder 0.51 1.020 -> 0.51 remx174 remainder 0.52 1.020 -> 0.52 remx175 remainder 0.6 1.020 -> 0.6 -- More flavours of remainder by 0 maxexponent: 999999999 minexponent: -999999999 remx201 remainder 0 0 -> NaN Division_undefined remx202 remainder 0.0E5 0 -> NaN Division_undefined remx203 remainder 0.000 0 -> NaN Division_undefined remx204 remainder 0.0001 0 -> NaN Invalid_operation remx205 remainder 0.01 0 -> NaN Invalid_operation remx206 remainder 0.1 0 -> NaN Invalid_operation remx207 remainder 1 0 -> NaN Invalid_operation remx208 remainder 1 0.0 -> NaN Invalid_operation remx209 remainder 10 0.0 -> NaN Invalid_operation remx210 remainder 1E+100 0.0 -> NaN Invalid_operation remx211 remainder 1E+1000 0 -> NaN Invalid_operation -- some differences from remainderNear remx231 remainder 0.4 1.020 -> 0.4 remx232 remainder 0.50 1.020 -> 0.50 remx233 remainder 0.51 1.020 -> 0.51 remx234 remainder 0.52 1.020 -> 0.52 remx235 remainder 0.6 1.020 -> 0.6 -- test some cases that are close to exponent overflow maxexponent: 999999999 minexponent: -999999999 remx270 remainder 1 1e999999999 -> 1 remx271 remainder 1 0.9e999999999 -> 1 remx272 remainder 1 0.99e999999999 -> 1 remx273 remainder 1 0.999999999e999999999 -> 1 remx274 remainder 9e999999999 1 -> NaN Division_impossible remx275 remainder 9.9e999999999 1 -> NaN Division_impossible remx276 remainder 9.99e999999999 1 -> NaN Division_impossible remx277 remainder 9.99999999e999999999 1 -> NaN Division_impossible remx280 remainder 0.1 9e-999999999 -> NaN Division_impossible remx281 remainder 0.1 99e-999999999 -> NaN Division_impossible remx282 remainder 0.1 999e-999999999 -> NaN Division_impossible remx283 remainder 0.1 9e-999999998 -> NaN Division_impossible remx284 remainder 0.1 99e-999999998 -> NaN Division_impossible remx285 remainder 0.1 999e-999999998 -> NaN Division_impossible remx286 remainder 0.1 999e-999999997 -> NaN Division_impossible remx287 remainder 0.1 9999e-999999997 -> NaN Division_impossible remx288 remainder 0.1 99999e-999999997 -> NaN Division_impossible -- remx3xx are from DiagBigDecimal remx301 remainder 1 3 -> 1 remx302 remainder 5 5 -> 0 remx303 remainder 13 10 -> 3 remx304 remainder 13 50 -> 13 remx305 remainder 13 100 -> 13 remx306 remainder 13 1000 -> 13 remx307 remainder .13 1 -> 0.13 remx308 remainder 0.133 1 -> 0.133 remx309 remainder 0.1033 1 -> 0.1033 remx310 remainder 1.033 1 -> 0.033 remx311 remainder 10.33 1 -> 0.33 remx312 remainder 10.33 10 -> 0.33 remx313 remainder 103.3 1 -> 0.3 remx314 remainder 133 10 -> 3 remx315 remainder 1033 10 -> 3 remx316 remainder 1033 50 -> 33 remx317 remainder 101.0 3 -> 2.0 remx318 remainder 102.0 3 -> 0 remx319 remainder 103.0 3 -> 1.0 remx320 remainder 2.40 1 -> 0.40 remx321 remainder 2.400 1 -> 0.400 remx322 remainder 2.4 1 -> 0.4 remx323 remainder 2.4 2 -> 0.4 remx324 remainder 2.400 2 -> 0.400 remx325 remainder 1 0.3 -> 0.1 remx326 remainder 1 0.30 -> 0.10 remx327 remainder 1 0.300 -> 0.100 remx328 remainder 1 0.3000 -> 0.1000 remx329 remainder 1.0 0.3 -> 0.1 remx330 remainder 1.00 0.3 -> 0.10 remx331 remainder 1.000 0.3 -> 0.100 remx332 remainder 1.0000 0.3 -> 0.1000 remx333 remainder 0.5 2 -> 0.5 remx334 remainder 0.5 2.1 -> 0.5 remx335 remainder 0.5 2.01 -> 0.5 remx336 remainder 0.5 2.001 -> 0.5 remx337 remainder 0.50 2 -> 0.50 remx338 remainder 0.50 2.01 -> 0.50 remx339 remainder 0.50 2.001 -> 0.50 remx340 remainder 0.5 0.5000001 -> 0.5 remx341 remainder 0.5 0.50000001 -> 0.5 remx342 remainder 0.5 0.500000001 -> 0.5 remx343 remainder 0.5 0.5000000001 -> 0.5 remx344 remainder 0.5 0.50000000001 -> 0.5 remx345 remainder 0.5 0.4999999 -> 1E-7 remx346 remainder 0.5 0.49999999 -> 1E-8 remx347 remainder 0.5 0.499999999 -> 1E-9 remx348 remainder 0.5 0.4999999999 -> 1E-10 remx349 remainder 0.5 0.49999999999 -> 1E-11 remx350 remainder 0.5 0.499999999999 -> 1E-12 remx351 remainder 0.03 7 -> 0.03 remx352 remainder 5 2 -> 1 remx353 remainder 4.1 2 -> 0.1 remx354 remainder 4.01 2 -> 0.01 remx355 remainder 4.001 2 -> 0.001 remx356 remainder 4.0001 2 -> 0.0001 remx357 remainder 4.00001 2 -> 0.00001 remx358 remainder 4.000001 2 -> 0.000001 remx359 remainder 4.0000001 2 -> 1E-7 remx360 remainder 1.2 0.7345 -> 0.4655 remx361 remainder 0.8 12 -> 0.8 remx362 remainder 0.8 0.2 -> 0 remx363 remainder 0.8 0.3 -> 0.2 remx364 remainder 0.800 12 -> 0.800 remx365 remainder 0.800 1.7 -> 0.800 remx366 remainder 2.400 2 -> 0.400 precision: 6 remx371 remainder 2.400 2 -> 0.400 precision: 3 -- long operand case remx372 remainder 12345678900000 12e+12 -> 3.46E+11 Inexact Rounded precision: 5 remx381 remainder 12345 1 -> 0 remx382 remainder 12345 1.0001 -> 0.7657 remx383 remainder 12345 1.001 -> 0.668 remx384 remainder 12345 1.01 -> 0.78 remx385 remainder 12345 1.1 -> 0.8 remx386 remainder 12355 4 -> 3 remx387 remainder 12345 4 -> 1 remx388 remainder 12355 4.0001 -> 2.6912 remx389 remainder 12345 4.0001 -> 0.6914 remx390 remainder 12345 4.9 -> 1.9 remx391 remainder 12345 4.99 -> 4.73 remx392 remainder 12345 4.999 -> 2.469 remx393 remainder 12345 4.9999 -> 0.2469 remx394 remainder 12345 5 -> 0 remx395 remainder 12345 5.0001 -> 4.7532 remx396 remainder 12345 5.001 -> 2.532 remx397 remainder 12345 5.01 -> 0.36 remx398 remainder 12345 5.1 -> 3.0 precision: 9 -- the nasty division-by-1 cases remx401 remainder 0.5 1 -> 0.5 remx402 remainder 0.55 1 -> 0.55 remx403 remainder 0.555 1 -> 0.555 remx404 remainder 0.5555 1 -> 0.5555 remx405 remainder 0.55555 1 -> 0.55555 remx406 remainder 0.555555 1 -> 0.555555 remx407 remainder 0.5555555 1 -> 0.5555555 remx408 remainder 0.55555555 1 -> 0.55555555 remx409 remainder 0.555555555 1 -> 0.555555555 -- Specials remx680 remainder Inf -Inf -> NaN Invalid_operation remx681 remainder Inf -1000 -> NaN Invalid_operation remx682 remainder Inf -1 -> NaN Invalid_operation remx683 remainder Inf 0 -> NaN Invalid_operation remx684 remainder Inf -0 -> NaN Invalid_operation remx685 remainder Inf 1 -> NaN Invalid_operation remx686 remainder Inf 1000 -> NaN Invalid_operation remx687 remainder Inf Inf -> NaN Invalid_operation remx688 remainder -1000 Inf -> -1000 remx689 remainder -Inf Inf -> NaN Invalid_operation remx691 remainder -1 Inf -> -1 remx692 remainder 0 Inf -> 0 remx693 remainder -0 Inf -> -0 remx694 remainder 1 Inf -> 1 remx695 remainder 1000 Inf -> 1000 remx696 remainder Inf Inf -> NaN Invalid_operation remx700 remainder -Inf -Inf -> NaN Invalid_operation remx701 remainder -Inf -1000 -> NaN Invalid_operation remx702 remainder -Inf -1 -> NaN Invalid_operation remx703 remainder -Inf -0 -> NaN Invalid_operation remx704 remainder -Inf 0 -> NaN Invalid_operation remx705 remainder -Inf 1 -> NaN Invalid_operation remx706 remainder -Inf 1000 -> NaN Invalid_operation remx707 remainder -Inf Inf -> NaN Invalid_operation remx708 remainder -Inf -Inf -> NaN Invalid_operation remx709 remainder -1000 Inf -> -1000 remx710 remainder -1 -Inf -> -1 remx711 remainder -0 -Inf -> -0 remx712 remainder 0 -Inf -> 0 remx713 remainder 1 -Inf -> 1 remx714 remainder 1000 -Inf -> 1000 remx715 remainder Inf -Inf -> NaN Invalid_operation remx721 remainder NaN -Inf -> NaN remx722 remainder NaN -1000 -> NaN remx723 remainder NaN -1 -> NaN remx724 remainder NaN -0 -> NaN remx725 remainder NaN 0 -> NaN remx726 remainder NaN 1 -> NaN remx727 remainder NaN 1000 -> NaN remx728 remainder NaN Inf -> NaN remx729 remainder NaN NaN -> NaN remx730 remainder -Inf NaN -> NaN remx731 remainder -1000 NaN -> NaN remx732 remainder -1 NaN -> NaN remx733 remainder -0 NaN -> NaN remx734 remainder 0 NaN -> NaN remx735 remainder 1 NaN -> NaN remx736 remainder 1000 NaN -> NaN remx737 remainder Inf NaN -> NaN remx741 remainder sNaN -Inf -> NaN Invalid_operation remx742 remainder sNaN -1000 -> NaN Invalid_operation remx743 remainder sNaN -1 -> NaN Invalid_operation remx744 remainder sNaN -0 -> NaN Invalid_operation remx745 remainder sNaN 0 -> NaN Invalid_operation remx746 remainder sNaN 1 -> NaN Invalid_operation remx747 remainder sNaN 1000 -> NaN Invalid_operation remx749 remainder sNaN NaN -> NaN Invalid_operation remx750 remainder sNaN sNaN -> NaN Invalid_operation remx751 remainder NaN sNaN -> NaN Invalid_operation remx752 remainder -Inf sNaN -> NaN Invalid_operation remx753 remainder -1000 sNaN -> NaN Invalid_operation remx754 remainder -1 sNaN -> NaN Invalid_operation remx755 remainder -0 sNaN -> NaN Invalid_operation remx756 remainder 0 sNaN -> NaN Invalid_operation remx757 remainder 1 sNaN -> NaN Invalid_operation remx758 remainder 1000 sNaN -> NaN Invalid_operation remx759 remainder Inf sNaN -> NaN Invalid_operation remx760 remainder NaN sNaN -> NaN Invalid_operation -- test some cases that are close to exponent overflow maxexponent: 999999999 minexponent: -999999999 remx770 remainder 1 1e999999999 -> 1 remx771 remainder 1 0.9e999999999 -> 1 remx772 remainder 1 0.99e999999999 -> 1 remx773 remainder 1 0.999999999e999999999 -> 1 remx774 remainder 9e999999999 1 -> NaN Division_impossible remx775 remainder 9.9e999999999 1 -> NaN Division_impossible remx776 remainder 9.99e999999999 1 -> NaN Division_impossible remx777 remainder 9.99999999e999999999 1 -> NaN Division_impossible -- long operand checks maxexponent: 999 minexponent: -999 precision: 9 remx801 remainder 12345678000 100 -> 0 remx802 remainder 1 12345678000 -> 1 remx803 remainder 1234567800 10 -> 0 remx804 remainder 1 1234567800 -> 1 remx805 remainder 1234567890 10 -> 0 remx806 remainder 1 1234567890 -> 1 remx807 remainder 1234567891 10 -> 1 remx808 remainder 1 1234567891 -> 1 remx809 remainder 12345678901 100 -> 1 remx810 remainder 1 12345678901 -> 1 remx811 remainder 1234567896 10 -> 6 remx812 remainder 1 1234567896 -> 1 precision: 15 remx821 remainder 12345678000 100 -> 0 remx822 remainder 1 12345678000 -> 1 remx823 remainder 1234567800 10 -> 0 remx824 remainder 1 1234567800 -> 1 remx825 remainder 1234567890 10 -> 0 remx826 remainder 1 1234567890 -> 1 remx827 remainder 1234567891 10 -> 1 remx828 remainder 1 1234567891 -> 1 remx829 remainder 12345678901 100 -> 1 remx830 remainder 1 12345678901 -> 1 remx831 remainder 1234567896 10 -> 6 remx832 remainder 1 1234567896 -> 1 -- worries from divideint precision: 8 dvix660 remainder 100000000.0 1 -> NaN Division_impossible dvix661 remainder 100000000.4 1 -> NaN Division_impossible dvix662 remainder 100000000.5 1 -> NaN Division_impossible dvix663 remainder 100000000.9 1 -> NaN Division_impossible dvix664 remainder 100000000.999 1 -> NaN Division_impossible precision: 6 dvix690 remainder 100000003 5 -> NaN Division_impossible dvix691 remainder 10000003 5 -> NaN Division_impossible dvix692 remainder 1000003 5 -> 3 dvix693 remainder 100003 5 -> 3 dvix694 remainder 10003 5 -> 3 dvix695 remainder 1003 5 -> 3 dvix696 remainder 103 5 -> 3 dvix697 remainder 13 5 -> 3 dvix698 remainder 1 5 -> 1 -- overflow and underflow tests [from divide] precision: 9 maxexponent: 999999999 minexponent: -999999999 remx890 remainder +1.23456789012345E-0 9E+999999999 -> 1.23456789 Inexact Rounded remx891 remainder 9E+999999999 +0.23456789012345E-0 -> NaN Division_impossible remx892 remainder +0.100 9E+999999999 -> 0.100 remx893 remainder 9E-999999999 +9.100 -> 9E-999999999 remx895 remainder -1.23456789012345E-0 9E+999999999 -> -1.23456789 Inexact Rounded remx896 remainder 9E+999999999 -0.83456789012345E-0 -> NaN Division_impossible remx897 remainder -0.100 9E+999999999 -> -0.100 remx898 remainder 9E-999999999 -9.100 -> 9E-999999999 -- Null tests rem900 remainder 10 # -> NaN Invalid_operation rem901 remainder # 10 -> NaN Invalid_operation --- NEW FILE: randoms.decTest --- ------------------------------------------------------------------------ -- randoms.decTest -- decimal random testcases -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ [...3990 lines suppressed...] xmul498 multiply -7.27403536 -481469656E-835183700 -> 3.50222730E-835183691 Inexact Rounded xpow498 power -7.27403536 -5 -> -0.0000491046885 Inexact Rounded xrem498 remainder -7.27403536 -481469656E-835183700 -> NaN Division_impossible xsub498 subtract -7.27403536 -481469656E-835183700 -> -7.27403536 Inexact Rounded xadd499 add -6157.74292 -94075286.2E+92555877 -> -9.40752862E+92555884 Inexact Rounded xcom499 compare -6157.74292 -94075286.2E+92555877 -> 1 xdiv499 divide -6157.74292 -94075286.2E+92555877 -> 6.54554790E-92555882 Inexact Rounded xdvi499 divideint -6157.74292 -94075286.2E+92555877 -> 0 xmul499 multiply -6157.74292 -94075286.2E+92555877 -> 5.79291428E+92555888 Inexact Rounded xpow499 power -6157.74292 -9 -> -7.85608218E-35 Inexact Rounded xrem499 remainder -6157.74292 -94075286.2E+92555877 -> -6157.74292 xsub499 subtract -6157.74292 -94075286.2E+92555877 -> 9.40752862E+92555884 Inexact Rounded xadd500 add -525445087.E+231529167 188227460 -> -5.25445087E+231529175 Inexact Rounded xcom500 compare -525445087.E+231529167 188227460 -> -1 xdiv500 divide -525445087.E+231529167 188227460 -> -2.79154321E+231529167 Inexact Rounded xdvi500 divideint -525445087.E+231529167 188227460 -> NaN Division_impossible xmul500 multiply -525445087.E+231529167 188227460 -> -9.89031941E+231529183 Inexact Rounded xpow500 power -525445087.E+231529167 188227460 -> Infinity Overflow Inexact Rounded xrem500 remainder -525445087.E+231529167 188227460 -> NaN Division_impossible xsub500 subtract -525445087.E+231529167 188227460 -> -5.25445087E+231529175 Inexact Rounded --- NEW FILE: randomBound32.decTest --- ------------------------------------------------------------------------ -- randomBound32.decTest -- decimal testcases -- boundaries near 32 -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ [...2404 lines suppressed...] mulx3498 multiply 91936087917435.5974889495278215874 -67080823344.8903392584327136082486E-757 -> -6.16714847260980448099292763939423E-733 Inexact Rounded powx3498 power 91936087917435.5974889495278215874 -7 -> 1.80134899939035708719659065082630E-98 Inexact Rounded remx3498 remainder 91936087917435.5974889495278215874 -67080823344.8903392584327136082486E-757 -> NaN Division_impossible subx3498 subtract 91936087917435.5974889495278215874 -67080823344.8903392584327136082486E-757 -> 91936087917435.5974889495278215874 Inexact Rounded addx3499 add -07345.6422518528556136521417259811E-600 41188325.7041362608934957584583381E-763 -> -7.34564225185285561365214172598110E-597 Inexact Rounded comx3499 compare -07345.6422518528556136521417259811E-600 41188325.7041362608934957584583381E-763 -> -1 divx3499 divide -07345.6422518528556136521417259811E-600 41188325.7041362608934957584583381E-763 -> -1.78342822299163842247184303878022E+159 Inexact Rounded dvix3499 divideint -07345.6422518528556136521417259811E-600 41188325.7041362608934957584583381E-763 -> NaN Division_impossible mulx3499 multiply -07345.6422518528556136521417259811E-600 41188325.7041362608934957584583381E-763 -> -3.02554705575380338274126867655676E-1352 Inexact Rounded powx3499 power -07345.6422518528556136521417259811E-600 4 -> 2.91151541552217582082937236255996E-2385 Inexact Rounded remx3499 remainder -07345.6422518528556136521417259811E-600 41188325.7041362608934957584583381E-763 -> NaN Division_impossible subx3499 subtract -07345.6422518528556136521417259811E-600 41188325.7041362608934957584583381E-763 -> -7.34564225185285561365214172598110E-597 Inexact Rounded addx3500 add -253280724.939458021588167965038184 616988.426425908872398170896375634E+396 -> 6.16988426425908872398170896375634E+401 Inexact Rounded comx3500 compare -253280724.939458021588167965038184 616988.426425908872398170896375634E+396 -> -1 divx3500 divide -253280724.939458021588167965038184 616988.426425908872398170896375634E+396 -> -4.10511306357337753351655511866170E-394 Inexact Rounded dvix3500 divideint -253280724.939458021588167965038184 616988.426425908872398170896375634E+396 -> -0 mulx3500 multiply -253280724.939458021588167965038184 616988.426425908872398170896375634E+396 -> -1.56271275924409657991913620522315E+410 Inexact Rounded powx3500 power -253280724.939458021588167965038184 6 -> 2.64005420221406808782284459794424E+50 Inexact Rounded remx3500 remainder -253280724.939458021588167965038184 616988.426425908872398170896375634E+396 -> -253280724.939458021588167965038184 subx3500 subtract -253280724.939458021588167965038184 616988.426425908872398170896375634E+396 -> -6.16988426425908872398170896375634E+401 Inexact Rounded --- NEW FILE: power.decTest --- ---------------------------------------------------------------------- -- power.decTest -- decimal exponentiation -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- This set of testcases tests raising numbers to an integer power only. -- If arbitrary powers were supported, 1 ulp differences would be -- permitted. extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- base checks. Note 0**0 is an error. powx001 power '0' '0' -> NaN Invalid_operation powx002 power '0' '1' -> '0' powx003 power '0' '2' -> '0' powx004 power '1' '0' -> '1' powx005 power '1' '1' -> '1' powx006 power '1' '2' -> '1' powx010 power '2' '0' -> '1' powx011 power '2' '1' -> '2' powx012 power '2' '2' -> '4' powx013 power '2' '3' -> '8' powx014 power '2' '4' -> '16' powx015 power '2' '5' -> '32' powx016 power '2' '6' -> '64' powx017 power '2' '7' -> '128' powx018 power '2' '8' -> '256' powx019 power '2' '9' -> '512' powx020 power '2' '10' -> '1024' powx021 power '2' '11' -> '2048' powx022 power '2' '12' -> '4096' powx023 power '2' '15' -> '32768' powx024 power '2' '16' -> '65536' powx025 power '2' '31' -> '2.14748365E+9' Inexact Rounded -- NB 0 not stripped in next powx026 power '2' '32' -> '4.29496730E+9' Inexact Rounded precision: 10 powx027 power '2' '31' -> '2147483648' powx028 power '2' '32' -> '4294967296' precision: 9 powx030 power '3' '2' -> 9 powx031 power '4' '2' -> 16 powx032 power '5' '2' -> 25 powx033 power '6' '2' -> 36 powx034 power '7' '2' -> 49 powx035 power '8' '2' -> 64 powx036 power '9' '2' -> 81 powx037 power '10' '2' -> 100 powx038 power '11' '2' -> 121 powx039 power '12' '2' -> 144 powx040 power '3' '3' -> 27 powx041 power '4' '3' -> 64 powx042 power '5' '3' -> 125 powx043 power '6' '3' -> 216 powx044 power '7' '3' -> 343 powx050 power '10' '0' -> 1 powx051 power '10' '1' -> 10 powx052 power '10' '2' -> 100 powx053 power '10' '3' -> 1000 powx054 power '10' '4' -> 10000 powx055 power '10' '5' -> 100000 powx056 power '10' '6' -> 1000000 powx057 power '10' '7' -> 10000000 powx058 power '10' '8' -> 100000000 powx059 power '10' '9' -> 1.00000000E+9 Rounded powx060 power '10' '22' -> 1.00000000E+22 Rounded powx061 power '10' '77' -> 1.00000000E+77 Rounded powx062 power '10' '99' -> 1.00000000E+99 Rounded maxexponent: 999999999 minexponent: -999999999 powx063 power '10' '999999999' -> '1.00000000E+999999999' Rounded powx064 power '10' '999999998' -> '1.00000000E+999999998' Rounded powx065 power '10' '999999997' -> '1.00000000E+999999997' Rounded powx066 power '10' '333333333' -> '1.00000000E+333333333' Rounded powx070 power '0.3' '0' -> '1' powx071 power '0.3' '1' -> '0.3' powx072 power '0.3' '1.00' -> '0.3' powx073 power '0.3' '2.00' -> '0.09' powx074 power '0.3' '2.000000000' -> '0.09' powx075 power '6.0' '1' -> '6.0' -- NB zeros not stripped powx076 power '6.0' '2' -> '36.00' -- .. powx077 power '-3' '2' -> '9' -- from NetRexx book powx078 power '4' '3' -> '64' -- .. (sort of) powx080 power 0.1 0 -> 1 powx081 power 0.1 1 -> 0.1 powx082 power 0.1 2 -> 0.01 powx083 power 0.1 3 -> 0.001 powx084 power 0.1 4 -> 0.0001 powx085 power 0.1 5 -> 0.00001 powx086 power 0.1 6 -> 0.000001 powx087 power 0.1 7 -> 1E-7 powx088 power 0.1 8 -> 1E-8 powx089 power 0.1 9 -> 1E-9 powx090 power 101 2 -> 10201 powx091 power 101 3 -> 1030301 powx092 power 101 4 -> 104060401 powx093 power 101 5 -> 1.05101005E+10 Inexact Rounded powx094 power 101 6 -> 1.06152015E+12 Inexact Rounded powx095 power 101 7 -> 1.07213535E+14 Inexact Rounded -- negative powers powx101 power '2' '-1' -> 0.5 powx102 power '2' '-2' -> 0.25 powx103 power '2' '-4' -> 0.0625 powx104 power '2' '-8' -> 0.00390625 powx105 power '2' '-16' -> 0.0000152587891 Inexact Rounded powx106 power '2' '-32' -> 2.32830644E-10 Inexact Rounded powx108 power '2' '-64' -> 5.42101086E-20 Inexact Rounded powx110 power '10' '-8' -> 1E-8 powx111 power '10' '-7' -> 1E-7 powx112 power '10' '-6' -> 0.000001 powx113 power '10' '-5' -> 0.00001 powx114 power '10' '-4' -> 0.0001 powx115 power '10' '-3' -> 0.001 powx116 power '10' '-2' -> 0.01 powx117 power '10' '-1' -> 0.1 powx118 power '10' '-333333333' -> 1E-333333333 powx119 power '10' '-999999998' -> 1E-999999998 powx120 power '10' '-999999999' -> 1E-999999999 powx121 power '10' '-77' -> '1E-77' powx122 power '10' '-22' -> '1E-22' powx123 power '2' '-1' -> '0.5' powx124 power '2' '-2' -> '0.25' powx125 power '2' '-4' -> '0.0625' powx126 power '0' '-1' -> Infinity Division_by_zero powx127 power '0' '-2' -> Infinity Division_by_zero powx128 power -0 '-1' -> -Infinity Division_by_zero powx129 power -0 '-2' -> Infinity Division_by_zero -- out-of-range edge cases powx181 power '7' '999999998' -> 2.10892313E+845098038 Inexact Rounded powx182 power '7' '999999999' -> 1.47624619E+845098039 Inexact Rounded powx183 power '7' '1000000000' -> NaN Invalid_operation powx184 power '7' '1000000001' -> NaN Invalid_operation powx185 power '7' '10000000000' -> NaN Invalid_operation powx186 power '7' '-1000000001' -> NaN Invalid_operation powx187 power '7' '-1000000000' -> NaN Invalid_operation powx189 power '7' '-999999999' -> 6.77393787E-845098040 Inexact Rounded powx190 power '7' '-999999998' -> 4.74175651E-845098039 Inexact Rounded -- some baddies [more below] powx191 power '2' '2.000001' -> NaN Invalid_operation powx192 power '2' '2.00000000' -> 4 powx193 power '2' '2.000000001' -> NaN Invalid_operation powx194 power '2' '2.0000000001' -> NaN Invalid_operation -- "0.5" tests from original Rexx diagnostics [loop unrolled] powx200 power 0.5 0 -> 1 powx201 power 0.5 1 -> 0.5 powx202 power 0.5 2 -> 0.25 powx203 power 0.5 3 -> 0.125 powx204 power 0.5 4 -> 0.0625 powx205 power 0.5 5 -> 0.03125 powx206 power 0.5 6 -> 0.015625 powx207 power 0.5 7 -> 0.0078125 powx208 power 0.5 8 -> 0.00390625 powx209 power 0.5 9 -> 0.001953125 powx210 power 0.5 10 -> 0.0009765625 -- A (rare) case where the last digit is not within 0.5 ULP precision: 9 powx215 power "-21971575.0E+31454441" "-7" -> "-4.04549503E-220181139" Inexact Rounded precision: 20 powx216 power "-21971575.0E+31454441" "-7" -> "-4.0454950249324891788E-220181139" Inexact Rounded -- The Vienna case. Checks both setup and 1/acc working precision -- Modified 1998.12.14 as RHS no longer rounded before use (must fit) -- Modified 1990.02.04 as LHS is now rounded (instead of truncated to guard) -- '123456789E+10' -- lhs .. rounded to 1.23E+18 -- '-1.23000e+2' -- rhs .. [was: -1.23455e+2, rounds to -123] -- Modified 2002.10.06 -- finally, no input rounding -- With input rounding, result would be 8.74E-2226 precision: 3 powx219 power '123456789E+10' '-1.23000e+2' -> '5.54E-2226' Inexact Rounded -- whole number checks precision: 9 powx221 power 1 1234 -> 1 precision: 4 powx222 power 1 1234 -> 1 precision: 3 powx223 power 1 1234 -> 1 powx224 power 1 12.34e+2 -> 1 powx225 power 1 12.3 -> NaN Invalid_operation powx226 power 1 12.0 -> 1 powx227 power 1 1.01 -> NaN Invalid_operation powx228 power 2 1.00 -> 2 powx229 power 2 2.00 -> 4 precision: 9 powx230 power 1 1.0001 -> NaN Invalid_operation powx231 power 1 1.0000001 -> NaN Invalid_operation powx232 power 1 1.0000000001 -> NaN Invalid_operation powx233 power 1 1.0000000000001 -> NaN Invalid_operation precision: 5 powx234 power 1 1.0001 -> NaN Invalid_operation powx235 power 1 1.0000001 -> NaN Invalid_operation powx236 power 1 1.0000000001 -> NaN Invalid_operation powx237 power 1 1.0000000000001 -> NaN Invalid_operation powx238 power 1 1.0000000000001 -> NaN Invalid_operation maxexponent: 999999999 minexponent: -999999999 powx239 power 1 5.67E-987654321 -> NaN Invalid_operation powx240 power 1 100000000 -> 1 powx241 power 1 999999998 -> 1 powx242 power 1 999999999 -> 1 powx243 power 1 1000000000 -> NaN Invalid_operation powx244 power 1 9999999999 -> NaN Invalid_operation -- Checks for 'Too much precision needed' -- For x^12, digits+elength+1 = digits+3 precision: 999999999 powx249 add 1 1 -> 2 -- check basic operation at this precision powx250 power 2 12 -> Infinity Overflow precision: 999999998 powx251 power 2 12 -> Infinity Overflow precision: 999999997 powx252 power 2 12 -> Infinity Overflow precision: 999999996 powx253 power 2 12 -> 4096 precision: 999999995 powx254 power 2 12 -> 4096 -- overflow and underflow tests maxexponent: 999999999 minexponent: -999999999 precision: 9 powx280 power 9 999999999 -> 3.05550054E+954242508 Inexact Rounded powx281 power 10 999999999 -> 1.00000000E+999999999 Rounded powx282 power 10.0001 999999999 -> Infinity Overflow Inexact Rounded powx283 power 10.1 999999999 -> Infinity Overflow Inexact Rounded powx284 power 11 999999999 -> Infinity Overflow Inexact Rounded powx285 power 12 999999999 -> Infinity Overflow Inexact Rounded powx286 power 999 999999999 -> Infinity Overflow Inexact Rounded powx287 power 999999 999999999 -> Infinity Overflow Inexact Rounded powx288 power 999999999 999999999 -> Infinity Overflow Inexact Rounded powx289 power 9.9E999999999 999999999 -> Infinity Overflow Inexact Rounded powx290 power 0.5 999999999 -> 4.33559594E-301029996 Inexact Rounded powx291 power 0.1 999999999 -> 1E-999999999 -- unrounded powx292 power 0.09 999999999 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx293 power 0.05 999999999 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx294 power 0.01 999999999 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx295 power 0.0001 999999999 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx297 power 0.0000001 999999999 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx298 power 0.0000000001 999999999 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx299 power 1E-999999999 999999999 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx310 power -9 999999999 -> -3.05550054E+954242508 Inexact Rounded powx311 power -10 999999999 -> -1.00000000E+999999999 Rounded powx312 power -10.0001 999999999 -> -Infinity Overflow Inexact Rounded powx313 power -10.1 999999999 -> -Infinity Overflow Inexact Rounded powx314 power -11 999999999 -> -Infinity Overflow Inexact Rounded powx315 power -12 999999999 -> -Infinity Overflow Inexact Rounded powx316 power -999 999999999 -> -Infinity Overflow Inexact Rounded powx317 power -999999 999999999 -> -Infinity Overflow Inexact Rounded powx318 power -999999999 999999999 -> -Infinity Overflow Inexact Rounded powx319 power -9.9E999999999 999999999 -> -Infinity Overflow Inexact Rounded powx320 power -0.5 999999999 -> -4.33559594E-301029996 Inexact Rounded powx321 power -0.1 999999999 -> -1E-999999999 powx322 power -0.09 999999999 -> -0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx323 power -0.05 999999999 -> -0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx324 power -0.01 999999999 -> -0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx325 power -0.0001 999999999 -> -0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx327 power -0.0000001 999999999 -> -0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx328 power -0.0000000001 999999999 -> -0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx329 power -1E-999999999 999999999 -> -0E-1000000007 Underflow Subnormal Inexact Rounded Clamped -- note no trim of next result powx330 power -9 999999998 -> 3.39500060E+954242507 Inexact Rounded powx331 power -10 999999998 -> 1.00000000E+999999998 Rounded powx332 power -10.0001 999999998 -> Infinity Overflow Inexact Rounded powx333 power -10.1 999999998 -> Infinity Overflow Inexact Rounded powx334 power -11 999999998 -> Infinity Overflow Inexact Rounded powx335 power -12 999999998 -> Infinity Overflow Inexact Rounded powx336 power -999 999999998 -> Infinity Overflow Inexact Rounded powx337 power -999999 999999998 -> Infinity Overflow Inexact Rounded powx338 power -999999999 999999998 -> Infinity Overflow Inexact Rounded powx339 power -9.9E999999999 999999998 -> Infinity Overflow Inexact Rounded powx340 power -0.5 999999998 -> 8.67119187E-301029996 Inexact Rounded powx341 power -0.1 999999998 -> 1E-999999998 -- NB exact unrounded powx342 power -0.09 999999998 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx343 power -0.05 999999998 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx344 power -0.01 999999998 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx345 power -0.0001 999999998 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx347 power -0.0000001 999999998 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx348 power -0.0000000001 999999998 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx349 power -1E-999999999 999999998 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped -- some subnormals precision: 9 -- [precision is 9, so smallest exponent is -1000000007 powx350 power 1e-1 500000000 -> 1E-500000000 powx351 power 1e-2 999999999 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped powx352 power 1e-2 500000000 -> 1E-1000000000 Subnormal powx353 power 1e-2 500000001 -> 1E-1000000002 Subnormal powx354 power 1e-2 500000002 -> 1E-1000000004 Subnormal powx355 power 1e-2 500000003 -> 1E-1000000006 Subnormal powx356 power 1e-2 500000004 -> 0E-1000000007 Underflow Subnormal Inexact Rounded powx360 power 0.010001 500000000 -> 4.34941988E-999978287 Inexact Rounded powx361 power 0.010000001 500000000 -> 5.18469257E-999999979 Inexact Rounded powx362 power 0.010000001 500000001 -> 5.18469309E-999999981 Inexact Rounded powx363 power 0.0100000009 500000000 -> 3.49342003E-999999981 Inexact Rounded powx364 power 0.0100000001 500000000 -> 1.48413155E-999999998 Inexact Rounded powx365 power 0.01 500000000 -> 1E-1000000000 Subnormal powx366 power 0.0099999999 500000000 -> 6.7379E-1000000003 Underflow Subnormal Inexact Rounded powx367 power 0.0099999998 500000000 -> 4.54E-1000000005 Underflow Subnormal Inexact Rounded powx368 power 0.0099999997 500000000 -> 3E-1000000007 Underflow Subnormal Inexact Rounded powx369 power 0.0099999996 500000000 -> 0E-1000000007 Underflow Subnormal Inexact Rounded powx370 power 0.009 500000000 -> 0E-1000000007 Underflow Subnormal Inexact Rounded Clamped -- 1/subnormal -> overflow powx371 power 1e-1 -500000000 -> 1E+500000000 powx372 power 1e-2 -999999999 -> Infinity Overflow Inexact Rounded powx373 power 1e-2 -500000000 -> Infinity Overflow Inexact Rounded powx374 power 1e-2 -500000001 -> Infinity Overflow Inexact Rounded powx375 power 1e-2 -500000002 -> Infinity Overflow Inexact Rounded powx376 power 1e-2 -500000003 -> Infinity Overflow Inexact Rounded powx377 power 1e-2 -500000004 -> Infinity Overflow Inexact Rounded powx381 power 0.010001 -500000000 -> 2.29915719E+999978286 Inexact Rounded powx382 power 0.010000001 -500000000 -> 1.92875467E+999999978 Inexact Rounded powx383 power 0.010000001 -500000001 -> 1.92875448E+999999980 Inexact Rounded powx384 power 0.0100000009 -500000000 -> 2.86252438E+999999980 Inexact Rounded powx385 power 0.0100000001 -500000000 -> 6.73794717E+999999997 Inexact Rounded powx386 power 0.01 -500000000 -> Infinity Overflow Inexact Rounded powx387 power 0.009999 -500000000 -> Infinity Overflow Inexact Rounded -- negative power giving subnormal powx388 power 100.000001 -500000000 -> 6.7379E-1000000003 Underflow Subnormal Inexact Rounded -- some more edge cases precision: 15 maxExponent: 999 minexponent: -999 powx391 power 0.1 999 -> 1E-999 powx392 power 0.099 999 -> 4.360732062E-1004 Underflow Subnormal Inexact Rounded powx393 power 0.098 999 -> 1.71731E-1008 Underflow Subnormal Inexact Rounded powx394 power 0.097 999 -> 6E-1013 Underflow Subnormal Inexact Rounded powx395 power 0.096 999 -> 0E-1013 Underflow Subnormal Inexact Rounded powx396 power 0.01 999 -> 0E-1013 Underflow Subnormal Inexact Rounded Clamped -- multiply tests are here to aid checking and test for consistent handling -- of underflow precision: 5 maxexponent: 999 minexponent: -999 -- squares mulx400 multiply 1E-502 1e-502 -> 0E-1003 Subnormal Inexact Underflow Rounded mulx401 multiply 1E-501 1e-501 -> 1E-1002 Subnormal mulx402 multiply 2E-501 2e-501 -> 4E-1002 Subnormal mulx403 multiply 4E-501 4e-501 -> 1.6E-1001 Subnormal mulx404 multiply 10E-501 10e-501 -> 1.00E-1000 Subnormal mulx405 multiply 30E-501 30e-501 -> 9.00E-1000 Subnormal mulx406 multiply 40E-501 40e-501 -> 1.600E-999 powx400 power 1E-502 2 -> 0E-1003 Underflow Subnormal Inexact Rounded powx401 power 1E-501 2 -> 1E-1002 Subnormal powx402 power 2E-501 2 -> 4E-1002 Subnormal powx403 power 4E-501 2 -> 1.6E-1001 Subnormal powx404 power 10E-501 2 -> 1.00E-1000 Subnormal powx405 power 30E-501 2 -> 9.00E-1000 Subnormal powx406 power 40E-501 2 -> 1.600E-999 -- cubes mulx410 multiply 1E-670 1e-335 -> 0E-1003 Underflow Subnormal Inexact Rounded mulx411 multiply 1E-668 1e-334 -> 1E-1002 Subnormal mulx412 multiply 4E-668 2e-334 -> 8E-1002 Subnormal mulx413 multiply 9E-668 3e-334 -> 2.7E-1001 Subnormal mulx414 multiply 16E-668 4e-334 -> 6.4E-1001 Subnormal mulx415 multiply 25E-668 5e-334 -> 1.25E-1000 Subnormal mulx416 multiply 10E-668 100e-334 -> 1.000E-999 powx410 power 1E-335 3 -> 0E-1003 Underflow Subnormal Inexact Rounded powx411 power 1E-334 3 -> 1E-1002 Subnormal powx412 power 2E-334 3 -> 8E-1002 Subnormal powx413 power 3E-334 3 -> 2.7E-1001 Subnormal powx414 power 4E-334 3 -> 6.4E-1001 Subnormal powx415 power 5E-334 3 -> 1.25E-1000 Subnormal powx416 power 10E-334 3 -> 1.000E-999 -- negative powers, testing subnormals precision: 5 maxExponent: 999 minexponent: -999 powx421 power 2.5E-501 -2 -> Infinity Overflow Inexact Rounded powx422 power 2.5E-500 -2 -> 1.6E+999 powx423 power 2.5E+499 -2 -> 1.6E-999 powx424 power 2.5E+500 -2 -> 1.6E-1001 Subnormal powx425 power 2.5E+501 -2 -> 2E-1003 Underflow Subnormal Inexact Rounded powx426 power 2.5E+502 -2 -> 0E-1003 Underflow Subnormal Inexact Rounded powx427 power 0.25E+499 -2 -> 1.6E-997 powx428 power 0.25E+500 -2 -> 1.6E-999 powx429 power 0.25E+501 -2 -> 1.6E-1001 Subnormal powx430 power 0.25E+502 -2 -> 2E-1003 Underflow Subnormal Inexact Rounded powx431 power 0.25E+503 -2 -> 0E-1003 Underflow Subnormal Inexact Rounded powx432 power 0.04E+499 -2 -> 6.25E-996 powx433 power 0.04E+500 -2 -> 6.25E-998 powx434 power 0.04E+501 -2 -> 6.25E-1000 Subnormal powx435 power 0.04E+502 -2 -> 6.3E-1002 Underflow Subnormal Inexact Rounded powx436 power 0.04E+503 -2 -> 1E-1003 Underflow Subnormal Inexact Rounded powx437 power 0.04E+504 -2 -> 0E-1003 Underflow Subnormal Inexact Rounded powx441 power 0.04E+334 -3 -> 1.5625E-998 powx442 power 0.04E+335 -3 -> 1.56E-1001 Underflow Subnormal Inexact Rounded powx443 power 0.04E+336 -3 -> 0E-1003 Underflow Subnormal Inexact Rounded powx444 power 0.25E+333 -3 -> 6.4E-998 powx445 power 0.25E+334 -3 -> 6.4E-1001 Subnormal powx446 power 0.25E+335 -3 -> 1E-1003 Underflow Subnormal Inexact Rounded powx447 power 0.25E+336 -3 -> 0E-1003 Underflow Subnormal Inexact Rounded Clamped -- check sign for cubes and a few squares powx448 power -0.04E+334 -3 -> -1.5625E-998 powx449 power -0.04E+335 -3 -> -1.56E-1001 Underflow Subnormal Inexact Rounded powx450 power -0.04E+336 -3 -> -0E-1003 Underflow Subnormal Inexact Rounded powx451 power -0.25E+333 -3 -> -6.4E-998 powx452 power -0.25E+334 -3 -> -6.4E-1001 Subnormal powx453 power -0.25E+335 -3 -> -1E-1003 Underflow Subnormal Inexact Rounded powx454 power -0.25E+336 -3 -> -0E-1003 Underflow Subnormal Inexact Rounded Clamped powx455 power -0.04E+499 -2 -> 6.25E-996 powx456 power -0.04E+500 -2 -> 6.25E-998 powx457 power -0.04E+501 -2 -> 6.25E-1000 Subnormal powx458 power -0.04E+502 -2 -> 6.3E-1002 Underflow Subnormal Inexact Rounded -- test -0s precision: 9 powx560 power 0 0 -> NaN Invalid_operation powx561 power 0 -0 -> NaN Invalid_operation powx562 power -0 0 -> NaN Invalid_operation powx563 power -0 -0 -> NaN Invalid_operation powx564 power 1 0 -> 1 powx565 power 1 -0 -> 1 powx566 power -1 0 -> 1 powx567 power -1 -0 -> 1 powx568 power 0 1 -> 0 powx569 power 0 -1 -> Infinity Division_by_zero powx570 power -0 1 -> -0 powx571 power -0 -1 -> -Infinity Division_by_zero powx572 power 0 2 -> 0 powx573 power 0 -2 -> Infinity Division_by_zero powx574 power -0 2 -> 0 powx575 power -0 -2 -> Infinity Division_by_zero powx576 power 0 3 -> 0 powx577 power 0 -3 -> Infinity Division_by_zero powx578 power -0 3 -> -0 powx579 power -0 -3 -> -Infinity Division_by_zero -- Specials powx580 power Inf -Inf -> NaN Invalid_operation powx581 power Inf -1000 -> 0 powx582 power Inf -1 -> 0 powx583 power Inf -0 -> 1 powx584 power Inf 0 -> 1 powx585 power Inf 1 -> Infinity powx586 power Inf 1000 -> Infinity powx587 power Inf Inf -> NaN Invalid_operation powx588 power -1000 Inf -> NaN Invalid_operation powx589 power -Inf Inf -> NaN Invalid_operation powx590 power -1 Inf -> NaN Invalid_operation powx591 power -0 Inf -> NaN Invalid_operation powx592 power 0 Inf -> NaN Invalid_operation powx593 power 1 Inf -> NaN Invalid_operation powx594 power 1000 Inf -> NaN Invalid_operation powx595 power Inf Inf -> NaN Invalid_operation powx600 power -Inf -Inf -> NaN Invalid_operation powx601 power -Inf -1000 -> 0 powx602 power -Inf -1 -> -0 powx603 power -Inf -0 -> 1 powx604 power -Inf 0 -> 1 powx605 power -Inf 1 -> -Infinity powx606 power -Inf 1000 -> Infinity powx607 power -Inf Inf -> NaN Invalid_operation powx608 power -1000 Inf -> NaN Invalid_operation powx609 power -Inf -Inf -> NaN Invalid_operation powx610 power -1 -Inf -> NaN Invalid_operation powx611 power -0 -Inf -> NaN Invalid_operation powx612 power 0 -Inf -> NaN Invalid_operation powx613 power 1 -Inf -> NaN Invalid_operation powx614 power 1000 -Inf -> NaN Invalid_operation powx615 power Inf -Inf -> NaN Invalid_operation powx621 power NaN -Inf -> NaN Invalid_operation powx622 power NaN -1000 -> NaN powx623 power NaN -1 -> NaN powx624 power NaN -0 -> NaN powx625 power NaN 0 -> NaN powx626 power NaN 1 -> NaN powx627 power NaN 1000 -> NaN powx628 power NaN Inf -> NaN Invalid_operation powx629 power NaN NaN -> NaN powx630 power -Inf NaN -> NaN powx631 power -1000 NaN -> NaN powx632 power -1 NaN -> NaN powx633 power -0 NaN -> NaN powx634 power 0 NaN -> NaN powx635 power 1 NaN -> NaN powx636 power 1000 NaN -> NaN powx637 power Inf NaN -> NaN powx641 power sNaN -Inf -> NaN Invalid_operation powx642 power sNaN -1000 -> NaN Invalid_operation powx643 power sNaN -1 -> NaN Invalid_operation powx644 power sNaN -0 -> NaN Invalid_operation powx645 power sNaN 0 -> NaN Invalid_operation powx646 power sNaN 1 -> NaN Invalid_operation powx647 power sNaN 1000 -> NaN Invalid_operation powx648 power sNaN NaN -> NaN Invalid_operation powx649 power sNaN sNaN -> NaN Invalid_operation powx650 power NaN sNaN -> NaN Invalid_operation powx651 power -Inf sNaN -> NaN Invalid_operation powx652 power -1000 sNaN -> NaN Invalid_operation powx653 power -1 sNaN -> NaN Invalid_operation powx654 power -0 sNaN -> NaN Invalid_operation powx655 power 0 sNaN -> NaN Invalid_operation powx656 power 1 sNaN -> NaN Invalid_operation powx657 power 1000 sNaN -> NaN Invalid_operation powx658 power Inf sNaN -> NaN Invalid_operation powx659 power NaN sNaN -> NaN Invalid_operation -- Examples from extended specification powx660 power Inf -2 -> 0 powx661 power Inf -1 -> 0 powx662 power Inf 0 -> 1 powx663 power Inf 1 -> Infinity powx664 power Inf 2 -> Infinity powx665 power -Inf -2 -> 0 powx666 power -Inf -1 -> -0 powx667 power -Inf 0 -> 1 powx668 power -Inf 1 -> -Infinity powx669 power -Inf 2 -> Infinity powx670 power 0 0 -> NaN Invalid_operation -- long operand and RHS range checks maxexponent: 999 minexponent: -999 precision: 9 powx701 power 12345678000 1 -> 1.23456780E+10 Rounded powx702 power 1234567800 1 -> 1.23456780E+9 Rounded powx703 power 1234567890 1 -> 1.23456789E+9 Rounded powx704 power 1234567891 1 -> 1.23456789E+9 Inexact Rounded powx705 power 12345678901 1 -> 1.23456789E+10 Inexact Rounded powx706 power 1234567896 1 -> 1.23456790E+9 Inexact Rounded powx707 power 1 12345678000 -> NaN Invalid_operation powx708 power 1 1234567800 -> NaN Invalid_operation powx709 power 1 1234567890 -> NaN Invalid_operation powx710 power 1 11234567891 -> NaN Invalid_operation powx711 power 1 12345678901 -> NaN Invalid_operation powx712 power 1 1234567896 -> NaN Invalid_operation powx713 power 1 -1234567896 -> NaN Invalid_operation powx714 power 1 1000000000 -> NaN Invalid_operation powx715 power 1 -1000000000 -> NaN Invalid_operation precision: 15 -- still checking powx741 power 12345678000 1 -> 12345678000 powx742 power 1234567800 1 -> 1234567800 powx743 power 1234567890 1 -> 1234567890 powx744 power 1234567891 1 -> 1234567891 powx745 power 12345678901 1 -> 12345678901 powx746 power 1234567896 1 -> 1234567896 powx747 power 1 12345678000 -> NaN Invalid_operation powx748 power 1 -1234567896 -> NaN Invalid_operation powx749 power 1 1000000000 -> NaN Invalid_operation powx740 power 1 -1000000000 -> NaN Invalid_operation -- check for double-rounded subnormals precision: 5 maxexponent: 79 minexponent: -79 powx750 power 1.2347E-40 2 -> 1.524E-80 Inexact Rounded Subnormal Underflow -- Null tests powx900 power 1 # -> NaN Invalid_operation powx901 power # 1 -> NaN Invalid_operation --- NEW FILE: plus.decTest --- ------------------------------------------------------------------------ -- plus.decTest -- decimal monadic addition -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- This set of tests primarily tests the existence of the operator. -- Addition and rounding, and most overflows, are tested elsewhere. extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 plux001 plus '1' -> '1' plux002 plus '-1' -> '-1' plux003 plus '1.00' -> '1.00' plux004 plus '-1.00' -> '-1.00' plux005 plus '0' -> '0' plux006 plus '0.00' -> '0.00' plux007 plus '00.0' -> '0.0' plux008 plus '00.00' -> '0.00' plux009 plus '00' -> '0' plux010 plus '-2' -> '-2' plux011 plus '2' -> '2' plux012 plus '-2.00' -> '-2.00' plux013 plus '2.00' -> '2.00' plux014 plus '-0' -> '0' plux015 plus '-0.00' -> '0.00' plux016 plus '-00.0' -> '0.0' plux017 plus '-00.00' -> '0.00' plux018 plus '-00' -> '0' plux020 plus '-2000000' -> '-2000000' plux021 plus '2000000' -> '2000000' precision: 7 plux022 plus '-2000000' -> '-2000000' plux023 plus '2000000' -> '2000000' precision: 6 plux024 plus '-2000000' -> '-2.00000E+6' Rounded plux025 plus '2000000' -> '2.00000E+6' Rounded precision: 3 plux026 plus '-2000000' -> '-2.00E+6' Rounded plux027 plus '2000000' -> '2.00E+6' Rounded -- more fixed, potential LHS swaps if done by add 0 precision: 9 plux060 plus '56267E-10' -> '0.0000056267' plux061 plus '56267E-5' -> '0.56267' plux062 plus '56267E-2' -> '562.67' plux063 plus '56267E-1' -> '5626.7' plux065 plus '56267E-0' -> '56267' plux066 plus '56267E+0' -> '56267' plux067 plus '56267E+1' -> '5.6267E+5' plux068 plus '56267E+2' -> '5.6267E+6' plux069 plus '56267E+3' -> '5.6267E+7' plux070 plus '56267E+4' -> '5.6267E+8' plux071 plus '56267E+5' -> '5.6267E+9' plux072 plus '56267E+6' -> '5.6267E+10' plux080 plus '-56267E-10' -> '-0.0000056267' plux081 plus '-56267E-5' -> '-0.56267' plux082 plus '-56267E-2' -> '-562.67' plux083 plus '-56267E-1' -> '-5626.7' plux085 plus '-56267E-0' -> '-56267' plux086 plus '-56267E+0' -> '-56267' plux087 plus '-56267E+1' -> '-5.6267E+5' plux088 plus '-56267E+2' -> '-5.6267E+6' plux089 plus '-56267E+3' -> '-5.6267E+7' plux090 plus '-56267E+4' -> '-5.6267E+8' plux091 plus '-56267E+5' -> '-5.6267E+9' plux092 plus '-56267E+6' -> '-5.6267E+10' -- "lhs" zeros in plus and minus have exponent = operand plux120 plus '-0E3' -> '0E+3' plux121 plus '-0E2' -> '0E+2' plux122 plus '-0E1' -> '0E+1' plux123 plus '-0E0' -> '0' plux124 plus '+0E0' -> '0' plux125 plus '+0E1' -> '0E+1' plux126 plus '+0E2' -> '0E+2' plux127 plus '+0E3' -> '0E+3' plux130 plus '-5E3' -> '-5E+3' plux131 plus '-5E8' -> '-5E+8' plux132 plus '-5E13' -> '-5E+13' plux133 plus '-5E18' -> '-5E+18' plux134 plus '+5E3' -> '5E+3' plux135 plus '+5E8' -> '5E+8' plux136 plus '+5E13' -> '5E+13' plux137 plus '+5E18' -> '5E+18' -- specials plux150 plus 'Inf' -> 'Infinity' plux151 plus '-Inf' -> '-Infinity' plux152 plus NaN -> NaN plux153 plus sNaN -> NaN Invalid_operation -- overflow tests maxexponent: 999999999 minexponent: -999999999 precision: 3 plux160 plus 9.999E+999999999 -> Infinity Inexact Overflow Rounded plux161 plus -9.999E+999999999 -> -Infinity Inexact Overflow Rounded -- subnormals and underflow precision: 3 maxexponent: 999 minexponent: -999 plux210 plus 1.00E-999 -> 1.00E-999 plux211 plus 0.1E-999 -> 1E-1000 Subnormal plux212 plus 0.10E-999 -> 1.0E-1000 Subnormal plux213 plus 0.100E-999 -> 1.0E-1000 Subnormal Rounded plux214 plus 0.01E-999 -> 1E-1001 Subnormal -- next is rounded to Emin plux215 plus 0.999E-999 -> 1.00E-999 Inexact Rounded Subnormal Underflow plux216 plus 0.099E-999 -> 1.0E-1000 Inexact Rounded Subnormal Underflow plux217 plus 0.009E-999 -> 1E-1001 Inexact Rounded Subnormal Underflow plux218 plus 0.001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow plux219 plus 0.0009E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow plux220 plus 0.0001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow plux230 plus -1.00E-999 -> -1.00E-999 plux231 plus -0.1E-999 -> -1E-1000 Subnormal plux232 plus -0.10E-999 -> -1.0E-1000 Subnormal plux233 plus -0.100E-999 -> -1.0E-1000 Subnormal Rounded plux234 plus -0.01E-999 -> -1E-1001 Subnormal -- next is rounded to Emin plux235 plus -0.999E-999 -> -1.00E-999 Inexact Rounded Subnormal Underflow plux236 plus -0.099E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow plux237 plus -0.009E-999 -> -1E-1001 Inexact Rounded Subnormal Underflow plux238 plus -0.001E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow plux239 plus -0.0009E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow plux240 plus -0.0001E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow -- long operand checks maxexponent: 999 minexponent: -999 precision: 9 plux301 plus 12345678000 -> 1.23456780E+10 Rounded plux302 plus 1234567800 -> 1.23456780E+9 Rounded plux303 plus 1234567890 -> 1.23456789E+9 Rounded plux304 plus 1234567891 -> 1.23456789E+9 Inexact Rounded plux305 plus 12345678901 -> 1.23456789E+10 Inexact Rounded plux306 plus 1234567896 -> 1.23456790E+9 Inexact Rounded -- still checking precision: 15 plux321 plus 12345678000 -> 12345678000 plux322 plus 1234567800 -> 1234567800 plux323 plus 1234567890 -> 1234567890 plux324 plus 1234567891 -> 1234567891 plux325 plus 12345678901 -> 12345678901 plux326 plus 1234567896 -> 1234567896 precision: 9 -- Null tests plu900 plus # -> NaN Invalid_operation --- NEW FILE: normalize.decTest --- ------------------------------------------------------------------------ -- normalize.decTest -- remove trailing zeros -- -- Copyright (c) IBM Corporation, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 nrmx001 normalize '1' -> '1' nrmx002 normalize '-1' -> '-1' nrmx003 normalize '1.00' -> '1' nrmx004 normalize '-1.00' -> '-1' nrmx005 normalize '0' -> '0' nrmx006 normalize '0.00' -> '0' nrmx007 normalize '00.0' -> '0' nrmx008 normalize '00.00' -> '0' nrmx009 normalize '00' -> '0' nrmx010 normalize '0E+1' -> '0' nrmx011 normalize '0E+5' -> '0' nrmx012 normalize '-2' -> '-2' nrmx013 normalize '2' -> '2' nrmx014 normalize '-2.00' -> '-2' nrmx015 normalize '2.00' -> '2' nrmx016 normalize '-0' -> '-0' nrmx017 normalize '-0.00' -> '-0' nrmx018 normalize '-00.0' -> '-0' nrmx019 normalize '-00.00' -> '-0' nrmx020 normalize '-00' -> '-0' nrmx021 normalize '-0E+5' -> '-0' nrmx022 normalize '-0E+1' -> '-0' nrmx030 normalize '+0.1' -> '0.1' nrmx031 normalize '-0.1' -> '-0.1' nrmx032 normalize '+0.01' -> '0.01' nrmx033 normalize '-0.01' -> '-0.01' nrmx034 normalize '+0.001' -> '0.001' nrmx035 normalize '-0.001' -> '-0.001' nrmx036 normalize '+0.000001' -> '0.000001' nrmx037 normalize '-0.000001' -> '-0.000001' nrmx038 normalize '+0.000000000001' -> '1E-12' nrmx039 normalize '-0.000000000001' -> '-1E-12' nrmx041 normalize 1.1 -> 1.1 nrmx042 normalize 1.10 -> 1.1 nrmx043 normalize 1.100 -> 1.1 nrmx044 normalize 1.110 -> 1.11 nrmx045 normalize -1.1 -> -1.1 nrmx046 normalize -1.10 -> -1.1 nrmx047 normalize -1.100 -> -1.1 nrmx048 normalize -1.110 -> -1.11 nrmx049 normalize 9.9 -> 9.9 nrmx050 normalize 9.90 -> 9.9 nrmx051 normalize 9.900 -> 9.9 nrmx052 normalize 9.990 -> 9.99 nrmx053 normalize -9.9 -> -9.9 nrmx054 normalize -9.90 -> -9.9 nrmx055 normalize -9.900 -> -9.9 nrmx056 normalize -9.990 -> -9.99 -- some trailing fractional zeros with zeros in units nrmx060 normalize 10.0 -> 1E+1 nrmx061 normalize 10.00 -> 1E+1 nrmx062 normalize 100.0 -> 1E+2 nrmx063 normalize 100.00 -> 1E+2 nrmx064 normalize 1.1000E+3 -> 1.1E+3 nrmx065 normalize 1.10000E+3 -> 1.1E+3 nrmx066 normalize -10.0 -> -1E+1 nrmx067 normalize -10.00 -> -1E+1 nrmx068 normalize -100.0 -> -1E+2 nrmx069 normalize -100.00 -> -1E+2 nrmx070 normalize -1.1000E+3 -> -1.1E+3 nrmx071 normalize -1.10000E+3 -> -1.1E+3 -- some insignificant trailing zeros with positive exponent nrmx080 normalize 10E+1 -> 1E+2 nrmx081 normalize 100E+1 -> 1E+3 nrmx082 normalize 1.0E+2 -> 1E+2 nrmx083 normalize 1.0E+3 -> 1E+3 nrmx084 normalize 1.1E+3 -> 1.1E+3 nrmx085 normalize 1.00E+3 -> 1E+3 nrmx086 normalize 1.10E+3 -> 1.1E+3 nrmx087 normalize -10E+1 -> -1E+2 nrmx088 normalize -100E+1 -> -1E+3 nrmx089 normalize -1.0E+2 -> -1E+2 nrmx090 normalize -1.0E+3 -> -1E+3 nrmx091 normalize -1.1E+3 -> -1.1E+3 nrmx092 normalize -1.00E+3 -> -1E+3 nrmx093 normalize -1.10E+3 -> -1.1E+3 -- some significant trailing zeros, were we to be trimming nrmx100 normalize 11 -> 11 nrmx101 normalize 10 -> 1E+1 nrmx102 normalize 10. -> 1E+1 nrmx103 normalize 1.1E+1 -> 11 nrmx104 normalize 1.0E+1 -> 1E+1 nrmx105 normalize 1.10E+2 -> 1.1E+2 nrmx106 normalize 1.00E+2 -> 1E+2 nrmx107 normalize 1.100E+3 -> 1.1E+3 nrmx108 normalize 1.000E+3 -> 1E+3 nrmx109 normalize 1.000000E+6 -> 1E+6 nrmx110 normalize -11 -> -11 nrmx111 normalize -10 -> -1E+1 nrmx112 normalize -10. -> -1E+1 nrmx113 normalize -1.1E+1 -> -11 nrmx114 normalize -1.0E+1 -> -1E+1 nrmx115 normalize -1.10E+2 -> -1.1E+2 nrmx116 normalize -1.00E+2 -> -1E+2 nrmx117 normalize -1.100E+3 -> -1.1E+3 nrmx118 normalize -1.000E+3 -> -1E+3 nrmx119 normalize -1.00000E+5 -> -1E+5 nrmx120 normalize -1.000000E+6 -> -1E+6 nrmx121 normalize -10.00000E+6 -> -1E+7 nrmx122 normalize -100.0000E+6 -> -1E+8 nrmx123 normalize -1000.000E+6 -> -1E+9 nrmx124 normalize -10000.00E+6 -> -1E+10 nrmx125 normalize -100000.0E+6 -> -1E+11 nrmx126 normalize -1000000.E+6 -> -1E+12 -- examples from decArith nrmx140 normalize '2.1' -> '2.1' nrmx141 normalize '-2.0' -> '-2' nrmx142 normalize '1.200' -> '1.2' nrmx143 normalize '-120' -> '-1.2E+2' nrmx144 normalize '120.00' -> '1.2E+2' nrmx145 normalize '0.00' -> '0' -- overflow tests maxexponent: 999999999 minexponent: -999999999 precision: 3 nrmx160 normalize 9.999E+999999999 -> Infinity Inexact Overflow Rounded nrmx161 normalize -9.999E+999999999 -> -Infinity Inexact Overflow Rounded -- subnormals and underflow precision: 3 maxexponent: 999 minexponent: -999 nrmx210 normalize 1.00E-999 -> 1E-999 nrmx211 normalize 0.1E-999 -> 1E-1000 Subnormal nrmx212 normalize 0.10E-999 -> 1E-1000 Subnormal nrmx213 normalize 0.100E-999 -> 1E-1000 Subnormal Rounded nrmx214 normalize 0.01E-999 -> 1E-1001 Subnormal -- next is rounded to Emin nrmx215 normalize 0.999E-999 -> 1E-999 Inexact Rounded Subnormal Underflow nrmx216 normalize 0.099E-999 -> 1E-1000 Inexact Rounded Subnormal Underflow nrmx217 normalize 0.009E-999 -> 1E-1001 Inexact Rounded Subnormal Underflow nrmx218 normalize 0.001E-999 -> 0 Inexact Rounded Subnormal Underflow nrmx219 normalize 0.0009E-999 -> 0 Inexact Rounded Subnormal Underflow nrmx220 normalize 0.0001E-999 -> 0 Inexact Rounded Subnormal Underflow nrmx230 normalize -1.00E-999 -> -1E-999 nrmx231 normalize -0.1E-999 -> -1E-1000 Subnormal nrmx232 normalize -0.10E-999 -> -1E-1000 Subnormal nrmx233 normalize -0.100E-999 -> -1E-1000 Subnormal Rounded nrmx234 normalize -0.01E-999 -> -1E-1001 Subnormal -- next is rounded to Emin nrmx235 normalize -0.999E-999 -> -1E-999 Inexact Rounded Subnormal Underflow nrmx236 normalize -0.099E-999 -> -1E-1000 Inexact Rounded Subnormal Underflow nrmx237 normalize -0.009E-999 -> -1E-1001 Inexact Rounded Subnormal Underflow nrmx238 normalize -0.001E-999 -> -0 Inexact Rounded Subnormal Underflow nrmx239 normalize -0.0009E-999 -> -0 Inexact Rounded Subnormal Underflow nrmx240 normalize -0.0001E-999 -> -0 Inexact Rounded Subnormal Underflow -- more reshaping precision: 9 nrmx260 normalize '56260E-10' -> '0.000005626' nrmx261 normalize '56260E-5' -> '0.5626' nrmx262 normalize '56260E-2' -> '562.6' nrmx263 normalize '56260E-1' -> '5626' nrmx265 normalize '56260E-0' -> '5.626E+4' nrmx266 normalize '56260E+0' -> '5.626E+4' nrmx267 normalize '56260E+1' -> '5.626E+5' nrmx268 normalize '56260E+2' -> '5.626E+6' nrmx269 normalize '56260E+3' -> '5.626E+7' nrmx270 normalize '56260E+4' -> '5.626E+8' nrmx271 normalize '56260E+5' -> '5.626E+9' nrmx272 normalize '56260E+6' -> '5.626E+10' nrmx280 normalize '-56260E-10' -> '-0.000005626' nrmx281 normalize '-56260E-5' -> '-0.5626' nrmx282 normalize '-56260E-2' -> '-562.6' nrmx283 normalize '-56260E-1' -> '-5626' nrmx285 normalize '-56260E-0' -> '-5.626E+4' nrmx286 normalize '-56260E+0' -> '-5.626E+4' nrmx287 normalize '-56260E+1' -> '-5.626E+5' nrmx288 normalize '-56260E+2' -> '-5.626E+6' nrmx289 normalize '-56260E+3' -> '-5.626E+7' nrmx290 normalize '-56260E+4' -> '-5.626E+8' nrmx291 normalize '-56260E+5' -> '-5.626E+9' nrmx292 normalize '-56260E+6' -> '-5.626E+10' -- specials nrmx820 normalize 'Inf' -> 'Infinity' nrmx821 normalize '-Inf' -> '-Infinity' nrmx822 normalize NaN -> NaN nrmx823 normalize sNaN -> NaN Invalid_operation -- Null test nrmx900 normalize # -> NaN Invalid_operation --- NEW FILE: multiply.decTest --- ------------------------------------------------------------------------ -- multiply.decTest -- decimal multiplication -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- sanity checks (as base, above) mulx000 multiply 2 2 -> 4 mulx001 multiply 2 3 -> 6 mulx002 multiply 5 1 -> 5 mulx003 multiply 5 2 -> 10 mulx004 multiply 1.20 2 -> 2.40 mulx005 multiply 1.20 0 -> 0.00 mulx006 multiply 1.20 -2 -> -2.40 mulx007 multiply -1.20 2 -> -2.40 mulx008 multiply -1.20 0 -> -0.00 mulx009 multiply -1.20 -2 -> 2.40 mulx010 multiply 5.09 7.1 -> 36.139 mulx011 multiply 2.5 4 -> 10.0 mulx012 multiply 2.50 4 -> 10.00 mulx013 multiply 1.23456789 1.00000000 -> 1.23456789 Rounded mulx014 multiply 9.999999999 9.999999999 -> 100.000000 Inexact Rounded mulx015 multiply 2.50 4 -> 10.00 precision: 6 mulx016 multiply 2.50 4 -> 10.00 mulx017 multiply 9.999999999 9.999999999 -> 100.000 Inexact Rounded -- 1999.12.21: next one is a edge case if intermediate longs are used precision: 15 mulx019 multiply 999999999999 9765625 -> 9.76562499999023E+18 Inexact Rounded precision: 30 mulx160 multiply 999999999999 9765625 -> 9765624999990234375 precision: 9 ----- -- zeros, etc. mulx020 multiply 0 0 -> 0 mulx021 multiply 0 -0 -> -0 mulx022 multiply -0 0 -> -0 mulx023 multiply -0 -0 -> 0 mulx030 multiply 5.00 1E-3 -> 0.00500 mulx031 multiply 00.00 0.000 -> 0.00000 mulx032 multiply 00.00 0E-3 -> 0.00000 -- rhs is 0 mulx033 multiply 0E-3 00.00 -> 0.00000 -- lhs is 0 mulx034 multiply -5.00 1E-3 -> -0.00500 mulx035 multiply -00.00 0.000 -> -0.00000 mulx036 multiply -00.00 0E-3 -> -0.00000 -- rhs is 0 mulx037 multiply -0E-3 00.00 -> -0.00000 -- lhs is 0 mulx038 multiply 5.00 -1E-3 -> -0.00500 mulx039 multiply 00.00 -0.000 -> -0.00000 mulx040 multiply 00.00 -0E-3 -> -0.00000 -- rhs is 0 mulx041 multiply 0E-3 -00.00 -> -0.00000 -- lhs is 0 mulx042 multiply -5.00 -1E-3 -> 0.00500 mulx043 multiply -00.00 -0.000 -> 0.00000 mulx044 multiply -00.00 -0E-3 -> 0.00000 -- rhs is 0 mulx045 multiply -0E-3 -00.00 -> 0.00000 -- lhs is 0 -- examples from decarith mulx050 multiply 1.20 3 -> 3.60 mulx051 multiply 7 3 -> 21 mulx052 multiply 0.9 0.8 -> 0.72 mulx053 multiply 0.9 -0 -> -0.0 mulx054 multiply 654321 654321 -> 4.28135971E+11 Inexact Rounded mulx060 multiply 123.45 1e7 -> 1.2345E+9 mulx061 multiply 123.45 1e8 -> 1.2345E+10 mulx062 multiply 123.45 1e+9 -> 1.2345E+11 mulx063 multiply 123.45 1e10 -> 1.2345E+12 mulx064 multiply 123.45 1e11 -> 1.2345E+13 mulx065 multiply 123.45 1e12 -> 1.2345E+14 mulx066 multiply 123.45 1e13 -> 1.2345E+15 -- test some intermediate lengths precision: 9 mulx080 multiply 0.1 123456789 -> 12345678.9 mulx081 multiply 0.1 1234567891 -> 123456789 Inexact Rounded mulx082 multiply 0.1 12345678912 -> 1.23456789E+9 Inexact Rounded mulx083 multiply 0.1 12345678912345 -> 1.23456789E+12 Inexact Rounded mulx084 multiply 0.1 123456789 -> 12345678.9 precision: 8 mulx085 multiply 0.1 12345678912 -> 1.2345679E+9 Inexact Rounded mulx086 multiply 0.1 12345678912345 -> 1.2345679E+12 Inexact Rounded precision: 7 mulx087 multiply 0.1 12345678912 -> 1.234568E+9 Inexact Rounded mulx088 multiply 0.1 12345678912345 -> 1.234568E+12 Inexact Rounded precision: 9 mulx090 multiply 123456789 0.1 -> 12345678.9 mulx091 multiply 1234567891 0.1 -> 123456789 Inexact Rounded mulx092 multiply 12345678912 0.1 -> 1.23456789E+9 Inexact Rounded mulx093 multiply 12345678912345 0.1 -> 1.23456789E+12 Inexact Rounded mulx094 multiply 123456789 0.1 -> 12345678.9 precision: 8 mulx095 multiply 12345678912 0.1 -> 1.2345679E+9 Inexact Rounded mulx096 multiply 12345678912345 0.1 -> 1.2345679E+12 Inexact Rounded precision: 7 mulx097 multiply 12345678912 0.1 -> 1.234568E+9 Inexact Rounded mulx098 multiply 12345678912345 0.1 -> 1.234568E+12 Inexact Rounded -- test some more edge cases and carries maxexponent: 9999 minexponent: -9999 precision: 33 mulx101 multiply 9 9 -> 81 mulx102 multiply 9 90 -> 810 mulx103 multiply 9 900 -> 8100 mulx104 multiply 9 9000 -> 81000 mulx105 multiply 9 90000 -> 810000 mulx106 multiply 9 900000 -> 8100000 mulx107 multiply 9 9000000 -> 81000000 mulx108 multiply 9 90000000 -> 810000000 mulx109 multiply 9 900000000 -> 8100000000 mulx110 multiply 9 9000000000 -> 81000000000 mulx111 multiply 9 90000000000 -> 810000000000 mulx112 multiply 9 900000000000 -> 8100000000000 mulx113 multiply 9 9000000000000 -> 81000000000000 mulx114 multiply 9 90000000000000 -> 810000000000000 mulx115 multiply 9 900000000000000 -> 8100000000000000 mulx116 multiply 9 9000000000000000 -> 81000000000000000 mulx117 multiply 9 90000000000000000 -> 810000000000000000 mulx118 multiply 9 900000000000000000 -> 8100000000000000000 mulx119 multiply 9 9000000000000000000 -> 81000000000000000000 mulx120 multiply 9 90000000000000000000 -> 810000000000000000000 mulx121 multiply 9 900000000000000000000 -> 8100000000000000000000 mulx122 multiply 9 9000000000000000000000 -> 81000000000000000000000 mulx123 multiply 9 90000000000000000000000 -> 810000000000000000000000 -- test some more edge cases without carries mulx131 multiply 3 3 -> 9 mulx132 multiply 3 30 -> 90 mulx133 multiply 3 300 -> 900 mulx134 multiply 3 3000 -> 9000 mulx135 multiply 3 30000 -> 90000 mulx136 multiply 3 300000 -> 900000 mulx137 multiply 3 3000000 -> 9000000 mulx138 multiply 3 30000000 -> 90000000 mulx139 multiply 3 300000000 -> 900000000 mulx140 multiply 3 3000000000 -> 9000000000 mulx141 multiply 3 30000000000 -> 90000000000 mulx142 multiply 3 300000000000 -> 900000000000 mulx143 multiply 3 3000000000000 -> 9000000000000 mulx144 multiply 3 30000000000000 -> 90000000000000 mulx145 multiply 3 300000000000000 -> 900000000000000 mulx146 multiply 3 3000000000000000 -> 9000000000000000 mulx147 multiply 3 30000000000000000 -> 90000000000000000 mulx148 multiply 3 300000000000000000 -> 900000000000000000 mulx149 multiply 3 3000000000000000000 -> 9000000000000000000 mulx150 multiply 3 30000000000000000000 -> 90000000000000000000 mulx151 multiply 3 300000000000000000000 -> 900000000000000000000 mulx152 multiply 3 3000000000000000000000 -> 9000000000000000000000 mulx153 multiply 3 30000000000000000000000 -> 90000000000000000000000 maxexponent: 999999999 minexponent: -999999999 precision: 9 -- test some cases that are close to exponent overflow/underflow mulx170 multiply 1 9e999999999 -> 9E+999999999 mulx171 multiply 1 9.9e999999999 -> 9.9E+999999999 mulx172 multiply 1 9.99e999999999 -> 9.99E+999999999 mulx173 multiply 9e999999999 1 -> 9E+999999999 mulx174 multiply 9.9e999999999 1 -> 9.9E+999999999 mulx176 multiply 9.99e999999999 1 -> 9.99E+999999999 mulx177 multiply 1 9.99999999e999999999 -> 9.99999999E+999999999 mulx178 multiply 9.99999999e999999999 1 -> 9.99999999E+999999999 mulx180 multiply 0.1 9e-999999998 -> 9E-999999999 mulx181 multiply 0.1 99e-999999998 -> 9.9E-999999998 mulx182 multiply 0.1 999e-999999998 -> 9.99E-999999997 mulx183 multiply 0.1 9e-999999998 -> 9E-999999999 mulx184 multiply 0.1 99e-999999998 -> 9.9E-999999998 mulx185 multiply 0.1 999e-999999998 -> 9.99E-999999997 mulx186 multiply 0.1 999e-999999997 -> 9.99E-999999996 mulx187 multiply 0.1 9999e-999999997 -> 9.999E-999999995 mulx188 multiply 0.1 99999e-999999997 -> 9.9999E-999999994 mulx190 multiply 1 9e-999999998 -> 9E-999999998 mulx191 multiply 1 99e-999999998 -> 9.9E-999999997 mulx192 multiply 1 999e-999999998 -> 9.99E-999999996 mulx193 multiply 9e-999999998 1 -> 9E-999999998 mulx194 multiply 99e-999999998 1 -> 9.9E-999999997 mulx195 multiply 999e-999999998 1 -> 9.99E-999999996 mulx196 multiply 1e-599999999 1e-400000000 -> 1E-999999999 mulx197 multiply 1e-600000000 1e-399999999 -> 1E-999999999 mulx198 multiply 1.2e-599999999 1.2e-400000000 -> 1.44E-999999999 mulx199 multiply 1.2e-600000000 1.2e-399999999 -> 1.44E-999999999 mulx201 multiply 1e599999999 1e400000000 -> 1E+999999999 mulx202 multiply 1e600000000 1e399999999 -> 1E+999999999 mulx203 multiply 1.2e599999999 1.2e400000000 -> 1.44E+999999999 mulx204 multiply 1.2e600000000 1.2e399999999 -> 1.44E+999999999 -- long operand triangle precision: 33 mulx246 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369671916511992830 Inexact Rounded precision: 32 mulx247 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967191651199283 Inexact Rounded precision: 31 mulx248 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933696719165119928 Inexact Rounded precision: 30 mulx249 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369671916511993 Inexact Rounded precision: 29 mulx250 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967191651199 Inexact Rounded precision: 28 mulx251 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933696719165120 Inexact Rounded precision: 27 mulx252 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369671916512 Inexact Rounded precision: 26 mulx253 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967191651 Inexact Rounded precision: 25 mulx254 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933696719165 Inexact Rounded precision: 24 mulx255 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369671917 Inexact Rounded precision: 23 mulx256 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967192 Inexact Rounded precision: 22 mulx257 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933696719 Inexact Rounded precision: 21 mulx258 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369672 Inexact Rounded precision: 20 mulx259 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967 Inexact Rounded precision: 19 mulx260 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933697 Inexact Rounded precision: 18 mulx261 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193370 Inexact Rounded precision: 17 mulx262 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119337 Inexact Rounded precision: 16 mulx263 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011934 Inexact Rounded precision: 15 mulx264 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193 Inexact Rounded precision: 14 mulx265 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119 Inexact Rounded precision: 13 mulx266 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908012 Inexact Rounded precision: 12 mulx267 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801 Inexact Rounded precision: 11 mulx268 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080 Inexact Rounded precision: 10 mulx269 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908 Inexact Rounded precision: 9 mulx270 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.291 Inexact Rounded precision: 8 mulx271 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29 Inexact Rounded precision: 7 mulx272 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.3 Inexact Rounded precision: 6 mulx273 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433 Inexact Rounded precision: 5 mulx274 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1.4543E+5 Inexact Rounded precision: 4 mulx275 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1.454E+5 Inexact Rounded precision: 3 mulx276 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1.45E+5 Inexact Rounded precision: 2 mulx277 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1.5E+5 Inexact Rounded precision: 1 mulx278 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1E+5 Inexact Rounded -- tryzeros cases precision: 7 rounding: half_up maxExponent: 92 minexponent: -92 mulx504 multiply 0E-60 1000E-60 -> 0E-98 Clamped mulx505 multiply 100E+60 0E+60 -> 0E+92 Clamped -- mixed with zeros maxexponent: 999999999 minexponent: -999999999 precision: 9 mulx541 multiply 0 -1 -> -0 mulx542 multiply -0 -1 -> 0 mulx543 multiply 0 1 -> 0 mulx544 multiply -0 1 -> -0 mulx545 multiply -1 0 -> -0 mulx546 multiply -1 -0 -> 0 mulx547 multiply 1 0 -> 0 mulx548 multiply 1 -0 -> -0 mulx551 multiply 0.0 -1 -> -0.0 mulx552 multiply -0.0 -1 -> 0.0 mulx553 multiply 0.0 1 -> 0.0 mulx554 multiply -0.0 1 -> -0.0 mulx555 multiply -1.0 0 -> -0.0 mulx556 multiply -1.0 -0 -> 0.0 mulx557 multiply 1.0 0 -> 0.0 mulx558 multiply 1.0 -0 -> -0.0 mulx561 multiply 0 -1.0 -> -0.0 mulx562 multiply -0 -1.0 -> 0.0 mulx563 multiply 0 1.0 -> 0.0 mulx564 multiply -0 1.0 -> -0.0 mulx565 multiply -1 0.0 -> -0.0 mulx566 multiply -1 -0.0 -> 0.0 mulx567 multiply 1 0.0 -> 0.0 mulx568 multiply 1 -0.0 -> -0.0 mulx571 multiply 0.0 -1.0 -> -0.00 mulx572 multiply -0.0 -1.0 -> 0.00 mulx573 multiply 0.0 1.0 -> 0.00 mulx574 multiply -0.0 1.0 -> -0.00 mulx575 multiply -1.0 0.0 -> -0.00 mulx576 multiply -1.0 -0.0 -> 0.00 mulx577 multiply 1.0 0.0 -> 0.00 mulx578 multiply 1.0 -0.0 -> -0.00 -- Specials mulx580 multiply Inf -Inf -> -Infinity mulx581 multiply Inf -1000 -> -Infinity mulx582 multiply Inf -1 -> -Infinity mulx583 multiply Inf -0 -> NaN Invalid_operation mulx584 multiply Inf 0 -> NaN Invalid_operation mulx585 multiply Inf 1 -> Infinity mulx586 multiply Inf 1000 -> Infinity mulx587 multiply Inf Inf -> Infinity mulx588 multiply -1000 Inf -> -Infinity mulx589 multiply -Inf Inf -> -Infinity mulx590 multiply -1 Inf -> -Infinity mulx591 multiply -0 Inf -> NaN Invalid_operation mulx592 multiply 0 Inf -> NaN Invalid_operation mulx593 multiply 1 Inf -> Infinity mulx594 multiply 1000 Inf -> Infinity mulx595 multiply Inf Inf -> Infinity mulx600 multiply -Inf -Inf -> Infinity mulx601 multiply -Inf -1000 -> Infinity mulx602 multiply -Inf -1 -> Infinity mulx603 multiply -Inf -0 -> NaN Invalid_operation mulx604 multiply -Inf 0 -> NaN Invalid_operation mulx605 multiply -Inf 1 -> -Infinity mulx606 multiply -Inf 1000 -> -Infinity mulx607 multiply -Inf Inf -> -Infinity mulx608 multiply -1000 Inf -> -Infinity mulx609 multiply -Inf -Inf -> Infinity mulx610 multiply -1 -Inf -> Infinity mulx611 multiply -0 -Inf -> NaN Invalid_operation mulx612 multiply 0 -Inf -> NaN Invalid_operation mulx613 multiply 1 -Inf -> -Infinity mulx614 multiply 1000 -Inf -> -Infinity mulx615 multiply Inf -Inf -> -Infinity mulx621 multiply NaN -Inf -> NaN mulx622 multiply NaN -1000 -> NaN mulx623 multiply NaN -1 -> NaN mulx624 multiply NaN -0 -> NaN mulx625 multiply NaN 0 -> NaN mulx626 multiply NaN 1 -> NaN mulx627 multiply NaN 1000 -> NaN mulx628 multiply NaN Inf -> NaN mulx629 multiply NaN NaN -> NaN mulx630 multiply -Inf NaN -> NaN mulx631 multiply -1000 NaN -> NaN mulx632 multiply -1 NaN -> NaN mulx633 multiply -0 NaN -> NaN mulx634 multiply 0 NaN -> NaN mulx635 multiply 1 NaN -> NaN mulx636 multiply 1000 NaN -> NaN mulx637 multiply Inf NaN -> NaN mulx641 multiply sNaN -Inf -> NaN Invalid_operation mulx642 multiply sNaN -1000 -> NaN Invalid_operation mulx643 multiply sNaN -1 -> NaN Invalid_operation mulx644 multiply sNaN -0 -> NaN Invalid_operation mulx645 multiply sNaN 0 -> NaN Invalid_operation mulx646 multiply sNaN 1 -> NaN Invalid_operation mulx647 multiply sNaN 1000 -> NaN Invalid_operation mulx648 multiply sNaN NaN -> NaN Invalid_operation mulx649 multiply sNaN sNaN -> NaN Invalid_operation mulx650 multiply NaN sNaN -> NaN Invalid_operation mulx651 multiply -Inf sNaN -> NaN Invalid_operation mulx652 multiply -1000 sNaN -> NaN Invalid_operation mulx653 multiply -1 sNaN -> NaN Invalid_operation mulx654 multiply -0 sNaN -> NaN Invalid_operation mulx655 multiply 0 sNaN -> NaN Invalid_operation mulx656 multiply 1 sNaN -> NaN Invalid_operation mulx657 multiply 1000 sNaN -> NaN Invalid_operation mulx658 multiply Inf sNaN -> NaN Invalid_operation mulx659 multiply NaN sNaN -> NaN Invalid_operation -- overflow and underflow tests .. note subnormal results maxexponent: 999999999 minexponent: -999999999 mulx730 multiply +1.23456789012345E-0 9E+999999999 -> Infinity Inexact Overflow Rounded mulx731 multiply 9E+999999999 +1.23456789012345E-0 -> Infinity Inexact Overflow Rounded mulx732 multiply +0.100 9E-999999999 -> 9.00E-1000000000 Subnormal mulx733 multiply 9E-999999999 +0.100 -> 9.00E-1000000000 Subnormal mulx735 multiply -1.23456789012345E-0 9E+999999999 -> -Infinity Inexact Overflow Rounded mulx736 multiply 9E+999999999 -1.23456789012345E-0 -> -Infinity Inexact Overflow Rounded mulx737 multiply -0.100 9E-999999999 -> -9.00E-1000000000 Subnormal mulx738 multiply 9E-999999999 -0.100 -> -9.00E-1000000000 Subnormal mulx739 multiply 1e-599999999 1e-400000001 -> 1E-1000000000 Subnormal mulx740 multiply 1e-599999999 1e-400000000 -> 1E-999999999 mulx741 multiply 1e-600000000 1e-400000000 -> 1E-1000000000 Subnormal mulx742 multiply 9e-999999998 0.01 -> 9E-1000000000 Subnormal mulx743 multiply 9e-999999998 0.1 -> 9E-999999999 mulx744 multiply 0.01 9e-999999998 -> 9E-1000000000 Subnormal mulx745 multiply 1e599999999 1e400000001 -> Infinity Overflow Inexact Rounded mulx746 multiply 1e599999999 1e400000000 -> 1E+999999999 mulx747 multiply 1e600000000 1e400000000 -> Infinity Overflow Inexact Rounded mulx748 multiply 9e999999998 100 -> Infinity Overflow Inexact Rounded mulx749 multiply 9e999999998 10 -> 9.0E+999999999 mulx750 multiply 100 9e999999998 -> Infinity Overflow Inexact Rounded -- signs mulx751 multiply 1e+777777777 1e+411111111 -> Infinity Overflow Inexact Rounded mulx752 multiply 1e+777777777 -1e+411111111 -> -Infinity Overflow Inexact Rounded mulx753 multiply -1e+777777777 1e+411111111 -> -Infinity Overflow Inexact Rounded mulx754 multiply -1e+777777777 -1e+411111111 -> Infinity Overflow Inexact Rounded mulx755 multiply 1e-777777777 1e-411111111 -> 0E-1000000007 Underflow Subnormal Inexact Rounded mulx756 multiply 1e-777777777 -1e-411111111 -> -0E-1000000007 Underflow Subnormal Inexact Rounded mulx757 multiply -1e-777777777 1e-411111111 -> -0E-1000000007 Underflow Subnormal Inexact Rounded mulx758 multiply -1e-777777777 -1e-411111111 -> 0E-1000000007 Underflow Subnormal Inexact Rounded -- 'subnormal' boundary (all hard underflow or overflow in base arithemtic) precision: 9 mulx760 multiply 1e-600000000 1e-400000001 -> 1E-1000000001 Subnormal mulx761 multiply 1e-600000000 1e-400000002 -> 1E-1000000002 Subnormal mulx762 multiply 1e-600000000 1e-400000003 -> 1E-1000000003 Subnormal mulx763 multiply 1e-600000000 1e-400000004 -> 1E-1000000004 Subnormal mulx764 multiply 1e-600000000 1e-400000005 -> 1E-1000000005 Subnormal mulx765 multiply 1e-600000000 1e-400000006 -> 1E-1000000006 Subnormal mulx766 multiply 1e-600000000 1e-400000007 -> 1E-1000000007 Subnormal mulx767 multiply 1e-600000000 1e-400000008 -> 0E-1000000007 Underflow Subnormal Inexact Rounded mulx768 multiply 1e-600000000 1e-400000009 -> 0E-1000000007 Underflow Subnormal Inexact Rounded mulx769 multiply 1e-600000000 1e-400000010 -> 0E-1000000007 Underflow Subnormal Inexact Rounded -- [no equivalent of 'subnormal' for overflow] mulx770 multiply 1e+600000000 1e+400000001 -> Infinity Overflow Inexact Rounded mulx771 multiply 1e+600000000 1e+400000002 -> Infinity Overflow Inexact Rounded mulx772 multiply 1e+600000000 1e+400000003 -> Infinity Overflow Inexact Rounded mulx773 multiply 1e+600000000 1e+400000004 -> Infinity Overflow Inexact Rounded mulx774 multiply 1e+600000000 1e+400000005 -> Infinity Overflow Inexact Rounded mulx775 multiply 1e+600000000 1e+400000006 -> Infinity Overflow Inexact Rounded mulx776 multiply 1e+600000000 1e+400000007 -> Infinity Overflow Inexact Rounded mulx777 multiply 1e+600000000 1e+400000008 -> Infinity Overflow Inexact Rounded mulx778 multiply 1e+600000000 1e+400000009 -> Infinity Overflow Inexact Rounded mulx779 multiply 1e+600000000 1e+400000010 -> Infinity Overflow Inexact Rounded -- 'subnormal' test edge condition at higher precisions precision: 99 mulx780 multiply 1e-600000000 1e-400000007 -> 1E-1000000007 Subnormal mulx781 multiply 1e-600000000 1e-400000008 -> 1E-1000000008 Subnormal mulx782 multiply 1e-600000000 1e-400000097 -> 1E-1000000097 Subnormal mulx783 multiply 1e-600000000 1e-400000098 -> 0E-1000000097 Underflow Subnormal Inexact Rounded precision: 999 mulx784 multiply 1e-600000000 1e-400000997 -> 1E-1000000997 Subnormal mulx785 multiply 1e-600000000 1e-400000998 -> 0E-1000000997 Underflow Subnormal Inexact Rounded -- following testcases [through mulx800] not yet run against code precision: 9999 mulx786 multiply 1e-600000000 1e-400009997 -> 1E-1000009997 Subnormal mulx787 multiply 1e-600000000 1e-400009998 -> 0E-1000009997 Underflow Subnormal Inexact Rounded precision: 99999 mulx788 multiply 1e-600000000 1e-400099997 -> 1E-1000099997 Subnormal mulx789 multiply 1e-600000000 1e-400099998 -> 0E-1000099997 Underflow Subnormal Inexact Rounded precision: 999999 mulx790 multiply 1e-600000000 1e-400999997 -> 1E-1000999997 Subnormal mulx791 multiply 1e-600000000 1e-400999998 -> 0E-1000999997 Underflow Subnormal Inexact Rounded precision: 9999999 mulx792 multiply 1e-600000000 1e-409999997 -> 1E-1009999997 Subnormal mulx793 multiply 1e-600000000 1e-409999998 -> 0E-1009999997 Underflow Subnormal Inexact Rounded precision: 99999999 mulx794 multiply 1e-600000000 1e-499999997 -> 1E-1099999997 Subnormal mulx795 multiply 1e-600000000 1e-499999998 -> 0E-1099999997 Underflow Subnormal Inexact Rounded precision: 999999999 mulx796 multiply 1e-999999999 1e-999999997 -> 1E-1999999996 Subnormal mulx797 multiply 1e-999999999 1e-999999998 -> 1E-1999999997 Subnormal mulx798 multiply 1e-999999999 1e-999999999 -> 0E-1999999997 Underflow Subnormal Inexact Rounded mulx799 multiply 1e-600000000 1e-400000007 -> 1E-1000000007 Subnormal mulx800 multiply 1e-600000000 1e-400000008 -> 1E-1000000008 Subnormal -- test subnormals rounding precision: 5 maxExponent: 999 minexponent: -999 rounding: half_even mulx801 multiply 1.0000E-999 1 -> 1.0000E-999 mulx802 multiply 1.000E-999 1e-1 -> 1.000E-1000 Subnormal mulx803 multiply 1.00E-999 1e-2 -> 1.00E-1001 Subnormal mulx804 multiply 1.0E-999 1e-3 -> 1.0E-1002 Subnormal mulx805 multiply 1.0E-999 1e-4 -> 1E-1003 Subnormal Rounded mulx806 multiply 1.3E-999 1e-4 -> 1E-1003 Underflow Subnormal Inexact Rounded mulx807 multiply 1.5E-999 1e-4 -> 2E-1003 Underflow Subnormal Inexact Rounded mulx808 multiply 1.7E-999 1e-4 -> 2E-1003 Underflow Subnormal Inexact Rounded mulx809 multiply 2.3E-999 1e-4 -> 2E-1003 Underflow Subnormal Inexact Rounded mulx810 multiply 2.5E-999 1e-4 -> 2E-1003 Underflow Subnormal Inexact Rounded mulx811 multiply 2.7E-999 1e-4 -> 3E-1003 Underflow Subnormal Inexact Rounded mulx812 multiply 1.49E-999 1e-4 -> 1E-1003 Underflow Subnormal Inexact Rounded mulx813 multiply 1.50E-999 1e-4 -> 2E-1003 Underflow Subnormal Inexact Rounded mulx814 multiply 1.51E-999 1e-4 -> 2E-1003 Underflow Subnormal Inexact Rounded mulx815 multiply 2.49E-999 1e-4 -> 2E-1003 Underflow Subnormal Inexact Rounded mulx816 multiply 2.50E-999 1e-4 -> 2E-1003 Underflow Subnormal Inexact Rounded mulx817 multiply 2.51E-999 1e-4 -> 3E-1003 Underflow Subnormal Inexact Rounded mulx818 multiply 1E-999 1e-4 -> 1E-1003 Subnormal mulx819 multiply 3E-999 1e-5 -> 0E-1003 Underflow Subnormal Inexact Rounded mulx820 multiply 5E-999 1e-5 -> 0E-1003 Underflow Subnormal Inexact Rounded mulx821 multiply 7E-999 1e-5 -> 1E-1003 Underflow Subnormal Inexact Rounded mulx822 multiply 9E-999 1e-5 -> 1E-1003 Underflow Subnormal Inexact Rounded mulx823 multiply 9.9E-999 1e-5 -> 1E-1003 Underflow Subnormal Inexact Rounded mulx824 multiply 1E-999 -1e-4 -> -1E-1003 Subnormal mulx825 multiply 3E-999 -1e-5 -> -0E-1003 Underflow Subnormal Inexact Rounded mulx826 multiply -5E-999 1e-5 -> -0E-1003 Underflow Subnormal Inexact Rounded mulx827 multiply 7E-999 -1e-5 -> -1E-1003 Underflow Subnormal Inexact Rounded mulx828 multiply -9E-999 1e-5 -> -1E-1003 Underflow Subnormal Inexact Rounded mulx829 multiply 9.9E-999 -1e-5 -> -1E-1003 Underflow Subnormal Inexact Rounded mulx830 multiply 3.0E-999 -1e-5 -> -0E-1003 Underflow Subnormal Inexact Rounded mulx831 multiply 1.0E-501 1e-501 -> 1.0E-1002 Subnormal mulx832 multiply 2.0E-501 2e-501 -> 4.0E-1002 Subnormal mulx833 multiply 4.0E-501 4e-501 -> 1.60E-1001 Subnormal mulx834 multiply 10.0E-501 10e-501 -> 1.000E-1000 Subnormal mulx835 multiply 30.0E-501 30e-501 -> 9.000E-1000 Subnormal mulx836 multiply 40.0E-501 40e-501 -> 1.6000E-999 -- squares mulx840 multiply 1E-502 1e-502 -> 0E-1003 Underflow Subnormal Inexact Rounded mulx841 multiply 1E-501 1e-501 -> 1E-1002 Subnormal mulx842 multiply 2E-501 2e-501 -> 4E-1002 Subnormal mulx843 multiply 4E-501 4e-501 -> 1.6E-1001 Subnormal mulx844 multiply 10E-501 10e-501 -> 1.00E-1000 Subnormal mulx845 multiply 30E-501 30e-501 -> 9.00E-1000 Subnormal mulx846 multiply 40E-501 40e-501 -> 1.600E-999 -- cubes mulx850 multiply 1E-670 1e-335 -> 0E-1003 Underflow Subnormal Inexact Rounded mulx851 multiply 1E-668 1e-334 -> 1E-1002 Subnormal mulx852 multiply 4E-668 2e-334 -> 8E-1002 Subnormal mulx853 multiply 9E-668 3e-334 -> 2.7E-1001 Subnormal mulx854 multiply 16E-668 4e-334 -> 6.4E-1001 Subnormal mulx855 multiply 25E-668 5e-334 -> 1.25E-1000 Subnormal mulx856 multiply 10E-668 100e-334 -> 1.000E-999 -- test from 0.099 ** 999 at 15 digits precision: 19 mulx860 multiply 6636851557994578716E-520 6636851557994578716E-520 -> 4.40477986028551E-1003 Underflow Subnormal Inexact Rounded -- Long operand overflow may be a different path precision: 3 maxExponent: 999999999 minexponent: -999999999 mulx870 multiply 1 9.999E+999999999 -> Infinity Inexact Overflow Rounded mulx871 multiply 1 -9.999E+999999999 -> -Infinity Inexact Overflow Rounded mulx872 multiply 9.999E+999999999 1 -> Infinity Inexact Overflow Rounded mulx873 multiply -9.999E+999999999 1 -> -Infinity Inexact Overflow Rounded -- check for double-rounded subnormals precision: 5 maxexponent: 79 minexponent: -79 mulx881 multiply 1.2347E-40 1.2347E-40 -> 1.524E-80 Inexact Rounded Subnormal Underflow mulx882 multiply 1.234E-40 1.234E-40 -> 1.523E-80 Inexact Rounded Subnormal Underflow mulx883 multiply 1.23E-40 1.23E-40 -> 1.513E-80 Inexact Rounded Subnormal Underflow mulx884 multiply 1.2E-40 1.2E-40 -> 1.44E-80 Subnormal mulx885 multiply 1.2E-40 1.2E-41 -> 1.44E-81 Subnormal mulx886 multiply 1.2E-40 1.2E-42 -> 1.4E-82 Subnormal Inexact Rounded Underflow mulx887 multiply 1.2E-40 1.3E-42 -> 1.6E-82 Subnormal Inexact Rounded Underflow mulx888 multiply 1.3E-40 1.3E-42 -> 1.7E-82 Subnormal Inexact Rounded Underflow mulx891 multiply 1.2345E-39 1.234E-40 -> 1.5234E-79 Inexact Rounded mulx892 multiply 1.23456E-39 1.234E-40 -> 1.5234E-79 Inexact Rounded mulx893 multiply 1.2345E-40 1.234E-40 -> 1.523E-80 Inexact Rounded Subnormal Underflow mulx894 multiply 1.23456E-40 1.234E-40 -> 1.523E-80 Inexact Rounded Subnormal Underflow mulx895 multiply 1.2345E-41 1.234E-40 -> 1.52E-81 Inexact Rounded Subnormal Underflow mulx896 multiply 1.23456E-41 1.234E-40 -> 1.52E-81 Inexact Rounded Subnormal Underflow -- Null tests mulx900 multiply 10 # -> NaN Invalid_operation mulx901 multiply # 10 -> NaN Invalid_operation --- NEW FILE: minus.decTest --- ------------------------------------------------------------------------ -- minus.decTest -- decimal negation -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- This set of tests primarily tests the existence of the operator. -- Subtraction, rounding, and more overflows are tested elsewhere. extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 minx001 minus '1' -> '-1' minx002 minus '-1' -> '1' minx003 minus '1.00' -> '-1.00' minx004 minus '-1.00' -> '1.00' minx005 minus '0' -> '0' minx006 minus '0.00' -> '0.00' minx007 minus '00.0' -> '0.0' minx008 minus '00.00' -> '0.00' minx009 minus '00' -> '0' minx010 minus '-2' -> '2' minx011 minus '2' -> '-2' minx012 minus '-2.00' -> '2.00' minx013 minus '2.00' -> '-2.00' minx014 minus '-0' -> '0' minx015 minus '-0.00' -> '0.00' minx016 minus '-00.0' -> '0.0' minx017 minus '-00.00' -> '0.00' minx018 minus '-00' -> '0' -- "lhs" zeros in plus and minus have exponent = operand minx020 minus '-0E3' -> '0E+3' minx021 minus '-0E2' -> '0E+2' minx022 minus '-0E1' -> '0E+1' minx023 minus '-0E0' -> '0' minx024 minus '+0E0' -> '0' minx025 minus '+0E1' -> '0E+1' minx026 minus '+0E2' -> '0E+2' minx027 minus '+0E3' -> '0E+3' minx030 minus '-5E3' -> '5E+3' minx031 minus '-5E8' -> '5E+8' minx032 minus '-5E13' -> '5E+13' minx033 minus '-5E18' -> '5E+18' minx034 minus '+5E3' -> '-5E+3' minx035 minus '+5E8' -> '-5E+8' minx036 minus '+5E13' -> '-5E+13' minx037 minus '+5E18' -> '-5E+18' minx050 minus '-2000000' -> '2000000' minx051 minus '2000000' -> '-2000000' precision: 7 minx052 minus '-2000000' -> '2000000' minx053 minus '2000000' -> '-2000000' precision: 6 minx054 minus '-2000000' -> '2.00000E+6' Rounded minx055 minus '2000000' -> '-2.00000E+6' Rounded precision: 3 minx056 minus '-2000000' -> '2.00E+6' Rounded minx057 minus '2000000' -> '-2.00E+6' Rounded -- more fixed, potential LHS swaps/overlays if done by 0 subtract x precision: 9 minx060 minus '56267E-10' -> '-0.0000056267' minx061 minus '56267E-5' -> '-0.56267' minx062 minus '56267E-2' -> '-562.67' minx063 minus '56267E-1' -> '-5626.7' minx065 minus '56267E-0' -> '-56267' minx066 minus '56267E+0' -> '-56267' minx067 minus '56267E+1' -> '-5.6267E+5' minx068 minus '56267E+2' -> '-5.6267E+6' minx069 minus '56267E+3' -> '-5.6267E+7' minx070 minus '56267E+4' -> '-5.6267E+8' minx071 minus '56267E+5' -> '-5.6267E+9' minx072 minus '56267E+6' -> '-5.6267E+10' minx080 minus '-56267E-10' -> '0.0000056267' minx081 minus '-56267E-5' -> '0.56267' minx082 minus '-56267E-2' -> '562.67' minx083 minus '-56267E-1' -> '5626.7' minx085 minus '-56267E-0' -> '56267' minx086 minus '-56267E+0' -> '56267' minx087 minus '-56267E+1' -> '5.6267E+5' minx088 minus '-56267E+2' -> '5.6267E+6' minx089 minus '-56267E+3' -> '5.6267E+7' minx090 minus '-56267E+4' -> '5.6267E+8' minx091 minus '-56267E+5' -> '5.6267E+9' minx092 minus '-56267E+6' -> '5.6267E+10' -- overflow tests maxexponent: 999999999 minexponent: -999999999 precision: 3 minx100 minus 9.999E+999999999 -> -Infinity Inexact Overflow Rounded minx101 minus -9.999E+999999999 -> Infinity Inexact Overflow Rounded -- subnormals and underflow precision: 3 maxexponent: 999 minexponent: -999 minx110 minus 1.00E-999 -> -1.00E-999 minx111 minus 0.1E-999 -> -1E-1000 Subnormal minx112 minus 0.10E-999 -> -1.0E-1000 Subnormal minx113 minus 0.100E-999 -> -1.0E-1000 Subnormal Rounded minx114 minus 0.01E-999 -> -1E-1001 Subnormal -- next is rounded to Emin minx115 minus 0.999E-999 -> -1.00E-999 Inexact Rounded Subnormal Underflow minx116 minus 0.099E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow minx117 minus 0.009E-999 -> -1E-1001 Inexact Rounded Subnormal Underflow minx118 minus 0.001E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow minx119 minus 0.0009E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow minx120 minus 0.0001E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow minx130 minus -1.00E-999 -> 1.00E-999 minx131 minus -0.1E-999 -> 1E-1000 Subnormal minx132 minus -0.10E-999 -> 1.0E-1000 Subnormal minx133 minus -0.100E-999 -> 1.0E-1000 Subnormal Rounded minx134 minus -0.01E-999 -> 1E-1001 Subnormal -- next is rounded to Emin minx135 minus -0.999E-999 -> 1.00E-999 Inexact Rounded Subnormal Underflow minx136 minus -0.099E-999 -> 1.0E-1000 Inexact Rounded Subnormal Underflow minx137 minus -0.009E-999 -> 1E-1001 Inexact Rounded Subnormal Underflow minx138 minus -0.001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow minx139 minus -0.0009E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow minx140 minus -0.0001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow -- long operand checks maxexponent: 999 minexponent: -999 precision: 9 minx301 minus 12345678000 -> -1.23456780E+10 Rounded minx302 minus 1234567800 -> -1.23456780E+9 Rounded minx303 minus 1234567890 -> -1.23456789E+9 Rounded minx304 minus 1234567891 -> -1.23456789E+9 Inexact Rounded minx305 minus 12345678901 -> -1.23456789E+10 Inexact Rounded minx306 minus 1234567896 -> -1.23456790E+9 Inexact Rounded precision: 15 -- still checking minx321 minus 12345678000 -> -12345678000 minx322 minus 1234567800 -> -1234567800 minx323 minus 1234567890 -> -1234567890 minx324 minus 1234567891 -> -1234567891 minx325 minus 12345678901 -> -12345678901 minx326 minus 1234567896 -> -1234567896 -- specials minx420 minus 'Inf' -> '-Infinity' minx421 minus '-Inf' -> 'Infinity' minx422 minus NaN -> NaN minx423 minus sNaN -> NaN Invalid_operation -- Null tests minx900 minus # -> NaN Invalid_operation --- NEW FILE: min.decTest --- ------------------------------------------------------------------------ -- min.decTest -- decimal minimum -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- sanity checks mnmx001 min -2 -2 -> -2 mnmx002 min -2 -1 -> -2 mnmx003 min -2 0 -> -2 mnmx004 min -2 1 -> -2 mnmx005 min -2 2 -> -2 mnmx006 min -1 -2 -> -2 mnmx007 min -1 -1 -> -1 mnmx008 min -1 0 -> -1 mnmx009 min -1 1 -> -1 mnmx010 min -1 2 -> -1 mnmx011 min 0 -2 -> -2 mnmx012 min 0 -1 -> -1 mnmx013 min 0 0 -> 0 mnmx014 min 0 1 -> 0 mnmx015 min 0 2 -> 0 mnmx016 min 1 -2 -> -2 mnmx017 min 1 -1 -> -1 mnmx018 min 1 0 -> 0 mnmx019 min 1 1 -> 1 mnmx020 min 1 2 -> 1 mnmx021 min 2 -2 -> -2 mnmx022 min 2 -1 -> -1 mnmx023 min 2 0 -> 0 mnmx025 min 2 1 -> 1 mnmx026 min 2 2 -> 2 -- extended zeros mnmx030 min 0 0 -> 0 mnmx031 min 0 -0 -> 0 mnmx032 min 0 -0.0 -> 0 mnmx033 min 0 0.0 -> 0 mnmx034 min -0 0 -> -0 mnmx035 min -0 -0 -> -0 mnmx036 min -0 -0.0 -> -0 mnmx037 min -0 0.0 -> -0 mnmx038 min 0.0 0 -> 0.0 mnmx039 min 0.0 -0 -> 0.0 mnmx040 min 0.0 -0.0 -> 0.0 mnmx041 min 0.0 0.0 -> 0.0 mnmx042 min -0.0 0 -> -0.0 mnmx043 min -0.0 -0 -> -0.0 mnmx044 min -0.0 -0.0 -> -0.0 mnmx045 min -0.0 0.0 -> -0.0 mnmx046 min -0E1 0E2 -> -0E+1 mnmx047 min 0E2 0E1 -> 0E+2 mnmx048 min 0E1 0E2 -> 0E+1 mnmx049 min -0E3 -0E2 -> -0E+3 -- Specials precision: 9 mnmx090 min Inf -Inf -> -Infinity mnmx091 min Inf -1000 -> -1000 mnmx092 min Inf -1 -> -1 mnmx093 min Inf -0 -> -0 mnmx094 min Inf 0 -> 0 mnmx095 min Inf 1 -> 1 mnmx096 min Inf 1000 -> 1000 mnmx097 min Inf Inf -> Infinity mnmx098 min -1000 Inf -> -1000 mnmx099 min -Inf Inf -> -Infinity mnmx100 min -1 Inf -> -1 mnmx101 min -0 Inf -> -0 mnmx102 min 0 Inf -> 0 mnmx103 min 1 Inf -> 1 mnmx104 min 1000 Inf -> 1000 mnmx105 min Inf Inf -> Infinity mnmx120 min -Inf -Inf -> -Infinity mnmx121 min -Inf -1000 -> -Infinity mnmx122 min -Inf -1 -> -Infinity mnmx123 min -Inf -0 -> -Infinity mnmx124 min -Inf 0 -> -Infinity mnmx125 min -Inf 1 -> -Infinity mnmx126 min -Inf 1000 -> -Infinity mnmx127 min -Inf Inf -> -Infinity mnmx128 min -Inf -Inf -> -Infinity mnmx129 min -1000 -Inf -> -Infinity mnmx130 min -1 -Inf -> -Infinity mnmx131 min -0 -Inf -> -Infinity mnmx132 min 0 -Inf -> -Infinity mnmx133 min 1 -Inf -> -Infinity mnmx134 min 1000 -Inf -> -Infinity mnmx135 min Inf -Inf -> -Infinity mnmx141 min NaN -Inf -> NaN mnmx142 min NaN -1000 -> NaN mnmx143 min NaN -1 -> NaN mnmx144 min NaN -0 -> NaN mnmx145 min NaN 0 -> NaN mnmx146 min NaN 1 -> NaN mnmx147 min NaN 1000 -> NaN mnmx148 min NaN Inf -> NaN mnmx149 min NaN NaN -> NaN mnmx150 min -Inf NaN -> NaN mnmx151 min -1000 NaN -> NaN mnmx152 min -1 NaN -> NaN mnmx153 min -0 NaN -> NaN mnmx154 min 0 NaN -> NaN mnmx155 min 1 NaN -> NaN mnmx156 min 1000 NaN -> NaN mnmx157 min Inf NaN -> NaN mnmx161 min sNaN -Inf -> NaN Invalid_operation mnmx162 min sNaN -1000 -> NaN Invalid_operation mnmx163 min sNaN -1 -> NaN Invalid_operation mnmx164 min sNaN -0 -> NaN Invalid_operation mnmx165 min sNaN 0 -> NaN Invalid_operation mnmx166 min sNaN 1 -> NaN Invalid_operation mnmx167 min sNaN 1000 -> NaN Invalid_operation mnmx168 min sNaN NaN -> NaN Invalid_operation mnmx169 min sNaN sNaN -> NaN Invalid_operation mnmx170 min NaN sNaN -> NaN Invalid_operation mnmx171 min -Inf sNaN -> NaN Invalid_operation mnmx172 min -1000 sNaN -> NaN Invalid_operation mnmx173 min -1 sNaN -> NaN Invalid_operation mnmx174 min -0 sNaN -> NaN Invalid_operation mnmx175 min 0 sNaN -> NaN Invalid_operation mnmx176 min 1 sNaN -> NaN Invalid_operation mnmx177 min 1000 sNaN -> NaN Invalid_operation mnmx178 min Inf sNaN -> NaN Invalid_operation mnmx179 min NaN sNaN -> NaN Invalid_operation -- from examples mnmx180 min '3' '2' -> '2' mnmx181 min '-10' '3' -> '-10' mnmx182 min '1.0' '1' -> '1.0' mnmx183 min '1' '1.0' -> '1' -- rounding checks -- chosen is rounded, or not maxExponent: 999 minexponent: -999 precision: 9 mnmx201 min -12345678000 1 -> -1.23456780E+10 Rounded mnmx202 min 1 -12345678000 -> -1.23456780E+10 Rounded mnmx203 min -1234567800 1 -> -1.23456780E+9 Rounded mnmx204 min 1 -1234567800 -> -1.23456780E+9 Rounded mnmx205 min -1234567890 1 -> -1.23456789E+9 Rounded mnmx206 min 1 -1234567890 -> -1.23456789E+9 Rounded mnmx207 min -1234567891 1 -> -1.23456789E+9 Inexact Rounded mnmx208 min 1 -1234567891 -> -1.23456789E+9 Inexact Rounded mnmx209 min -12345678901 1 -> -1.23456789E+10 Inexact Rounded mnmx210 min 1 -12345678901 -> -1.23456789E+10 Inexact Rounded mnmx211 min -1234567896 1 -> -1.23456790E+9 Inexact Rounded mnmx212 min 1 -1234567896 -> -1.23456790E+9 Inexact Rounded mnmx213 min 1234567891 1 -> 1 mnmx214 min 1 1234567891 -> 1 mnmx215 min 12345678901 1 -> 1 mnmx216 min 1 12345678901 -> 1 mnmx217 min 1234567896 1 -> 1 mnmx218 min 1 1234567896 -> 1 precision: 15 mnmx221 min -12345678000 1 -> -12345678000 mnmx222 min 1 -12345678000 -> -12345678000 mnmx223 min -1234567800 1 -> -1234567800 mnmx224 min 1 -1234567800 -> -1234567800 mnmx225 min -1234567890 1 -> -1234567890 mnmx226 min 1 -1234567890 -> -1234567890 mnmx227 min -1234567891 1 -> -1234567891 mnmx228 min 1 -1234567891 -> -1234567891 mnmx229 min -12345678901 1 -> -12345678901 mnmx230 min 1 -12345678901 -> -12345678901 mnmx231 min -1234567896 1 -> -1234567896 mnmx232 min 1 -1234567896 -> -1234567896 mnmx233 min 1234567891 1 -> 1 mnmx234 min 1 1234567891 -> 1 mnmx235 min 12345678901 1 -> 1 mnmx236 min 1 12345678901 -> 1 mnmx237 min 1234567896 1 -> 1 mnmx238 min 1 1234567896 -> 1 -- overflow and underflow tests .. subnormal results [inputs] now allowed maxExponent: 999999999 minexponent: -999999999 mnmx330 min -1.23456789012345E-0 -9E+999999999 -> -9E+999999999 mnmx331 min -9E+999999999 -1.23456789012345E-0 -> -9E+999999999 mnmx332 min -0.100 -9E-999999999 -> -0.100 mnmx333 min -9E-999999999 -0.100 -> -0.100 mnmx335 min +1.23456789012345E-0 -9E+999999999 -> -9E+999999999 mnmx336 min -9E+999999999 1.23456789012345E-0 -> -9E+999999999 mnmx337 min +0.100 -9E-999999999 -> -9E-999999999 mnmx338 min -9E-999999999 0.100 -> -9E-999999999 mnmx339 min -1e-599999999 -1e-400000001 -> -1E-400000001 mnmx340 min -1e-599999999 -1e-400000000 -> -1E-400000000 mnmx341 min -1e-600000000 -1e-400000000 -> -1E-400000000 mnmx342 min -9e-999999998 -0.01 -> -0.01 mnmx343 min -9e-999999998 -0.1 -> -0.1 mnmx344 min -0.01 -9e-999999998 -> -0.01 mnmx345 min -1e599999999 -1e400000001 -> -1E+599999999 mnmx346 min -1e599999999 -1e400000000 -> -1E+599999999 mnmx347 min -1e600000000 -1e400000000 -> -1E+600000000 mnmx348 min -9e999999998 -100 -> -9E+999999998 mnmx349 min -9e999999998 -10 -> -9E+999999998 mnmx350 min -100 -9e999999998 -> -9E+999999998 -- signs mnmx351 min -1e+777777777 -1e+411111111 -> -1E+777777777 mnmx352 min -1e+777777777 +1e+411111111 -> -1E+777777777 mnmx353 min +1e+777777777 -1e+411111111 -> -1E+411111111 mnmx354 min +1e+777777777 +1e+411111111 -> 1E+411111111 mnmx355 min -1e-777777777 -1e-411111111 -> -1E-411111111 mnmx356 min -1e-777777777 +1e-411111111 -> -1E-777777777 mnmx357 min +1e-777777777 -1e-411111111 -> -1E-411111111 mnmx358 min +1e-777777777 +1e-411111111 -> 1E-777777777 -- overflow tests maxexponent: 999999999 minexponent: -999999999 precision: 3 mnmx400 min 9.999E+999999999 0 -> 0 mnmx401 min -9.999E+999999999 0 -> -Infinity Inexact Overflow Rounded -- subnormals and underflow precision: 3 maxexponent: 999 minexponent: -999 mnmx410 min 1.00E-999 0 -> 0 mnmx411 min 0.1E-999 0 -> 0 mnmx412 min 0.10E-999 0 -> 0 mnmx413 min 0.100E-999 0 -> 0 mnmx414 min 0.01E-999 0 -> 0 mnmx415 min 0.999E-999 0 -> 0 mnmx416 min 0.099E-999 0 -> 0 mnmx417 min 0.009E-999 0 -> 0 mnmx418 min 0.001E-999 0 -> 0 mnmx419 min 0.0009E-999 0 -> 0 mnmx420 min 0.0001E-999 0 -> 0 mnmx430 min -1.00E-999 0 -> -1.00E-999 mnmx431 min -0.1E-999 0 -> -1E-1000 Subnormal mnmx432 min -0.10E-999 0 -> -1.0E-1000 Subnormal mnmx433 min -0.100E-999 0 -> -1.0E-1000 Subnormal Rounded mnmx434 min -0.01E-999 0 -> -1E-1001 Subnormal -- next is rounded to Emin mnmx435 min -0.999E-999 0 -> -1.00E-999 Inexact Rounded Subnormal Underflow mnmx436 min -0.099E-999 0 -> -1.0E-1000 Inexact Rounded Subnormal Underflow mnmx437 min -0.009E-999 0 -> -1E-1001 Inexact Rounded Subnormal Underflow mnmx438 min -0.001E-999 0 -> -0E-1001 Inexact Rounded Subnormal Underflow mnmx439 min -0.0009E-999 0 -> -0E-1001 Inexact Rounded Subnormal Underflow mnmx440 min -0.0001E-999 0 -> -0E-1001 Inexact Rounded Subnormal Underflow -- Null tests mnm900 min 10 # -> NaN Invalid_operation mnm901 min # 10 -> NaN Invalid_operation --- NEW FILE: max.decTest --- ------------------------------------------------------------------------ -- max.decTest -- decimal maximum -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- sanity checks maxx001 max -2 -2 -> -2 maxx002 max -2 -1 -> -1 maxx003 max -2 0 -> 0 maxx004 max -2 1 -> 1 maxx005 max -2 2 -> 2 maxx006 max -1 -2 -> -1 maxx007 max -1 -1 -> -1 maxx008 max -1 0 -> 0 maxx009 max -1 1 -> 1 maxx010 max -1 2 -> 2 maxx011 max 0 -2 -> 0 maxx012 max 0 -1 -> 0 maxx013 max 0 0 -> 0 maxx014 max 0 1 -> 1 maxx015 max 0 2 -> 2 maxx016 max 1 -2 -> 1 maxx017 max 1 -1 -> 1 maxx018 max 1 0 -> 1 maxx019 max 1 1 -> 1 maxx020 max 1 2 -> 2 maxx021 max 2 -2 -> 2 maxx022 max 2 -1 -> 2 maxx023 max 2 0 -> 2 maxx025 max 2 1 -> 2 maxx026 max 2 2 -> 2 -- extended zeros maxx030 max 0 0 -> 0 maxx031 max 0 -0 -> 0 maxx032 max 0 -0.0 -> 0 maxx033 max 0 0.0 -> 0 maxx034 max -0 0 -> -0 -- note: -0 = 0 maxx035 max -0 -0 -> -0 maxx036 max -0 -0.0 -> -0 maxx037 max -0 0.0 -> -0 maxx038 max 0.0 0 -> 0.0 maxx039 max 0.0 -0 -> 0.0 maxx040 max 0.0 -0.0 -> 0.0 maxx041 max 0.0 0.0 -> 0.0 maxx042 max -0.0 0 -> -0.0 maxx043 max -0.0 -0 -> -0.0 maxx044 max -0.0 -0.0 -> -0.0 maxx045 max -0.0 0.0 -> -0.0 maxx046 max -0E1 0E2 -> -0E+1 maxx047 max 0E2 0E1 -> 0E+2 maxx048 max 0E1 0E2 -> 0E+1 maxx049 max -0E3 -0E2 -> -0E+3 -- Specials precision: 9 maxx090 max Inf -Inf -> Infinity maxx091 max Inf -1000 -> Infinity maxx092 max Inf -1 -> Infinity maxx093 max Inf -0 -> Infinity maxx094 max Inf 0 -> Infinity maxx095 max Inf 1 -> Infinity maxx096 max Inf 1000 -> Infinity maxx097 max Inf Inf -> Infinity maxx098 max -1000 Inf -> Infinity maxx099 max -Inf Inf -> Infinity maxx100 max -1 Inf -> Infinity maxx101 max -0 Inf -> Infinity maxx102 max 0 Inf -> Infinity maxx103 max 1 Inf -> Infinity maxx104 max 1000 Inf -> Infinity maxx105 max Inf Inf -> Infinity maxx120 max -Inf -Inf -> -Infinity maxx121 max -Inf -1000 -> -1000 maxx122 max -Inf -1 -> -1 maxx123 max -Inf -0 -> -0 maxx124 max -Inf 0 -> 0 maxx125 max -Inf 1 -> 1 maxx126 max -Inf 1000 -> 1000 maxx127 max -Inf Inf -> Infinity maxx128 max -Inf -Inf -> -Infinity maxx129 max -1000 -Inf -> -1000 maxx130 max -1 -Inf -> -1 maxx131 max -0 -Inf -> -0 maxx132 max 0 -Inf -> 0 maxx133 max 1 -Inf -> 1 maxx134 max 1000 -Inf -> 1000 maxx135 max Inf -Inf -> Infinity maxx141 max NaN -Inf -> NaN maxx142 max NaN -1000 -> NaN maxx143 max NaN -1 -> NaN maxx144 max NaN -0 -> NaN maxx145 max NaN 0 -> NaN maxx146 max NaN 1 -> NaN maxx147 max NaN 1000 -> NaN maxx148 max NaN Inf -> NaN maxx149 max NaN NaN -> NaN maxx150 max -Inf NaN -> NaN maxx151 max -1000 NaN -> NaN maxx152 max -1 NaN -> NaN maxx153 max -0 NaN -> NaN maxx154 max 0 NaN -> NaN maxx155 max 1 NaN -> NaN maxx156 max 1000 NaN -> NaN maxx157 max Inf NaN -> NaN maxx161 max sNaN -Inf -> NaN Invalid_operation maxx162 max sNaN -1000 -> NaN Invalid_operation maxx163 max sNaN -1 -> NaN Invalid_operation maxx164 max sNaN -0 -> NaN Invalid_operation maxx165 max sNaN 0 -> NaN Invalid_operation maxx166 max sNaN 1 -> NaN Invalid_operation maxx167 max sNaN 1000 -> NaN Invalid_operation maxx168 max sNaN NaN -> NaN Invalid_operation maxx169 max sNaN sNaN -> NaN Invalid_operation maxx170 max NaN sNaN -> NaN Invalid_operation maxx171 max -Inf sNaN -> NaN Invalid_operation maxx172 max -1000 sNaN -> NaN Invalid_operation maxx173 max -1 sNaN -> NaN Invalid_operation maxx174 max -0 sNaN -> NaN Invalid_operation maxx175 max 0 sNaN -> NaN Invalid_operation maxx176 max 1 sNaN -> NaN Invalid_operation maxx177 max 1000 sNaN -> NaN Invalid_operation maxx178 max Inf sNaN -> NaN Invalid_operation maxx179 max NaN sNaN -> NaN Invalid_operation -- from examples maxx180 max '3' '2' -> '3' maxx181 max '-10' '3' -> '3' maxx182 max '1.0' '1' -> '1.0' maxx183 max '1' '1.0' -> '1' -- rounding checks maxexponent: 999 minexponent: -999 precision: 9 maxx201 max 12345678000 1 -> 1.23456780E+10 Rounded maxx202 max 1 12345678000 -> 1.23456780E+10 Rounded maxx203 max 1234567800 1 -> 1.23456780E+9 Rounded maxx204 max 1 1234567800 -> 1.23456780E+9 Rounded maxx205 max 1234567890 1 -> 1.23456789E+9 Rounded maxx206 max 1 1234567890 -> 1.23456789E+9 Rounded maxx207 max 1234567891 1 -> 1.23456789E+9 Inexact Rounded maxx208 max 1 1234567891 -> 1.23456789E+9 Inexact Rounded maxx209 max 12345678901 1 -> 1.23456789E+10 Inexact Rounded maxx210 max 1 12345678901 -> 1.23456789E+10 Inexact Rounded maxx211 max 1234567896 1 -> 1.23456790E+9 Inexact Rounded maxx212 max 1 1234567896 -> 1.23456790E+9 Inexact Rounded maxx213 max -1234567891 1 -> 1 maxx214 max 1 -1234567891 -> 1 maxx215 max -12345678901 1 -> 1 maxx216 max 1 -12345678901 -> 1 maxx217 max -1234567896 1 -> 1 maxx218 max 1 -1234567896 -> 1 precision: 15 maxx221 max 12345678000 1 -> 12345678000 maxx222 max 1 12345678000 -> 12345678000 maxx223 max 1234567800 1 -> 1234567800 maxx224 max 1 1234567800 -> 1234567800 maxx225 max 1234567890 1 -> 1234567890 maxx226 max 1 1234567890 -> 1234567890 maxx227 max 1234567891 1 -> 1234567891 maxx228 max 1 1234567891 -> 1234567891 maxx229 max 12345678901 1 -> 12345678901 maxx230 max 1 12345678901 -> 12345678901 maxx231 max 1234567896 1 -> 1234567896 maxx232 max 1 1234567896 -> 1234567896 maxx233 max -1234567891 1 -> 1 maxx234 max 1 -1234567891 -> 1 maxx235 max -12345678901 1 -> 1 maxx236 max 1 -12345678901 -> 1 maxx237 max -1234567896 1 -> 1 maxx238 max 1 -1234567896 -> 1 -- overflow and underflow tests ... maxExponent: 999999999 minexponent: -999999999 maxx330 max +1.23456789012345E-0 9E+999999999 -> 9E+999999999 maxx331 max 9E+999999999 +1.23456789012345E-0 -> 9E+999999999 maxx332 max +0.100 9E-999999999 -> 0.100 maxx333 max 9E-999999999 +0.100 -> 0.100 maxx335 max -1.23456789012345E-0 9E+999999999 -> 9E+999999999 maxx336 max 9E+999999999 -1.23456789012345E-0 -> 9E+999999999 maxx337 max -0.100 9E-999999999 -> 9E-999999999 maxx338 max 9E-999999999 -0.100 -> 9E-999999999 maxx339 max 1e-599999999 1e-400000001 -> 1E-400000001 maxx340 max 1e-599999999 1e-400000000 -> 1E-400000000 maxx341 max 1e-600000000 1e-400000000 -> 1E-400000000 maxx342 max 9e-999999998 0.01 -> 0.01 maxx343 max 9e-999999998 0.1 -> 0.1 maxx344 max 0.01 9e-999999998 -> 0.01 maxx345 max 1e599999999 1e400000001 -> 1E+599999999 maxx346 max 1e599999999 1e400000000 -> 1E+599999999 maxx347 max 1e600000000 1e400000000 -> 1E+600000000 maxx348 max 9e999999998 100 -> 9E+999999998 maxx349 max 9e999999998 10 -> 9E+999999998 maxx350 max 100 9e999999998 -> 9E+999999998 -- signs maxx351 max 1e+777777777 1e+411111111 -> 1E+777777777 maxx352 max 1e+777777777 -1e+411111111 -> 1E+777777777 maxx353 max -1e+777777777 1e+411111111 -> 1E+411111111 maxx354 max -1e+777777777 -1e+411111111 -> -1E+411111111 maxx355 max 1e-777777777 1e-411111111 -> 1E-411111111 maxx356 max 1e-777777777 -1e-411111111 -> 1E-777777777 maxx357 max -1e-777777777 1e-411111111 -> 1E-411111111 maxx358 max -1e-777777777 -1e-411111111 -> -1E-777777777 -- overflow tests maxexponent: 999999999 minexponent: -999999999 precision: 3 maxx400 max 9.999E+999999999 0 -> Infinity Inexact Overflow Rounded maxx401 max -9.999E+999999999 0 -> 0 -- subnormals and underflow precision: 3 maxexponent: 999 minexponent: -999 maxx410 max 1.00E-999 0 -> 1.00E-999 maxx411 max 0.1E-999 0 -> 1E-1000 Subnormal maxx412 max 0.10E-999 0 -> 1.0E-1000 Subnormal maxx413 max 0.100E-999 0 -> 1.0E-1000 Subnormal Rounded maxx414 max 0.01E-999 0 -> 1E-1001 Subnormal -- next is rounded to Emin maxx415 max 0.999E-999 0 -> 1.00E-999 Inexact Rounded Subnormal Underflow maxx416 max 0.099E-999 0 -> 1.0E-1000 Inexact Rounded Subnormal Underflow maxx417 max 0.009E-999 0 -> 1E-1001 Inexact Rounded Subnormal Underflow maxx418 max 0.001E-999 0 -> 0E-1001 Inexact Rounded Subnormal Underflow maxx419 max 0.0009E-999 0 -> 0E-1001 Inexact Rounded Subnormal Underflow maxx420 max 0.0001E-999 0 -> 0E-1001 Inexact Rounded Subnormal Underflow maxx430 max -1.00E-999 0 -> 0 maxx431 max -0.1E-999 0 -> 0 maxx432 max -0.10E-999 0 -> 0 maxx433 max -0.100E-999 0 -> 0 maxx434 max -0.01E-999 0 -> 0 maxx435 max -0.999E-999 0 -> 0 maxx436 max -0.099E-999 0 -> 0 maxx437 max -0.009E-999 0 -> 0 maxx438 max -0.001E-999 0 -> 0 maxx439 max -0.0009E-999 0 -> 0 maxx440 max -0.0001E-999 0 -> 0 -- Null tests maxx900 max 10 # -> NaN Invalid_operation maxx901 max # 10 -> NaN Invalid_operation --- NEW FILE: integer.decTest --- ------------------------------------------------------------------------ -- integer.decTest -- round decimal to integer -- -- Copyright (c) IBM Corporation, 2001, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- This set of tests tests the extended specification 'round-to-integer' -- operation (from IEEE 854). All non-zero results are defined as -- being those from either plus or rescale, so those are assumed to have -- been tested. extended: 1 precision: 9 rounding: half_up maxExponent: 999 minExponent: -999 intx001 integer 0 -> 0 intx002 integer 0.0 -> 0 intx003 integer 0.1 -> 0 Rounded Inexact intx004 integer 0.2 -> 0 Rounded Inexact intx005 integer 0.3 -> 0 Rounded Inexact intx006 integer 0.4 -> 0 Rounded Inexact intx007 integer 0.5 -> 1 Rounded Inexact intx008 integer 0.6 -> 1 Rounded Inexact intx009 integer 0.7 -> 1 Rounded Inexact intx010 integer 0.8 -> 1 Rounded Inexact intx011 integer 0.9 -> 1 Rounded Inexact intx012 integer 1 -> 1 intx013 integer 1.0 -> 1 Rounded intx014 integer 1.1 -> 1 Rounded Inexact intx015 integer 1.2 -> 1 Rounded Inexact intx016 integer 1.3 -> 1 Rounded Inexact intx017 integer 1.4 -> 1 Rounded Inexact intx018 integer 1.5 -> 2 Rounded Inexact intx019 integer 1.6 -> 2 Rounded Inexact intx020 integer 1.7 -> 2 Rounded Inexact intx021 integer 1.8 -> 2 Rounded Inexact intx022 integer 1.9 -> 2 Rounded Inexact -- negatives intx031 integer -0 -> -0 intx032 integer -0.0 -> -0 intx033 integer -0.1 -> -0 Rounded Inexact intx034 integer -0.2 -> -0 Rounded Inexact intx035 integer -0.3 -> -0 Rounded Inexact intx036 integer -0.4 -> -0 Rounded Inexact intx037 integer -0.5 -> -1 Rounded Inexact intx038 integer -0.6 -> -1 Rounded Inexact intx039 integer -0.7 -> -1 Rounded Inexact intx040 integer -0.8 -> -1 Rounded Inexact intx041 integer -0.9 -> -1 Rounded Inexact intx042 integer -1 -> -1 intx043 integer -1.0 -> -1 Rounded intx044 integer -1.1 -> -1 Rounded Inexact intx045 integer -1.2 -> -1 Rounded Inexact intx046 integer -1.3 -> -1 Rounded Inexact intx047 integer -1.4 -> -1 Rounded Inexact intx048 integer -1.5 -> -2 Rounded Inexact intx049 integer -1.6 -> -2 Rounded Inexact intx050 integer -1.7 -> -2 Rounded Inexact intx051 integer -1.8 -> -2 Rounded Inexact intx052 integer -1.9 -> -2 Rounded Inexact -- numbers around precision precision: 9 intx060 integer '56267E-10' -> '0' Inexact Rounded intx061 integer '56267E-5' -> '1' Inexact Rounded intx062 integer '56267E-2' -> '563' Inexact Rounded intx063 integer '56267E-1' -> '5627' Inexact Rounded intx065 integer '56267E-0' -> '56267' intx066 integer '56267E+0' -> '56267' intx067 integer '56267E+1' -> '562670' intx068 integer '56267E+2' -> '5626700' intx069 integer '56267E+3' -> '56267000' intx070 integer '56267E+4' -> '562670000' intx071 integer '56267E+5' -> Infinity Overflow Inexact Rounded intx072 integer '56267E+6' -> Infinity Overflow Inexact Rounded intx080 integer '-56267E-10' -> '-0' Inexact Rounded intx081 integer '-56267E-5' -> '-1' Inexact Rounded intx082 integer '-56267E-2' -> '-563' Inexact Rounded intx083 integer '-56267E-1' -> '-5627' Inexact Rounded intx085 integer '-56267E-0' -> '-56267' intx086 integer '-56267E+0' -> '-56267' intx087 integer '-56267E+1' -> '-562670' intx088 integer '-56267E+2' -> '-5626700' intx089 integer '-56267E+3' -> '-56267000' intx090 integer '-56267E+4' -> '-562670000' intx091 integer '-56267E+5' -> -Infinity Overflow Inexact Rounded intx092 integer '-56267E+6' -> -Infinity Overflow Inexact Rounded -- specials and zeros intx120 integer 'Inf' -> 'Infinity' intx121 integer '-Inf' -> '-Infinity' intx122 integer NaN -> NaN intx123 integer sNaN -> NaN Invalid_operation intx124 integer 0 -> 0 intx125 integer -0 -> -0 intx126 integer 0.000 -> 0 intx127 integer 0.00 -> 0 intx128 integer 0.0 -> 0 intx129 integer 0 -> 0 intx130 integer 0E-3 -> 0 intx131 integer 0E-2 -> 0 intx132 integer 0E-1 -> 0 intx133 integer 0E-0 -> 0 intx134 integer 0E+1 -> 0 intx135 integer 0E+2 -> 0 intx136 integer 0E+3 -> 0 intx137 integer 0E+4 -> 0 intx138 integer 0E+5 -> 0 intx139 integer -0.000 -> -0 intx140 integer -0.00 -> -0 intx141 integer -0.0 -> -0 intx142 integer -0 -> -0 intx143 integer -0E-3 -> -0 intx144 integer -0E-2 -> -0 intx145 integer -0E-1 -> -0 intx146 integer -0E-0 -> -0 intx147 integer -0E+1 -> -0 intx148 integer -0E+2 -> -0 intx149 integer -0E+3 -> -0 intx150 integer -0E+4 -> -0 intx151 integer -0E+5 -> -0 -- examples rounding: half_up precision: 9 intx200 integer 2.1 -> 2 Rounded Inexact intx201 integer 100 -> 100 intx202 integer 100.0 -> 100 Rounded intx203 integer 101.5 -> 102 Rounded Inexact intx204 integer -101.5 -> -102 Rounded Inexact intx205 integer 10E+5 -> 1000000 --- NEW FILE: inexact.decTest --- ------------------------------------------------------------------------ -- inexact.decTest -- decimal inexact and rounded edge cases -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 inx001 add 1 1 -> 2 inx002 add 123456789 0 -> 123456789 inx003 add 123456789 0.0 -> 123456789 Rounded inx004 add 123456789 0.00 -> 123456789 Rounded inx005 add 123456789 1 -> 123456790 inx006 add 123456789 0.1 -> 123456789 Inexact Rounded inx007 add 123456789 0.01 -> 123456789 Inexact Rounded inx008 add 123456789 0.001 -> 123456789 Inexact Rounded inx009 add 123456789 0.000001 -> 123456789 Inexact Rounded inx010 add 123456789 0.000000001 -> 123456789 Inexact Rounded inx011 add 123456789 0.000000000001 -> 123456789 Inexact Rounded inx012 add 123456789 0.9 -> 123456790 Inexact Rounded inx013 add 123456789 0.09 -> 123456789 Inexact Rounded inx014 add 123456789 0.009 -> 123456789 Inexact Rounded inx015 add 123456789 0.000009 -> 123456789 Inexact Rounded inx016 add 123456789 0.000000009 -> 123456789 Inexact Rounded inx017 add 123456789 0.000000000009 -> 123456789 Inexact Rounded inx021 add 1 -1 -> 0 inx022 add 123456789 -0 -> 123456789 inx023 add 123456789 -0.0 -> 123456789 Rounded inx024 add 123456789 -0.00 -> 123456789 Rounded inx025 add 123456789 -1 -> 123456788 inx026 add 123456789 -0.1 -> 123456789 Inexact Rounded inx027 add 123456789 -0.01 -> 123456789 Inexact Rounded inx028 add 123456789 -0.001 -> 123456789 Inexact Rounded inx029 add 123456789 -0.000001 -> 123456789 Inexact Rounded inx030 add 123456789 -0.000000001 -> 123456789 Inexact Rounded inx031 add 123456789 -0.000000000001 -> 123456789 Inexact Rounded inx032 add 123456789 -0.9 -> 123456788 Inexact Rounded inx033 add 123456789 -0.09 -> 123456789 Inexact Rounded inx034 add 123456789 -0.009 -> 123456789 Inexact Rounded inx035 add 123456789 -0.000009 -> 123456789 Inexact Rounded inx036 add 123456789 -0.000000009 -> 123456789 Inexact Rounded inx037 add 123456789 -0.000000000009 -> 123456789 Inexact Rounded inx042 add 0 123456789 -> 123456789 inx043 add 0.0 123456789 -> 123456789 Rounded inx044 add 0.00 123456789 -> 123456789 Rounded inx045 add 1 123456789 -> 123456790 inx046 add 0.1 123456789 -> 123456789 Inexact Rounded inx047 add 0.01 123456789 -> 123456789 Inexact Rounded inx048 add 0.001 123456789 -> 123456789 Inexact Rounded inx049 add 0.000001 123456789 -> 123456789 Inexact Rounded inx050 add 0.000000001 123456789 -> 123456789 Inexact Rounded inx051 add 0.000000000001 123456789 -> 123456789 Inexact Rounded inx052 add 0.9 123456789 -> 123456790 Inexact Rounded inx053 add 0.09 123456789 -> 123456789 Inexact Rounded inx054 add 0.009 123456789 -> 123456789 Inexact Rounded inx055 add 0.000009 123456789 -> 123456789 Inexact Rounded inx056 add 0.000000009 123456789 -> 123456789 Inexact Rounded inx057 add 0.000000000009 123456789 -> 123456789 Inexact Rounded inx062 add -0 123456789 -> 123456789 inx063 add -0.0 123456789 -> 123456789 Rounded inx064 add -0.00 123456789 -> 123456789 Rounded inx065 add -1 123456789 -> 123456788 inx066 add -0.1 123456789 -> 123456789 Inexact Rounded inx067 add -0.01 123456789 -> 123456789 Inexact Rounded inx068 add -0.001 123456789 -> 123456789 Inexact Rounded inx069 add -0.000001 123456789 -> 123456789 Inexact Rounded inx070 add -0.000000001 123456789 -> 123456789 Inexact Rounded inx071 add -0.000000000001 123456789 -> 123456789 Inexact Rounded inx072 add -0.9 123456789 -> 123456788 Inexact Rounded inx073 add -0.09 123456789 -> 123456789 Inexact Rounded inx074 add -0.009 123456789 -> 123456789 Inexact Rounded inx075 add -0.000009 123456789 -> 123456789 Inexact Rounded inx076 add -0.000000009 123456789 -> 123456789 Inexact Rounded inx077 add -0.000000000009 123456789 -> 123456789 Inexact Rounded -- some boundaries inx081 add 999999999 0 -> 999999999 inx082 add 0.999999999 0.000000000 -> 0.999999999 inx083 add 999999999 1 -> 1.00000000E+9 Rounded inx084 add 0.999999999 0.000000001 -> 1.00000000 Rounded inx085 add 999999999 2 -> 1.00000000E+9 Inexact Rounded inx086 add 0.999999999 0.000000002 -> 1.00000000 Inexact Rounded inx087 add 999999999 3 -> 1.00000000E+9 Inexact Rounded inx089 add 0.999999999 0.000000003 -> 1.00000000 Inexact Rounded -- minus, plus, and subtract all assumed to work like add. -- multiply precision: 8 inx101 multiply 1000 1000 -> 1000000 inx102 multiply 9000 9000 -> 81000000 inx103 multiply 9999 9999 -> 99980001 inx104 multiply 1000 10000 -> 10000000 inx105 multiply 10000 10000 -> 1.0000000E+8 Rounded inx106 multiply 10001 10000 -> 1.0001000E+8 Rounded inx107 multiply 10001 10001 -> 1.0002000E+8 Inexact Rounded inx108 multiply 10101 10001 -> 1.0102010E+8 Inexact Rounded inx109 multiply 10001 10101 -> 1.0102010E+8 Inexact Rounded -- divide precision: 4 inx201 divide 1000 1000 -> 1 inx202 divide 1000 1 -> 1000 inx203 divide 1000 2 -> 500 inx204 divide 1000 3 -> 333.3 Inexact Rounded inx205 divide 1000 4 -> 250 inx206 divide 1000 5 -> 200 inx207 divide 1000 6 -> 166.7 Inexact Rounded inx208 divide 1000 7 -> 142.9 Inexact Rounded inx209 divide 1000 8 -> 125 inx210 divide 1000 9 -> 111.1 Inexact Rounded inx211 divide 1000 10 -> 100 inx220 divide 1 1 -> 1 inx221 divide 1 2 -> 0.5 inx222 divide 1 4 -> 0.25 inx223 divide 1 8 -> 0.125 inx224 divide 1 16 -> 0.0625 inx225 divide 1 32 -> 0.03125 inx226 divide 1 64 -> 0.01563 Inexact Rounded inx227 divide 1 128 -> 0.007813 Inexact Rounded precision: 5 inx230 divide 1 1 -> 1 inx231 divide 1 2 -> 0.5 inx232 divide 1 4 -> 0.25 inx233 divide 1 8 -> 0.125 inx234 divide 1 16 -> 0.0625 inx235 divide 1 32 -> 0.03125 inx236 divide 1 64 -> 0.015625 inx237 divide 1 128 -> 0.0078125 precision: 3 inx240 divide 1 1 -> 1 inx241 divide 1 2 -> 0.5 inx242 divide 1 4 -> 0.25 inx243 divide 1 8 -> 0.125 inx244 divide 1 16 -> 0.0625 inx245 divide 1 32 -> 0.0313 Inexact Rounded inx246 divide 1 64 -> 0.0156 Inexact Rounded inx247 divide 1 128 -> 0.00781 Inexact Rounded precision: 2 inx250 divide 1 1 -> 1 inx251 divide 1 2 -> 0.5 inx252 divide 1 4 -> 0.25 inx253 divide 1 8 -> 0.13 Inexact Rounded inx254 divide 1 16 -> 0.063 Inexact Rounded inx255 divide 1 32 -> 0.031 Inexact Rounded inx256 divide 1 64 -> 0.016 Inexact Rounded inx257 divide 1 128 -> 0.0078 Inexact Rounded precision: 1 inx260 divide 1 1 -> 1 inx261 divide 1 2 -> 0.5 inx262 divide 1 4 -> 0.3 Inexact Rounded inx263 divide 1 8 -> 0.1 Inexact Rounded inx264 divide 1 16 -> 0.06 Inexact Rounded inx265 divide 1 32 -> 0.03 Inexact Rounded inx266 divide 1 64 -> 0.02 Inexact Rounded inx267 divide 1 128 -> 0.008 Inexact Rounded -- power precision: 4 inx301 power 0.5 2 -> 0.25 inx302 power 0.5 4 -> 0.0625 inx303 power 0.5 8 -> 0.003906 Inexact Rounded inx304 power 0.5 16 -> 0.00001526 Inexact Rounded inx305 power 0.5 32 -> 2.328E-10 Inexact Rounded -- compare, divideInteger, and remainder are always exact -- rescale precision: 4 inx401 rescale 0 0 -> 0 inx402 rescale 1 0 -> 1 inx403 rescale 0.1 +2 -> 0E+2 Inexact Rounded inx404 rescale 0.1 +1 -> 0E+1 Inexact Rounded inx405 rescale 0.1 0 -> 0 Inexact Rounded inx406 rescale 0.1 -1 -> 0.1 inx407 rescale 0.1 -2 -> 0.10 -- long operands cause rounding too precision: 9 inx801 plus 123456789 -> 123456789 inx802 plus 1234567890 -> 1.23456789E+9 Rounded inx803 plus 1234567891 -> 1.23456789E+9 Inexact Rounded inx804 plus 1234567892 -> 1.23456789E+9 Inexact Rounded inx805 plus 1234567899 -> 1.23456790E+9 Inexact Rounded inx806 plus 1234567900 -> 1.23456790E+9 Rounded --- NEW FILE: divideint.decTest --- ------------------------------------------------------------------------ -- divideint.decTest -- decimal integer division -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 dvix001 divideint 1 1 -> 1 dvix002 divideint 2 1 -> 2 dvix003 divideint 1 2 -> 0 dvix004 divideint 2 2 -> 1 dvix005 divideint 0 1 -> 0 dvix006 divideint 0 2 -> 0 dvix007 divideint 1 3 -> 0 dvix008 divideint 2 3 -> 0 dvix009 divideint 3 3 -> 1 dvix010 divideint 2.4 1 -> 2 dvix011 divideint 2.4 -1 -> -2 dvix012 divideint -2.4 1 -> -2 dvix013 divideint -2.4 -1 -> 2 dvix014 divideint 2.40 1 -> 2 dvix015 divideint 2.400 1 -> 2 dvix016 divideint 2.4 2 -> 1 dvix017 divideint 2.400 2 -> 1 dvix018 divideint 2. 2 -> 1 dvix019 divideint 20 20 -> 1 dvix020 divideint 187 187 -> 1 dvix021 divideint 5 2 -> 2 dvix022 divideint 5 2.0 -> 2 dvix023 divideint 5 2.000 -> 2 dvix024 divideint 5 0.200 -> 25 dvix025 divideint 5 0.200 -> 25 dvix030 divideint 1 2 -> 0 dvix031 divideint 1 4 -> 0 dvix032 divideint 1 8 -> 0 dvix033 divideint 1 16 -> 0 dvix034 divideint 1 32 -> 0 dvix035 divideint 1 64 -> 0 dvix040 divideint 1 -2 -> -0 dvix041 divideint 1 -4 -> -0 dvix042 divideint 1 -8 -> -0 dvix043 divideint 1 -16 -> -0 dvix044 divideint 1 -32 -> -0 dvix045 divideint 1 -64 -> -0 dvix050 divideint -1 2 -> -0 dvix051 divideint -1 4 -> -0 dvix052 divideint -1 8 -> -0 dvix053 divideint -1 16 -> -0 dvix054 divideint -1 32 -> -0 dvix055 divideint -1 64 -> -0 dvix060 divideint -1 -2 -> 0 dvix061 divideint -1 -4 -> 0 dvix062 divideint -1 -8 -> 0 dvix063 divideint -1 -16 -> 0 dvix064 divideint -1 -32 -> 0 dvix065 divideint -1 -64 -> 0 -- similar with powers of ten dvix160 divideint 1 1 -> 1 dvix161 divideint 1 10 -> 0 dvix162 divideint 1 100 -> 0 dvix163 divideint 1 1000 -> 0 dvix164 divideint 1 10000 -> 0 dvix165 divideint 1 100000 -> 0 dvix166 divideint 1 1000000 -> 0 dvix167 divideint 1 10000000 -> 0 dvix168 divideint 1 100000000 -> 0 dvix170 divideint 1 -1 -> -1 dvix171 divideint 1 -10 -> -0 dvix172 divideint 1 -100 -> -0 dvix173 divideint 1 -1000 -> -0 dvix174 divideint 1 -10000 -> -0 dvix175 divideint 1 -100000 -> -0 dvix176 divideint 1 -1000000 -> -0 dvix177 divideint 1 -10000000 -> -0 dvix178 divideint 1 -100000000 -> -0 dvix180 divideint -1 1 -> -1 dvix181 divideint -1 10 -> -0 dvix182 divideint -1 100 -> -0 dvix183 divideint -1 1000 -> -0 dvix184 divideint -1 10000 -> -0 dvix185 divideint -1 100000 -> -0 dvix186 divideint -1 1000000 -> -0 dvix187 divideint -1 10000000 -> -0 dvix188 divideint -1 100000000 -> -0 dvix190 divideint -1 -1 -> 1 dvix191 divideint -1 -10 -> 0 dvix192 divideint -1 -100 -> 0 dvix193 divideint -1 -1000 -> 0 dvix194 divideint -1 -10000 -> 0 dvix195 divideint -1 -100000 -> 0 dvix196 divideint -1 -1000000 -> 0 dvix197 divideint -1 -10000000 -> 0 dvix198 divideint -1 -100000000 -> 0 -- some long operand cases here dvix070 divideint 999999999 1 -> 999999999 dvix071 divideint 999999999.4 1 -> 999999999 dvix072 divideint 999999999.5 1 -> 999999999 dvix073 divideint 999999999.9 1 -> 999999999 dvix074 divideint 999999999.999 1 -> 999999999 precision: 6 dvix080 divideint 999999999 1 -> NaN Division_impossible dvix081 divideint 99999999 1 -> NaN Division_impossible dvix082 divideint 9999999 1 -> NaN Division_impossible dvix083 divideint 999999 1 -> 999999 dvix084 divideint 99999 1 -> 99999 dvix085 divideint 9999 1 -> 9999 dvix086 divideint 999 1 -> 999 dvix087 divideint 99 1 -> 99 dvix088 divideint 9 1 -> 9 precision: 9 dvix090 divideint 0. 1 -> 0 dvix091 divideint .0 1 -> 0 dvix092 divideint 0.00 1 -> 0 dvix093 divideint 0.00E+9 1 -> 0 dvix094 divideint 0.0000E-50 1 -> 0 dvix100 divideint 1 1 -> 1 dvix101 divideint 1 2 -> 0 dvix102 divideint 1 3 -> 0 dvix103 divideint 1 4 -> 0 dvix104 divideint 1 5 -> 0 dvix105 divideint 1 6 -> 0 dvix106 divideint 1 7 -> 0 dvix107 divideint 1 8 -> 0 dvix108 divideint 1 9 -> 0 dvix109 divideint 1 10 -> 0 dvix110 divideint 1 1 -> 1 dvix111 divideint 2 1 -> 2 dvix112 divideint 3 1 -> 3 dvix113 divideint 4 1 -> 4 dvix114 divideint 5 1 -> 5 dvix115 divideint 6 1 -> 6 dvix116 divideint 7 1 -> 7 dvix117 divideint 8 1 -> 8 dvix118 divideint 9 1 -> 9 dvix119 divideint 10 1 -> 10 -- from DiagBigDecimal dvix131 divideint 101.3 1 -> 101 dvix132 divideint 101.0 1 -> 101 dvix133 divideint 101.3 3 -> 33 dvix134 divideint 101.0 3 -> 33 dvix135 divideint 2.4 1 -> 2 dvix136 divideint 2.400 1 -> 2 dvix137 divideint 18 18 -> 1 dvix138 divideint 1120 1000 -> 1 dvix139 divideint 2.4 2 -> 1 dvix140 divideint 2.400 2 -> 1 dvix141 divideint 0.5 2.000 -> 0 dvix142 divideint 8.005 7 -> 1 dvix143 divideint 5 2 -> 2 dvix144 divideint 0 2 -> 0 dvix145 divideint 0.00 2 -> 0 -- Others dvix150 divideint 12345 4.999 -> 2469 dvix151 divideint 12345 4.99 -> 2473 dvix152 divideint 12345 4.9 -> 2519 dvix153 divideint 12345 5 -> 2469 dvix154 divideint 12345 5.1 -> 2420 dvix155 divideint 12345 5.01 -> 2464 dvix156 divideint 12345 5.001 -> 2468 dvix157 divideint 101 7.6 -> 13 -- Various flavours of divideint by 0 maxexponent: 999999999 minexponent: -999999999 dvix201 divideint 0 0 -> NaN Division_undefined dvix202 divideint 0.0E5 0 -> NaN Division_undefined dvix203 divideint 0.000 0 -> NaN Division_undefined dvix204 divideint 0.0001 0 -> Infinity Division_by_zero dvix205 divideint 0.01 0 -> Infinity Division_by_zero dvix206 divideint 0.1 0 -> Infinity Division_by_zero dvix207 divideint 1 0 -> Infinity Division_by_zero dvix208 divideint 1 0.0 -> Infinity Division_by_zero dvix209 divideint 10 0.0 -> Infinity Division_by_zero dvix210 divideint 1E+100 0.0 -> Infinity Division_by_zero dvix211 divideint 1E+1000 0 -> Infinity Division_by_zero dvix214 divideint -0.0001 0 -> -Infinity Division_by_zero dvix215 divideint -0.01 0 -> -Infinity Division_by_zero dvix216 divideint -0.1 0 -> -Infinity Division_by_zero dvix217 divideint -1 0 -> -Infinity Division_by_zero dvix218 divideint -1 0.0 -> -Infinity Division_by_zero dvix219 divideint -10 0.0 -> -Infinity Division_by_zero dvix220 divideint -1E+100 0.0 -> -Infinity Division_by_zero dvix221 divideint -1E+1000 0 -> -Infinity Division_by_zero -- test some cases that are close to exponent overflow maxexponent: 999999999 minexponent: -999999999 dvix270 divideint 1 1e999999999 -> 0 dvix271 divideint 1 0.9e999999999 -> 0 dvix272 divideint 1 0.99e999999999 -> 0 dvix273 divideint 1 0.999999999e999999999 -> 0 dvix274 divideint 9e999999999 1 -> NaN Division_impossible dvix275 divideint 9.9e999999999 1 -> NaN Division_impossible dvix276 divideint 9.99e999999999 1 -> NaN Division_impossible dvix277 divideint 9.99999999e999999999 1 -> NaN Division_impossible dvix280 divideint 0.1 9e-999999999 -> NaN Division_impossible dvix281 divideint 0.1 99e-999999999 -> NaN Division_impossible dvix282 divideint 0.1 999e-999999999 -> NaN Division_impossible dvix283 divideint 0.1 9e-999999998 -> NaN Division_impossible dvix284 divideint 0.1 99e-999999998 -> NaN Division_impossible dvix285 divideint 0.1 999e-999999998 -> NaN Division_impossible dvix286 divideint 0.1 999e-999999997 -> NaN Division_impossible dvix287 divideint 0.1 9999e-999999997 -> NaN Division_impossible dvix288 divideint 0.1 99999e-999999997 -> NaN Division_impossible -- overflow and underflow tests [from divide] maxexponent: 999999999 minexponent: -999999999 dvix330 divideint +1.23456789012345E-0 9E+999999999 -> 0 dvix331 divideint 9E+999999999 +0.23456789012345E-0 -> NaN Division_impossible dvix332 divideint +0.100 9E+999999999 -> 0 dvix333 divideint 9E-999999999 +9.100 -> 0 dvix335 divideint -1.23456789012345E-0 9E+999999999 -> -0 dvix336 divideint 9E+999999999 -0.83456789012345E-0 -> NaN Division_impossible dvix337 divideint -0.100 9E+999999999 -> -0 dvix338 divideint 9E-999999999 -9.100 -> -0 -- long operand checks maxexponent: 999 minexponent: -999 precision: 9 dvix401 divideint 12345678000 100 -> 123456780 dvix402 divideint 1 12345678000 -> 0 dvix403 divideint 1234567800 10 -> 123456780 dvix404 divideint 1 1234567800 -> 0 dvix405 divideint 1234567890 10 -> 123456789 dvix406 divideint 1 1234567890 -> 0 dvix407 divideint 1234567891 10 -> 123456789 dvix408 divideint 1 1234567891 -> 0 dvix409 divideint 12345678901 100 -> 123456789 dvix410 divideint 1 12345678901 -> 0 dvix411 divideint 1234567896 10 -> 123456789 dvix412 divideint 1 1234567896 -> 0 dvix413 divideint 12345678948 100 -> 123456789 dvix414 divideint 12345678949 100 -> 123456789 dvix415 divideint 12345678950 100 -> 123456789 dvix416 divideint 12345678951 100 -> 123456789 dvix417 divideint 12345678999 100 -> 123456789 precision: 15 dvix441 divideint 12345678000 1 -> 12345678000 dvix442 divideint 1 12345678000 -> 0 dvix443 divideint 1234567800 1 -> 1234567800 dvix444 divideint 1 1234567800 -> 0 dvix445 divideint 1234567890 1 -> 1234567890 dvix446 divideint 1 1234567890 -> 0 dvix447 divideint 1234567891 1 -> 1234567891 dvix448 divideint 1 1234567891 -> 0 dvix449 divideint 12345678901 1 -> 12345678901 dvix450 divideint 1 12345678901 -> 0 dvix451 divideint 1234567896 1 -> 1234567896 dvix452 divideint 1 1234567896 -> 0 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- more zeros, etc. dvix531 divideint 5.00 1E-3 -> 5000 dvix532 divideint 00.00 0.000 -> NaN Division_undefined dvix533 divideint 00.00 0E-3 -> NaN Division_undefined dvix534 divideint 0 -0 -> NaN Division_undefined dvix535 divideint -0 0 -> NaN Division_undefined dvix536 divideint -0 -0 -> NaN Division_undefined dvix541 divideint 0 -1 -> -0 dvix542 divideint -0 -1 -> 0 dvix543 divideint 0 1 -> 0 dvix544 divideint -0 1 -> -0 dvix545 divideint -1 0 -> -Infinity Division_by_zero dvix546 divideint -1 -0 -> Infinity Division_by_zero dvix547 divideint 1 0 -> Infinity Division_by_zero dvix548 divideint 1 -0 -> -Infinity Division_by_zero dvix551 divideint 0.0 -1 -> -0 dvix552 divideint -0.0 -1 -> 0 dvix553 divideint 0.0 1 -> 0 dvix554 divideint -0.0 1 -> -0 dvix555 divideint -1.0 0 -> -Infinity Division_by_zero dvix556 divideint -1.0 -0 -> Infinity Division_by_zero dvix557 divideint 1.0 0 -> Infinity Division_by_zero dvix558 divideint 1.0 -0 -> -Infinity Division_by_zero dvix561 divideint 0 -1.0 -> -0 dvix562 divideint -0 -1.0 -> 0 dvix563 divideint 0 1.0 -> 0 dvix564 divideint -0 1.0 -> -0 dvix565 divideint -1 0.0 -> -Infinity Division_by_zero dvix566 divideint -1 -0.0 -> Infinity Division_by_zero dvix567 divideint 1 0.0 -> Infinity Division_by_zero dvix568 divideint 1 -0.0 -> -Infinity Division_by_zero dvix571 divideint 0.0 -1.0 -> -0 dvix572 divideint -0.0 -1.0 -> 0 dvix573 divideint 0.0 1.0 -> 0 dvix574 divideint -0.0 1.0 -> -0 dvix575 divideint -1.0 0.0 -> -Infinity Division_by_zero dvix576 divideint -1.0 -0.0 -> Infinity Division_by_zero dvix577 divideint 1.0 0.0 -> Infinity Division_by_zero dvix578 divideint 1.0 -0.0 -> -Infinity Division_by_zero -- Specials dvix580 divideint Inf -Inf -> NaN Invalid_operation dvix581 divideint Inf -1000 -> -Infinity dvix582 divideint Inf -1 -> -Infinity dvix583 divideint Inf -0 -> -Infinity Division_by_zero dvix584 divideint Inf 0 -> Infinity Division_by_zero dvix585 divideint Inf 1 -> Infinity dvix586 divideint Inf 1000 -> Infinity dvix587 divideint Inf Inf -> NaN Invalid_operation dvix588 divideint -1000 Inf -> -0 dvix589 divideint -Inf Inf -> NaN Invalid_operation dvix590 divideint -1 Inf -> -0 dvix591 divideint -0 Inf -> -0 dvix592 divideint 0 Inf -> 0 dvix593 divideint 1 Inf -> 0 dvix594 divideint 1000 Inf -> 0 dvix595 divideint Inf Inf -> NaN Invalid_operation dvix600 divideint -Inf -Inf -> NaN Invalid_operation dvix601 divideint -Inf -1000 -> Infinity dvix602 divideint -Inf -1 -> Infinity dvix603 divideint -Inf -0 -> Infinity Division_by_zero dvix604 divideint -Inf 0 -> -Infinity Division_by_zero dvix605 divideint -Inf 1 -> -Infinity dvix606 divideint -Inf 1000 -> -Infinity dvix607 divideint -Inf Inf -> NaN Invalid_operation dvix608 divideint -1000 Inf -> -0 dvix609 divideint -Inf -Inf -> NaN Invalid_operation dvix610 divideint -1 -Inf -> 0 dvix611 divideint -0 -Inf -> 0 dvix612 divideint 0 -Inf -> -0 dvix613 divideint 1 -Inf -> -0 dvix614 divideint 1000 -Inf -> -0 dvix615 divideint Inf -Inf -> NaN Invalid_operation dvix621 divideint NaN -Inf -> NaN dvix622 divideint NaN -1000 -> NaN dvix623 divideint NaN -1 -> NaN dvix624 divideint NaN -0 -> NaN dvix625 divideint NaN 0 -> NaN dvix626 divideint NaN 1 -> NaN dvix627 divideint NaN 1000 -> NaN dvix628 divideint NaN Inf -> NaN dvix629 divideint NaN NaN -> NaN dvix630 divideint -Inf NaN -> NaN dvix631 divideint -1000 NaN -> NaN dvix632 divideint -1 NaN -> NaN dvix633 divideint -0 NaN -> NaN dvix634 divideint 0 NaN -> NaN dvix635 divideint 1 NaN -> NaN dvix636 divideint 1000 NaN -> NaN dvix637 divideint Inf NaN -> NaN dvix641 divideint sNaN -Inf -> NaN Invalid_operation dvix642 divideint sNaN -1000 -> NaN Invalid_operation dvix643 divideint sNaN -1 -> NaN Invalid_operation dvix644 divideint sNaN -0 -> NaN Invalid_operation dvix645 divideint sNaN 0 -> NaN Invalid_operation dvix646 divideint sNaN 1 -> NaN Invalid_operation dvix647 divideint sNaN 1000 -> NaN Invalid_operation dvix648 divideint sNaN NaN -> NaN Invalid_operation dvix649 divideint sNaN sNaN -> NaN Invalid_operation dvix650 divideint NaN sNaN -> NaN Invalid_operation dvix651 divideint -Inf sNaN -> NaN Invalid_operation dvix652 divideint -1000 sNaN -> NaN Invalid_operation dvix653 divideint -1 sNaN -> NaN Invalid_operation dvix654 divideint -0 sNaN -> NaN Invalid_operation dvix655 divideint 0 sNaN -> NaN Invalid_operation dvix656 divideint 1 sNaN -> NaN Invalid_operation dvix657 divideint 1000 sNaN -> NaN Invalid_operation dvix658 divideint Inf sNaN -> NaN Invalid_operation dvix659 divideint NaN sNaN -> NaN Invalid_operation -- some long operand cases again precision: 8 dvix660 divideint 100000001 1 -> NaN Division_impossible dvix661 divideint 100000000.4 1 -> NaN Division_impossible dvix662 divideint 100000000.5 1 -> NaN Division_impossible dvix663 divideint 100000000.9 1 -> NaN Division_impossible dvix664 divideint 100000000.999 1 -> NaN Division_impossible precision: 6 dvix690 divideint 100000000 1 -> NaN Division_impossible dvix691 divideint 10000000 1 -> NaN Division_impossible dvix692 divideint 1000000 1 -> NaN Division_impossible dvix693 divideint 100000 1 -> 100000 dvix694 divideint 10000 1 -> 10000 dvix695 divideint 1000 1 -> 1000 dvix696 divideint 100 1 -> 100 dvix697 divideint 10 1 -> 10 dvix698 divideint 1 1 -> 1 precision: 9 maxexponent: 999999999 minexponent: -999999999 dvix672 divideint 1 0.99e999999999 -> 0 dvix673 divideint 1 0.999999999e999999999 -> 0 dvix674 divideint 9e999999999 1 -> NaN Division_impossible dvix675 divideint 9.9e999999999 1 -> NaN Division_impossible dvix676 divideint 9.99e999999999 1 -> NaN Division_impossible dvix677 divideint 9.99999999e999999999 1 -> NaN Division_impossible dvix680 divideint 0.1 9e-999999999 -> NaN Division_impossible dvix681 divideint 0.1 99e-999999999 -> NaN Division_impossible dvix682 divideint 0.1 999e-999999999 -> NaN Division_impossible dvix683 divideint 0.1 9e-999999998 -> NaN Division_impossible dvix684 divideint 0.1 99e-999999998 -> NaN Division_impossible dvix685 divideint 0.1 999e-999999998 -> NaN Division_impossible dvix686 divideint 0.1 999e-999999997 -> NaN Division_impossible dvix687 divideint 0.1 9999e-999999997 -> NaN Division_impossible dvix688 divideint 0.1 99999e-999999997 -> NaN Division_impossible -- Null tests dvix900 divideint 10 # -> NaN Invalid_operation dvix901 divideint # 10 -> NaN Invalid_operation --- NEW FILE: divide.decTest --- ------------------------------------------------------------------------ -- divide.decTest -- decimal division -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- sanity checks divx001 divide 1 1 -> 1 divx002 divide 2 1 -> 2 divx003 divide 1 2 -> 0.5 divx004 divide 2 2 -> 1 divx005 divide 0 1 -> 0 divx006 divide 0 2 -> 0 divx007 divide 1 3 -> 0.333333333 Inexact Rounded divx008 divide 2 3 -> 0.666666667 Inexact Rounded divx009 divide 3 3 -> 1 divx010 divide 2.4 1 -> 2.4 divx011 divide 2.4 -1 -> -2.4 divx012 divide -2.4 1 -> -2.4 divx013 divide -2.4 -1 -> 2.4 divx014 divide 2.40 1 -> 2.40 divx015 divide 2.400 1 -> 2.400 divx016 divide 2.4 2 -> 1.2 divx017 divide 2.400 2 -> 1.200 divx018 divide 2. 2 -> 1 divx019 divide 20 20 -> 1 divx020 divide 187 187 -> 1 divx021 divide 5 2 -> 2.5 divx022 divide 5 2.0 -> 2.5 divx023 divide 5 2.000 -> 2.5 divx024 divide 5 0.20 -> 25 divx025 divide 5 0.200 -> 25 divx026 divide 10 1 -> 10 divx027 divide 100 1 -> 100 divx028 divide 1000 1 -> 1000 divx029 divide 1000 100 -> 10 divx030 divide 1 2 -> 0.5 divx031 divide 1 4 -> 0.25 divx032 divide 1 8 -> 0.125 divx033 divide 1 16 -> 0.0625 divx034 divide 1 32 -> 0.03125 divx035 divide 1 64 -> 0.015625 divx040 divide 1 -2 -> -0.5 divx041 divide 1 -4 -> -0.25 divx042 divide 1 -8 -> -0.125 divx043 divide 1 -16 -> -0.0625 divx044 divide 1 -32 -> -0.03125 divx045 divide 1 -64 -> -0.015625 divx050 divide -1 2 -> -0.5 divx051 divide -1 4 -> -0.25 divx052 divide -1 8 -> -0.125 divx053 divide -1 16 -> -0.0625 divx054 divide -1 32 -> -0.03125 divx055 divide -1 64 -> -0.015625 divx060 divide -1 -2 -> 0.5 divx061 divide -1 -4 -> 0.25 divx062 divide -1 -8 -> 0.125 divx063 divide -1 -16 -> 0.0625 divx064 divide -1 -32 -> 0.03125 divx065 divide -1 -64 -> 0.015625 divx070 divide 999999999 1 -> 999999999 divx071 divide 999999999.4 1 -> 999999999 Inexact Rounded divx072 divide 999999999.5 1 -> 1.00000000E+9 Inexact Rounded divx073 divide 999999999.9 1 -> 1.00000000E+9 Inexact Rounded divx074 divide 999999999.999 1 -> 1.00000000E+9 Inexact Rounded precision: 6 divx080 divide 999999999 1 -> 1.00000E+9 Inexact Rounded divx081 divide 99999999 1 -> 1.00000E+8 Inexact Rounded divx082 divide 9999999 1 -> 1.00000E+7 Inexact Rounded divx083 divide 999999 1 -> 999999 divx084 divide 99999 1 -> 99999 divx085 divide 9999 1 -> 9999 divx086 divide 999 1 -> 999 divx087 divide 99 1 -> 99 divx088 divide 9 1 -> 9 precision: 9 divx090 divide 0. 1 -> 0 divx091 divide .0 1 -> 0.0 divx092 divide 0.00 1 -> 0.00 divx093 divide 0.00E+9 1 -> 0E+7 divx094 divide 0.0000E-50 1 -> 0E-54 divx095 divide 1 1E-8 -> 1E+8 divx096 divide 1 1E-9 -> 1E+9 divx097 divide 1 1E-10 -> 1E+10 divx098 divide 1 1E-11 -> 1E+11 divx099 divide 1 1E-12 -> 1E+12 divx100 divide 1 1 -> 1 divx101 divide 1 2 -> 0.5 divx102 divide 1 3 -> 0.333333333 Inexact Rounded divx103 divide 1 4 -> 0.25 divx104 divide 1 5 -> 0.2 divx105 divide 1 6 -> 0.166666667 Inexact Rounded divx106 divide 1 7 -> 0.142857143 Inexact Rounded divx107 divide 1 8 -> 0.125 divx108 divide 1 9 -> 0.111111111 Inexact Rounded divx109 divide 1 10 -> 0.1 divx110 divide 1 1 -> 1 divx111 divide 2 1 -> 2 divx112 divide 3 1 -> 3 divx113 divide 4 1 -> 4 divx114 divide 5 1 -> 5 divx115 divide 6 1 -> 6 divx116 divide 7 1 -> 7 divx117 divide 8 1 -> 8 divx118 divide 9 1 -> 9 divx119 divide 10 1 -> 10 divx130 divide 12345 4.999 -> 2469.49390 Inexact Rounded divx131 divide 12345 4.99 -> 2473.94790 Inexact Rounded divx132 divide 12345 4.9 -> 2519.38776 Inexact Rounded divx133 divide 12345 5 -> 2469 divx134 divide 12345 5.1 -> 2420.58824 Inexact Rounded divx135 divide 12345 5.01 -> 2464.07186 Inexact Rounded divx136 divide 12345 5.001 -> 2468.50630 Inexact Rounded precision: 9 maxexponent: 999999999 minexponent: -999999999 -- test possibly imprecise results divx220 divide 391 597 -> 0.654941374 Inexact Rounded divx221 divide 391 -597 -> -0.654941374 Inexact Rounded divx222 divide -391 597 -> -0.654941374 Inexact Rounded divx223 divide -391 -597 -> 0.654941374 Inexact Rounded -- test some cases that are close to exponent overflow maxexponent: 999999999 minexponent: -999999999 divx270 divide 1 1e999999999 -> 1E-999999999 divx271 divide 1 0.9e999999999 -> 1.11111111E-999999999 Inexact Rounded divx272 divide 1 0.99e999999999 -> 1.01010101E-999999999 Inexact Rounded divx273 divide 1 0.999999999e999999999 -> 1.00000000E-999999999 Inexact Rounded divx274 divide 9e999999999 1 -> 9E+999999999 divx275 divide 9.9e999999999 1 -> 9.9E+999999999 divx276 divide 9.99e999999999 1 -> 9.99E+999999999 divx277 divide 9.99999999e999999999 1 -> 9.99999999E+999999999 divx280 divide 0.1 9e-999999999 -> 1.11111111E+999999997 Inexact Rounded divx281 divide 0.1 99e-999999999 -> 1.01010101E+999999996 Inexact Rounded divx282 divide 0.1 999e-999999999 -> 1.00100100E+999999995 Inexact Rounded divx283 divide 0.1 9e-999999998 -> 1.11111111E+999999996 Inexact Rounded divx284 divide 0.1 99e-999999998 -> 1.01010101E+999999995 Inexact Rounded divx285 divide 0.1 999e-999999998 -> 1.00100100E+999999994 Inexact Rounded divx286 divide 0.1 999e-999999997 -> 1.00100100E+999999993 Inexact Rounded divx287 divide 0.1 9999e-999999997 -> 1.00010001E+999999992 Inexact Rounded divx288 divide 0.1 99999e-999999997 -> 1.00001000E+999999991 Inexact Rounded -- Divide into 0 tests divx301 divide 0 7 -> 0 divx302 divide 0 7E-5 -> 0E+5 divx303 divide 0 7E-1 -> 0E+1 divx304 divide 0 7E+1 -> 0.0 divx305 divide 0 7E+5 -> 0.00000 divx306 divide 0 7E+6 -> 0.000000 divx307 divide 0 7E+7 -> 0E-7 divx308 divide 0 70E-5 -> 0E+4 divx309 divide 0 70E-1 -> 0 divx310 divide 0 70E+0 -> 0.0 divx311 divide 0 70E+1 -> 0.00 divx312 divide 0 70E+5 -> 0.000000 divx313 divide 0 70E+6 -> 0E-7 divx314 divide 0 70E+7 -> 0E-8 divx315 divide 0 700E-5 -> 0E+3 divx316 divide 0 700E-1 -> 0.0 divx317 divide 0 700E+0 -> 0.00 divx318 divide 0 700E+1 -> 0.000 divx319 divide 0 700E+5 -> 0E-7 divx320 divide 0 700E+6 -> 0E-8 divx321 divide 0 700E+7 -> 0E-9 divx331 divide 0E-3 7E-5 -> 0E+2 divx332 divide 0E-3 7E-1 -> 0.00 divx333 divide 0E-3 7E+1 -> 0.0000 divx334 divide 0E-3 7E+5 -> 0E-8 divx335 divide 0E-1 7E-5 -> 0E+4 divx336 divide 0E-1 7E-1 -> 0 divx337 divide 0E-1 7E+1 -> 0.00 divx338 divide 0E-1 7E+5 -> 0.000000 divx339 divide 0E+1 7E-5 -> 0E+6 divx340 divide 0E+1 7E-1 -> 0E+2 divx341 divide 0E+1 7E+1 -> 0 divx342 divide 0E+1 7E+5 -> 0.0000 divx343 divide 0E+3 7E-5 -> 0E+8 divx344 divide 0E+3 7E-1 -> 0E+4 divx345 divide 0E+3 7E+1 -> 0E+2 divx346 divide 0E+3 7E+5 -> 0.00 maxexponent: 92 minexponent: -92 precision: 7 divx351 divide 0E-92 7E-1 -> 0E-91 divx352 divide 0E-92 7E+1 -> 0E-93 divx353 divide 0E-92 7E+5 -> 0E-97 divx354 divide 0E-92 7E+6 -> 0E-98 divx355 divide 0E-92 7E+7 -> 0E-98 Clamped divx356 divide 0E-92 777E-1 -> 0E-93 divx357 divide 0E-92 777E+1 -> 0E-95 divx358 divide 0E-92 777E+3 -> 0E-97 divx359 divide 0E-92 777E+4 -> 0E-98 divx360 divide 0E-92 777E+5 -> 0E-98 Clamped divx361 divide 0E+92 7E+1 -> 0E+91 divx362 divide 0E+92 7E+0 -> 0E+92 divx363 divide 0E+92 7E-1 -> 0E+92 Clamped divx364 divide 0E+92 777E+1 -> 0E+89 divx365 divide 0E+92 777E-1 -> 0E+91 divx366 divide 0E+92 777E-2 -> 0E+92 divx367 divide 0E+92 777E-3 -> 0E+92 Clamped divx368 divide 0E+92 777E-4 -> 0E+92 Clamped -- input rounding checks maxexponent: 999 minexponent: -999 precision: 9 divx401 divide 12345678000 1 -> 1.23456780E+10 Rounded divx402 divide 1 12345678000 -> 8.10000066E-11 Inexact Rounded divx403 divide 1234567800 1 -> 1.23456780E+9 Rounded divx404 divide 1 1234567800 -> 8.10000066E-10 Inexact Rounded divx405 divide 1234567890 1 -> 1.23456789E+9 Rounded divx406 divide 1 1234567890 -> 8.10000007E-10 Inexact Rounded divx407 divide 1234567891 1 -> 1.23456789E+9 Inexact Rounded divx408 divide 1 1234567891 -> 8.10000007E-10 Inexact Rounded divx409 divide 12345678901 1 -> 1.23456789E+10 Inexact Rounded divx410 divide 1 12345678901 -> 8.10000007E-11 Inexact Rounded divx411 divide 1234567896 1 -> 1.23456790E+9 Inexact Rounded divx412 divide 1 1234567896 -> 8.10000003E-10 Inexact Rounded divx413 divide 1 1234567897 -> 8.10000003E-10 Inexact Rounded divx414 divide 1 1234567898 -> 8.10000002E-10 Inexact Rounded divx415 divide 1 1234567899 -> 8.10000001E-10 Inexact Rounded divx416 divide 1 1234567900 -> 8.10000001E-10 Inexact Rounded divx417 divide 1 1234567901 -> 8.10000000E-10 Inexact Rounded divx418 divide 1 1234567902 -> 8.09999999E-10 Inexact Rounded -- some longies divx421 divide 1234567896.000000000000 1 -> 1.23456790E+9 Inexact Rounded divx422 divide 1 1234567896.000000000000 -> 8.10000003E-10 Inexact Rounded divx423 divide 1234567896.000000000001 1 -> 1.23456790E+9 Inexact Rounded divx424 divide 1 1234567896.000000000001 -> 8.10000003E-10 Inexact Rounded divx425 divide 1234567896.000000000000000000000000000000000000000009 1 -> 1.23456790E+9 Inexact Rounded divx426 divide 1 1234567896.000000000000000000000000000000000000000009 -> 8.10000003E-10 Inexact Rounded divx427 divide 1234567897.900010000000000000000000000000000000000009 1 -> 1.23456790E+9 Inexact Rounded divx428 divide 1 1234567897.900010000000000000000000000000000000000009 -> 8.10000002E-10 Inexact Rounded precision: 15 -- still checking... divx441 divide 12345678000 1 -> 12345678000 divx442 divide 1 12345678000 -> 8.10000066420005E-11 Inexact Rounded divx443 divide 1234567800 1 -> 1234567800 divx444 divide 1 1234567800 -> 8.10000066420005E-10 Inexact Rounded divx445 divide 1234567890 1 -> 1234567890 divx446 divide 1 1234567890 -> 8.10000007371000E-10 Inexact Rounded divx447 divide 1234567891 1 -> 1234567891 divx448 divide 1 1234567891 -> 8.10000006714900E-10 Inexact Rounded divx449 divide 12345678901 1 -> 12345678901 divx450 divide 1 12345678901 -> 8.10000007305390E-11 Inexact Rounded divx451 divide 1234567896 1 -> 1234567896 divx452 divide 1 1234567896 -> 8.10000003434400E-10 Inexact Rounded -- some suggested by Dan Zuras divx460 divide 3e0 2e0 -> 1.5 divx461 divide 30e-1 2e0 -> 1.5 divx462 divide 300e-2 2e0 -> 1.50 divx464 divide 3000e-3 2e0 -> 1.500 divx465 divide 3e0 20e-1 -> 1.5 divx466 divide 30e-1 20e-1 -> 1.5 divx467 divide 300e-2 20e-1 -> 1.5 divx468 divide 3000e-3 20e-1 -> 1.50 divx469 divide 3e0 200e-2 -> 1.5 divx470 divide 30e-1 200e-2 -> 1.5 divx471 divide 300e-2 200e-2 -> 1.5 divx472 divide 3000e-3 200e-2 -> 1.5 divx473 divide 3e0 2000e-3 -> 1.5 divx474 divide 30e-1 2000e-3 -> 1.5 divx475 divide 300e-2 2000e-3 -> 1.5 divx476 divide 3000e-3 2000e-3 -> 1.5 -- some reciprocals divx480 divide 1 1.0E+33 -> 1E-33 divx481 divide 1 10E+33 -> 1E-34 divx482 divide 1 1.0E-33 -> 1E+33 divx483 divide 1 10E-33 -> 1E+32 -- tryzeros cases precision: 7 rounding: half_up maxExponent: 92 minexponent: -92 divx496 divide 0E+86 1000E-13 -> 0E+92 Clamped divx497 divide 0E-98 1000E+13 -> 0E-98 Clamped precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- focus on trailing zeros issues precision: 9 divx500 divide 1 9.9 -> 0.101010101 Inexact Rounded precision: 8 divx501 divide 1 9.9 -> 0.10101010 Inexact Rounded precision: 7 divx502 divide 1 9.9 -> 0.1010101 Inexact Rounded precision: 6 divx503 divide 1 9.9 -> 0.101010 Inexact Rounded precision: 9 divx531 divide 1 2 -> 0.5 divx532 divide 1.0 2 -> 0.5 divx533 divide 1.00 2 -> 0.50 divx534 divide 1.000 2 -> 0.500 divx535 divide 1.0000 2 -> 0.5000 divx536 divide 1.00000 2 -> 0.50000 divx537 divide 1.000000 2 -> 0.500000 divx538 divide 1.0000000 2 -> 0.5000000 divx539 divide 1.00 2.00 -> 0.5 divx541 divide 2 1 -> 2 divx542 divide 2 1.0 -> 2 divx543 divide 2 1.00 -> 2 divx544 divide 2 1.000 -> 2 divx545 divide 2 1.0000 -> 2 divx546 divide 2 1.00000 -> 2 divx547 divide 2 1.000000 -> 2 divx548 divide 2 1.0000000 -> 2 divx549 divide 2.00 1.00 -> 2 divx550 divide 2.40 2 -> 1.20 divx551 divide 2.40 4 -> 0.60 divx552 divide 2.40 10 -> 0.24 divx553 divide 2.40 2.0 -> 1.2 divx554 divide 2.40 4.0 -> 0.6 divx555 divide 2.40 10.0 -> 0.24 divx556 divide 2.40 2.00 -> 1.2 divx557 divide 2.40 4.00 -> 0.6 divx558 divide 2.40 10.00 -> 0.24 divx559 divide 0.9 0.1 -> 9 divx560 divide 0.9 0.01 -> 9E+1 divx561 divide 0.9 0.001 -> 9E+2 divx562 divide 5 2 -> 2.5 divx563 divide 5 2.0 -> 2.5 divx564 divide 5 2.00 -> 2.5 divx565 divide 5 20 -> 0.25 divx566 divide 5 20.0 -> 0.25 divx567 divide 2.400 2 -> 1.200 divx568 divide 2.400 2.0 -> 1.20 divx569 divide 2.400 2.400 -> 1 -- +ve exponent precision: 5 divx570 divide 2.4E+6 2 -> 1.2E+6 divx571 divide 2.40E+6 2 -> 1.20E+6 divx572 divide 2.400E+6 2 -> 1.200E+6 divx573 divide 2.4000E+6 2 -> 1.2000E+6 divx574 divide 24E+5 2 -> 1.2E+6 divx575 divide 240E+4 2 -> 1.20E+6 divx576 divide 2400E+3 2 -> 1.200E+6 divx577 divide 24000E+2 2 -> 1.2000E+6 precision: 6 divx580 divide 2.4E+6 2 -> 1.2E+6 divx581 divide 2.40E+6 2 -> 1.20E+6 divx582 divide 2.400E+6 2 -> 1.200E+6 divx583 divide 2.4000E+6 2 -> 1.2000E+6 divx584 divide 24E+5 2 -> 1.2E+6 divx585 divide 240E+4 2 -> 1.20E+6 divx586 divide 2400E+3 2 -> 1.200E+6 divx587 divide 24000E+2 2 -> 1.2000E+6 precision: 7 divx590 divide 2.4E+6 2 -> 1.2E+6 divx591 divide 2.40E+6 2 -> 1.20E+6 divx592 divide 2.400E+6 2 -> 1.200E+6 divx593 divide 2.4000E+6 2 -> 1.2000E+6 divx594 divide 24E+5 2 -> 1.2E+6 divx595 divide 240E+4 2 -> 1.20E+6 divx596 divide 2400E+3 2 -> 1.200E+6 divx597 divide 24000E+2 2 -> 1.2000E+6 precision: 9 divx600 divide 2.4E+9 2 -> 1.2E+9 divx601 divide 2.40E+9 2 -> 1.20E+9 divx602 divide 2.400E+9 2 -> 1.200E+9 divx603 divide 2.4000E+9 2 -> 1.2000E+9 divx604 divide 24E+8 2 -> 1.2E+9 divx605 divide 240E+7 2 -> 1.20E+9 divx606 divide 2400E+6 2 -> 1.200E+9 divx607 divide 24000E+5 2 -> 1.2000E+9 -- long operand triangle precision: 33 divx610 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8131097703792 Inexact Rounded precision: 32 divx611 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.813109770379 Inexact Rounded precision: 31 divx612 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.81310977038 Inexact Rounded precision: 30 divx613 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8131097704 Inexact Rounded precision: 29 divx614 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.813109770 Inexact Rounded precision: 28 divx615 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.81310977 Inexact Rounded precision: 27 divx616 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8131098 Inexact Rounded precision: 26 divx617 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.813110 Inexact Rounded precision: 25 divx618 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.81311 Inexact Rounded precision: 24 divx619 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8131 Inexact Rounded precision: 23 divx620 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.813 Inexact Rounded precision: 22 divx621 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.81 Inexact Rounded precision: 21 divx622 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8 Inexact Rounded precision: 20 divx623 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817798 Inexact Rounded precision: 19 divx624 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101140888379681780E+19 Inexact Rounded precision: 18 divx625 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114088837968178E+19 Inexact Rounded precision: 17 divx626 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011408883796818E+19 Inexact Rounded precision: 16 divx627 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101140888379682E+19 Inexact Rounded precision: 15 divx628 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114088837968E+19 Inexact Rounded precision: 14 divx629 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011408883797E+19 Inexact Rounded precision: 13 divx630 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101140888380E+19 Inexact Rounded precision: 12 divx631 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114088838E+19 Inexact Rounded precision: 11 divx632 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011408884E+19 Inexact Rounded precision: 10 divx633 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101140888E+19 Inexact Rounded precision: 9 divx634 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114089E+19 Inexact Rounded precision: 8 divx635 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011409E+19 Inexact Rounded precision: 7 divx636 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101141E+19 Inexact Rounded precision: 6 divx637 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114E+19 Inexact Rounded precision: 5 divx638 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011E+19 Inexact Rounded precision: 4 divx639 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101E+19 Inexact Rounded precision: 3 divx640 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10E+19 Inexact Rounded precision: 2 divx641 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1E+19 Inexact Rounded precision: 1 divx642 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4E+19 Inexact Rounded -- more zeros, etc. precision: 9 divx731 divide 5.00 1E-3 -> 5.00E+3 divx732 divide 00.00 0.000 -> NaN Division_undefined divx733 divide 00.00 0E-3 -> NaN Division_undefined divx734 divide 0 -0 -> NaN Division_undefined divx735 divide -0 0 -> NaN Division_undefined divx736 divide -0 -0 -> NaN Division_undefined divx741 divide 0 -1 -> -0 divx742 divide -0 -1 -> 0 divx743 divide 0 1 -> 0 divx744 divide -0 1 -> -0 divx745 divide -1 0 -> -Infinity Division_by_zero divx746 divide -1 -0 -> Infinity Division_by_zero divx747 divide 1 0 -> Infinity Division_by_zero divx748 divide 1 -0 -> -Infinity Division_by_zero divx751 divide 0.0 -1 -> -0.0 divx752 divide -0.0 -1 -> 0.0 divx753 divide 0.0 1 -> 0.0 divx754 divide -0.0 1 -> -0.0 divx755 divide -1.0 0 -> -Infinity Division_by_zero divx756 divide -1.0 -0 -> Infinity Division_by_zero divx757 divide 1.0 0 -> Infinity Division_by_zero divx758 divide 1.0 -0 -> -Infinity Division_by_zero divx761 divide 0 -1.0 -> -0 divx762 divide -0 -1.0 -> 0 divx763 divide 0 1.0 -> 0 divx764 divide -0 1.0 -> -0 divx765 divide -1 0.0 -> -Infinity Division_by_zero divx766 divide -1 -0.0 -> Infinity Division_by_zero divx767 divide 1 0.0 -> Infinity Division_by_zero divx768 divide 1 -0.0 -> -Infinity Division_by_zero divx771 divide 0.0 -1.0 -> -0.0 divx772 divide -0.0 -1.0 -> 0.0 divx773 divide 0.0 1.0 -> 0.0 divx774 divide -0.0 1.0 -> -0.0 divx775 divide -1.0 0.0 -> -Infinity Division_by_zero divx776 divide -1.0 -0.0 -> Infinity Division_by_zero divx777 divide 1.0 0.0 -> Infinity Division_by_zero divx778 divide 1.0 -0.0 -> -Infinity Division_by_zero -- Specials divx780 divide Inf -Inf -> NaN Invalid_operation divx781 divide Inf -1000 -> -Infinity divx782 divide Inf -1 -> -Infinity divx783 divide Inf -0 -> -Infinity Division_by_zero divx784 divide Inf 0 -> Infinity Division_by_zero divx785 divide Inf 1 -> Infinity divx786 divide Inf 1000 -> Infinity divx787 divide Inf Inf -> NaN Invalid_operation divx788 divide -1000 Inf -> -0 divx789 divide -Inf Inf -> NaN Invalid_operation divx790 divide -1 Inf -> -0 divx791 divide -0 Inf -> -0 divx792 divide 0 Inf -> 0 divx793 divide 1 Inf -> 0 divx794 divide 1000 Inf -> 0 divx795 divide Inf Inf -> NaN Invalid_operation divx800 divide -Inf -Inf -> NaN Invalid_operation divx801 divide -Inf -1000 -> Infinity divx802 divide -Inf -1 -> Infinity divx803 divide -Inf -0 -> Infinity Division_by_zero divx804 divide -Inf 0 -> -Infinity Division_by_zero divx805 divide -Inf 1 -> -Infinity divx806 divide -Inf 1000 -> -Infinity divx807 divide -Inf Inf -> NaN Invalid_operation divx808 divide -1000 Inf -> -0 divx809 divide -Inf -Inf -> NaN Invalid_operation divx810 divide -1 -Inf -> 0 divx811 divide -0 -Inf -> 0 divx812 divide 0 -Inf -> -0 divx813 divide 1 -Inf -> -0 divx814 divide 1000 -Inf -> -0 divx815 divide Inf -Inf -> NaN Invalid_operation divx821 divide NaN -Inf -> NaN divx822 divide NaN -1000 -> NaN divx823 divide NaN -1 -> NaN divx824 divide NaN -0 -> NaN divx825 divide NaN 0 -> NaN divx826 divide NaN 1 -> NaN divx827 divide NaN 1000 -> NaN divx828 divide NaN Inf -> NaN divx829 divide NaN NaN -> NaN divx830 divide -Inf NaN -> NaN divx831 divide -1000 NaN -> NaN divx832 divide -1 NaN -> NaN divx833 divide -0 NaN -> NaN divx834 divide 0 NaN -> NaN divx835 divide 1 NaN -> NaN divx836 divide 1000 NaN -> NaN divx837 divide Inf NaN -> NaN divx841 divide sNaN -Inf -> NaN Invalid_operation divx842 divide sNaN -1000 -> NaN Invalid_operation divx843 divide sNaN -1 -> NaN Invalid_operation divx844 divide sNaN -0 -> NaN Invalid_operation divx845 divide sNaN 0 -> NaN Invalid_operation divx846 divide sNaN 1 -> NaN Invalid_operation divx847 divide sNaN 1000 -> NaN Invalid_operation divx848 divide sNaN NaN -> NaN Invalid_operation divx849 divide sNaN sNaN -> NaN Invalid_operation divx850 divide NaN sNaN -> NaN Invalid_operation divx851 divide -Inf sNaN -> NaN Invalid_operation divx852 divide -1000 sNaN -> NaN Invalid_operation divx853 divide -1 sNaN -> NaN Invalid_operation divx854 divide -0 sNaN -> NaN Invalid_operation divx855 divide 0 sNaN -> NaN Invalid_operation divx856 divide 1 sNaN -> NaN Invalid_operation divx857 divide 1000 sNaN -> NaN Invalid_operation divx858 divide Inf sNaN -> NaN Invalid_operation divx859 divide NaN sNaN -> NaN Invalid_operation maxexponent: 999999999 minexponent: -999999999 -- Various flavours of divide by 0 divx901 divide 0 0 -> NaN Division_undefined divx902 divide 0.0E5 0 -> NaN Division_undefined divx903 divide 0.000 0 -> NaN Division_undefined divx904 divide 0.0001 0 -> Infinity Division_by_zero divx905 divide 0.01 0 -> Infinity Division_by_zero divx906 divide 0.1 0 -> Infinity Division_by_zero divx907 divide 1 0 -> Infinity Division_by_zero divx908 divide 1 0.0 -> Infinity Division_by_zero divx909 divide 10 0.0 -> Infinity Division_by_zero divx910 divide 1E+100 0.0 -> Infinity Division_by_zero divx911 divide 1E+1000 0 -> Infinity Division_by_zero divx921 divide -0.0001 0 -> -Infinity Division_by_zero divx922 divide -0.01 0 -> -Infinity Division_by_zero divx923 divide -0.1 0 -> -Infinity Division_by_zero divx924 divide -1 0 -> -Infinity Division_by_zero divx925 divide -1 0.0 -> -Infinity Division_by_zero divx926 divide -10 0.0 -> -Infinity Division_by_zero divx927 divide -1E+100 0.0 -> -Infinity Division_by_zero divx928 divide -1E+1000 0 -> -Infinity Division_by_zero divx931 divide 0.0001 -0 -> -Infinity Division_by_zero divx932 divide 0.01 -0 -> -Infinity Division_by_zero divx933 divide 0.1 -0 -> -Infinity Division_by_zero divx934 divide 1 -0 -> -Infinity Division_by_zero divx935 divide 1 -0.0 -> -Infinity Division_by_zero divx936 divide 10 -0.0 -> -Infinity Division_by_zero divx937 divide 1E+100 -0.0 -> -Infinity Division_by_zero divx938 divide 1E+1000 -0 -> -Infinity Division_by_zero divx941 divide -0.0001 -0 -> Infinity Division_by_zero divx942 divide -0.01 -0 -> Infinity Division_by_zero divx943 divide -0.1 -0 -> Infinity Division_by_zero divx944 divide -1 -0 -> Infinity Division_by_zero divx945 divide -1 -0.0 -> Infinity Division_by_zero divx946 divide -10 -0.0 -> Infinity Division_by_zero divx947 divide -1E+100 -0.0 -> Infinity Division_by_zero divx948 divide -1E+1000 -0 -> Infinity Division_by_zero -- overflow and underflow tests maxexponent: 999999999 minexponent: -999999999 divx951 divide 9E+999999999 +0.23456789012345E-0 -> Infinity Inexact Overflow Rounded divx952 divide +0.100 9E+999999999 -> 1.111111E-1000000001 Inexact Rounded Underflow Subnormal divx953 divide 9E-999999999 +9.100 -> 9.8901099E-1000000000 Inexact Rounded Underflow Subnormal divx954 divide -1.23456789 9E+999999999 -> -1.3717421E-1000000000 Subnormal divx955 divide -1.23456789012345E-0 9E+999999999 -> -1.3717421E-1000000000 Underflow Subnormal Rounded Inexact divx956 divide -1.23456789012345E-0 7E+999999999 -> -1.7636684E-1000000000 Inexact Rounded Underflow Subnormal divx957 divide 9E+999999999 -0.83456789012345E-0 -> -Infinity Inexact Overflow Rounded divx958 divide -0.100 9E+999999999 -> -1.111111E-1000000001 Subnormal Inexact Rounded Underflow divx959 divide 9E-999999999 -9.100 -> -9.8901099E-1000000000 Inexact Rounded Underflow Subnormal -- overflow and underflow (additional edge tests in multiply.decTest) -- 'subnormal' results now possible (all hard underflow or overflow in -- base arithemtic) divx960 divide 1e-600000000 1e+400000001 -> 1E-1000000001 Subnormal divx961 divide 1e-600000000 1e+400000002 -> 1E-1000000002 Subnormal divx962 divide 1e-600000000 1e+400000003 -> 1E-1000000003 Subnormal divx963 divide 1e-600000000 1e+400000004 -> 1E-1000000004 Subnormal divx964 divide 1e-600000000 1e+400000005 -> 1E-1000000005 Subnormal divx965 divide 1e-600000000 1e+400000006 -> 1E-1000000006 Subnormal divx966 divide 1e-600000000 1e+400000007 -> 1E-1000000007 Subnormal divx967 divide 1e-600000000 1e+400000008 -> 0E-1000000007 Underflow Subnormal Inexact Rounded divx968 divide 1e-600000000 1e+400000009 -> 0E-1000000007 Underflow Subnormal Inexact Rounded divx969 divide 1e-600000000 1e+400000010 -> 0E-1000000007 Underflow Subnormal Inexact Rounded -- [no equivalent of 'subnormal' for overflow] divx970 divide 1e+600000000 1e-400000001 -> Infinity Overflow Inexact Rounded divx971 divide 1e+600000000 1e-400000002 -> Infinity Overflow Inexact Rounded divx972 divide 1e+600000000 1e-400000003 -> Infinity Overflow Inexact Rounded divx973 divide 1e+600000000 1e-400000004 -> Infinity Overflow Inexact Rounded divx974 divide 1e+600000000 1e-400000005 -> Infinity Overflow Inexact Rounded divx975 divide 1e+600000000 1e-400000006 -> Infinity Overflow Inexact Rounded divx976 divide 1e+600000000 1e-400000007 -> Infinity Overflow Inexact Rounded divx977 divide 1e+600000000 1e-400000008 -> Infinity Overflow Inexact Rounded divx978 divide 1e+600000000 1e-400000009 -> Infinity Overflow Inexact Rounded divx979 divide 1e+600000000 1e-400000010 -> Infinity Overflow Inexact Rounded -- Sign after overflow and underflow divx980 divide 1e-600000000 1e+400000009 -> 0E-1000000007 Underflow Subnormal Inexact Rounded divx981 divide 1e-600000000 -1e+400000009 -> -0E-1000000007 Underflow Subnormal Inexact Rounded divx982 divide -1e-600000000 1e+400000009 -> -0E-1000000007 Underflow Subnormal Inexact Rounded divx983 divide -1e-600000000 -1e+400000009 -> 0E-1000000007 Underflow Subnormal Inexact Rounded divx984 divide 1e+600000000 1e-400000009 -> Infinity Overflow Inexact Rounded divx985 divide 1e+600000000 -1e-400000009 -> -Infinity Overflow Inexact Rounded divx986 divide -1e+600000000 1e-400000009 -> -Infinity Overflow Inexact Rounded divx987 divide -1e+600000000 -1e-400000009 -> Infinity Overflow Inexact Rounded -- Long operand overflow may be a different path precision: 3 divx990 divide 1000 9.999E-999999999 -> Infinity Inexact Overflow Rounded divx991 divide 1000 -9.999E-999999999 -> -Infinity Inexact Overflow Rounded divx992 divide 9.999E+999999999 0.01 -> Infinity Inexact Overflow Rounded divx993 divide -9.999E+999999999 0.01 -> -Infinity Inexact Overflow Rounded -- check for double-rounded subnormals precision: 5 maxexponent: 79 minexponent: -79 divx1001 divide 1.52444E-80 1 -> 1.524E-80 Inexact Rounded Subnormal Underflow divx1002 divide 1.52445E-80 1 -> 1.524E-80 Inexact Rounded Subnormal Underflow divx1003 divide 1.52446E-80 1 -> 1.524E-80 Inexact Rounded Subnormal Underflow -- Null tests divx9998 divide 10 # -> NaN Invalid_operation divx9999 divide # 10 -> NaN Invalid_operation --- NEW FILE: decimal64.decTest --- ------------------------------------------------------------------------ -- decimal64.decTest -- decimal eight-byte format testcases -- -- Copyright (c) IBM Corporation, 2000, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- This set of tests is for the eight-byte concrete representation. -- Its characteristics are: -- -- 1 bit sign -- 5 bits combination field -- 8 bits exponent continuation -- 50 bits coefficient continuation -- -- Total exponent length 10 bits -- Total coefficient length 54 bits (16 digits) -- -- Elimit = 767 (maximum encoded exponent) -- Emax = 384 (largest exponent value) -- Emin = -383 (smallest exponent value) -- bias = 398 (subtracted from encoded exponent) = -Etiny extended: 1 precision: 16 rounding: half_up maxExponent: 384 minExponent: -383 -- General testcases -- (mostly derived from the Strawman 4 document and examples) dece001 apply #A2300000000003D0 -> -7.50 dece002 apply -7.50 -> #A2300000000003D0 -- Normality dece010 apply 1234567890123456 -> #263934b9c1e28e56 dece011 apply 1234567890123456.0 -> #263934b9c1e28e56 Rounded dece012 apply 1234567890123456.1 -> #263934b9c1e28e56 Rounded Inexact dece013 apply -1234567890123456 -> #a63934b9c1e28e56 dece014 apply -1234567890123456.0 -> #a63934b9c1e28e56 Rounded dece015 apply -1234567890123456.1 -> #a63934b9c1e28e56 Rounded Inexact -- Nmax and similar dece022 apply 9.999999999999999E+384 -> #77fcff3fcff3fcff dece023 apply #77fcff3fcff3fcff -> 9.999999999999999E+384 dece024 apply 1.234567890123456E+384 -> #47fd34b9c1e28e56 dece025 apply #47fd34b9c1e28e56 -> 1.234567890123456E+384 -- fold-downs (more below) dece030 apply 1.23E+384 -> #47fd300000000000 Clamped dece031 apply #47fd300000000000 -> 1.230000000000000E+384 dece032 apply 1E+384 -> #47fc000000000000 Clamped dece033 apply #47fc000000000000 -> 1.000000000000000E+384 -- overflows maxExponent: 999 -- set high so conversion causes the overflow minExponent: -999 dece040 apply 10E+384 -> #7800000000000000 Overflow Rounded Inexact dece041 apply 1.000000000000000E+385 -> #7800000000000000 Overflow Rounded Inexact maxExponent: 384 minExponent: -383 dece051 apply 12345 -> #22380000000049c5 dece052 apply #22380000000049c5 -> 12345 dece053 apply 1234 -> #2238000000000534 dece054 apply #2238000000000534 -> 1234 dece055 apply 123 -> #22380000000000a3 dece056 apply #22380000000000a3 -> 123 dece057 apply 12 -> #2238000000000012 dece058 apply #2238000000000012 -> 12 dece059 apply 1 -> #2238000000000001 dece060 apply #2238000000000001 -> 1 dece061 apply 1.23 -> #22300000000000a3 dece062 apply #22300000000000a3 -> 1.23 dece063 apply 123.45 -> #22300000000049c5 dece064 apply #22300000000049c5 -> 123.45 -- Nmin and below dece071 apply 1E-383 -> #003c000000000001 dece072 apply #003c000000000001 -> 1E-383 dece073 apply 1.000000000000000E-383 -> #0400000000000000 dece074 apply #0400000000000000 -> 1.000000000000000E-383 dece075 apply 1.000000000000001E-383 -> #0400000000000001 dece076 apply #0400000000000001 -> 1.000000000000001E-383 dece077 apply 0.100000000000000E-383 -> #0000800000000000 Subnormal dece078 apply #0000800000000000 -> 1.00000000000000E-384 Subnormal dece079 apply 0.000000000000010E-383 -> #0000000000000010 Subnormal dece080 apply #0000000000000010 -> 1.0E-397 Subnormal dece081 apply 0.00000000000001E-383 -> #0004000000000001 Subnormal dece082 apply #0004000000000001 -> 1E-397 Subnormal dece083 apply 0.000000000000001E-383 -> #0000000000000001 Subnormal dece084 apply #0000000000000001 -> 1E-398 Subnormal -- underflows dece090 apply 1e-398 -> #0000000000000001 Subnormal dece091 apply 1.9e-398 -> #0000000000000002 Subnormal Underflow Inexact Rounded dece092 apply 1.1e-398 -> #0000000000000001 Subnormal Underflow Inexact Rounded dece093 apply 1.00000000001e-398 -> #0000000000000001 Subnormal Underflow Inexact Rounded dece094 apply 1.00000000000001e-398 -> #0000000000000001 Subnormal Underflow Inexact Rounded dece095 apply 1.000000000000001e-398 -> #0000000000000001 Subnormal Underflow Inexact Rounded dece096 apply 0.1e-398 -> #0000000000000000 Subnormal Underflow Inexact Rounded dece097 apply 0.00000000001e-398 -> #0000000000000000 Subnormal Underflow Inexact Rounded dece098 apply 0.00000000000001e-398 -> #0000000000000000 Subnormal Underflow Inexact Rounded dece099 apply 0.000000000000001e-398 -> #0000000000000000 Subnormal Underflow Inexact Rounded -- Same again, negatives -- Nmax and similar dece122 apply -9.999999999999999E+384 -> #f7fcff3fcff3fcff dece123 apply #f7fcff3fcff3fcff -> -9.999999999999999E+384 dece124 apply -1.234567890123456E+384 -> #c7fd34b9c1e28e56 dece125 apply #c7fd34b9c1e28e56 -> -1.234567890123456E+384 -- fold-downs (more below) dece130 apply -1.23E+384 -> #c7fd300000000000 Clamped dece131 apply #c7fd300000000000 -> -1.230000000000000E+384 dece132 apply -1E+384 -> #c7fc000000000000 Clamped dece133 apply #c7fc000000000000 -> -1.000000000000000E+384 -- overflows maxExponent: 999 -- set high so conversion causes the overflow minExponent: -999 dece140 apply -10E+384 -> #f800000000000000 Overflow Rounded Inexact dece141 apply -1.000000000000000E+385 -> #f800000000000000 Overflow Rounded Inexact maxExponent: 384 minExponent: -383 dece151 apply -12345 -> #a2380000000049c5 dece152 apply #a2380000000049c5 -> -12345 dece153 apply -1234 -> #a238000000000534 dece154 apply #a238000000000534 -> -1234 dece155 apply -123 -> #a2380000000000a3 dece156 apply #a2380000000000a3 -> -123 dece157 apply -12 -> #a238000000000012 dece158 apply #a238000000000012 -> -12 dece159 apply -1 -> #a238000000000001 dece160 apply #a238000000000001 -> -1 dece161 apply -1.23 -> #a2300000000000a3 dece162 apply #a2300000000000a3 -> -1.23 dece163 apply -123.45 -> #a2300000000049c5 dece164 apply #a2300000000049c5 -> -123.45 -- Nmin and below dece171 apply -1E-383 -> #803c000000000001 dece172 apply #803c000000000001 -> -1E-383 dece173 apply -1.000000000000000E-383 -> #8400000000000000 dece174 apply #8400000000000000 -> -1.000000000000000E-383 dece175 apply -1.000000000000001E-383 -> #8400000000000001 dece176 apply #8400000000000001 -> -1.000000000000001E-383 dece177 apply -0.100000000000000E-383 -> #8000800000000000 Subnormal dece178 apply #8000800000000000 -> -1.00000000000000E-384 Subnormal dece179 apply -0.000000000000010E-383 -> #8000000000000010 Subnormal dece180 apply #8000000000000010 -> -1.0E-397 Subnormal dece181 apply -0.00000000000001E-383 -> #8004000000000001 Subnormal dece182 apply #8004000000000001 -> -1E-397 Subnormal dece183 apply -0.000000000000001E-383 -> #8000000000000001 Subnormal dece184 apply #8000000000000001 -> -1E-398 Subnormal -- underflows dece189 apply -1e-398 -> #8000000000000001 Subnormal dece190 apply -1.0e-398 -> #8000000000000001 Subnormal Rounded dece191 apply -1.9e-398 -> #8000000000000002 Subnormal Underflow Inexact Rounded dece192 apply -1.1e-398 -> #8000000000000001 Subnormal Underflow Inexact Rounded dece193 apply -1.00000000001e-398 -> #8000000000000001 Subnormal Underflow Inexact Rounded dece194 apply -1.00000000000001e-398 -> #8000000000000001 Subnormal Underflow Inexact Rounded dece195 apply -1.000000000000001e-398 -> #8000000000000001 Subnormal Underflow Inexact Rounded dece196 apply -0.1e-398 -> #8000000000000000 Subnormal Underflow Inexact Rounded dece197 apply -0.00000000001e-398 -> #8000000000000000 Subnormal Underflow Inexact Rounded dece198 apply -0.00000000000001e-398 -> #8000000000000000 Subnormal Underflow Inexact Rounded dece199 apply -0.000000000000001e-398 -> #8000000000000000 Subnormal Underflow Inexact Rounded -- zeros dece401 apply 0E-500 -> #0000000000000000 Clamped dece402 apply 0E-400 -> #0000000000000000 Clamped dece403 apply 0E-398 -> #0000000000000000 dece404 apply #0000000000000000 -> 0E-398 dece405 apply 0.000000000000000E-383 -> #0000000000000000 dece406 apply #0000000000000000 -> 0E-398 dece407 apply 0E-2 -> #2230000000000000 dece408 apply #2230000000000000 -> 0.00 dece409 apply 0 -> #2238000000000000 dece410 apply #2238000000000000 -> 0 dece411 apply 0E+3 -> #2244000000000000 dece412 apply #2244000000000000 -> 0E+3 dece413 apply 0E+369 -> #43fc000000000000 dece414 apply #43fc000000000000 -> 0E+369 -- clamped zeros... dece415 apply 0E+370 -> #43fc000000000000 Clamped dece416 apply #43fc000000000000 -> 0E+369 dece417 apply 0E+384 -> #43fc000000000000 Clamped dece418 apply #43fc000000000000 -> 0E+369 dece419 apply 0E+400 -> #43fc000000000000 Clamped dece420 apply #43fc000000000000 -> 0E+369 dece421 apply 0E+500 -> #43fc000000000000 Clamped dece422 apply #43fc000000000000 -> 0E+369 -- negative zeros dece431 apply -0E-400 -> #8000000000000000 Clamped dece432 apply -0E-400 -> #8000000000000000 Clamped dece433 apply -0E-398 -> #8000000000000000 dece434 apply #8000000000000000 -> -0E-398 dece435 apply -0.000000000000000E-383 -> #8000000000000000 dece436 apply #8000000000000000 -> -0E-398 dece437 apply -0E-2 -> #a230000000000000 dece438 apply #a230000000000000 -> -0.00 dece439 apply -0 -> #a238000000000000 dece440 apply #a238000000000000 -> -0 dece441 apply -0E+3 -> #a244000000000000 dece442 apply #a244000000000000 -> -0E+3 dece443 apply -0E+369 -> #c3fc000000000000 dece444 apply #c3fc000000000000 -> -0E+369 -- clamped zeros... dece445 apply -0E+370 -> #c3fc000000000000 Clamped dece446 apply #c3fc000000000000 -> -0E+369 dece447 apply -0E+384 -> #c3fc000000000000 Clamped dece448 apply #c3fc000000000000 -> -0E+369 dece449 apply -0E+400 -> #c3fc000000000000 Clamped dece450 apply #c3fc000000000000 -> -0E+369 dece451 apply -0E+500 -> #c3fc000000000000 Clamped dece452 apply #c3fc000000000000 -> -0E+369 -- Specials dece501 apply #7878787878787878 -> #7800000000000000 dece502 apply #7800000000000000 -> Infinity dece503 apply #7979797979797979 -> #7800000000000000 dece504 apply #7900000000000000 -> Infinity dece505 apply #7a7a7a7a7a7a7a7a -> #7800000000000000 dece506 apply #7a00000000000000 -> Infinity dece507 apply #7b7b7b7b7b7b7b7b -> #7800000000000000 dece508 apply #7b00000000000000 -> Infinity dece509 apply #7c7c7c7c7c7c7c7c -> #7dffffffffffffff dece510 apply #7c00000000000000 -> NaN dece511 apply #7d7d7d7d7d7d7d7d -> #7dffffffffffffff dece512 apply #7d00000000000000 -> NaN dece513 apply #7e7e7e7e7e7e7e7e -> #7fffffffffffffff dece514 apply #7e00000000000000 -> sNaN dece515 apply #7f7f7f7f7f7f7f7f -> #7fffffffffffffff dece516 apply #7f00000000000000 -> sNaN dece521 apply #f878787878787878 -> #f800000000000000 dece522 apply #f800000000000000 -> -Infinity dece523 apply #f979797979797979 -> #f800000000000000 dece524 apply #f900000000000000 -> -Infinity dece525 apply #fa7a7a7a7a7a7a7a -> #f800000000000000 dece526 apply #fa00000000000000 -> -Infinity dece527 apply #fb7b7b7b7b7b7b7b -> #f800000000000000 dece528 apply #fb00000000000000 -> -Infinity dece529 apply #fc7c7c7c7c7c7c7c -> #7dffffffffffffff dece530 apply #fc00000000000000 -> NaN dece531 apply #fd7d7d7d7d7d7d7d -> #7dffffffffffffff dece532 apply #fd00000000000000 -> NaN dece533 apply #fe7e7e7e7e7e7e7e -> #7fffffffffffffff dece534 apply #fe00000000000000 -> sNaN dece535 apply #ff7f7f7f7f7f7f7f -> #7fffffffffffffff dece536 apply #ff00000000000000 -> sNaN -- fold-down full sequence dece601 apply 1E+384 -> #47fc000000000000 Clamped dece602 apply #47fc000000000000 -> 1.000000000000000E+384 dece603 apply 1E+383 -> #43fc800000000000 Clamped dece604 apply #43fc800000000000 -> 1.00000000000000E+383 dece605 apply 1E+382 -> #43fc100000000000 Clamped dece606 apply #43fc100000000000 -> 1.0000000000000E+382 dece607 apply 1E+381 -> #43fc010000000000 Clamped dece608 apply #43fc010000000000 -> 1.000000000000E+381 dece609 apply 1E+380 -> #43fc002000000000 Clamped dece610 apply #43fc002000000000 -> 1.00000000000E+380 dece611 apply 1E+379 -> #43fc000400000000 Clamped dece612 apply #43fc000400000000 -> 1.0000000000E+379 dece613 apply 1E+378 -> #43fc000040000000 Clamped dece614 apply #43fc000040000000 -> 1.000000000E+378 dece615 apply 1E+377 -> #43fc000008000000 Clamped dece616 apply #43fc000008000000 -> 1.00000000E+377 dece617 apply 1E+376 -> #43fc000001000000 Clamped dece618 apply #43fc000001000000 -> 1.0000000E+376 dece619 apply 1E+375 -> #43fc000000100000 Clamped dece620 apply #43fc000000100000 -> 1.000000E+375 dece621 apply 1E+374 -> #43fc000000020000 Clamped dece622 apply #43fc000000020000 -> 1.00000E+374 dece623 apply 1E+373 -> #43fc000000004000 Clamped dece624 apply #43fc000000004000 -> 1.0000E+373 dece625 apply 1E+372 -> #43fc000000000400 Clamped dece626 apply #43fc000000000400 -> 1.000E+372 dece627 apply 1E+371 -> #43fc000000000080 Clamped dece628 apply #43fc000000000080 -> 1.00E+371 dece629 apply 1E+370 -> #43fc000000000010 Clamped dece630 apply #43fc000000000010 -> 1.0E+370 dece631 apply 1E+369 -> #43fc000000000001 dece632 apply #43fc000000000001 -> 1E+369 dece633 apply 1E+368 -> #43f8000000000001 dece634 apply #43f8000000000001 -> 1E+368 -- same with 9s dece641 apply 9E+384 -> #77fc000000000000 Clamped dece642 apply #77fc000000000000 -> 9.000000000000000E+384 dece643 apply 9E+383 -> #43fc8c0000000000 Clamped dece644 apply #43fc8c0000000000 -> 9.00000000000000E+383 dece645 apply 9E+382 -> #43fc1a0000000000 Clamped dece646 apply #43fc1a0000000000 -> 9.0000000000000E+382 dece647 apply 9E+381 -> #43fc090000000000 Clamped dece648 apply #43fc090000000000 -> 9.000000000000E+381 dece649 apply 9E+380 -> #43fc002300000000 Clamped dece650 apply #43fc002300000000 -> 9.00000000000E+380 dece651 apply 9E+379 -> #43fc000680000000 Clamped dece652 apply #43fc000680000000 -> 9.0000000000E+379 dece653 apply 9E+378 -> #43fc000240000000 Clamped dece654 apply #43fc000240000000 -> 9.000000000E+378 dece655 apply 9E+377 -> #43fc000008c00000 Clamped dece656 apply #43fc000008c00000 -> 9.00000000E+377 dece657 apply 9E+376 -> #43fc000001a00000 Clamped dece658 apply #43fc000001a00000 -> 9.0000000E+376 dece659 apply 9E+375 -> #43fc000000900000 Clamped dece660 apply #43fc000000900000 -> 9.000000E+375 dece661 apply 9E+374 -> #43fc000000023000 Clamped dece662 apply #43fc000000023000 -> 9.00000E+374 dece663 apply 9E+373 -> #43fc000000006800 Clamped dece664 apply #43fc000000006800 -> 9.0000E+373 dece665 apply 9E+372 -> #43fc000000002400 Clamped dece666 apply #43fc000000002400 -> 9.000E+372 dece667 apply 9E+371 -> #43fc00000000008c Clamped dece668 apply #43fc00000000008c -> 9.00E+371 dece669 apply 9E+370 -> #43fc00000000001a Clamped dece670 apply #43fc00000000001a -> 9.0E+370 dece671 apply 9E+369 -> #43fc000000000009 dece672 apply #43fc000000000009 -> 9E+369 dece673 apply 9E+368 -> #43f8000000000009 dece674 apply #43f8000000000009 -> 9E+368 -- Selected DPD codes dece700 apply #2238000000000000 -> 0 dece701 apply #2238000000000009 -> 9 dece702 apply #2238000000000010 -> 10 dece703 apply #2238000000000019 -> 19 dece704 apply #2238000000000020 -> 20 dece705 apply #2238000000000029 -> 29 dece706 apply #2238000000000030 -> 30 dece707 apply #2238000000000039 -> 39 dece708 apply #2238000000000040 -> 40 dece709 apply #2238000000000049 -> 49 dece710 apply #2238000000000050 -> 50 dece711 apply #2238000000000059 -> 59 dece712 apply #2238000000000060 -> 60 dece713 apply #2238000000000069 -> 69 dece714 apply #2238000000000070 -> 70 dece715 apply #2238000000000071 -> 71 dece716 apply #2238000000000072 -> 72 dece717 apply #2238000000000073 -> 73 dece718 apply #2238000000000074 -> 74 dece719 apply #2238000000000075 -> 75 dece720 apply #2238000000000076 -> 76 dece721 apply #2238000000000077 -> 77 dece722 apply #2238000000000078 -> 78 dece723 apply #2238000000000079 -> 79 dece730 apply #223800000000029e -> 994 dece731 apply #223800000000029f -> 995 dece732 apply #22380000000002a0 -> 520 dece733 apply #22380000000002a1 -> 521 -- DPD: one of each of the huffman groups dece740 apply #22380000000003f7 -> 777 dece741 apply #22380000000003f8 -> 778 dece742 apply #22380000000003eb -> 787 dece743 apply #223800000000037d -> 877 dece744 apply #223800000000039f -> 997 dece745 apply #22380000000003bf -> 979 dece746 apply #22380000000003df -> 799 dece747 apply #223800000000006e -> 888 -- DPD all-highs cases (includes the 24 redundant codes) dece750 apply #223800000000006e -> 888 dece751 apply #223800000000016e -> 888 dece752 apply #223800000000026e -> 888 dece753 apply #223800000000036e -> 888 dece754 apply #223800000000006f -> 889 dece755 apply #223800000000016f -> 889 dece756 apply #223800000000026f -> 889 dece757 apply #223800000000036f -> 889 dece760 apply #223800000000007e -> 898 dece761 apply #223800000000017e -> 898 dece762 apply #223800000000027e -> 898 dece763 apply #223800000000037e -> 898 dece764 apply #223800000000007f -> 899 dece765 apply #223800000000017f -> 899 dece766 apply #223800000000027f -> 899 dece767 apply #223800000000037f -> 899 dece770 apply #22380000000000ee -> 988 dece771 apply #22380000000001ee -> 988 dece772 apply #22380000000002ee -> 988 dece773 apply #22380000000003ee -> 988 dece774 apply #22380000000000ef -> 989 dece775 apply #22380000000001ef -> 989 dece776 apply #22380000000002ef -> 989 dece777 apply #22380000000003ef -> 989 dece780 apply #22380000000000fe -> 998 dece781 apply #22380000000001fe -> 998 dece782 apply #22380000000002fe -> 998 dece783 apply #22380000000003fe -> 998 dece784 apply #22380000000000ff -> 999 dece785 apply #22380000000001ff -> 999 dece786 apply #22380000000002ff -> 999 dece787 apply #22380000000003ff -> 999 --- NEW FILE: compare.decTest --- ------------------------------------------------------------------------ -- compare.decTest -- decimal comparison -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot -- overflow or underflow, so actual subtractions are not necesary). extended: 1 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 -- sanity checks comx001 compare -2 -2 -> 0 comx002 compare -2 -1 -> -1 comx003 compare -2 0 -> -1 comx004 compare -2 1 -> -1 comx005 compare -2 2 -> -1 comx006 compare -1 -2 -> 1 comx007 compare -1 -1 -> 0 comx008 compare -1 0 -> -1 comx009 compare -1 1 -> -1 comx010 compare -1 2 -> -1 comx011 compare 0 -2 -> 1 comx012 compare 0 -1 -> 1 comx013 compare 0 0 -> 0 comx014 compare 0 1 -> -1 comx015 compare 0 2 -> -1 comx016 compare 1 -2 -> 1 comx017 compare 1 -1 -> 1 comx018 compare 1 0 -> 1 comx019 compare 1 1 -> 0 comx020 compare 1 2 -> -1 comx021 compare 2 -2 -> 1 comx022 compare 2 -1 -> 1 comx023 compare 2 0 -> 1 comx025 compare 2 1 -> 1 comx026 compare 2 2 -> 0 comx031 compare -20 -20 -> 0 comx032 compare -20 -10 -> -1 comx033 compare -20 00 -> -1 comx034 compare -20 10 -> -1 comx035 compare -20 20 -> -1 comx036 compare -10 -20 -> 1 comx037 compare -10 -10 -> 0 comx038 compare -10 00 -> -1 comx039 compare -10 10 -> -1 comx040 compare -10 20 -> -1 comx041 compare 00 -20 -> 1 comx042 compare 00 -10 -> 1 comx043 compare 00 00 -> 0 comx044 compare 00 10 -> -1 comx045 compare 00 20 -> -1 comx046 compare 10 -20 -> 1 comx047 compare 10 -10 -> 1 comx048 compare 10 00 -> 1 comx049 compare 10 10 -> 0 comx050 compare 10 20 -> -1 comx051 compare 20 -20 -> 1 comx052 compare 20 -10 -> 1 comx053 compare 20 00 -> 1 comx055 compare 20 10 -> 1 comx056 compare 20 20 -> 0 comx061 compare -2.0 -2.0 -> 0 comx062 compare -2.0 -1.0 -> -1 comx063 compare -2.0 0.0 -> -1 comx064 compare -2.0 1.0 -> -1 comx065 compare -2.0 2.0 -> -1 comx066 compare -1.0 -2.0 -> 1 comx067 compare -1.0 -1.0 -> 0 comx068 compare -1.0 0.0 -> -1 comx069 compare -1.0 1.0 -> -1 comx070 compare -1.0 2.0 -> -1 comx071 compare 0.0 -2.0 -> 1 comx072 compare 0.0 -1.0 -> 1 comx073 compare 0.0 0.0 -> 0 comx074 compare 0.0 1.0 -> -1 comx075 compare 0.0 2.0 -> -1 comx076 compare 1.0 -2.0 -> 1 comx077 compare 1.0 -1.0 -> 1 comx078 compare 1.0 0.0 -> 1 comx079 compare 1.0 1.0 -> 0 comx080 compare 1.0 2.0 -> -1 comx081 compare 2.0 -2.0 -> 1 comx082 compare 2.0 -1.0 -> 1 comx083 compare 2.0 0.0 -> 1 comx085 compare 2.0 1.0 -> 1 comx086 compare 2.0 2.0 -> 0 -- now some cases which might overflow if subtract were used maxexponent: 999999999 minexponent: -999999999 comx090 compare 9.99999999E+999999999 9.99999999E+999999999 -> 0 comx091 compare -9.99999999E+999999999 9.99999999E+999999999 -> -1 comx092 compare 9.99999999E+999999999 -9.99999999E+999999999 -> 1 comx093 compare -9.99999999E+999999999 -9.99999999E+999999999 -> 0 -- some differing length/exponent cases comx100 compare 7.0 7.0 -> 0 comx101 compare 7.0 7 -> 0 comx102 compare 7 7.0 -> 0 comx103 compare 7E+0 7.0 -> 0 comx104 compare 70E-1 7.0 -> 0 comx105 compare 0.7E+1 7 -> 0 comx106 compare 70E-1 7 -> 0 comx107 compare 7.0 7E+0 -> 0 comx108 compare 7.0 70E-1 -> 0 comx109 compare 7 0.7E+1 -> 0 comx110 compare 7 70E-1 -> 0 comx120 compare 8.0 7.0 -> 1 comx121 compare 8.0 7 -> 1 comx122 compare 8 7.0 -> 1 comx123 compare 8E+0 7.0 -> 1 comx124 compare 80E-1 7.0 -> 1 comx125 compare 0.8E+1 7 -> 1 comx126 compare 80E-1 7 -> 1 comx127 compare 8.0 7E+0 -> 1 comx128 compare 8.0 70E-1 -> 1 comx129 compare 8 0.7E+1 -> 1 comx130 compare 8 70E-1 -> 1 comx140 compare 8.0 9.0 -> -1 comx141 compare 8.0 9 -> -1 comx142 compare 8 9.0 -> -1 comx143 compare 8E+0 9.0 -> -1 comx144 compare 80E-1 9.0 -> -1 comx145 compare 0.8E+1 9 -> -1 comx146 compare 80E-1 9 -> -1 comx147 compare 8.0 9E+0 -> -1 comx148 compare 8.0 90E-1 -> -1 comx149 compare 8 0.9E+1 -> -1 comx150 compare 8 90E-1 -> -1 -- and again, with sign changes -+ .. comx200 compare -7.0 7.0 -> -1 comx201 compare -7.0 7 -> -1 comx202 compare -7 7.0 -> -1 comx203 compare -7E+0 7.0 -> -1 comx204 compare -70E-1 7.0 -> -1 comx205 compare -0.7E+1 7 -> -1 comx206 compare -70E-1 7 -> -1 comx207 compare -7.0 7E+0 -> -1 comx208 compare -7.0 70E-1 -> -1 comx209 compare -7 0.7E+1 -> -1 comx210 compare -7 70E-1 -> -1 comx220 compare -8.0 7.0 -> -1 comx221 compare -8.0 7 -> -1 comx222 compare -8 7.0 -> -1 comx223 compare -8E+0 7.0 -> -1 comx224 compare -80E-1 7.0 -> -1 comx225 compare -0.8E+1 7 -> -1 comx226 compare -80E-1 7 -> -1 comx227 compare -8.0 7E+0 -> -1 comx228 compare -8.0 70E-1 -> -1 comx229 compare -8 0.7E+1 -> -1 comx230 compare -8 70E-1 -> -1 comx240 compare -8.0 9.0 -> -1 comx241 compare -8.0 9 -> -1 comx242 compare -8 9.0 -> -1 comx243 compare -8E+0 9.0 -> -1 comx244 compare -80E-1 9.0 -> -1 comx245 compare -0.8E+1 9 -> -1 comx246 compare -80E-1 9 -> -1 comx247 compare -8.0 9E+0 -> -1 comx248 compare -8.0 90E-1 -> -1 comx249 compare -8 0.9E+1 -> -1 comx250 compare -8 90E-1 -> -1 -- and again, with sign changes +- .. comx300 compare 7.0 -7.0 -> 1 comx301 compare 7.0 -7 -> 1 comx302 compare 7 -7.0 -> 1 comx303 compare 7E+0 -7.0 -> 1 comx304 compare 70E-1 -7.0 -> 1 comx305 compare .7E+1 -7 -> 1 comx306 compare 70E-1 -7 -> 1 comx307 compare 7.0 -7E+0 -> 1 comx308 compare 7.0 -70E-1 -> 1 comx309 compare 7 -.7E+1 -> 1 comx310 compare 7 -70E-1 -> 1 comx320 compare 8.0 -7.0 -> 1 comx321 compare 8.0 -7 -> 1 comx322 compare 8 -7.0 -> 1 comx323 compare 8E+0 -7.0 -> 1 comx324 compare 80E-1 -7.0 -> 1 comx325 compare .8E+1 -7 -> 1 comx326 compare 80E-1 -7 -> 1 comx327 compare 8.0 -7E+0 -> 1 comx328 compare 8.0 -70E-1 -> 1 comx329 compare 8 -.7E+1 -> 1 comx330 compare 8 -70E-1 -> 1 comx340 compare 8.0 -9.0 -> 1 comx341 compare 8.0 -9 -> 1 comx342 compare 8 -9.0 -> 1 comx343 compare 8E+0 -9.0 -> 1 comx344 compare 80E-1 -9.0 -> 1 comx345 compare .8E+1 -9 -> 1 comx346 compare 80E-1 -9 -> 1 comx347 compare 8.0 -9E+0 -> 1 comx348 compare 8.0 -90E-1 -> 1 comx349 compare 8 -.9E+1 -> 1 comx350 compare 8 -90E-1 -> 1 -- and again, with sign changes -- .. comx400 compare -7.0 -7.0 -> 0 comx401 compare -7.0 -7 -> 0 comx402 compare -7 -7.0 -> 0 comx403 compare -7E+0 -7.0 -> 0 comx404 compare -70E-1 -7.0 -> 0 comx405 compare -.7E+1 -7 -> 0 comx406 compare -70E-1 -7 -> 0 comx407 compare -7.0 -7E+0 -> 0 comx408 compare -7.0 -70E-1 -> 0 comx409 compare -7 -.7E+1 -> 0 comx410 compare -7 -70E-1 -> 0 comx420 compare -8.0 -7.0 -> -1 comx421 compare -8.0 -7 -> -1 comx422 compare -8 -7.0 -> -1 comx423 compare -8E+0 -7.0 -> -1 comx424 compare -80E-1 -7.0 -> -1 comx425 compare -.8E+1 -7 -> -1 comx426 compare -80E-1 -7 -> -1 comx427 compare -8.0 -7E+0 -> -1 comx428 compare -8.0 -70E-1 -> -1 comx429 compare -8 -.7E+1 -> -1 comx430 compare -8 -70E-1 -> -1 comx440 compare -8.0 -9.0 -> 1 comx441 compare -8.0 -9 -> 1 comx442 compare -8 -9.0 -> 1 comx443 compare -8E+0 -9.0 -> 1 comx444 compare -80E-1 -9.0 -> 1 comx445 compare -.8E+1 -9 -> 1 comx446 compare -80E-1 -9 -> 1 comx447 compare -8.0 -9E+0 -> 1 comx448 compare -8.0 -90E-1 -> 1 comx449 compare -8 -.9E+1 -> 1 comx450 compare -8 -90E-1 -> 1 -- testcases that subtract to lots of zeros at boundaries [pgr] precision: 40 comx470 compare 123.4560000000000000E789 123.456E789 -> 0 comx471 compare 123.456000000000000E-89 123.456E-89 -> 0 comx472 compare 123.45600000000000E789 123.456E789 -> 0 comx473 compare 123.4560000000000E-89 123.456E-89 -> 0 comx474 compare 123.456000000000E789 123.456E789 -> 0 comx475 compare 123.45600000000E-89 123.456E-89 -> 0 comx476 compare 123.4560000000E789 123.456E789 -> 0 comx477 compare 123.456000000E-89 123.456E-89 -> 0 comx478 compare 123.45600000E789 123.456E789 -> 0 comx479 compare 123.4560000E-89 123.456E-89 -> 0 comx480 compare 123.456000E789 123.456E789 -> 0 comx481 compare 123.45600E-89 123.456E-89 -> 0 comx482 compare 123.4560E789 123.456E789 -> 0 comx483 compare 123.456E-89 123.456E-89 -> 0 comx484 compare 123.456E-89 123.4560000000000000E-89 -> 0 comx485 compare 123.456E789 123.456000000000000E789 -> 0 comx486 compare 123.456E-89 123.45600000000000E-89 -> 0 comx487 compare 123.456E789 123.4560000000000E789 -> 0 comx488 compare 123.456E-89 123.456000000000E-89 -> 0 comx489 compare 123.456E789 123.45600000000E789 -> 0 comx490 compare 123.456E-89 123.4560000000E-89 -> 0 comx491 compare 123.456E789 123.456000000E789 -> 0 comx492 compare 123.456E-89 123.45600000E-89 -> 0 comx493 compare 123.456E789 123.4560000E789 -> 0 comx494 compare 123.456E-89 123.456000E-89 -> 0 comx495 compare 123.456E789 123.45600E789 -> 0 comx496 compare 123.456E-89 123.4560E-89 -> 0 comx497 compare 123.456E789 123.456E789 -> 0 -- wide-ranging, around precision; signs equal precision: 9 comx500 compare 1 1E-15 -> 1 comx501 compare 1 1E-14 -> 1 comx502 compare 1 1E-13 -> 1 comx503 compare 1 1E-12 -> 1 comx504 compare 1 1E-11 -> 1 comx505 compare 1 1E-10 -> 1 comx506 compare 1 1E-9 -> 1 comx507 compare 1 1E-8 -> 1 comx508 compare 1 1E-7 -> 1 comx509 compare 1 1E-6 -> 1 comx510 compare 1 1E-5 -> 1 comx511 compare 1 1E-4 -> 1 comx512 compare 1 1E-3 -> 1 comx513 compare 1 1E-2 -> 1 comx514 compare 1 1E-1 -> 1 comx515 compare 1 1E-0 -> 0 comx516 compare 1 1E+1 -> -1 comx517 compare 1 1E+2 -> -1 comx518 compare 1 1E+3 -> -1 comx519 compare 1 1E+4 -> -1 comx521 compare 1 1E+5 -> -1 comx522 compare 1 1E+6 -> -1 comx523 compare 1 1E+7 -> -1 comx524 compare 1 1E+8 -> -1 comx525 compare 1 1E+9 -> -1 comx526 compare 1 1E+10 -> -1 comx527 compare 1 1E+11 -> -1 comx528 compare 1 1E+12 -> -1 comx529 compare 1 1E+13 -> -1 comx530 compare 1 1E+14 -> -1 comx531 compare 1 1E+15 -> -1 -- LR swap comx540 compare 1E-15 1 -> -1 comx541 compare 1E-14 1 -> -1 comx542 compare 1E-13 1 -> -1 comx543 compare 1E-12 1 -> -1 comx544 compare 1E-11 1 -> -1 comx545 compare 1E-10 1 -> -1 comx546 compare 1E-9 1 -> -1 comx547 compare 1E-8 1 -> -1 comx548 compare 1E-7 1 -> -1 comx549 compare 1E-6 1 -> -1 comx550 compare 1E-5 1 -> -1 comx551 compare 1E-4 1 -> -1 comx552 compare 1E-3 1 -> -1 comx553 compare 1E-2 1 -> -1 comx554 compare 1E-1 1 -> -1 comx555 compare 1E-0 1 -> 0 comx556 compare 1E+1 1 -> 1 comx557 compare 1E+2 1 -> 1 comx558 compare 1E+3 1 -> 1 comx559 compare 1E+4 1 -> 1 comx561 compare 1E+5 1 -> 1 comx562 compare 1E+6 1 -> 1 comx563 compare 1E+7 1 -> 1 comx564 compare 1E+8 1 -> 1 comx565 compare 1E+9 1 -> 1 comx566 compare 1E+10 1 -> 1 comx567 compare 1E+11 1 -> 1 comx568 compare 1E+12 1 -> 1 comx569 compare 1E+13 1 -> 1 comx570 compare 1E+14 1 -> 1 comx571 compare 1E+15 1 -> 1 -- similar with an useful coefficient, one side only comx580 compare 0.000000987654321 1E-15 -> 1 comx581 compare 0.000000987654321 1E-14 -> 1 comx582 compare 0.000000987654321 1E-13 -> 1 comx583 compare 0.000000987654321 1E-12 -> 1 comx584 compare 0.000000987654321 1E-11 -> 1 comx585 compare 0.000000987654321 1E-10 -> 1 comx586 compare 0.000000987654321 1E-9 -> 1 comx587 compare 0.000000987654321 1E-8 -> 1 comx588 compare 0.000000987654321 1E-7 -> 1 comx589 compare 0.000000987654321 1E-6 -> -1 comx590 compare 0.000000987654321 1E-5 -> -1 comx591 compare 0.000000987654321 1E-4 -> -1 comx592 compare 0.000000987654321 1E-3 -> -1 comx593 compare 0.000000987654321 1E-2 -> -1 comx594 compare 0.000000987654321 1E-1 -> -1 comx595 compare 0.000000987654321 1E-0 -> -1 comx596 compare 0.000000987654321 1E+1 -> -1 comx597 compare 0.000000987654321 1E+2 -> -1 comx598 compare 0.000000987654321 1E+3 -> -1 comx599 compare 0.000000987654321 1E+4 -> -1 -- check some unit-y traps precision: 20 comx600 compare 12 12.2345 -> -1 comx601 compare 12.0 12.2345 -> -1 comx602 compare 12.00 12.2345 -> -1 comx603 compare 12.000 12.2345 -> -1 comx604 compare 12.0000 12.2345 -> -1 comx605 compare 12.00000 12.2345 -> -1 comx606 compare 12.000000 12.2345 -> -1 comx607 compare 12.0000000 12.2345 -> -1 comx608 compare 12.00000000 12.2345 -> -1 comx609 compare 12.000000000 12.2345 -> -1 comx610 compare 12.1234 12 -> 1 comx611 compare 12.1234 12.0 -> 1 comx612 compare 12.1234 12.00 -> 1 comx613 compare 12.1234 12.000 -> 1 comx614 compare 12.1234 12.0000 -> 1 comx615 compare 12.1234 12.00000 -> 1 comx616 compare 12.1234 12.000000 -> 1 comx617 compare 12.1234 12.0000000 -> 1 comx618 compare 12.1234 12.00000000 -> 1 comx619 compare 12.1234 12.000000000 -> 1 comx620 compare -12 -12.2345 -> 1 comx621 compare -12.0 -12.2345 -> 1 comx622 compare -12.00 -12.2345 -> 1 comx623 compare -12.000 -12.2345 -> 1 comx624 compare -12.0000 -12.2345 -> 1 comx625 compare -12.00000 -12.2345 -> 1 comx626 compare -12.000000 -12.2345 -> 1 comx627 compare -12.0000000 -12.2345 -> 1 comx628 compare -12.00000000 -12.2345 -> 1 comx629 compare -12.000000000 -12.2345 -> 1 comx630 compare -12.1234 -12 -> -1 comx631 compare -12.1234 -12.0 -> -1 comx632 compare -12.1234 -12.00 -> -1 comx633 compare -12.1234 -12.000 -> -1 comx634 compare -12.1234 -12.0000 -> -1 comx635 compare -12.1234 -12.00000 -> -1 comx636 compare -12.1234 -12.000000 -> -1 comx637 compare -12.1234 -12.0000000 -> -1 comx638 compare -12.1234 -12.00000000 -> -1 comx639 compare -12.1234 -12.000000000 -> -1 precision: 9 -- extended zeros comx640 compare 0 0 -> 0 comx641 compare 0 -0 -> 0 comx642 compare 0 -0.0 -> 0 comx643 compare 0 0.0 -> 0 comx644 compare -0 0 -> 0 comx645 compare -0 -0 -> 0 comx646 compare -0 -0.0 -> 0 comx647 compare -0 0.0 -> 0 comx648 compare 0.0 0 -> 0 comx649 compare 0.0 -0 -> 0 comx650 compare 0.0 -0.0 -> 0 comx651 compare 0.0 0.0 -> 0 comx652 compare -0.0 0 -> 0 comx653 compare -0.0 -0 -> 0 comx654 compare -0.0 -0.0 -> 0 comx655 compare -0.0 0.0 -> 0 comx656 compare -0E1 0.0 -> 0 comx657 compare -0E2 0.0 -> 0 comx658 compare 0E1 0.0 -> 0 comx659 compare 0E2 0.0 -> 0 comx660 compare -0E1 0 -> 0 comx661 compare -0E2 0 -> 0 comx662 compare 0E1 0 -> 0 comx663 compare 0E2 0 -> 0 comx664 compare -0E1 -0E1 -> 0 comx665 compare -0E2 -0E1 -> 0 comx666 compare 0E1 -0E1 -> 0 comx667 compare 0E2 -0E1 -> 0 comx668 compare -0E1 -0E2 -> 0 comx669 compare -0E2 -0E2 -> 0 comx670 compare 0E1 -0E2 -> 0 comx671 compare 0E2 -0E2 -> 0 comx672 compare -0E1 0E1 -> 0 comx673 compare -0E2 0E1 -> 0 comx674 compare 0E1 0E1 -> 0 comx675 compare 0E2 0E1 -> 0 comx676 compare -0E1 0E2 -> 0 comx677 compare -0E2 0E2 -> 0 comx678 compare 0E1 0E2 -> 0 comx679 compare 0E2 0E2 -> 0 -- trailing zeros; unit-y precision: 20 comx680 compare 12 12 -> 0 comx681 compare 12 12.0 -> 0 comx682 compare 12 12.00 -> 0 comx683 compare 12 12.000 -> 0 comx684 compare 12 12.0000 -> 0 comx685 compare 12 12.00000 -> 0 comx686 compare 12 12.000000 -> 0 comx687 compare 12 12.0000000 -> 0 comx688 compare 12 12.00000000 -> 0 comx689 compare 12 12.000000000 -> 0 comx690 compare 12 12 -> 0 comx691 compare 12.0 12 -> 0 comx692 compare 12.00 12 -> 0 comx693 compare 12.000 12 -> 0 comx694 compare 12.0000 12 -> 0 comx695 compare 12.00000 12 -> 0 comx696 compare 12.000000 12 -> 0 comx697 compare 12.0000000 12 -> 0 comx698 compare 12.00000000 12 -> 0 comx699 compare 12.000000000 12 -> 0 -- long operand checks maxexponent: 999 minexponent: -999 precision: 9 comx701 compare 12345678000 1 -> 1 comx702 compare 1 12345678000 -> -1 comx703 compare 1234567800 1 -> 1 comx704 compare 1 1234567800 -> -1 comx705 compare 1234567890 1 -> 1 comx706 compare 1 1234567890 -> -1 comx707 compare 1234567891 1 -> 1 comx708 compare 1 1234567891 -> -1 comx709 compare 12345678901 1 -> 1 comx710 compare 1 12345678901 -> -1 comx711 compare 1234567896 1 -> 1 comx712 compare 1 1234567896 -> -1 comx713 compare -1234567891 1 -> -1 comx714 compare 1 -1234567891 -> 1 comx715 compare -12345678901 1 -> -1 comx716 compare 1 -12345678901 -> 1 comx717 compare -1234567896 1 -> -1 comx718 compare 1 -1234567896 -> 1 precision: 15 -- same with plenty of precision comx721 compare 12345678000 1 -> 1 comx722 compare 1 12345678000 -> -1 comx723 compare 1234567800 1 -> 1 comx724 compare 1 1234567800 -> -1 comx725 compare 1234567890 1 -> 1 comx726 compare 1 1234567890 -> -1 comx727 compare 1234567891 1 -> 1 comx728 compare 1 1234567891 -> -1 comx729 compare 12345678901 1 -> 1 comx730 compare 1 12345678901 -> -1 comx731 compare 1234567896 1 -> 1 comx732 compare 1 1234567896 -> -1 -- residue cases precision: 5 comx740 compare 1 0.9999999 -> 1 comx741 compare 1 0.999999 -> 1 comx742 compare 1 0.99999 -> 1 comx743 compare 1 1.0000 -> 0 comx744 compare 1 1.00001 -> -1 comx745 compare 1 1.000001 -> -1 comx746 compare 1 1.0000001 -> -1 comx750 compare 0.9999999 1 -> -1 comx751 compare 0.999999 1 -> -1 comx752 compare 0.99999 1 -> -1 comx753 compare 1.0000 1 -> 0 comx754 compare 1.00001 1 -> 1 comx755 compare 1.000001 1 -> 1 comx756 compare 1.0000001 1 -> 1 -- a selection of longies comx760 compare -36852134.84194296250843579428931 -5830629.8347085025808756560357940 -> -1 comx761 compare -36852134.84194296250843579428931 -36852134.84194296250843579428931 -> 0 comx762 compare -36852134.94194296250843579428931 -36852134.84194296250843579428931 -> -1 comx763 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 -- precisions above or below the difference should have no effect precision: 11 comx764 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 10 comx765 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 9 comx766 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 8 comx767 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 7 comx768 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 6 comx769 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 5 comx770 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 4 comx771 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 3 comx772 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 2 comx773 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 precision: 1 comx774 compare -36852134.84194296250843579428931 -36852134.94194296250843579428931 -> 1 -- Specials precision: 9 comx780 compare Inf -Inf -> 1 comx781 compare Inf -1000 -> 1 comx782 compare Inf -1 -> 1 comx783 compare Inf -0 -> 1 comx784 compare Inf 0 -> 1 comx785 compare Inf 1 -> 1 comx786 compare Inf 1000 -> 1 comx787 compare Inf Inf -> 0 comx788 compare -1000 Inf -> -1 comx789 compare -Inf Inf -> -1 comx790 compare -1 Inf -> -1 comx791 compare -0 Inf -> -1 comx792 compare 0 Inf -> -1 comx793 compare 1 Inf -> -1 comx794 compare 1000 Inf -> -1 comx795 compare Inf Inf -> 0 comx800 compare -Inf -Inf -> 0 comx801 compare -Inf -1000 -> -1 comx802 compare -Inf -1 -> -1 comx803 compare -Inf -0 -> -1 comx804 compare -Inf 0 -> -1 comx805 compare -Inf 1 -> -1 comx806 compare -Inf 1000 -> -1 comx807 compare -Inf Inf -> -1 comx808 compare -Inf -Inf -> 0 comx809 compare -1000 -Inf -> 1 comx810 compare -1 -Inf -> 1 comx811 compare -0 -Inf -> 1 comx812 compare 0 -Inf -> 1 comx813 compare 1 -Inf -> 1 comx814 compare 1000 -Inf -> 1 comx815 compare Inf -Inf -> 1 comx821 compare NaN -Inf -> NaN comx822 compare NaN -1000 -> NaN comx823 compare NaN -1 -> NaN comx824 compare NaN -0 -> NaN comx825 compare NaN 0 -> NaN comx826 compare NaN 1 -> NaN comx827 compare NaN 1000 -> NaN comx828 compare NaN Inf -> NaN comx829 compare NaN NaN -> NaN comx830 compare -Inf NaN -> NaN comx831 compare -1000 NaN -> NaN comx832 compare -1 NaN -> NaN comx833 compare -0 NaN -> NaN comx834 compare 0 NaN -> NaN comx835 compare 1 NaN -> NaN comx836 compare 1000 NaN -> NaN comx837 compare Inf NaN -> NaN comx841 compare sNaN -Inf -> NaN Invalid_operation comx842 compare sNaN -1000 -> NaN Invalid_operation comx843 compare sNaN -1 -> NaN Invalid_operation comx844 compare sNaN -0 -> NaN Invalid_operation comx845 compare sNaN 0 -> NaN Invalid_operation comx846 compare sNaN 1 -> NaN Invalid_operation comx847 compare sNaN 1000 -> NaN Invalid_operation comx848 compare sNaN NaN -> NaN Invalid_operation comx849 compare sNaN sNaN -> NaN Invalid_operation comx850 compare NaN sNaN -> NaN Invalid_operation comx851 compare -Inf sNaN -> NaN Invalid_operation comx852 compare -1000 sNaN -> NaN Invalid_operation comx853 compare -1 sNaN -> NaN Invalid_operation comx854 compare -0 sNaN -> NaN Invalid_operation comx855 compare 0 sNaN -> NaN Invalid_operation comx856 compare 1 sNaN -> NaN Invalid_operation comx857 compare 1000 sNaN -> NaN Invalid_operation comx858 compare Inf sNaN -> NaN Invalid_operation comx859 compare NaN sNaN -> NaN Invalid_operation -- overflow and underflow tests .. subnormal results now allowed maxExponent: 999999999 minexponent: -999999999 comx860 compare +1.23456789012345E-0 9E+999999999 -> -1 comx861 compare 9E+999999999 +1.23456789012345E-0 -> 1 comx862 compare +0.100 9E-999999999 -> 1 comx863 compare 9E-999999999 +0.100 -> -1 comx865 compare -1.23456789012345E-0 9E+999999999 -> -1 comx866 compare 9E+999999999 -1.23456789012345E-0 -> 1 comx867 compare -0.100 9E-999999999 -> -1 comx868 compare 9E-999999999 -0.100 -> 1 comx869 compare 1e-599999999 1e-400000001 -> -1 comx870 compare 1e-599999999 1e-400000000 -> -1 comx871 compare 1e-600000000 1e-400000000 -> -1 comx872 compare 9e-999999998 0.01 -> -1 comx873 compare 9e-999999998 0.1 -> -1 comx874 compare 0.01 9e-999999998 -> 1 comx875 compare 1e599999999 1e400000001 -> 1 comx876 compare 1e599999999 1e400000000 -> 1 comx877 compare 1e600000000 1e400000000 -> 1 comx878 compare 9e999999998 100 -> 1 comx879 compare 9e999999998 10 -> 1 comx880 compare 100 9e999999998 -> -1 -- signs comx881 compare 1e+777777777 1e+411111111 -> 1 comx882 compare 1e+777777777 -1e+411111111 -> 1 comx883 compare -1e+777777777 1e+411111111 -> -1 comx884 compare -1e+777777777 -1e+411111111 -> -1 comx885 compare 1e-777777777 1e-411111111 -> -1 comx886 compare 1e-777777777 -1e-411111111 -> 1 comx887 compare -1e-777777777 1e-411111111 -> -1 comx888 compare -1e-777777777 -1e-411111111 -> 1 -- Null tests comx900 compare 10 # -> NaN Invalid_operation comx901 compare # 10 -> NaN Invalid_operation --- NEW FILE: clamp.decTest --- ------------------------------------------------------------------------ -- clamp.decTest -- clamped exponent tests (format-independent) -- -- Copyright (c) IBM Corporation, 2000, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- This set of tests uses the same limits as the 8-byte concrete -- representation, but applies clamping without using format-specific -- conversions. extended: 1 precision: 16 rounding: half_even maxExponent: 384 minExponent: -383 clamp: 1 -- General testcases -- Normality clam010 apply 1234567890123456 -> 1234567890123456 clam011 apply 1234567890123456.0 -> 1234567890123456 Rounded clam012 apply 1234567890123456.1 -> 1234567890123456 Rounded Inexact clam013 apply -1234567890123456 -> -1234567890123456 clam014 apply -1234567890123456.0 -> -1234567890123456 Rounded clam015 apply -1234567890123456.1 -> -1234567890123456 Rounded Inexact -- Nmax and similar clam022 apply 9.999999999999999E+384 -> 9.999999999999999E+384 clam024 apply 1.234567890123456E+384 -> 1.234567890123456E+384 -- fold-downs (more below) clam030 apply 1.23E+384 -> 1.230000000000000E+384 Clamped clam032 apply 1E+384 -> 1.000000000000000E+384 Clamped clam051 apply 12345 -> 12345 clam053 apply 1234 -> 1234 clam055 apply 123 -> 123 clam057 apply 12 -> 12 clam059 apply 1 -> 1 clam061 apply 1.23 -> 1.23 clam063 apply 123.45 -> 123.45 -- Nmin and below clam071 apply 1E-383 -> 1E-383 clam073 apply 1.000000000000000E-383 -> 1.000000000000000E-383 clam075 apply 1.000000000000001E-383 -> 1.000000000000001E-383 clam077 apply 0.100000000000000E-383 -> 1.00000000000000E-384 Subnormal clam079 apply 0.000000000000010E-383 -> 1.0E-397 Subnormal clam081 apply 0.00000000000001E-383 -> 1E-397 Subnormal clam083 apply 0.000000000000001E-383 -> 1E-398 Subnormal -- underflows clam090 apply 1e-398 -> #0000000000000001 Subnormal clam091 apply 1.9e-398 -> #0000000000000002 Subnormal Underflow Inexact Rounded clam092 apply 1.1e-398 -> #0000000000000001 Subnormal Underflow Inexact Rounded clam093 apply 1.00000000001e-398 -> #0000000000000001 Subnormal Underflow Inexact Rounded clam094 apply 1.00000000000001e-398 -> #0000000000000001 Subnormal Underflow Inexact Rounded clam095 apply 1.000000000000001e-398 -> #0000000000000001 Subnormal Underflow Inexact Rounded clam096 apply 0.1e-398 -> #0000000000000000 Subnormal Underflow Inexact Rounded clam097 apply 0.00000000001e-398 -> #0000000000000000 Subnormal Underflow Inexact Rounded clam098 apply 0.00000000000001e-398 -> #0000000000000000 Subnormal Underflow Inexact Rounded clam099 apply 0.000000000000001e-398 -> #0000000000000000 Subnormal Underflow Inexact Rounded -- Same again, negatives -- Nmax and similar clam122 apply -9.999999999999999E+384 -> -9.999999999999999E+384 clam124 apply -1.234567890123456E+384 -> -1.234567890123456E+384 -- fold-downs (more below) clam130 apply -1.23E+384 -> -1.230000000000000E+384 Clamped clam132 apply -1E+384 -> -1.000000000000000E+384 Clamped clam151 apply -12345 -> -12345 clam153 apply -1234 -> -1234 clam155 apply -123 -> -123 clam157 apply -12 -> -12 clam159 apply -1 -> -1 clam161 apply -1.23 -> -1.23 clam163 apply -123.45 -> -123.45 -- Nmin and below clam171 apply -1E-383 -> -1E-383 clam173 apply -1.000000000000000E-383 -> -1.000000000000000E-383 clam175 apply -1.000000000000001E-383 -> -1.000000000000001E-383 clam177 apply -0.100000000000000E-383 -> -1.00000000000000E-384 Subnormal clam179 apply -0.000000000000010E-383 -> -1.0E-397 Subnormal clam181 apply -0.00000000000001E-383 -> -1E-397 Subnormal clam183 apply -0.000000000000001E-383 -> -1E-398 Subnormal -- underflows clam189 apply -1e-398 -> #8000000000000001 Subnormal clam190 apply -1.0e-398 -> #8000000000000001 Subnormal Rounded clam191 apply -1.9e-398 -> #8000000000000002 Subnormal Underflow Inexact Rounded clam192 apply -1.1e-398 -> #8000000000000001 Subnormal Underflow Inexact Rounded clam193 apply -1.00000000001e-398 -> #8000000000000001 Subnormal Underflow Inexact Rounded clam194 apply -1.00000000000001e-398 -> #8000000000000001 Subnormal Underflow Inexact Rounded clam195 apply -1.000000000000001e-398 -> #8000000000000001 Subnormal Underflow Inexact Rounded clam196 apply -0.1e-398 -> #8000000000000000 Subnormal Underflow Inexact Rounded clam197 apply -0.00000000001e-398 -> #8000000000000000 Subnormal Underflow Inexact Rounded clam198 apply -0.00000000000001e-398 -> #8000000000000000 Subnormal Underflow Inexact Rounded clam199 apply -0.000000000000001e-398 -> #8000000000000000 Subnormal Underflow Inexact Rounded -- zeros clam401 apply 0E-500 -> 0E-398 Clamped clam402 apply 0E-400 -> 0E-398 Clamped clam403 apply 0E-398 -> 0E-398 clam404 apply 0.000000000000000E-383 -> 0E-398 clam405 apply 0E-2 -> 0.00 clam406 apply 0 -> 0 clam407 apply 0E+3 -> 0E+3 clam408 apply 0E+369 -> 0E+369 -- clamped zeros... clam410 apply 0E+370 -> 0E+369 Clamped clam411 apply 0E+384 -> 0E+369 Clamped clam412 apply 0E+400 -> 0E+369 Clamped clam413 apply 0E+500 -> 0E+369 Clamped -- negative zeros clam420 apply -0E-500 -> -0E-398 Clamped clam421 apply -0E-400 -> -0E-398 Clamped clam422 apply -0E-398 -> -0E-398 clam423 apply -0.000000000000000E-383 -> -0E-398 clam424 apply -0E-2 -> -0.00 clam425 apply -0 -> -0 clam426 apply -0E+3 -> -0E+3 clam427 apply -0E+369 -> -0E+369 -- clamped zeros... clam431 apply -0E+370 -> -0E+369 Clamped clam432 apply -0E+384 -> -0E+369 Clamped clam433 apply -0E+400 -> -0E+369 Clamped clam434 apply -0E+500 -> -0E+369 Clamped -- fold-down full sequence clam601 apply 1E+384 -> 1.000000000000000E+384 Clamped clam603 apply 1E+383 -> 1.00000000000000E+383 Clamped clam605 apply 1E+382 -> 1.0000000000000E+382 Clamped clam607 apply 1E+381 -> 1.000000000000E+381 Clamped clam609 apply 1E+380 -> 1.00000000000E+380 Clamped clam611 apply 1E+379 -> 1.0000000000E+379 Clamped clam613 apply 1E+378 -> 1.000000000E+378 Clamped clam615 apply 1E+377 -> 1.00000000E+377 Clamped clam617 apply 1E+376 -> 1.0000000E+376 Clamped clam619 apply 1E+375 -> 1.000000E+375 Clamped clam621 apply 1E+374 -> 1.00000E+374 Clamped clam623 apply 1E+373 -> 1.0000E+373 Clamped clam625 apply 1E+372 -> 1.000E+372 Clamped clam627 apply 1E+371 -> 1.00E+371 Clamped clam629 apply 1E+370 -> 1.0E+370 Clamped clam631 apply 1E+369 -> 1E+369 clam633 apply 1E+368 -> 1E+368 -- same with 9s clam641 apply 9E+384 -> 9.000000000000000E+384 Clamped clam643 apply 9E+383 -> 9.00000000000000E+383 Clamped clam645 apply 9E+382 -> 9.0000000000000E+382 Clamped clam647 apply 9E+381 -> 9.000000000000E+381 Clamped clam649 apply 9E+380 -> 9.00000000000E+380 Clamped clam651 apply 9E+379 -> 9.0000000000E+379 Clamped clam653 apply 9E+378 -> 9.000000000E+378 Clamped clam655 apply 9E+377 -> 9.00000000E+377 Clamped clam657 apply 9E+376 -> 9.0000000E+376 Clamped clam659 apply 9E+375 -> 9.000000E+375 Clamped clam661 apply 9E+374 -> 9.00000E+374 Clamped clam663 apply 9E+373 -> 9.0000E+373 Clamped clam665 apply 9E+372 -> 9.000E+372 Clamped clam667 apply 9E+371 -> 9.00E+371 Clamped clam669 apply 9E+370 -> 9.0E+370 Clamped clam671 apply 9E+369 -> 9E+369 clam673 apply 9E+368 -> 9E+368 -- example from documentation precision: 7 rounding: half_even maxExponent: +96 minExponent: -95 clamp: 0 clam700 apply 1.23E+96 -> 1.23E+96 clamp: 1 clam701 apply 1.23E+96 -> 1.230000E+96 Clamped --- NEW FILE: base.decTest --- ------------------------------------------------------------------------ -- base.decTest -- base decimal <--> string conversions -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ [...1173 lines suppressed...] basx1001 toSci 1e999999999 -> 1E+999999999 basx1002 toSci 1e0999999999 -> 1E+999999999 basx1003 toSci 1e00999999999 -> 1E+999999999 basx1004 toSci 1e000999999999 -> 1E+999999999 basx1005 toSci 1e000000000000999999999 -> 1E+999999999 basx1006 toSci 1e000000000001000000007 -> Infinity Overflow Inexact Rounded basx1007 toSci 1e-999999999 -> 1E-999999999 basx1008 toSci 1e-0999999999 -> 1E-999999999 basx1009 toSci 1e-00999999999 -> 1E-999999999 basx1010 toSci 1e-000999999999 -> 1E-999999999 basx1011 toSci 1e-000000000000999999999 -> 1E-999999999 basx1012 toSci 1e-000000000001000000007 -> 1E-1000000007 Subnormal -- check for double-rounded subnormals precision: 5 maxexponent: 79 minexponent: -79 basx1021 toSci 1.52444E-80 -> 1.524E-80 Inexact Rounded Subnormal Underflow basx1022 toSci 1.52445E-80 -> 1.524E-80 Inexact Rounded Subnormal Underflow basx1023 toSci 1.52446E-80 -> 1.524E-80 Inexact Rounded Subnormal Underflow --- NEW FILE: add.decTest --- ------------------------------------------------------------------------ -- add.decTest -- decimal addition -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 extended: 1 -- [first group are 'quick confidence check'] addx001 add 1 1 -> 2 addx002 add 2 3 -> 5 addx003 add '5.75' '3.3' -> 9.05 addx004 add '5' '-3' -> 2 addx005 add '-5' '-3' -> -8 addx006 add '-7' '2.5' -> -4.5 addx007 add '0.7' '0.3' -> 1.0 addx008 add '1.25' '1.25' -> 2.50 addx009 add '1.23456789' '1.00000000' -> '2.23456789' addx010 add '1.23456789' '1.00000011' -> '2.23456800' addx011 add '0.4444444444' '0.5555555555' -> '1.00000000' Inexact Rounded addx012 add '0.4444444440' '0.5555555555' -> '1.00000000' Inexact Rounded addx013 add '0.4444444444' '0.5555555550' -> '0.999999999' Inexact Rounded addx014 add '0.44444444449' '0' -> '0.444444444' Inexact Rounded addx015 add '0.444444444499' '0' -> '0.444444444' Inexact Rounded addx016 add '0.4444444444999' '0' -> '0.444444444' Inexact Rounded addx017 add '0.4444444445000' '0' -> '0.444444445' Inexact Rounded addx018 add '0.4444444445001' '0' -> '0.444444445' Inexact Rounded addx019 add '0.444444444501' '0' -> '0.444444445' Inexact Rounded addx020 add '0.44444444451' '0' -> '0.444444445' Inexact Rounded addx021 add 0 1 -> 1 addx022 add 1 1 -> 2 addx023 add 2 1 -> 3 addx024 add 3 1 -> 4 addx025 add 4 1 -> 5 addx026 add 5 1 -> 6 addx027 add 6 1 -> 7 addx028 add 7 1 -> 8 addx029 add 8 1 -> 9 addx030 add 9 1 -> 10 -- some carrying effects addx031 add '0.9998' '0.0000' -> '0.9998' addx032 add '0.9998' '0.0001' -> '0.9999' addx033 add '0.9998' '0.0002' -> '1.0000' addx034 add '0.9998' '0.0003' -> '1.0001' addx035 add '70' '10000e+9' -> '1.00000000E+13' Inexact Rounded addx036 add '700' '10000e+9' -> '1.00000000E+13' Inexact Rounded addx037 add '7000' '10000e+9' -> '1.00000000E+13' Inexact Rounded addx038 add '70000' '10000e+9' -> '1.00000001E+13' Inexact Rounded addx039 add '700000' '10000e+9' -> '1.00000007E+13' Rounded -- symmetry: addx040 add '10000e+9' '70' -> '1.00000000E+13' Inexact Rounded addx041 add '10000e+9' '700' -> '1.00000000E+13' Inexact Rounded addx042 add '10000e+9' '7000' -> '1.00000000E+13' Inexact Rounded addx044 add '10000e+9' '70000' -> '1.00000001E+13' Inexact Rounded addx045 add '10000e+9' '700000' -> '1.00000007E+13' Rounded -- same, higher precision precision: 15 addx046 add '10000e+9' '7' -> '10000000000007' addx047 add '10000e+9' '70' -> '10000000000070' addx048 add '10000e+9' '700' -> '10000000000700' addx049 add '10000e+9' '7000' -> '10000000007000' addx050 add '10000e+9' '70000' -> '10000000070000' addx051 add '10000e+9' '700000' -> '10000000700000' -- examples from decarith addx053 add '12' '7.00' -> '19.00' addx054 add '1.3' '-1.07' -> '0.23' addx055 add '1.3' '-1.30' -> '0.00' addx056 add '1.3' '-2.07' -> '-0.77' addx057 add '1E+2' '1E+4' -> '1.01E+4' -- zero preservation precision: 6 addx060 add '10000e+9' '70000' -> '1.00000E+13' Inexact Rounded addx061 add 1 '0.0001' -> '1.0001' addx062 add 1 '0.00001' -> '1.00001' addx063 add 1 '0.000001' -> '1.00000' Inexact Rounded addx064 add 1 '0.0000001' -> '1.00000' Inexact Rounded addx065 add 1 '0.00000001' -> '1.00000' Inexact Rounded -- some funny zeros [in case of bad signum] addx070 add 1 0 -> 1 addx071 add 1 0. -> 1 addx072 add 1 .0 -> 1.0 addx073 add 1 0.0 -> 1.0 addx074 add 1 0.00 -> 1.00 addx075 add 0 1 -> 1 addx076 add 0. 1 -> 1 addx077 add .0 1 -> 1.0 addx078 add 0.0 1 -> 1.0 addx079 add 0.00 1 -> 1.00 precision: 9 -- some carries addx080 add 999999998 1 -> 999999999 addx081 add 999999999 1 -> 1.00000000E+9 Rounded addx082 add 99999999 1 -> 100000000 addx083 add 9999999 1 -> 10000000 addx084 add 999999 1 -> 1000000 addx085 add 99999 1 -> 100000 addx086 add 9999 1 -> 10000 addx087 add 999 1 -> 1000 addx088 add 99 1 -> 100 addx089 add 9 1 -> 10 -- more LHS swaps addx090 add '-56267E-10' 0 -> '-0.0000056267' addx091 add '-56267E-6' 0 -> '-0.056267' addx092 add '-56267E-5' 0 -> '-0.56267' addx093 add '-56267E-4' 0 -> '-5.6267' addx094 add '-56267E-3' 0 -> '-56.267' addx095 add '-56267E-2' 0 -> '-562.67' addx096 add '-56267E-1' 0 -> '-5626.7' addx097 add '-56267E-0' 0 -> '-56267' addx098 add '-5E-10' 0 -> '-5E-10' addx099 add '-5E-7' 0 -> '-5E-7' addx100 add '-5E-6' 0 -> '-0.000005' addx101 add '-5E-5' 0 -> '-0.00005' addx102 add '-5E-4' 0 -> '-0.0005' addx103 add '-5E-1' 0 -> '-0.5' addx104 add '-5E0' 0 -> '-5' addx105 add '-5E1' 0 -> '-50' addx106 add '-5E5' 0 -> '-500000' addx107 add '-5E8' 0 -> '-500000000' addx108 add '-5E9' 0 -> '-5.00000000E+9' Rounded addx109 add '-5E10' 0 -> '-5.00000000E+10' Rounded addx110 add '-5E11' 0 -> '-5.00000000E+11' Rounded addx111 add '-5E100' 0 -> '-5.00000000E+100' Rounded -- more RHS swaps addx113 add 0 '-56267E-10' -> '-0.0000056267' addx114 add 0 '-56267E-6' -> '-0.056267' addx116 add 0 '-56267E-5' -> '-0.56267' addx117 add 0 '-56267E-4' -> '-5.6267' addx119 add 0 '-56267E-3' -> '-56.267' addx120 add 0 '-56267E-2' -> '-562.67' addx121 add 0 '-56267E-1' -> '-5626.7' addx122 add 0 '-56267E-0' -> '-56267' addx123 add 0 '-5E-10' -> '-5E-10' addx124 add 0 '-5E-7' -> '-5E-7' addx125 add 0 '-5E-6' -> '-0.000005' addx126 add 0 '-5E-5' -> '-0.00005' addx127 add 0 '-5E-4' -> '-0.0005' addx128 add 0 '-5E-1' -> '-0.5' addx129 add 0 '-5E0' -> '-5' addx130 add 0 '-5E1' -> '-50' addx131 add 0 '-5E5' -> '-500000' addx132 add 0 '-5E8' -> '-500000000' addx133 add 0 '-5E9' -> '-5.00000000E+9' Rounded addx134 add 0 '-5E10' -> '-5.00000000E+10' Rounded addx135 add 0 '-5E11' -> '-5.00000000E+11' Rounded addx136 add 0 '-5E100' -> '-5.00000000E+100' Rounded -- related addx137 add 1 '0E-12' -> '1.00000000' Rounded addx138 add -1 '0E-12' -> '-1.00000000' Rounded addx139 add '0E-12' 1 -> '1.00000000' Rounded addx140 add '0E-12' -1 -> '-1.00000000' Rounded addx141 add 1E+4 0.0000 -> '10000.0000' addx142 add 1E+4 0.00000 -> '10000.0000' Rounded addx143 add 0.000 1E+5 -> '100000.000' addx144 add 0.0000 1E+5 -> '100000.000' Rounded -- [some of the next group are really constructor tests] addx146 add '00.0' 0 -> '0.0' addx147 add '0.00' 0 -> '0.00' addx148 add 0 '0.00' -> '0.00' addx149 add 0 '00.0' -> '0.0' addx150 add '00.0' '0.00' -> '0.00' addx151 add '0.00' '00.0' -> '0.00' addx152 add '3' '.3' -> '3.3' addx153 add '3.' '.3' -> '3.3' addx154 add '3.0' '.3' -> '3.3' addx155 add '3.00' '.3' -> '3.30' addx156 add '3' '3' -> '6' addx157 add '3' '+3' -> '6' addx158 add '3' '-3' -> '0' addx159 add '0.3' '-0.3' -> '0.0' addx160 add '0.03' '-0.03' -> '0.00' -- try borderline precision, with carries, etc. precision: 15 addx161 add '1E+12' '-1' -> '999999999999' addx162 add '1E+12' '1.11' -> '1000000000001.11' addx163 add '1.11' '1E+12' -> '1000000000001.11' addx164 add '-1' '1E+12' -> '999999999999' addx165 add '7E+12' '-1' -> '6999999999999' addx166 add '7E+12' '1.11' -> '7000000000001.11' addx167 add '1.11' '7E+12' -> '7000000000001.11' addx168 add '-1' '7E+12' -> '6999999999999' -- 123456789012345 123456789012345 1 23456789012345 addx170 add '0.444444444444444' '0.555555555555563' -> '1.00000000000001' Inexact Rounded addx171 add '0.444444444444444' '0.555555555555562' -> '1.00000000000001' Inexact Rounded addx172 add '0.444444444444444' '0.555555555555561' -> '1.00000000000001' Inexact Rounded addx173 add '0.444444444444444' '0.555555555555560' -> '1.00000000000000' Inexact Rounded addx174 add '0.444444444444444' '0.555555555555559' -> '1.00000000000000' Inexact Rounded addx175 add '0.444444444444444' '0.555555555555558' -> '1.00000000000000' Inexact Rounded addx176 add '0.444444444444444' '0.555555555555557' -> '1.00000000000000' Inexact Rounded addx177 add '0.444444444444444' '0.555555555555556' -> '1.00000000000000' Rounded addx178 add '0.444444444444444' '0.555555555555555' -> '0.999999999999999' addx179 add '0.444444444444444' '0.555555555555554' -> '0.999999999999998' addx180 add '0.444444444444444' '0.555555555555553' -> '0.999999999999997' addx181 add '0.444444444444444' '0.555555555555552' -> '0.999999999999996' addx182 add '0.444444444444444' '0.555555555555551' -> '0.999999999999995' addx183 add '0.444444444444444' '0.555555555555550' -> '0.999999999999994' -- and some more, including residue effects and different roundings precision: 9 rounding: half_up addx200 add '123456789' 0 -> '123456789' addx201 add '123456789' 0.000000001 -> '123456789' Inexact Rounded addx202 add '123456789' 0.000001 -> '123456789' Inexact Rounded addx203 add '123456789' 0.1 -> '123456789' Inexact Rounded addx204 add '123456789' 0.4 -> '123456789' Inexact Rounded addx205 add '123456789' 0.49 -> '123456789' Inexact Rounded addx206 add '123456789' 0.499999 -> '123456789' Inexact Rounded addx207 add '123456789' 0.499999999 -> '123456789' Inexact Rounded addx208 add '123456789' 0.5 -> '123456790' Inexact Rounded addx209 add '123456789' 0.500000001 -> '123456790' Inexact Rounded addx210 add '123456789' 0.500001 -> '123456790' Inexact Rounded addx211 add '123456789' 0.51 -> '123456790' Inexact Rounded addx212 add '123456789' 0.6 -> '123456790' Inexact Rounded addx213 add '123456789' 0.9 -> '123456790' Inexact Rounded addx214 add '123456789' 0.99999 -> '123456790' Inexact Rounded addx215 add '123456789' 0.999999999 -> '123456790' Inexact Rounded addx216 add '123456789' 1 -> '123456790' addx217 add '123456789' 1.000000001 -> '123456790' Inexact Rounded addx218 add '123456789' 1.00001 -> '123456790' Inexact Rounded addx219 add '123456789' 1.1 -> '123456790' Inexact Rounded rounding: half_even addx220 add '123456789' 0 -> '123456789' addx221 add '123456789' 0.000000001 -> '123456789' Inexact Rounded addx222 add '123456789' 0.000001 -> '123456789' Inexact Rounded addx223 add '123456789' 0.1 -> '123456789' Inexact Rounded addx224 add '123456789' 0.4 -> '123456789' Inexact Rounded addx225 add '123456789' 0.49 -> '123456789' Inexact Rounded addx226 add '123456789' 0.499999 -> '123456789' Inexact Rounded addx227 add '123456789' 0.499999999 -> '123456789' Inexact Rounded addx228 add '123456789' 0.5 -> '123456790' Inexact Rounded addx229 add '123456789' 0.500000001 -> '123456790' Inexact Rounded addx230 add '123456789' 0.500001 -> '123456790' Inexact Rounded addx231 add '123456789' 0.51 -> '123456790' Inexact Rounded addx232 add '123456789' 0.6 -> '123456790' Inexact Rounded addx233 add '123456789' 0.9 -> '123456790' Inexact Rounded addx234 add '123456789' 0.99999 -> '123456790' Inexact Rounded addx235 add '123456789' 0.999999999 -> '123456790' Inexact Rounded addx236 add '123456789' 1 -> '123456790' addx237 add '123456789' 1.00000001 -> '123456790' Inexact Rounded addx238 add '123456789' 1.00001 -> '123456790' Inexact Rounded addx239 add '123456789' 1.1 -> '123456790' Inexact Rounded -- critical few with even bottom digit... addx240 add '123456788' 0.499999999 -> '123456788' Inexact Rounded addx241 add '123456788' 0.5 -> '123456788' Inexact Rounded addx242 add '123456788' 0.500000001 -> '123456789' Inexact Rounded rounding: down addx250 add '123456789' 0 -> '123456789' addx251 add '123456789' 0.000000001 -> '123456789' Inexact Rounded addx252 add '123456789' 0.000001 -> '123456789' Inexact Rounded addx253 add '123456789' 0.1 -> '123456789' Inexact Rounded addx254 add '123456789' 0.4 -> '123456789' Inexact Rounded addx255 add '123456789' 0.49 -> '123456789' Inexact Rounded addx256 add '123456789' 0.499999 -> '123456789' Inexact Rounded addx257 add '123456789' 0.499999999 -> '123456789' Inexact Rounded addx258 add '123456789' 0.5 -> '123456789' Inexact Rounded addx259 add '123456789' 0.500000001 -> '123456789' Inexact Rounded addx260 add '123456789' 0.500001 -> '123456789' Inexact Rounded addx261 add '123456789' 0.51 -> '123456789' Inexact Rounded addx262 add '123456789' 0.6 -> '123456789' Inexact Rounded addx263 add '123456789' 0.9 -> '123456789' Inexact Rounded addx264 add '123456789' 0.99999 -> '123456789' Inexact Rounded addx265 add '123456789' 0.999999999 -> '123456789' Inexact Rounded addx266 add '123456789' 1 -> '123456790' addx267 add '123456789' 1.00000001 -> '123456790' Inexact Rounded addx268 add '123456789' 1.00001 -> '123456790' Inexact Rounded addx269 add '123456789' 1.1 -> '123456790' Inexact Rounded rounding: half_up -- input preparation tests (operands should not be rounded) precision: 3 rounding: half_up addx270 add '12345678900000' 9999999999999 -> '2.23E+13' Inexact Rounded addx271 add '9999999999999' 12345678900000 -> '2.23E+13' Inexact Rounded addx272 add '12E+3' '3444' -> '1.54E+4' Inexact Rounded addx273 add '12E+3' '3446' -> '1.54E+4' Inexact Rounded addx274 add '12E+3' '3449.9' -> '1.54E+4' Inexact Rounded addx275 add '12E+3' '3450.0' -> '1.55E+4' Inexact Rounded addx276 add '12E+3' '3450.1' -> '1.55E+4' Inexact Rounded addx277 add '12E+3' '3454' -> '1.55E+4' Inexact Rounded addx278 add '12E+3' '3456' -> '1.55E+4' Inexact Rounded addx281 add '3444' '12E+3' -> '1.54E+4' Inexact Rounded addx282 add '3446' '12E+3' -> '1.54E+4' Inexact Rounded addx283 add '3449.9' '12E+3' -> '1.54E+4' Inexact Rounded addx284 add '3450.0' '12E+3' -> '1.55E+4' Inexact Rounded addx285 add '3450.1' '12E+3' -> '1.55E+4' Inexact Rounded addx286 add '3454' '12E+3' -> '1.55E+4' Inexact Rounded addx287 add '3456' '12E+3' -> '1.55E+4' Inexact Rounded rounding: half_down addx291 add '3444' '12E+3' -> '1.54E+4' Inexact Rounded addx292 add '3446' '12E+3' -> '1.54E+4' Inexact Rounded addx293 add '3449.9' '12E+3' -> '1.54E+4' Inexact Rounded addx294 add '3450.0' '12E+3' -> '1.54E+4' Inexact Rounded addx295 add '3450.1' '12E+3' -> '1.55E+4' Inexact Rounded addx296 add '3454' '12E+3' -> '1.55E+4' Inexact Rounded addx297 add '3456' '12E+3' -> '1.55E+4' Inexact Rounded -- 1 in last place tests rounding: half_up addx301 add -1 1 -> 0 addx302 add 0 1 -> 1 addx303 add 1 1 -> 2 addx304 add 12 1 -> 13 addx305 add 98 1 -> 99 addx306 add 99 1 -> 100 addx307 add 100 1 -> 101 addx308 add 101 1 -> 102 addx309 add -1 -1 -> -2 addx310 add 0 -1 -> -1 addx311 add 1 -1 -> 0 addx312 add 12 -1 -> 11 addx313 add 98 -1 -> 97 addx314 add 99 -1 -> 98 addx315 add 100 -1 -> 99 addx316 add 101 -1 -> 100 addx321 add -0.01 0.01 -> 0.00 addx322 add 0.00 0.01 -> 0.01 addx323 add 0.01 0.01 -> 0.02 addx324 add 0.12 0.01 -> 0.13 addx325 add 0.98 0.01 -> 0.99 addx326 add 0.99 0.01 -> 1.00 addx327 add 1.00 0.01 -> 1.01 addx328 add 1.01 0.01 -> 1.02 addx329 add -0.01 -0.01 -> -0.02 addx330 add 0.00 -0.01 -> -0.01 addx331 add 0.01 -0.01 -> 0.00 addx332 add 0.12 -0.01 -> 0.11 addx333 add 0.98 -0.01 -> 0.97 addx334 add 0.99 -0.01 -> 0.98 addx335 add 1.00 -0.01 -> 0.99 addx336 add 1.01 -0.01 -> 1.00 -- some more cases where adding 0 affects the coefficient precision: 9 addx340 add 1E+3 0 -> 1000 addx341 add 1E+8 0 -> 100000000 addx342 add 1E+9 0 -> 1.00000000E+9 Rounded addx343 add 1E+10 0 -> 1.00000000E+10 Rounded -- which simply follow from these cases ... addx344 add 1E+3 1 -> 1001 addx345 add 1E+8 1 -> 100000001 addx346 add 1E+9 1 -> 1.00000000E+9 Inexact Rounded addx347 add 1E+10 1 -> 1.00000000E+10 Inexact Rounded addx348 add 1E+3 7 -> 1007 addx349 add 1E+8 7 -> 100000007 addx350 add 1E+9 7 -> 1.00000001E+9 Inexact Rounded addx351 add 1E+10 7 -> 1.00000000E+10 Inexact Rounded -- tryzeros cases precision: 7 rounding: half_up maxExponent: 92 minexponent: -92 addx361 add 0E+50 10000E+1 -> 1.0000E+5 addx362 add 10000E+1 0E-50 -> 100000.0 Rounded addx363 add 10000E+1 10000E-50 -> 100000.0 Rounded Inexact -- ulp replacement tests precision: 9 maxexponent: 999999999 minexponent: -999999999 addx400 add 1 77e-7 -> 1.0000077 addx401 add 1 77e-8 -> 1.00000077 addx402 add 1 77e-9 -> 1.00000008 Inexact Rounded addx403 add 1 77e-10 -> 1.00000001 Inexact Rounded addx404 add 1 77e-11 -> 1.00000000 Inexact Rounded addx405 add 1 77e-12 -> 1.00000000 Inexact Rounded addx406 add 1 77e-999 -> 1.00000000 Inexact Rounded addx407 add 1 77e-9999999 -> 1.00000000 Inexact Rounded addx410 add 10 77e-7 -> 10.0000077 addx411 add 10 77e-8 -> 10.0000008 Inexact Rounded addx412 add 10 77e-9 -> 10.0000001 Inexact Rounded addx413 add 10 77e-10 -> 10.0000000 Inexact Rounded addx414 add 10 77e-11 -> 10.0000000 Inexact Rounded addx415 add 10 77e-12 -> 10.0000000 Inexact Rounded addx416 add 10 77e-999 -> 10.0000000 Inexact Rounded addx417 add 10 77e-9999999 -> 10.0000000 Inexact Rounded addx420 add 77e-7 1 -> 1.0000077 addx421 add 77e-8 1 -> 1.00000077 addx422 add 77e-9 1 -> 1.00000008 Inexact Rounded addx423 add 77e-10 1 -> 1.00000001 Inexact Rounded addx424 add 77e-11 1 -> 1.00000000 Inexact Rounded addx425 add 77e-12 1 -> 1.00000000 Inexact Rounded addx426 add 77e-999 1 -> 1.00000000 Inexact Rounded addx427 add 77e-9999999 1 -> 1.00000000 Inexact Rounded addx430 add 77e-7 10 -> 10.0000077 addx431 add 77e-8 10 -> 10.0000008 Inexact Rounded addx432 add 77e-9 10 -> 10.0000001 Inexact Rounded addx433 add 77e-10 10 -> 10.0000000 Inexact Rounded addx434 add 77e-11 10 -> 10.0000000 Inexact Rounded addx435 add 77e-12 10 -> 10.0000000 Inexact Rounded addx436 add 77e-999 10 -> 10.0000000 Inexact Rounded addx437 add 77e-9999999 10 -> 10.0000000 Inexact Rounded -- negative ulps addx440 add 1 -77e-7 -> 0.9999923 addx441 add 1 -77e-8 -> 0.99999923 addx442 add 1 -77e-9 -> 0.999999923 addx443 add 1 -77e-10 -> 0.999999992 Inexact Rounded addx444 add 1 -77e-11 -> 0.999999999 Inexact Rounded addx445 add 1 -77e-12 -> 1.00000000 Inexact Rounded addx446 add 1 -77e-999 -> 1.00000000 Inexact Rounded addx447 add 1 -77e-9999999 -> 1.00000000 Inexact Rounded addx450 add 10 -77e-7 -> 9.9999923 addx451 add 10 -77e-8 -> 9.99999923 addx452 add 10 -77e-9 -> 9.99999992 Inexact Rounded addx453 add 10 -77e-10 -> 9.99999999 Inexact Rounded addx454 add 10 -77e-11 -> 10.0000000 Inexact Rounded addx455 add 10 -77e-12 -> 10.0000000 Inexact Rounded addx456 add 10 -77e-999 -> 10.0000000 Inexact Rounded addx457 add 10 -77e-9999999 -> 10.0000000 Inexact Rounded addx460 add -77e-7 1 -> 0.9999923 addx461 add -77e-8 1 -> 0.99999923 addx462 add -77e-9 1 -> 0.999999923 addx463 add -77e-10 1 -> 0.999999992 Inexact Rounded addx464 add -77e-11 1 -> 0.999999999 Inexact Rounded addx465 add -77e-12 1 -> 1.00000000 Inexact Rounded addx466 add -77e-999 1 -> 1.00000000 Inexact Rounded addx467 add -77e-9999999 1 -> 1.00000000 Inexact Rounded addx470 add -77e-7 10 -> 9.9999923 addx471 add -77e-8 10 -> 9.99999923 addx472 add -77e-9 10 -> 9.99999992 Inexact Rounded addx473 add -77e-10 10 -> 9.99999999 Inexact Rounded addx474 add -77e-11 10 -> 10.0000000 Inexact Rounded addx475 add -77e-12 10 -> 10.0000000 Inexact Rounded addx476 add -77e-999 10 -> 10.0000000 Inexact Rounded addx477 add -77e-9999999 10 -> 10.0000000 Inexact Rounded -- negative ulps addx480 add -1 77e-7 -> -0.9999923 addx481 add -1 77e-8 -> -0.99999923 addx482 add -1 77e-9 -> -0.999999923 addx483 add -1 77e-10 -> -0.999999992 Inexact Rounded addx484 add -1 77e-11 -> -0.999999999 Inexact Rounded addx485 add -1 77e-12 -> -1.00000000 Inexact Rounded addx486 add -1 77e-999 -> -1.00000000 Inexact Rounded addx487 add -1 77e-9999999 -> -1.00000000 Inexact Rounded addx490 add -10 77e-7 -> -9.9999923 addx491 add -10 77e-8 -> -9.99999923 addx492 add -10 77e-9 -> -9.99999992 Inexact Rounded addx493 add -10 77e-10 -> -9.99999999 Inexact Rounded addx494 add -10 77e-11 -> -10.0000000 Inexact Rounded addx495 add -10 77e-12 -> -10.0000000 Inexact Rounded addx496 add -10 77e-999 -> -10.0000000 Inexact Rounded addx497 add -10 77e-9999999 -> -10.0000000 Inexact Rounded addx500 add 77e-7 -1 -> -0.9999923 addx501 add 77e-8 -1 -> -0.99999923 addx502 add 77e-9 -1 -> -0.999999923 addx503 add 77e-10 -1 -> -0.999999992 Inexact Rounded addx504 add 77e-11 -1 -> -0.999999999 Inexact Rounded addx505 add 77e-12 -1 -> -1.00000000 Inexact Rounded addx506 add 77e-999 -1 -> -1.00000000 Inexact Rounded addx507 add 77e-9999999 -1 -> -1.00000000 Inexact Rounded addx510 add 77e-7 -10 -> -9.9999923 addx511 add 77e-8 -10 -> -9.99999923 addx512 add 77e-9 -10 -> -9.99999992 Inexact Rounded addx513 add 77e-10 -10 -> -9.99999999 Inexact Rounded addx514 add 77e-11 -10 -> -10.0000000 Inexact Rounded addx515 add 77e-12 -10 -> -10.0000000 Inexact Rounded addx516 add 77e-999 -10 -> -10.0000000 Inexact Rounded addx517 add 77e-9999999 -10 -> -10.0000000 Inexact Rounded -- long operands maxexponent: 999 minexponent: -999 precision: 9 addx521 add 12345678000 0 -> 1.23456780E+10 Rounded addx522 add 0 12345678000 -> 1.23456780E+10 Rounded addx523 add 1234567800 0 -> 1.23456780E+9 Rounded addx524 add 0 1234567800 -> 1.23456780E+9 Rounded addx525 add 1234567890 0 -> 1.23456789E+9 Rounded addx526 add 0 1234567890 -> 1.23456789E+9 Rounded addx527 add 1234567891 0 -> 1.23456789E+9 Inexact Rounded addx528 add 0 1234567891 -> 1.23456789E+9 Inexact Rounded addx529 add 12345678901 0 -> 1.23456789E+10 Inexact Rounded addx530 add 0 12345678901 -> 1.23456789E+10 Inexact Rounded addx531 add 1234567896 0 -> 1.23456790E+9 Inexact Rounded addx532 add 0 1234567896 -> 1.23456790E+9 Inexact Rounded precision: 15 -- still checking addx541 add 12345678000 0 -> 12345678000 addx542 add 0 12345678000 -> 12345678000 addx543 add 1234567800 0 -> 1234567800 addx544 add 0 1234567800 -> 1234567800 addx545 add 1234567890 0 -> 1234567890 addx546 add 0 1234567890 -> 1234567890 addx547 add 1234567891 0 -> 1234567891 addx548 add 0 1234567891 -> 1234567891 addx549 add 12345678901 0 -> 12345678901 addx550 add 0 12345678901 -> 12345678901 addx551 add 1234567896 0 -> 1234567896 addx552 add 0 1234567896 -> 1234567896 -- some more residue effects with extreme rounding precision: 9 rounding: half_up addx601 add 123456789 0.000001 -> 123456789 Inexact Rounded rounding: half_even addx602 add 123456789 0.000001 -> 123456789 Inexact Rounded rounding: half_down addx603 add 123456789 0.000001 -> 123456789 Inexact Rounded rounding: floor addx604 add 123456789 0.000001 -> 123456789 Inexact Rounded rounding: ceiling addx605 add 123456789 0.000001 -> 123456790 Inexact Rounded rounding: up addx606 add 123456789 0.000001 -> 123456790 Inexact Rounded rounding: down addx607 add 123456789 0.000001 -> 123456789 Inexact Rounded rounding: half_up addx611 add 123456789 -0.000001 -> 123456789 Inexact Rounded rounding: half_even addx612 add 123456789 -0.000001 -> 123456789 Inexact Rounded rounding: half_down addx613 add 123456789 -0.000001 -> 123456789 Inexact Rounded rounding: floor addx614 add 123456789 -0.000001 -> 123456788 Inexact Rounded rounding: ceiling addx615 add 123456789 -0.000001 -> 123456789 Inexact Rounded rounding: up addx616 add 123456789 -0.000001 -> 123456789 Inexact Rounded rounding: down addx617 add 123456789 -0.000001 -> 123456788 Inexact Rounded rounding: half_up addx621 add 123456789 0.499999 -> 123456789 Inexact Rounded rounding: half_even addx622 add 123456789 0.499999 -> 123456789 Inexact Rounded rounding: half_down addx623 add 123456789 0.499999 -> 123456789 Inexact Rounded rounding: floor addx624 add 123456789 0.499999 -> 123456789 Inexact Rounded rounding: ceiling addx625 add 123456789 0.499999 -> 123456790 Inexact Rounded rounding: up addx626 add 123456789 0.499999 -> 123456790 Inexact Rounded rounding: down addx627 add 123456789 0.499999 -> 123456789 Inexact Rounded rounding: half_up addx631 add 123456789 -0.499999 -> 123456789 Inexact Rounded rounding: half_even addx632 add 123456789 -0.499999 -> 123456789 Inexact Rounded rounding: half_down addx633 add 123456789 -0.499999 -> 123456789 Inexact Rounded rounding: floor addx634 add 123456789 -0.499999 -> 123456788 Inexact Rounded rounding: ceiling addx635 add 123456789 -0.499999 -> 123456789 Inexact Rounded rounding: up addx636 add 123456789 -0.499999 -> 123456789 Inexact Rounded rounding: down addx637 add 123456789 -0.499999 -> 123456788 Inexact Rounded rounding: half_up addx641 add 123456789 0.500001 -> 123456790 Inexact Rounded rounding: half_even addx642 add 123456789 0.500001 -> 123456790 Inexact Rounded rounding: half_down addx643 add 123456789 0.500001 -> 123456790 Inexact Rounded rounding: floor addx644 add 123456789 0.500001 -> 123456789 Inexact Rounded rounding: ceiling addx645 add 123456789 0.500001 -> 123456790 Inexact Rounded rounding: up addx646 add 123456789 0.500001 -> 123456790 Inexact Rounded rounding: down addx647 add 123456789 0.500001 -> 123456789 Inexact Rounded rounding: half_up addx651 add 123456789 -0.500001 -> 123456788 Inexact Rounded rounding: half_even addx652 add 123456789 -0.500001 -> 123456788 Inexact Rounded rounding: half_down addx653 add 123456789 -0.500001 -> 123456788 Inexact Rounded rounding: floor addx654 add 123456789 -0.500001 -> 123456788 Inexact Rounded rounding: ceiling addx655 add 123456789 -0.500001 -> 123456789 Inexact Rounded rounding: up addx656 add 123456789 -0.500001 -> 123456789 Inexact Rounded rounding: down addx657 add 123456789 -0.500001 -> 123456788 Inexact Rounded -- long operand triangle rounding: half_up precision: 37 addx660 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.42211023638922337114834538 precision: 36 addx661 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.4221102363892233711483454 Inexact Rounded precision: 35 addx662 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.422110236389223371148345 Inexact Rounded precision: 34 addx663 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.42211023638922337114835 Inexact Rounded precision: 33 addx664 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.4221102363892233711483 Inexact Rounded precision: 32 addx665 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.422110236389223371148 Inexact Rounded precision: 31 addx666 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.42211023638922337115 Inexact Rounded precision: 30 addx667 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.4221102363892233711 Inexact Rounded precision: 29 addx668 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.422110236389223371 Inexact Rounded precision: 28 addx669 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.42211023638922337 Inexact Rounded precision: 27 addx670 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.4221102363892234 Inexact Rounded precision: 26 addx671 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.422110236389223 Inexact Rounded precision: 25 addx672 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.42211023638922 Inexact Rounded precision: 24 addx673 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.4221102363892 Inexact Rounded precision: 23 addx674 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.422110236389 Inexact Rounded precision: 22 addx675 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.42211023639 Inexact Rounded precision: 21 addx676 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.4221102364 Inexact Rounded precision: 20 addx677 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.422110236 Inexact Rounded precision: 19 addx678 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.42211024 Inexact Rounded precision: 18 addx679 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.4221102 Inexact Rounded precision: 17 addx680 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.422110 Inexact Rounded precision: 16 addx681 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.42211 Inexact Rounded precision: 15 addx682 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.4221 Inexact Rounded precision: 14 addx683 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.422 Inexact Rounded precision: 13 addx684 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.42 Inexact Rounded precision: 12 addx685 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166.4 Inexact Rounded precision: 11 addx686 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 98471174166 Inexact Rounded precision: 10 addx687 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 9.847117417E+10 Inexact Rounded precision: 9 addx688 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 9.84711742E+10 Inexact Rounded precision: 8 addx689 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 9.8471174E+10 Inexact Rounded precision: 7 addx690 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 9.847117E+10 Inexact Rounded precision: 6 addx691 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 9.84712E+10 Inexact Rounded precision: 5 addx692 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 9.8471E+10 Inexact Rounded precision: 4 addx693 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 9.847E+10 Inexact Rounded precision: 3 addx694 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 9.85E+10 Inexact Rounded precision: 2 addx695 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 9.8E+10 Inexact Rounded precision: 1 addx696 add 98471198160.56524417578665886060 -23994.14313393939743548945165462 -> 1E+11 Inexact Rounded -- more zeros, etc. rounding: half_up precision: 9 addx701 add 5.00 1.00E-3 -> 5.00100 addx702 add 00.00 0.000 -> 0.000 addx703 add 00.00 0E-3 -> 0.000 addx704 add 0E-3 00.00 -> 0.000 addx710 add 0E+3 00.00 -> 0.00 addx711 add 0E+3 00.0 -> 0.0 addx712 add 0E+3 00. -> 0 addx713 add 0E+3 00.E+1 -> 0E+1 addx714 add 0E+3 00.E+2 -> 0E+2 addx715 add 0E+3 00.E+3 -> 0E+3 addx716 add 0E+3 00.E+4 -> 0E+3 addx717 add 0E+3 00.E+5 -> 0E+3 addx718 add 0E+3 -00.0 -> 0.0 addx719 add 0E+3 -00. -> 0 addx731 add 0E+3 -00.E+1 -> 0E+1 addx720 add 00.00 0E+3 -> 0.00 addx721 add 00.0 0E+3 -> 0.0 addx722 add 00. 0E+3 -> 0 addx723 add 00.E+1 0E+3 -> 0E+1 addx724 add 00.E+2 0E+3 -> 0E+2 addx725 add 00.E+3 0E+3 -> 0E+3 addx726 add 00.E+4 0E+3 -> 0E+3 addx727 add 00.E+5 0E+3 -> 0E+3 addx728 add -00.00 0E+3 -> 0.00 addx729 add -00.0 0E+3 -> 0.0 addx730 add -00. 0E+3 -> 0 addx732 add 0 0 -> 0 addx733 add 0 -0 -> 0 addx734 add -0 0 -> 0 addx735 add -0 -0 -> -0 -- IEEE 854 exception addx736 add 1 -1 -> 0 addx737 add -1 -1 -> -2 addx738 add 1 1 -> 2 addx739 add -1 1 -> 0 addx741 add 0 -1 -> -1 addx742 add -0 -1 -> -1 addx743 add 0 1 -> 1 addx744 add -0 1 -> 1 addx745 add -1 0 -> -1 addx746 add -1 -0 -> -1 addx747 add 1 0 -> 1 addx748 add 1 -0 -> 1 addx751 add 0.0 -1 -> -1.0 addx752 add -0.0 -1 -> -1.0 addx753 add 0.0 1 -> 1.0 addx754 add -0.0 1 -> 1.0 addx755 add -1.0 0 -> -1.0 addx756 add -1.0 -0 -> -1.0 addx757 add 1.0 0 -> 1.0 addx758 add 1.0 -0 -> 1.0 addx761 add 0 -1.0 -> -1.0 addx762 add -0 -1.0 -> -1.0 addx763 add 0 1.0 -> 1.0 addx764 add -0 1.0 -> 1.0 addx765 add -1 0.0 -> -1.0 addx766 add -1 -0.0 -> -1.0 addx767 add 1 0.0 -> 1.0 addx768 add 1 -0.0 -> 1.0 addx771 add 0.0 -1.0 -> -1.0 addx772 add -0.0 -1.0 -> -1.0 addx773 add 0.0 1.0 -> 1.0 addx774 add -0.0 1.0 -> 1.0 addx775 add -1.0 0.0 -> -1.0 addx776 add -1.0 -0.0 -> -1.0 addx777 add 1.0 0.0 -> 1.0 addx778 add 1.0 -0.0 -> 1.0 -- Specials addx780 add -Inf -Inf -> -Infinity addx781 add -Inf -1000 -> -Infinity addx782 add -Inf -1 -> -Infinity addx783 add -Inf -0 -> -Infinity addx784 add -Inf 0 -> -Infinity addx785 add -Inf 1 -> -Infinity addx786 add -Inf 1000 -> -Infinity addx787 add -1000 -Inf -> -Infinity addx788 add -Inf -Inf -> -Infinity addx789 add -1 -Inf -> -Infinity addx790 add -0 -Inf -> -Infinity addx791 add 0 -Inf -> -Infinity addx792 add 1 -Inf -> -Infinity addx793 add 1000 -Inf -> -Infinity addx800 add Inf -Inf -> NaN Invalid_operation addx801 add Inf -1000 -> Infinity addx802 add Inf -1 -> Infinity addx803 add Inf -0 -> Infinity addx804 add Inf 0 -> Infinity addx805 add Inf 1 -> Infinity addx806 add Inf 1000 -> Infinity addx807 add Inf Inf -> Infinity addx808 add -1000 Inf -> Infinity addx809 add -Inf Inf -> NaN Invalid_operation addx810 add -1 Inf -> Infinity addx811 add -0 Inf -> Infinity addx812 add 0 Inf -> Infinity addx813 add 1 Inf -> Infinity addx814 add 1000 Inf -> Infinity addx815 add Inf Inf -> Infinity addx821 add NaN -Inf -> NaN addx822 add NaN -1000 -> NaN addx823 add NaN -1 -> NaN addx824 add NaN -0 -> NaN addx825 add NaN 0 -> NaN addx826 add NaN 1 -> NaN addx827 add NaN 1000 -> NaN addx828 add NaN Inf -> NaN addx829 add NaN NaN -> NaN addx830 add -Inf NaN -> NaN addx831 add -1000 NaN -> NaN addx832 add -1 NaN -> NaN addx833 add -0 NaN -> NaN addx834 add 0 NaN -> NaN addx835 add 1 NaN -> NaN addx836 add 1000 NaN -> NaN addx837 add Inf NaN -> NaN addx841 add sNaN -Inf -> NaN Invalid_operation addx842 add sNaN -1000 -> NaN Invalid_operation addx843 add sNaN -1 -> NaN Invalid_operation addx844 add sNaN -0 -> NaN Invalid_operation addx845 add sNaN 0 -> NaN Invalid_operation addx846 add sNaN 1 -> NaN Invalid_operation addx847 add sNaN 1000 -> NaN Invalid_operation addx848 add sNaN NaN -> NaN Invalid_operation addx849 add sNaN sNaN -> NaN Invalid_operation addx850 add NaN sNaN -> NaN Invalid_operation addx851 add -Inf sNaN -> NaN Invalid_operation addx852 add -1000 sNaN -> NaN Invalid_operation addx853 add -1 sNaN -> NaN Invalid_operation addx854 add -0 sNaN -> NaN Invalid_operation addx855 add 0 sNaN -> NaN Invalid_operation addx856 add 1 sNaN -> NaN Invalid_operation addx857 add 1000 sNaN -> NaN Invalid_operation addx858 add Inf sNaN -> NaN Invalid_operation addx859 add NaN sNaN -> NaN Invalid_operation -- overflow, underflow and subnormal tests maxexponent: 999999999 minexponent: -999999999 precision: 9 addx860 add 1E+999999999 9E+999999999 -> Infinity Overflow Inexact Rounded addx861 add 9E+999999999 1E+999999999 -> Infinity Overflow Inexact Rounded addx862 add -1.1E-999999999 1E-999999999 -> -1E-1000000000 Subnormal addx863 add 1E-999999999 -1.1e-999999999 -> -1E-1000000000 Subnormal addx864 add -1.0001E-999999999 1E-999999999 -> -1E-1000000003 Subnormal addx865 add 1E-999999999 -1.0001e-999999999 -> -1E-1000000003 Subnormal addx866 add -1E+999999999 -9E+999999999 -> -Infinity Overflow Inexact Rounded addx867 add -9E+999999999 -1E+999999999 -> -Infinity Overflow Inexact Rounded addx868 add +1.1E-999999999 -1E-999999999 -> 1E-1000000000 Subnormal addx869 add -1E-999999999 +1.1e-999999999 -> 1E-1000000000 Subnormal addx870 add +1.0001E-999999999 -1E-999999999 -> 1E-1000000003 Subnormal addx871 add -1E-999999999 +1.0001e-999999999 -> 1E-1000000003 Subnormal addx872 add -1E+999999999 +9E+999999999 -> 8E+999999999 addx873 add -9E+999999999 +1E+999999999 -> -8E+999999999 precision: 3 addx880 add 0 -9.999E+999999999 -> -Infinity Inexact Overflow Rounded addx881 add -9.999E+999999999 0 -> -Infinity Inexact Overflow Rounded addx882 add 0 9.999E+999999999 -> Infinity Inexact Overflow Rounded addx883 add 9.999E+999999999 0 -> Infinity Inexact Overflow Rounded precision: 3 maxexponent: 999 minexponent: -999 addx910 add 1.00E-999 0 -> 1.00E-999 addx911 add 0.1E-999 0 -> 1E-1000 Subnormal addx912 add 0.10E-999 0 -> 1.0E-1000 Subnormal addx913 add 0.100E-999 0 -> 1.0E-1000 Subnormal Rounded addx914 add 0.01E-999 0 -> 1E-1001 Subnormal -- next is rounded to Emin addx915 add 0.999E-999 0 -> 1.00E-999 Inexact Rounded Subnormal Underflow addx916 add 0.099E-999 0 -> 1.0E-1000 Inexact Rounded Subnormal Underflow addx917 add 0.009E-999 0 -> 1E-1001 Inexact Rounded Subnormal Underflow addx918 add 0.001E-999 0 -> 0E-1001 Inexact Rounded Subnormal Underflow addx919 add 0.0009E-999 0 -> 0E-1001 Inexact Rounded Subnormal Underflow addx920 add 0.0001E-999 0 -> 0E-1001 Inexact Rounded Subnormal Underflow addx930 add -1.00E-999 0 -> -1.00E-999 addx931 add -0.1E-999 0 -> -1E-1000 Subnormal addx932 add -0.10E-999 0 -> -1.0E-1000 Subnormal addx933 add -0.100E-999 0 -> -1.0E-1000 Subnormal Rounded addx934 add -0.01E-999 0 -> -1E-1001 Subnormal -- next is rounded to Emin addx935 add -0.999E-999 0 -> -1.00E-999 Inexact Rounded Subnormal Underflow addx936 add -0.099E-999 0 -> -1.0E-1000 Inexact Rounded Subnormal Underflow addx937 add -0.009E-999 0 -> -1E-1001 Inexact Rounded Subnormal Underflow addx938 add -0.001E-999 0 -> -0E-1001 Inexact Rounded Subnormal Underflow addx939 add -0.0009E-999 0 -> -0E-1001 Inexact Rounded Subnormal Underflow addx940 add -0.0001E-999 0 -> -0E-1001 Inexact Rounded Subnormal Underflow -- some non-zero subnormal adds addx950 add 1.00E-999 0.1E-999 -> 1.10E-999 addx951 add 0.1E-999 0.1E-999 -> 2E-1000 Subnormal addx952 add 0.10E-999 0.1E-999 -> 2.0E-1000 Subnormal addx953 add 0.100E-999 0.1E-999 -> 2.0E-1000 Subnormal Rounded addx954 add 0.01E-999 0.1E-999 -> 1.1E-1000 Subnormal addx955 add 0.999E-999 0.1E-999 -> 1.10E-999 Inexact Rounded addx956 add 0.099E-999 0.1E-999 -> 2.0E-1000 Inexact Rounded Subnormal Underflow addx957 add 0.009E-999 0.1E-999 -> 1.1E-1000 Inexact Rounded Subnormal Underflow addx958 add 0.001E-999 0.1E-999 -> 1.0E-1000 Inexact Rounded Subnormal Underflow addx959 add 0.0009E-999 0.1E-999 -> 1.0E-1000 Inexact Rounded Subnormal Underflow addx960 add 0.0001E-999 0.1E-999 -> 1.0E-1000 Inexact Rounded Subnormal Underflow -- negatives... addx961 add 1.00E-999 -0.1E-999 -> 9.0E-1000 Subnormal addx962 add 0.1E-999 -0.1E-999 -> 0E-1000 addx963 add 0.10E-999 -0.1E-999 -> 0E-1001 addx964 add 0.100E-999 -0.1E-999 -> 0E-1001 Clamped addx965 add 0.01E-999 -0.1E-999 -> -9E-1001 Subnormal addx966 add 0.999E-999 -0.1E-999 -> 9.0E-1000 Inexact Rounded Subnormal Underflow addx967 add 0.099E-999 -0.1E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow addx968 add 0.009E-999 -0.1E-999 -> -9E-1001 Inexact Rounded Subnormal Underflow addx969 add 0.001E-999 -0.1E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow addx970 add 0.0009E-999 -0.1E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow addx971 add 0.0001E-999 -0.1E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow -- check for double-rounded subnormals precision: 5 maxexponent: 79 minexponent: -79 -- Add: lhs and rhs 0 addx1001 add 1.52444E-80 0 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1002 add 1.52445E-80 0 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1003 add 1.52446E-80 0 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1004 add 0 1.52444E-80 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1005 add 0 1.52445E-80 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1006 add 0 1.52446E-80 -> 1.524E-80 Inexact Rounded Subnormal Underflow -- Add: lhs >> rhs and vice versa addx1011 add 1.52444E-80 1E-100 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1012 add 1.52445E-80 1E-100 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1013 add 1.52446E-80 1E-100 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1014 add 1E-100 1.52444E-80 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1015 add 1E-100 1.52445E-80 -> 1.524E-80 Inexact Rounded Subnormal Underflow addx1016 add 1E-100 1.52446E-80 -> 1.524E-80 Inexact Rounded Subnormal Underflow -- Add: lhs + rhs addition carried out addx1021 add 1.52443E-80 1.00001E-80 -> 2.524E-80 Inexact Rounded Subnormal Underflow addx1022 add 1.52444E-80 1.00001E-80 -> 2.524E-80 Inexact Rounded Subnormal Underflow addx1023 add 1.52445E-80 1.00001E-80 -> 2.524E-80 Inexact Rounded Subnormal Underflow addx1024 add 1.00001E-80 1.52443E-80 -> 2.524E-80 Inexact Rounded Subnormal Underflow addx1025 add 1.00001E-80 1.52444E-80 -> 2.524E-80 Inexact Rounded Subnormal Underflow addx1026 add 1.00001E-80 1.52445E-80 -> 2.524E-80 Inexact Rounded Subnormal Underflow -- Null tests addx9990 add 10 # -> NaN Invalid_operation addx9991 add # 10 -> NaN Invalid_operation --- NEW FILE: abs.decTest --- ------------------------------------------------------------------------ -- abs.decTest -- decimal absolute value -- -- Copyright (c) IBM Corporation, 1981, 2003. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- -- these testcases. -- -- -- -- These testcases are experimental ('beta' versions), and they -- -- may contain errors. They are offered on an as-is basis. In -- -- particular, achieving the same results as the tests here is not -- -- a guarantee that an implementation complies with any Standard -- -- or specification. The tests are not exhaustive. -- -- -- -- Please send comments, suggestions, and corrections to the author: -- -- Mike Cowlishaw, IBM Fellow -- -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc@uk.ibm.com -- ------------------------------------------------------------------------ version: 2.21 -- This set of tests primarily tests the existence of the operator. -- Additon, subtraction, rounding, and more overflows are tested -- elsewhere. precision: 9 rounding: half_up maxExponent: 999 minexponent: -999 extended: 1 absx001 abs '1' -> '1' absx002 abs '-1' -> '1' absx003 abs '1.00' -> '1.00' absx004 abs '-1.00' -> '1.00' absx005 abs '0' -> '0' absx006 abs '0.00' -> '0.00' absx007 abs '00.0' -> '0.0' absx008 abs '00.00' -> '0.00' absx009 abs '00' -> '0' absx010 abs '-2' -> '2' absx011 abs '2' -> '2' absx012 abs '-2.00' -> '2.00' absx013 abs '2.00' -> '2.00' absx014 abs '-0' -> '0' absx015 abs '-0.00' -> '0.00' absx016 abs '-00.0' -> '0.0' absx017 abs '-00.00' -> '0.00' absx018 abs '-00' -> '0' absx020 abs '-2000000' -> '2000000' absx021 abs '2000000' -> '2000000' precision: 7 absx022 abs '-2000000' -> '2000000' absx023 abs '2000000' -> '2000000' precision: 6 absx024 abs '-2000000' -> '2.00000E+6' Rounded absx025 abs '2000000' -> '2.00000E+6' Rounded precision: 3 absx026 abs '-2000000' -> '2.00E+6' Rounded absx027 abs '2000000' -> '2.00E+6' Rounded absx030 abs '+0.1' -> '0.1' absx031 abs '-0.1' -> '0.1' absx032 abs '+0.01' -> '0.01' absx033 abs '-0.01' -> '0.01' absx034 abs '+0.001' -> '0.001' absx035 abs '-0.001' -> '0.001' absx036 abs '+0.000001' -> '0.000001' absx037 abs '-0.000001' -> '0.000001' absx038 abs '+0.000000000001' -> '1E-12' absx039 abs '-0.000000000001' -> '1E-12' -- examples from decArith precision: 9 absx040 abs '2.1' -> '2.1' absx041 abs '-100' -> '100' absx042 abs '101.5' -> '101.5' absx043 abs '-101.5' -> '101.5' -- more fixed, potential LHS swaps/overlays if done by subtract 0 precision: 9 absx060 abs '-56267E-10' -> '0.0000056267' absx061 abs '-56267E-5' -> '0.56267' absx062 abs '-56267E-2' -> '562.67' absx063 abs '-56267E-1' -> '5626.7' absx065 abs '-56267E-0' -> '56267' -- overflow tests maxexponent: 999999999 minexponent: -999999999 precision: 3 absx120 abs 9.999E+999999999 -> Infinity Inexact Overflow Rounded -- subnormals and underflow precision: 3 maxexponent: 999 minexponent: -999 absx210 abs 1.00E-999 -> 1.00E-999 absx211 abs 0.1E-999 -> 1E-1000 Subnormal absx212 abs 0.10E-999 -> 1.0E-1000 Subnormal absx213 abs 0.100E-999 -> 1.0E-1000 Subnormal Rounded absx214 abs 0.01E-999 -> 1E-1001 Subnormal -- next is rounded to Emin absx215 abs 0.999E-999 -> 1.00E-999 Inexact Rounded Subnormal Underflow absx216 abs 0.099E-999 -> 1.0E-1000 Inexact Rounded Subnormal Underflow absx217 abs 0.009E-999 -> 1E-1001 Inexact Rounded Subnormal Underflow absx218 abs 0.001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow absx219 abs 0.0009E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow absx220 abs 0.0001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow absx230 abs -1.00E-999 -> 1.00E-999 absx231 abs -0.1E-999 -> 1E-1000 Subnormal absx232 abs -0.10E-999 -> 1.0E-1000 Subnormal absx233 abs -0.100E-999 -> 1.0E-1000 Subnormal Rounded absx234 abs -0.01E-999 -> 1E-1001 Subnormal -- next is rounded to Emin absx235 abs -0.999E-999 -> 1.00E-999 Inexact Rounded Subnormal Underflow absx236 abs -0.099E-999 -> 1.0E-1000 Inexact Rounded Subnormal Underflow absx237 abs -0.009E-999 -> 1E-1001 Inexact Rounded Subnormal Underflow absx238 abs -0.001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow absx239 abs -0.0009E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow absx240 abs -0.0001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow -- long operand tests maxexponent: 999 minexponent: -999 precision: 9 absx301 abs 12345678000 -> 1.23456780E+10 Rounded absx302 abs 1234567800 -> 1.23456780E+9 Rounded absx303 abs 1234567890 -> 1.23456789E+9 Rounded absx304 abs 1234567891 -> 1.23456789E+9 Inexact Rounded absx305 abs 12345678901 -> 1.23456789E+10 Inexact Rounded absx306 abs 1234567896 -> 1.23456790E+9 Inexact Rounded precision: 15 absx321 abs 12345678000 -> 12345678000 absx322 abs 1234567800 -> 1234567800 absx323 abs 1234567890 -> 1234567890 absx324 abs 1234567891 -> 1234567891 absx325 abs 12345678901 -> 12345678901 absx326 abs 1234567896 -> 1234567896 -- Specials precision: 9 -- specials absx520 abs 'Inf' -> 'Infinity' absx521 abs '-Inf' -> 'Infinity' absx522 abs NaN -> NaN absx523 abs sNaN -> NaN Invalid_operation -- Null tests absx900 abs # -> NaN Invalid_operation From jvr@users.sourceforge.net Sat May 3 00:40:31 2003 From: jvr@users.sourceforge.net (jvr@users.sourceforge.net) Date: Fri, 02 May 2003 16:40:31 -0700 Subject: [Python-checkins] python/dist/src/Mac/Tools/IDE PythonIDE.py,1.11,1.12 PythonIDEMain.py,1.33,1.34 Message-ID: Update of /cvsroot/python/python/dist/src/Mac/Tools/IDE In directory sc8-pr-cvs1:/tmp/cvs-serv29884 Modified Files: PythonIDE.py PythonIDEMain.py Log Message: Fixed age-old beginner's error: don't start the main loop as a side effect of an import. (This is one step towards threading support in the IDE.) Index: PythonIDE.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/Tools/IDE/PythonIDE.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** PythonIDE.py 18 Nov 2002 15:29:02 -0000 1.11 --- PythonIDE.py 2 May 2003 23:40:29 -0000 1.12 *************** *** 49,51 **** del init ! import PythonIDEMain --- 49,52 ---- del init ! import PythonIDEMain as _PythonIDEMain ! _PythonIDEMain.PythonIDE() Index: PythonIDEMain.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/Tools/IDE/PythonIDEMain.py,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** PythonIDEMain.py 31 Mar 2003 15:11:14 -0000 1.33 --- PythonIDEMain.py 2 May 2003 23:40:29 -0000 1.34 *************** *** 464,469 **** pass # W.Message("Cannot register Python Documentation: %s" % str(arg)) return has_help, has_doc - - - PythonIDE() - --- 464,465 ---- From montanaro@users.sourceforge.net Sat May 3 00:41:21 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Fri, 02 May 2003 16:41:21 -0700 Subject: [Python-checkins] python/nondist/sandbox/csv README,1.3,NONE _csv.c,1.35,NONE __init__.py,1.1,NONE libcsv.tex,1.13,NONE csv.py,1.36,NONE .cvsignore,1.2,NONE Message-ID: Update of /cvsroot/python/python/nondist/sandbox/csv In directory sc8-pr-cvs1:/tmp/cvs-serv31316 Removed Files: README _csv.c __init__.py libcsv.tex csv.py .cvsignore Log Message: csv sandbox cleanup --- README DELETED --- --- _csv.c DELETED --- --- __init__.py DELETED --- --- libcsv.tex DELETED --- --- csv.py DELETED --- --- .cvsignore DELETED --- From montanaro@users.sourceforge.net Sat May 3 00:42:02 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Fri, 02 May 2003 16:42:02 -0700 Subject: [Python-checkins] python/nondist/sandbox/csv setup.py,1.4,NONE Message-ID: Update of /cvsroot/python/python/nondist/sandbox/csv In directory sc8-pr-cvs1:/tmp/cvs-serv31734 Removed Files: setup.py Log Message: csv sandbox cleanup --- setup.py DELETED --- From montanaro@users.sourceforge.net Sat May 3 00:44:56 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Fri, 02 May 2003 16:44:56 -0700 Subject: [Python-checkins] python/nondist/sandbox/csv/test __init__.py,1.1,NONE test_csv.py,1.37,NONE unicode_test.py,1.1,NONE Message-ID: Update of /cvsroot/python/python/nondist/sandbox/csv/test In directory sc8-pr-cvs1:/tmp/cvs-serv1241/test Removed Files: __init__.py test_csv.py unicode_test.py Log Message: csv sandbox cleanup --- __init__.py DELETED --- --- test_csv.py DELETED --- --- unicode_test.py DELETED --- From montanaro@users.sourceforge.net Sat May 3 00:44:56 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Fri, 02 May 2003 16:44:56 -0700 Subject: [Python-checkins] python/nondist/sandbox/csv/util __init__.py,1.1,NONE sniffer.py,1.7,NONE Message-ID: Update of /cvsroot/python/python/nondist/sandbox/csv/util In directory sc8-pr-cvs1:/tmp/cvs-serv1241/util Removed Files: __init__.py sniffer.py Log Message: csv sandbox cleanup --- __init__.py DELETED --- --- sniffer.py DELETED --- From jvr@users.sourceforge.net Sat May 3 01:18:57 2003 From: jvr@users.sourceforge.net (jvr@users.sourceforge.net) Date: Fri, 02 May 2003 17:18:57 -0700 Subject: [Python-checkins] python/dist/src/Mac/Modules autoGIL.c,NONE,1.1 Message-ID: Update of /cvsroot/python/python/dist/src/Mac/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv21490 Added Files: autoGIL.c Log Message: Short and sweet module doing something very useful: for event loop based threads, release the GIL when the event loop goes to sleep, and acquire it again when the event loop wakes up again. OSX-only. --- NEW FILE: autoGIL.c --- #include "Python.h" #include /* These macros are defined in Python 2.3 but not 2.2 */ #ifndef PyMODINIT_FUNC #define PyMODINIT_FUNC void #endif #ifndef PyDoc_STRVAR #define PyDoc_STRVAR(Var,Str) static char Var[] = Str #endif #undef AUTOGIL_DEBUG static PyObject *AutoGILError; static void autoGILCallback(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) { PyThreadState **p_tstate = (PyThreadState **)info; switch (activity) { case kCFRunLoopBeforeWaiting: /* going to sleep, release GIL */ #ifdef AUTOGIL_DEBUG fprintf(stderr, "going to sleep, release GIL\n"); #endif *p_tstate = PyEval_SaveThread(); break; case kCFRunLoopAfterWaiting: /* waking up, acquire GIL */ #ifdef AUTOGIL_DEBUG fprintf(stderr, "waking up, acquire GIL\n"); #endif PyEval_RestoreThread(*p_tstate); *p_tstate = NULL; break; default: break; } } static void infoRelease(const void *info) { /* XXX This should get called when the run loop is deallocated, but this doesn't seem to happen. So for now: leak. */ PyMem_Free((void *)info); } static PyObject * autoGIL_installAutoGIL(PyObject *self) { PyObject *tstate_dict = PyThreadState_GetDict(); PyObject *v; CFRunLoopRef rl; PyThreadState **p_tstate; /* for use in the info field */ CFRunLoopObserverContext context = {0, NULL, NULL, NULL, NULL}; CFRunLoopObserverRef observer; if (tstate_dict == NULL) return NULL; v = PyDict_GetItemString(tstate_dict, "autoGIL.InstalledAutoGIL"); if (v != NULL) { /* we've already installed a callback for this thread */ Py_INCREF(Py_None); return Py_None; } rl = CFRunLoopGetCurrent(); if (rl == NULL) { PyErr_SetString(AutoGILError, "can't get run loop for current thread"); return NULL; } p_tstate = PyMem_Malloc(sizeof(PyThreadState *)); if (p_tstate == NULL) { PyErr_SetString(PyExc_MemoryError, "not enough memory to allocate " "tstate pointer"); return NULL; } *p_tstate = NULL; context.info = (void *)p_tstate; context.release = infoRelease; observer = CFRunLoopObserverCreate( NULL, kCFRunLoopBeforeWaiting | kCFRunLoopAfterWaiting, 1, 0, autoGILCallback, &context); if (observer == NULL) { PyErr_SetString(AutoGILError, "can't create event loop observer"); return NULL; } CFRunLoopAddObserver(rl, observer, kCFRunLoopDefaultMode); /* XXX how to check for errors? */ /* register that we have installed a callback for this thread */ if (PyDict_SetItemString(tstate_dict, "autoGIL.InstalledAutoGIL", Py_None) < 0) return NULL; Py_INCREF(Py_None); return Py_None; } PyDoc_STRVAR(autoGIL_installAutoGIL_doc, "installAutoGIL() -> None\n\ Install an observer callback in the event loop (CFRunLoop) for the\n\ current thread that will lock and unlock the Global Interpreter Lock\n\ (GIL) at appropriate times, allowing other Python threads to run while\n\ the event loop is running." ); static PyMethodDef autoGIL_methods[] = { { "installAutoGIL", (PyCFunction)autoGIL_installAutoGIL, METH_NOARGS, autoGIL_installAutoGIL_doc }, { 0, 0, 0, 0 } /* sentinel */ }; PyDoc_STRVAR(autoGIL_docs, "The autoGIL module provides a function (installAutoGIL) that\n\ automatically locks and unlocks Python's Global Interpreter Lock\n\ when running an event loop." ); PyMODINIT_FUNC initautoGIL(void) { PyObject *mod; mod = Py_InitModule4("autoGIL", autoGIL_methods, autoGIL_docs, NULL, PYTHON_API_VERSION); if (mod == NULL) return; AutoGILError = PyErr_NewException("autoGIL.AutoGILError", PyExc_Exception, NULL); if (AutoGILError == NULL) return; Py_INCREF(AutoGILError); if (PyModule_AddObject(mod, "AutoGILError", AutoGILError) < 0) return; } From jvr@users.sourceforge.net Sat May 3 01:27:25 2003 From: jvr@users.sourceforge.net (jvr@users.sourceforge.net) Date: Fri, 02 May 2003 17:27:25 -0700 Subject: [Python-checkins] python/dist/src setup.py,1.160,1.161 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv27421 Modified Files: setup.py Log Message: build the new autoGIL module on OSX Index: setup.py =================================================================== RCS file: /cvsroot/python/python/dist/src/setup.py,v retrieving revision 1.160 retrieving revision 1.161 diff -C2 -d -r1.160 -r1.161 *** setup.py 17 Apr 2003 22:23:36 -0000 1.160 --- setup.py 3 May 2003 00:27:23 -0000 1.161 *************** *** 749,752 **** --- 749,754 ---- extra_link_args=['-framework', 'CoreFoundation']) ) + exts.append( Extension('autoGIL', ['autoGIL.c'], + extra_link_args=['-framework', 'CoreFoundation']) ) exts.append( Extension('gestalt', ['gestaltmodule.c'], extra_link_args=['-framework', 'Carbon']) ) From jvr@users.sourceforge.net Sat May 3 01:31:37 2003 From: jvr@users.sourceforge.net (jvr@users.sourceforge.net) Date: Fri, 02 May 2003 17:31:37 -0700 Subject: [Python-checkins] python/dist/src/Mac/Tools/IDE PythonIDE.py,1.12,1.13 Message-ID: Update of /cvsroot/python/python/dist/src/Mac/Tools/IDE In directory sc8-pr-cvs1:/tmp/cvs-serv27839 Modified Files: PythonIDE.py Log Message: Install automatic GIL switcher upon IDE startup. (Jack: maybe this could/should be done in Framework.py instead, that way apps don't have to think about it. PackMan springs to mind...) Index: PythonIDE.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/Tools/IDE/PythonIDE.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** PythonIDE.py 2 May 2003 23:40:29 -0000 1.12 --- PythonIDE.py 3 May 2003 00:31:35 -0000 1.13 *************** *** 13,16 **** --- 13,23 ---- MacOS.EnableAppswitch(-1) + try: + import autoGIL + except ImportError: + pass + else: + autoGIL.installAutoGIL() + from Carbon import Qd, QuickDraw Qd.SetCursor(Qd.GetCursor(QuickDraw.watchCursor).data) From jvr@users.sourceforge.net Sat May 3 01:38:28 2003 From: jvr@users.sourceforge.net (jvr@users.sourceforge.net) Date: Fri, 02 May 2003 17:38:28 -0700 Subject: [Python-checkins] python/dist/src/Mac/Modules autoGIL.c,1.1,1.2 Message-ID: Update of /cvsroot/python/python/dist/src/Mac/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv1281 Modified Files: autoGIL.c Log Message: fixed typo Index: autoGIL.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/Modules/autoGIL.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** autoGIL.c 3 May 2003 00:18:55 -0000 1.1 --- autoGIL.c 3 May 2003 00:38:26 -0000 1.2 *************** *** 109,115 **** "installAutoGIL() -> None\n\ Install an observer callback in the event loop (CFRunLoop) for the\n\ ! current thread that will lock and unlock the Global Interpreter Lock\n\ (GIL) at appropriate times, allowing other Python threads to run while\n\ ! the event loop is running." ); --- 109,115 ---- "installAutoGIL() -> None\n\ Install an observer callback in the event loop (CFRunLoop) for the\n\ ! current thread, that will lock and unlock the Global Interpreter Lock\n\ (GIL) at appropriate times, allowing other Python threads to run while\n\ ! the event loop is idle." ); From fdrake@users.sourceforge.net Sat May 3 03:07:24 2003 From: fdrake@users.sourceforge.net (fdrake@users.sourceforge.net) Date: Fri, 02 May 2003 19:07:24 -0700 Subject: [Python-checkins] python/dist/src/Doc/perl l2hinit.perl,1.72,1.73 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/perl In directory sc8-pr-cvs1:/tmp/cvs-serv26345 Modified Files: l2hinit.perl Log Message: - add title attributes to the navigation icons on the navigation bars; this causes some browsers to offer descriptive tooltips when the mouse hovers over the linked icon - clean up the code in this area Index: l2hinit.perl =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/perl/l2hinit.perl,v retrieving revision 1.72 retrieving revision 1.73 diff -C2 -d -r1.72 -r1.73 *** l2hinit.perl 2 May 2003 20:30:18 -0000 1.72 --- l2hinit.perl 3 May 2003 02:07:22 -0000 1.73 *************** *** 142,166 **** } ! sub use_my_icon($$) { ! my($s,$rel) = @_; ! if ($s =~ /\/) { ! my $r = get_my_icon($1); ! $s =~ s/\/$r/; } - $s =~ s/<[aA] /' --- 142,178 ---- } ! sub unlinkify($) { ! my $text = "$_[0]"; ! $text =~ s|||; ! $text =~ s|]*>||i; ! return $text; ! } ! ! sub use_icon($$$) { ! my($rel,$str,$title) = @_; ! if ($title) { ! my $s = "$str"; ! if ($s =~ /\/) { ! my $r = get_my_icon($1); ! $s =~ s/\/$r/; ! } ! $s =~ s/<[aA] /' From rhettinger@users.sourceforge.net Sat May 3 04:38:03 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 20:38:03 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_random.py,1.10,1.11 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv11136 Modified Files: test_random.py Log Message: Apply the simplified test_support boilerplate. Index: test_random.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_random.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** test_random.py 2 May 2003 22:44:59 -0000 1.10 --- test_random.py 3 May 2003 03:38:01 -0000 1.11 *************** *** 273,283 **** def test_main(verbose=None): ! suite = unittest.TestSuite() ! for testclass in (WichmannHill_TestBasicOps, MersenneTwister_TestBasicOps, TestDistributions, ! TestModule): ! suite.addTest(unittest.makeSuite(testclass)) ! test_support.run_suite(suite) # verify reference counting --- 273,281 ---- def test_main(verbose=None): ! testclasses = (WichmannHill_TestBasicOps, MersenneTwister_TestBasicOps, TestDistributions, ! TestModule) ! test_support.run_unittest(*testclasses) # verify reference counting *************** *** 286,290 **** counts = [None] * 5 for i in xrange(len(counts)): ! test_support.run_suite(suite) counts[i] = sys.gettotalrefcount() print counts --- 284,288 ---- counts = [None] * 5 for i in xrange(len(counts)): ! test_support.run_unittest(*testclasses) counts[i] = sys.gettotalrefcount() print counts From rhettinger@users.sourceforge.net Sat May 3 06:59:50 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 22:59:50 -0700 Subject: [Python-checkins] python/dist/src/Modules itertoolsmodule.c,1.12,1.13 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv31727/Modules Modified Files: itertoolsmodule.c Log Message: * Added a substantial number of edge case and argument tests for the itertoolsmodule. * Taught itertools.repeat(obj, n) to treat negative repeat counts as zero. This behavior matches that for sequences and prevents infinite loops. Index: itertoolsmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/itertoolsmodule.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** itertoolsmodule.c 2 May 2003 19:44:20 -0000 1.12 --- itertoolsmodule.c 3 May 2003 05:59:47 -0000 1.13 *************** *** 1692,1695 **** --- 1692,1698 ---- return NULL; + if (PyTuple_Size(args) == 2 && cnt < 0) + cnt = 0; + ro = (repeatobject *)type->tp_alloc(type, 0); if (ro == NULL) From rhettinger@users.sourceforge.net Sat May 3 06:59:50 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 22:59:50 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_itertools.py,1.9,1.10 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv31727/Lib/test Modified Files: test_itertools.py Log Message: * Added a substantial number of edge case and argument tests for the itertoolsmodule. * Taught itertools.repeat(obj, n) to treat negative repeat counts as zero. This behavior matches that for sequences and prevents infinite loops. Index: test_itertools.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_itertools.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** test_itertools.py 2 May 2003 22:38:07 -0000 1.9 --- test_itertools.py 3 May 2003 05:59:48 -0000 1.10 *************** *** 3,10 **** --- 3,38 ---- from itertools import * import sys + import operator + + def onearg(x): + 'Test function of one argument' + return x + + def errfunc(*args): + 'Test function that raises an error' + raise ValueError + + def gen3(): + 'Non-restartable source sequence' + for i in (0, 1, 2): + yield i + + def isEven(x): + 'Test predicate' + return x%2==0 + + class StopNow: + 'Class emulating an empty iterable.' + def __iter__(self): + return self + def next(self): + raise StopIteration class TestBasicOps(unittest.TestCase): def test_chain(self): self.assertEqual(list(chain('abc', 'def')), list('abcdef')) + self.assertEqual(list(chain('abc')), list('abc')) + self.assertEqual(list(chain('')), []) + self.assertRaises(TypeError, chain, 2, 3) def test_count(self): *************** *** 12,42 **** self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)]) self.assertRaises(TypeError, count, 2, 3) def test_cycle(self): self.assertEqual(list(islice(cycle('abc'),10)), list('abcabcabca')) self.assertEqual(list(cycle('')), []) def test_ifilter(self): - def isEven(x): - return x%2==0 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4]) self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2]) self.assertRaises(TypeError, ifilter) ! self.assertRaises(TypeError, ifilter, 3) self.assertRaises(TypeError, ifilter, isEven, 3) def test_ifilterfalse(self): - def isEven(x): - return x%2==0 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5]) self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0]) self.assertRaises(TypeError, ifilterfalse) ! self.assertRaises(TypeError, ifilterfalse, 3) self.assertRaises(TypeError, ifilterfalse, isEven, 3) def test_izip(self): ans = [(x,y) for x, y in izip('abc',count())] self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)]) self.assertRaises(TypeError, izip) def test_repeat(self): --- 40,86 ---- self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)]) self.assertRaises(TypeError, count, 2, 3) + self.assertRaises(TypeError, count, 'a') + c = count(sys.maxint-2) # verify that rollover doesn't crash + c.next(); c.next(); c.next(); c.next(); c.next() def test_cycle(self): self.assertEqual(list(islice(cycle('abc'),10)), list('abcabcabca')) self.assertEqual(list(cycle('')), []) + self.assertRaises(TypeError, cycle) + self.assertRaises(TypeError, cycle, 5) + self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0]) def test_ifilter(self): self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4]) self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2]) self.assertRaises(TypeError, ifilter) ! self.assertRaises(TypeError, ifilter, lambda x:x) ! self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7) self.assertRaises(TypeError, ifilter, isEven, 3) + self.assertRaises(TypeError, ifilter(range(6), range(6)).next) def test_ifilterfalse(self): self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5]) self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0]) self.assertRaises(TypeError, ifilterfalse) ! self.assertRaises(TypeError, ifilterfalse, lambda x:x) ! self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7) self.assertRaises(TypeError, ifilterfalse, isEven, 3) + self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next) def test_izip(self): ans = [(x,y) for x, y in izip('abc',count())] self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)]) + self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6))) + self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3))) + self.assertEqual(list(izip('abcdef')), zip('abcdef')) self.assertRaises(TypeError, izip) + self.assertRaises(TypeError, izip, 3) + self.assertRaises(TypeError, izip, range(3), 3) + # Check tuple re-use (implementation detail) + self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')], + zip('abc', 'def')) + ids = map(id, izip('abc', 'def')) + self.assertEqual(min(ids), max(ids)) def test_repeat(self): *************** *** 44,63 **** [(0, 'a'), (1, 'a'), (2, 'a')]) self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a']) self.assertRaises(TypeError, repeat) def test_imap(self): - import operator self.assertEqual(list(imap(operator.pow, range(3), range(1,7))), [0**1, 1**2, 2**3]) self.assertEqual(list(imap(None, 'abc', range(5))), [('a',0),('b',1),('c',2)]) self.assertRaises(TypeError, imap) self.assertRaises(TypeError, imap, operator.neg) def test_starmap(self): - import operator self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))), [0**1, 1**2, 2**3]) self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]])) def test_islice(self): --- 88,119 ---- [(0, 'a'), (1, 'a'), (2, 'a')]) self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a']) + self.assertEqual(list(repeat('a', 0)), []) + self.assertEqual(list(repeat('a', -3)), []) self.assertRaises(TypeError, repeat) + self.assertRaises(TypeError, repeat, None, 3, 4) + self.assertRaises(TypeError, repeat, None, 'a') def test_imap(self): self.assertEqual(list(imap(operator.pow, range(3), range(1,7))), [0**1, 1**2, 2**3]) self.assertEqual(list(imap(None, 'abc', range(5))), [('a',0),('b',1),('c',2)]) + self.assertEqual(list(imap(operator.pow, [])), []) self.assertRaises(TypeError, imap) self.assertRaises(TypeError, imap, operator.neg) + self.assertRaises(TypeError, imap(10, range(5)).next) + self.assertRaises(ValueError, imap(errfunc, [4], [5]).next) + self.assertRaises(TypeError, imap(onearg, [4], [5]).next) def test_starmap(self): self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))), [0**1, 1**2, 2**3]) + self.assertEqual(list(starmap(operator.pow, [])), []) self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]])) + self.assertRaises(TypeError, starmap) + self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra') + self.assertRaises(TypeError, starmap(10, [(4,5)]).next) + self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next) + self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next) def test_islice(self): *************** *** 101,104 **** --- 157,166 ---- underten = lambda x: x<10 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5]) + self.assertEqual(list(takewhile(underten, [])), []) + self.assertRaises(TypeError, takewhile) + self.assertRaises(TypeError, takewhile, operator.pow) + self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra') + self.assertRaises(TypeError, takewhile(10, [(4,5)]).next) + self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next) def test_dropwhile(self): *************** *** 106,118 **** underten = lambda x: x<10 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8]) def test_StopIteration(self): - class StopNow: - """Test support class . Emulates an empty iterable.""" - def __iter__(self): - return self - def next(self): - raise StopIteration - for f in (chain, cycle, izip): self.assertRaises(StopIteration, f([]).next) --- 168,179 ---- underten = lambda x: x<10 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8]) + self.assertEqual(list(dropwhile(underten, [])), []) + self.assertRaises(TypeError, dropwhile) + self.assertRaises(TypeError, dropwhile, operator.pow) + self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra') + self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next) + self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next) def test_StopIteration(self): for f in (chain, cycle, izip): self.assertRaises(StopIteration, f([]).next) From rhettinger@users.sourceforge.net Sat May 3 07:52:01 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 23:52:01 -0700 Subject: [Python-checkins] python/dist/src/Include dictobject.h,2.26,2.27 Message-ID: Update of /cvsroot/python/python/dist/src/Include In directory sc8-pr-cvs1:/tmp/cvs-serv31206/Include Modified Files: dictobject.h Log Message: Add a reference to dictnotes.txt. It does no good if you don't know it's there or where to find it. Index: dictobject.h =================================================================== RCS file: /cvsroot/python/python/dist/src/Include/dictobject.h,v retrieving revision 2.26 retrieving revision 2.27 diff -C2 -d -r2.26 -r2.27 *** dictobject.h 11 Dec 2002 13:21:12 -0000 2.26 --- dictobject.h 3 May 2003 06:51:58 -0000 2.27 *************** *** 8,11 **** --- 8,17 ---- /* Dictionary object type -- mapping from hashable object to object */ + /* The distribution includes a separate file, Objects/dictnotes.txt, + describing explorations into dictionary design and optimization. + It covers typical dictionary use patterns, the parameters for + tuning dictionaries, and several ideas for possible optimizations. + */ + /* There are three kinds of slots in the table: From rhettinger@users.sourceforge.net Sat May 3 07:52:01 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Fri, 02 May 2003 23:52:01 -0700 Subject: [Python-checkins] python/dist/src/Objects dictobject.c,2.143,2.144 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv31206/Objects Modified Files: dictobject.c Log Message: Add a reference to dictnotes.txt. It does no good if you don't know it's there or where to find it. Index: dictobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v retrieving revision 2.143 retrieving revision 2.144 diff -C2 -d -r2.143 -r2.144 *** dictobject.c 17 Mar 2003 19:46:09 -0000 2.143 --- dictobject.c 3 May 2003 06:51:59 -0000 2.144 *************** *** 2,5 **** --- 2,11 ---- /* Dictionary object implementation using a hash table */ + /* The distribution includes a separate file, Objects/dictnotes.txt, + describing explorations into dictionary design and optimization. + It covers typical dictionary use patterns, the parameters for + tuning dictionaries, and several ideas for possible optimizations. + */ + #include "Python.h" From loewis@users.sourceforge.net Sat May 3 09:45:53 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 01:45:53 -0700 Subject: [Python-checkins] python/dist/src setup.py,1.161,1.162 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv5524 Modified Files: setup.py Log Message: Change 'and' to 'or' in _tkinter test. Index: setup.py =================================================================== RCS file: /cvsroot/python/python/dist/src/setup.py,v retrieving revision 1.161 retrieving revision 1.162 diff -C2 -d -r1.161 -r1.162 *** setup.py 3 May 2003 00:27:23 -0000 1.161 --- setup.py 3 May 2003 08:45:51 -0000 1.162 *************** *** 933,937 **** tk_includes = find_file('tk.h', inc_dirs, debian_tk_include) ! if (tcllib is None or tklib is None and tcl_includes is None or tk_includes is None): # Something's missing, so give up --- 933,937 ---- tk_includes = find_file('tk.h', inc_dirs, debian_tk_include) ! if (tcllib is None or tklib is None or tcl_includes is None or tk_includes is None): # Something's missing, so give up From loewis@users.sourceforge.net Sat May 3 10:09:04 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 02:09:04 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_inspect.py,1.9,1.10 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv17854/Lib/test Modified Files: test_inspect.py Log Message: Patch #711902: Cause pydoc to show data descriptor __doc__ strings. Index: test_inspect.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_inspect.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** test_inspect.py 30 Nov 2002 03:53:15 -0000 1.9 --- test_inspect.py 3 May 2003 09:09:02 -0000 1.10 *************** *** 62,65 **** --- 62,66 ---- # getsourcefile, getcomments, getsource, getclasstree, getargspec, # getargvalues, formatargspec, formatargvalues, currentframe, stack, trace + # isdatadescriptor from test.test_support import TestFailed, TESTFN *************** *** 105,108 **** --- 106,111 ---- istest(inspect.ismodule, 'mod') istest(inspect.istraceback, 'tb') + istest(inspect.isdatadescriptor, '__builtins__.file.closed') + istest(inspect.isdatadescriptor, '__builtins__.file.softspace') test(inspect.isroutine(mod.spam), 'isroutine(mod.spam)') test(inspect.isroutine([].count), 'isroutine([].count)') From loewis@users.sourceforge.net Sat May 3 10:09:04 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 02:09:04 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libinspect.tex,1.11,1.12 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv17854/Doc/lib Modified Files: libinspect.tex Log Message: Patch #711902: Cause pydoc to show data descriptor __doc__ strings. Index: libinspect.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libinspect.tex,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** libinspect.tex 23 Apr 2002 21:21:20 -0000 1.11 --- libinspect.tex 3 May 2003 09:09:01 -0000 1.12 *************** *** 162,165 **** --- 162,190 ---- \end{funcdesc} + \begin{funcdesc}{ismethoddescriptor}{object} + Return true if the object is a method descriptor, but not if ismethod() or + isclass() or isfunction() are true. + + This is new as of Python 2.2, and, for example, is true of int.__add__. + An object passing this test has a __get__ attribute but not a __set__ + attribute, but beyond that the set of attributes varies. __name__ is + usually sensible, and __doc__ often is. + + Methods implemented via descriptors that also pass one of the other + tests return false from the ismethoddescriptor() test, simply because + the other tests promise more -- you can, e.g., count on having the + im_func attribute (etc) when an object passes ismethod(). + \end{funcdesc} + + \begin{funcdesc}{isdatadescriptor}{object} + Return true if the object is a data descriptor. + + Data descriptors have both a __get__ and a __set__ attribute. Examples are + properties (defined in Python) and getsets and members (defined in C). + Typically, data descriptors will also have __name__ and __doc__ attributes + (properties, getsets, and members have both of these attributes), but this + is not guaranteed. + \end{funcdesc} + \subsection{Retrieving source code \label{inspect-source}} From loewis@users.sourceforge.net Sat May 3 10:09:04 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 02:09:04 -0700 Subject: [Python-checkins] python/dist/src/Lib inspect.py,1.42,1.43 pydoc.py,1.81,1.82 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv17854/Lib Modified Files: inspect.py pydoc.py Log Message: Patch #711902: Cause pydoc to show data descriptor __doc__ strings. Index: inspect.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/inspect.py,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** inspect.py 28 Mar 2003 16:29:50 -0000 1.42 --- inspect.py 3 May 2003 09:09:01 -0000 1.43 *************** *** 79,82 **** --- 79,92 ---- and not isclass(object)) + def isdatadescriptor(object): + """Return true if the object is a data descriptor. + + Data descriptors have both a __get__ and a __set__ attribute. Examples are + properties (defined in Python) and getsets and members (defined in C). + Typically, data descriptors will also have __name__ and __doc__ attributes + (properties, getsets, and members have both of these attributes), but this + is not guaranteed.""" + return (hasattr(object, "__set__") and hasattr(object, "__get__")) + def isfunction(object): """Return true if the object is a user-defined function. Index: pydoc.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/pydoc.py,v retrieving revision 1.81 retrieving revision 1.82 diff -C2 -d -r1.81 -r1.82 *** pydoc.py 30 Mar 2003 20:31:34 -0000 1.81 --- pydoc.py 3 May 2003 09:09:01 -0000 1.82 *************** *** 687,691 **** for name, kind, homecls, value in ok: base = self.docother(getattr(object, name), name, mod) ! if callable(value): doc = getattr(value, "__doc__", None) else: --- 687,691 ---- for name, kind, homecls, value in ok: base = self.docother(getattr(object, name), name, mod) ! if callable(value) or inspect.isdatadescriptor(value): doc = getattr(value, "__doc__", None) else: *************** *** 1088,1092 **** push(msg) for name, kind, homecls, value in ok: ! if callable(value): doc = getattr(value, "__doc__", None) else: --- 1088,1092 ---- push(msg) for name, kind, homecls, value in ok: ! if callable(value) or inspect.isdatadescriptor(value): doc = getattr(value, "__doc__", None) else: From loewis@users.sourceforge.net Sat May 3 10:09:05 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 02:09:05 -0700 Subject: [Python-checkins] python/dist/src/Misc NEWS,1.754,1.755 Message-ID: Update of /cvsroot/python/python/dist/src/Misc In directory sc8-pr-cvs1:/tmp/cvs-serv17854/Misc Modified Files: NEWS Log Message: Patch #711902: Cause pydoc to show data descriptor __doc__ strings. Index: NEWS =================================================================== RCS file: /cvsroot/python/python/dist/src/Misc/NEWS,v retrieving revision 1.754 retrieving revision 1.755 diff -C2 -d -r1.754 -r1.755 *** NEWS 2 May 2003 20:24:56 -0000 1.754 --- NEWS 3 May 2003 09:09:02 -0000 1.755 *************** *** 22,25 **** --- 22,28 ---- ------- + - inspect.is{method|data}descriptor was added, to allow pydoc display + __doc__ of data descriptors. + - Fixed socket speed loss caused by use of the _socketobject wrapper class in socket.py. From loewis@users.sourceforge.net Sat May 3 10:14:55 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 02:14:55 -0700 Subject: [Python-checkins] python/dist/src/Parser myreadline.c,2.28,2.29 Message-ID: Update of /cvsroot/python/python/dist/src/Parser In directory sc8-pr-cvs1:/tmp/cvs-serv20733/Parser Modified Files: myreadline.c Log Message: Patch #708495: Port more stuff to OpenVMS. Index: myreadline.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Parser/myreadline.c,v retrieving revision 2.28 retrieving revision 2.29 diff -C2 -d -r2.28 -r2.29 *** myreadline.c 26 Oct 2002 14:39:09 -0000 2.28 --- myreadline.c 3 May 2003 09:14:53 -0000 2.29 *************** *** 16,19 **** --- 16,23 ---- #endif /* MS_WINDOWS */ + #ifdef __VMS + extern char* vms__StdioReadline(FILE *sys_stdin, FILE *sys_stdout, char *prompt); + #endif + int (*PyOS_InputHook)(void) = NULL; *************** *** 160,164 **** --- 164,172 ---- if (PyOS_ReadlineFunctionPointer == NULL) { + #ifdef __VMS + PyOS_ReadlineFunctionPointer = vms__StdioReadline; + #else PyOS_ReadlineFunctionPointer = PyOS_StdioReadline; + #endif } From loewis@users.sourceforge.net Sat May 3 10:14:56 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 02:14:56 -0700 Subject: [Python-checkins] python/dist/src/Modules bz2module.c,1.18,1.19 fcntlmodule.c,2.38,2.39 fpectlmodule.c,2.18,2.19 grpmodule.c,2.20,2.21 mmapmodule.c,2.44,2.45 posixmodule.c,2.298,2.299 socketmodule.c,1.262,1.263 socketmodule.h,1.8,1.9 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv20733/Modules Modified Files: bz2module.c fcntlmodule.c fpectlmodule.c grpmodule.c mmapmodule.c posixmodule.c socketmodule.c socketmodule.h Log Message: Patch #708495: Port more stuff to OpenVMS. Index: bz2module.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/bz2module.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** bz2module.c 29 Apr 2003 14:53:06 -0000 1.18 --- bz2module.c 3 May 2003 09:14:53 -0000 1.19 *************** *** 1310,1314 **** --- 1310,1316 ---- case 'U': + #ifdef WITH_UNIVERSAL_NEWLINES self->f_univ_newline = 1; + #endif break; Index: fcntlmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/fcntlmodule.c,v retrieving revision 2.38 retrieving revision 2.39 diff -C2 -d -r2.38 -r2.39 *** fcntlmodule.c 3 Mar 2003 12:29:42 -0000 2.38 --- fcntlmodule.c 3 May 2003 09:14:53 -0000 2.39 *************** *** 183,187 **** --- 183,191 ---- } Py_BEGIN_ALLOW_THREADS + #ifdef __VMS + ret = ioctl(fd, code, (void *)arg); + #else ret = ioctl(fd, code, arg); + #endif Py_END_ALLOW_THREADS if (ret < 0) { Index: fpectlmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/fpectlmodule.c,v retrieving revision 2.18 retrieving revision 2.19 diff -C2 -d -r2.18 -r2.19 *** fpectlmodule.c 26 Sep 2002 16:52:02 -0000 2.18 --- fpectlmodule.c 3 May 2003 09:14:53 -0000 2.19 *************** *** 189,192 **** --- 189,196 ---- PyOS_setsig(SIGFPE, handler); + /*-- DEC ALPHA VMS --------------------------------------------------------*/ + #elif defined(__ALPHA) && defined(__VMS) + PyOS_setsig(SIGFPE, handler); + /*-- Cray Unicos ----------------------------------------------------------*/ #elif defined(cray) Index: grpmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/grpmodule.c,v retrieving revision 2.20 retrieving revision 2.21 diff -C2 -d -r2.20 -r2.21 *** grpmodule.c 17 Sep 2002 07:05:25 -0000 2.20 --- grpmodule.c 3 May 2003 09:14:53 -0000 2.21 *************** *** 59,62 **** --- 59,66 ---- #define SET(i,val) PyStructSequence_SET_ITEM(v, i, val) SET(setIndex++, PyString_FromString(p->gr_name)); + #ifdef __VMS + SET(setIndex++, Py_None); + Py_INCREF(Py_None); + #else if (p->gr_passwd) SET(setIndex++, PyString_FromString(p->gr_passwd)); *************** *** 65,68 **** --- 69,73 ---- Py_INCREF(Py_None); } + #endif SET(setIndex++, PyInt_FromLong((long) p->gr_gid)); SET(setIndex++, w); Index: mmapmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/mmapmodule.c,v retrieving revision 2.44 retrieving revision 2.45 diff -C2 -d -r2.44 -r2.45 *** mmapmodule.c 9 Apr 2003 19:31:02 -0000 2.44 --- mmapmodule.c 3 May 2003 09:14:53 -0000 2.45 *************** *** 898,901 **** --- 898,905 ---- #ifdef HAVE_FSTAT + # ifdef __VMS + /* on OpenVMS we must ensure that all bytes are written to the file */ + fsync(fd); + # endif if (fstat(fd, &st) == 0 && (size_t)map_size > st.st_size) { PyErr_SetString(PyExc_ValueError, Index: posixmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/posixmodule.c,v retrieving revision 2.298 retrieving revision 2.299 diff -C2 -d -r2.298 -r2.299 *** posixmodule.c 23 Apr 2003 02:39:17 -0000 2.298 --- posixmodule.c 3 May 2003 09:14:53 -0000 2.299 *************** *** 18,33 **** #if defined(__VMS) - # include /* tolower() */ - # include /* string descriptors */ - # include /* DVI$_name */ - # include /* -> O_RDWR */ - # include /* JPI$_name */ - # include /* LIB$name */ - # include /* OTS$name */ - # include /* SS$_name */ # include - # include - # include - # include /* define wait() */ #endif /* defined(__VMS) */ --- 18,22 ---- *************** *** 326,386 **** #endif /* !_MSC_VER */ - #if defined(__VMS) - /* add some values to provide a similar environment like POSIX */ - static - void - vms_add_posix_env(PyObject *d) - { - PyObject *o; - char* str; - - str = getenv("LINES"); - o = Py_BuildValue("s", str); - if (o != NULL) { - (void)PyDict_SetItemString(d, "LINES", o); - Py_DECREF(o); - } - - str = getenv("COLUMNS"); - o = Py_BuildValue("s", str); - if (o != NULL) { - (void)PyDict_SetItemString(d, "COLUMNS", o); - Py_DECREF(o); - } - - str = getenv("USER"); - o = Py_BuildValue("s", str); - if (o != NULL) { - (void)PyDict_SetItemString(d, "USERNAME", o); - Py_DECREF(o); - } - o = Py_BuildValue("s", str); - if (o != NULL) { - (void)PyDict_SetItemString(d, "LOGNAME", o); - Py_DECREF(o); - } - - str = getenv("HOME"); - o = Py_BuildValue("s", str); - if (o != NULL) { - (void)PyDict_SetItemString(d, "HOME", o); - Py_DECREF(o); - } - - str = getenv("PATH"); - o = Py_BuildValue("s", str); - if (o != NULL) { - (void)PyDict_SetItemString(d, "PATH", o); - Py_DECREF(o); - } - /* OS = "OpenVMS" */ - o = PyString_FromString ("OpenVMS"); - if (o != NULL) { - (void)PyDict_SetItemString(d, "OS", o); - Py_DECREF(o); - } - } - #endif /* __VMS */ - static PyObject * convertenviron(void) --- 315,318 ---- *************** *** 422,428 **** Py_DECREF(v); } ! #if defined(__VMS) ! vms_add_posix_env(d); ! #elif defined(PYOS_OS2) { APIRET rc; --- 354,358 ---- Py_DECREF(v); } ! #if defined(PYOS_OS2) { APIRET rc; *************** *** 1134,1138 **** #if defined(__VMS) ! /* DECC V5.0 - only about FD= 0 @@ try getname()+$getdvi(dvi$_devnam) */ if (id == 0) { ret = ttyname(); --- 1064,1068 ---- #if defined(__VMS) ! /* file descriptor 0 only, the default input device (stdin) */ if (id == 0) { ret = ttyname(); *************** *** 1340,1346 **** #if defined(PYOS_OS2) && defined(PYCC_GCC) res = _getcwd2(buf, sizeof buf); - #elif defined(__VMS) - /* 0 = force Unix-style path if in the VMS DCL environment! */ - res = getcwd(buf, sizeof buf, 0); #else res = getcwd(buf, sizeof buf); --- 1270,1273 ---- *************** *** 1379,1385 **** #if defined(PYOS_OS2) && defined(PYCC_GCC) res = _getcwd2(buf, sizeof buf); - #elif defined(__VMS) - /* 0 = force Unix-style path if in the VMS DCL environment! */ - res = getcwd(buf, sizeof buf, 0); #else res = getcwd(buf, sizeof buf); --- 1306,1309 ---- *************** *** 5184,5192 **** int res; Py_BEGIN_ALLOW_THREADS - #if defined(__VMS) - res = pipe(fds,0,2100); /* bigger mailbox quota than 512 */ - #else res = pipe(fds); - #endif Py_END_ALLOW_THREADS if (res != 0) --- 5108,5112 ---- Index: socketmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/socketmodule.c,v retrieving revision 1.262 retrieving revision 1.263 diff -C2 -d -r1.262 -r1.263 *** socketmodule.c 2 May 2003 15:40:46 -0000 1.262 --- socketmodule.c 3 May 2003 09:14:53 -0000 1.263 *************** *** 2200,2204 **** --- 2200,2208 ---- { char *name; + #ifdef ENABLE_IPV6 struct sockaddr_storage addrbuf; + #else + struct sockaddr_in addrbuf; + #endif if (!PyArg_ParseTuple(args, "s:gethostbyname", &name)) *************** *** 2358,2362 **** char *name; struct hostent *h; ! struct sockaddr_storage addr; struct sockaddr *sa; PyObject *ret; --- 2362,2370 ---- char *name; struct hostent *h; ! #ifdef ENABLE_IPV6 ! struct sockaddr_storage addr; ! #else ! struct sockaddr_in addr; ! #endif struct sockaddr *sa; PyObject *ret; Index: socketmodule.h =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/socketmodule.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** socketmodule.h 13 Jun 2002 15:07:44 -0000 1.8 --- socketmodule.h 3 May 2003 09:14:53 -0000 1.9 *************** *** 3,7 **** /* Includes needed for the sockaddr_* symbols below */ #ifndef MS_WINDOWS ! # include # include # if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP))) --- 3,11 ---- /* Includes needed for the sockaddr_* symbols below */ #ifndef MS_WINDOWS ! #ifdef __VMS ! # include ! # else ! # include ! # endif # include # if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP))) From loewis@users.sourceforge.net Sat May 3 10:14:56 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 02:14:56 -0700 Subject: [Python-checkins] python/dist/src/Python dynload_shlib.c,2.14,2.15 sysmodule.c,2.117,2.118 Message-ID: Update of /cvsroot/python/python/dist/src/Python In directory sc8-pr-cvs1:/tmp/cvs-serv20733/Python Modified Files: dynload_shlib.c sysmodule.c Log Message: Patch #708495: Port more stuff to OpenVMS. Index: dynload_shlib.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/dynload_shlib.c,v retrieving revision 2.14 retrieving revision 2.15 diff -C2 -d -r2.14 -r2.15 *** dynload_shlib.c 26 Feb 2002 11:41:34 -0000 2.14 --- dynload_shlib.c 3 May 2003 09:14:53 -0000 2.15 *************** *** 41,48 **** --- 41,55 ---- {".dll", "rb", C_EXTENSION}, #else + #ifdef __VMS + {".exe", "rb", C_EXTENSION}, + {".EXE", "rb", C_EXTENSION}, + {"module.exe", "rb", C_EXTENSION}, + {"MODULE.EXE", "rb", C_EXTENSION}, + #else {".so", "rb", C_EXTENSION}, {"module.so", "rb", C_EXTENSION}, #endif #endif + #endif {0, 0} }; *************** *** 50,54 **** --- 57,65 ---- static struct { dev_t dev; + #ifdef __VMS + ino_t ino[3]; + #else ino_t ino; + #endif void *handle; } handles[128]; *************** *** 88,92 **** --- 99,109 ---- if (nhandles < 128) { handles[nhandles].dev = statb.st_dev; + #ifdef __VMS + handles[nhandles].ino[0] = statb.st_ino[0]; + handles[nhandles].ino[1] = statb.st_ino[1]; + handles[nhandles].ino[2] = statb.st_ino[2]; + #else handles[nhandles].ino = statb.st_ino; + #endif } } *************** *** 98,101 **** --- 115,129 ---- if (Py_VerboseFlag) printf("dlopen(\"%s\", %x);\n", pathname, dlopenflags); + + #ifdef __VMS + /* VMS currently don't allow a pathname, use a logical name instead */ + /* Concatenate 'python_module_' and shortname */ + /* so "import vms.bar" will use the logical python_module_bar */ + /* As C module use only one name space this is probably not a */ + /* important limitation */ + PyOS_snprintf(pathbuf, sizeof(pathbuf), "python_module_%-.200s", + shortname); + pathname = pathbuf; + #endif handle = dlopen(pathname, dlopenflags); Index: sysmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/sysmodule.c,v retrieving revision 2.117 retrieving revision 2.118 diff -C2 -d -r2.117 -r2.118 *** sysmodule.c 9 Apr 2003 19:06:19 -0000 2.117 --- sysmodule.c 3 May 2003 09:14:54 -0000 2.118 *************** *** 33,36 **** --- 33,40 ---- #endif + #ifdef __VMS + #include + #endif + PyObject * PySys_GetObject(char *name) *************** *** 1051,1055 **** --- 1055,1074 ---- int i; for (i = 0; i < argc; i++) { + #ifdef __VMS + PyObject *v; + + /* argv[0] is the script pathname if known */ + if (i == 0) { + char* fn = decc$translate_vms(argv[0]); + if ((fn == (char *)0) || fn == (char *)-1) + v = PyString_FromString(argv[0]); + else + v = PyString_FromString( + decc$translate_vms(argv[0])); + } else + v = PyString_FromString(argv[i]); + #else PyObject *v = PyString_FromString(argv[i]); + #endif if (v == NULL) { Py_DECREF(av); From loewis@users.sourceforge.net Sat May 3 10:45:15 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 02:45:15 -0700 Subject: [Python-checkins] python/dist/src/Modules _tkinter.c,1.156,1.157 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv7009/Modules Modified Files: _tkinter.c Log Message: Implement tcl object __cmp__. Index: _tkinter.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/_tkinter.c,v retrieving revision 1.156 retrieving revision 1.157 diff -C2 -d -r1.156 -r1.157 *** _tkinter.c 1 May 2003 05:47:00 -0000 1.156 --- _tkinter.c 3 May 2003 09:45:12 -0000 1.157 *************** *** 811,814 **** --- 811,825 ---- } + static int + PyTclObject_cmp(PyTclObject *self, PyTclObject *other) + { + int res; + res = strcmp(Tcl_GetString(self->value), + Tcl_GetString(other->value)); + if (res < 0) return -1; + if (res > 0) return 1; + return 0; + } + PyDoc_STRVAR(get_typename__doc__, "name of the Tcl type"); *************** *** 844,848 **** 0, /*tp_getattr*/ 0, /*tp_setattr*/ ! 0, /*tp_compare*/ (reprfunc)PyTclObject_repr, /*tp_repr*/ 0, /*tp_as_number*/ --- 855,859 ---- 0, /*tp_getattr*/ 0, /*tp_setattr*/ ! (cmpfunc)PyTclObject_cmp, /*tp_compare*/ (reprfunc)PyTclObject_repr, /*tp_repr*/ 0, /*tp_as_number*/ From loewis@users.sourceforge.net Sat May 3 10:58:28 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 02:58:28 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_inspect.py,1.10,1.11 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv14489/Lib/test Modified Files: test_inspect.py Log Message: Refer to __builtin__.file, not __builtins__.file Index: test_inspect.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_inspect.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** test_inspect.py 3 May 2003 09:09:02 -0000 1.10 --- test_inspect.py 3 May 2003 09:58:26 -0000 1.11 *************** *** 106,111 **** istest(inspect.ismodule, 'mod') istest(inspect.istraceback, 'tb') ! istest(inspect.isdatadescriptor, '__builtins__.file.closed') ! istest(inspect.isdatadescriptor, '__builtins__.file.softspace') test(inspect.isroutine(mod.spam), 'isroutine(mod.spam)') test(inspect.isroutine([].count), 'isroutine([].count)') --- 106,112 ---- istest(inspect.ismodule, 'mod') istest(inspect.istraceback, 'tb') ! import __builtin__ ! istest(inspect.isdatadescriptor, '__builtin__.file.closed') ! istest(inspect.isdatadescriptor, '__builtin__.file.softspace') test(inspect.isroutine(mod.spam), 'isroutine(mod.spam)') test(inspect.isroutine([].count), 'isroutine([].count)') From loewis@users.sourceforge.net Sat May 3 11:00:27 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:00:27 -0700 Subject: [Python-checkins] python/dist/src/Python getargs.c,2.99,2.100 Message-ID: Update of /cvsroot/python/python/dist/src/Python In directory sc8-pr-cvs1:/tmp/cvs-serv15015/Python Modified Files: getargs.c Log Message: Patch #684981: Add cleanup capability for argument parsers. Fixes 501716. Index: getargs.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/getargs.c,v retrieving revision 2.99 retrieving revision 2.100 diff -C2 -d -r2.99 -r2.100 *** getargs.c 18 Apr 2003 00:12:30 -0000 2.99 --- getargs.c 3 May 2003 10:00:22 -0000 2.100 *************** *** 18,25 **** static void seterror(int, char *, int *, char *, char *); static char *convertitem(PyObject *, char **, va_list *, int *, char *, ! size_t); static char *converttuple(PyObject *, char **, va_list *, ! int *, char *, size_t, int); ! static char *convertsimple(PyObject *, char **, va_list *, char *, size_t); static int convertbuffer(PyObject *, void **p, char **); --- 18,26 ---- static void seterror(int, char *, int *, char *, char *); static char *convertitem(PyObject *, char **, va_list *, int *, char *, ! size_t, PyObject **); static char *converttuple(PyObject *, char **, va_list *, ! int *, char *, size_t, int, PyObject **); ! static char *convertsimple(PyObject *, char **, va_list *, char *, ! size_t, PyObject **); static int convertbuffer(PyObject *, void **p, char **); *************** *** 73,76 **** --- 74,120 ---- + /* Handle cleanup of allocated memory in case of exception */ + + static int + addcleanup(void *ptr, PyObject **freelist) + { + PyObject *cobj; + if (!*freelist) { + *freelist = PyList_New(0); + if (!*freelist) { + PyMem_FREE(ptr); + return -1; + } + } + cobj = PyCObject_FromVoidPtr(ptr, NULL); + if (!cobj) { + PyMem_FREE(ptr); + return -1; + } + if(PyList_Append(*freelist, cobj)) { + PyMem_FREE(ptr); + Py_DECREF(cobj); + return -1; + } + Py_DECREF(cobj); + return 0; + } + + static int + cleanreturn(int retval, PyObject *freelist) + { + if(freelist) { + if((retval) == 0) { + int len = PyList_GET_SIZE(freelist), i; + for (i = 0; i < len; i++) + PyMem_FREE(PyCObject_AsVoidPtr( + PyList_GET_ITEM(freelist, i))); + } + Py_DECREF(freelist); + } + return retval; + } + + static int vgetargs1(PyObject *args, char *format, va_list *p_va, int compat) *************** *** 87,90 **** --- 131,135 ---- int i, len; char *msg; + PyObject *freelist = NULL; assert(compat || (args != (PyObject*)NULL)); *************** *** 158,166 **** } msg = convertitem(args, &format, p_va, levels, msgbuf, ! sizeof(msgbuf)); if (msg == NULL) ! return 1; seterror(levels[0], msg, levels+1, fname, message); ! return 0; } else { --- 203,211 ---- } msg = convertitem(args, &format, p_va, levels, msgbuf, ! sizeof(msgbuf), &freelist); if (msg == NULL) ! return cleanreturn(1, freelist); seterror(levels[0], msg, levels+1, fname, message); ! return cleanreturn(0, freelist); } else { *************** *** 201,208 **** format++; msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, ! levels, msgbuf, sizeof(msgbuf)); if (msg) { seterror(i+1, msg, levels, fname, message); ! return 0; } } --- 246,253 ---- format++; msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, ! levels, msgbuf, sizeof(msgbuf), &freelist); if (msg) { seterror(i+1, msg, levels, fname, message); ! return cleanreturn(0, freelist); } } *************** *** 213,220 **** PyErr_Format(PyExc_SystemError, "bad format string: %.200s", formatsave); ! return 0; } ! return 1; } --- 258,265 ---- PyErr_Format(PyExc_SystemError, "bad format string: %.200s", formatsave); ! return cleanreturn(0, freelist); } ! return cleanreturn(1, freelist); } *************** *** 278,282 **** static char * converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels, ! char *msgbuf, size_t bufsize, int toplevel) { int level = 0; --- 323,327 ---- static char * converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels, ! char *msgbuf, size_t bufsize, int toplevel, PyObject **freelist) { int level = 0; *************** *** 328,332 **** item = PySequence_GetItem(arg, i); msg = convertitem(item, &format, p_va, levels+1, msgbuf, ! bufsize); /* PySequence_GetItem calls tp->sq_item, which INCREFs */ Py_XDECREF(item); --- 373,377 ---- item = PySequence_GetItem(arg, i); msg = convertitem(item, &format, p_va, levels+1, msgbuf, ! bufsize, freelist); /* PySequence_GetItem calls tp->sq_item, which INCREFs */ Py_XDECREF(item); *************** *** 346,350 **** static char * convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels, ! char *msgbuf, size_t bufsize) { char *msg; --- 391,395 ---- static char * convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels, ! char *msgbuf, size_t bufsize, PyObject **freelist) { char *msg; *************** *** 354,363 **** format++; msg = converttuple(arg, &format, p_va, levels, msgbuf, ! bufsize, 0); if (msg == NULL) format++; } else { ! msg = convertsimple(arg, &format, p_va, msgbuf, bufsize); if (msg != NULL) levels[0] = 0; --- 399,409 ---- format++; msg = converttuple(arg, &format, p_va, levels, msgbuf, ! bufsize, 0, freelist); if (msg == NULL) format++; } else { ! msg = convertsimple(arg, &format, p_va, msgbuf, bufsize, ! freelist); if (msg != NULL) levels[0] = 0; *************** *** 410,414 **** static char * convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, ! size_t bufsize) { char *format = *p_format; --- 456,460 ---- static char * convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, ! size_t bufsize, PyObject **freelist) { char *format = *p_format; *************** *** 837,844 **** format++; ! if (buffer_len == NULL) return converterr( "(buffer_len is NULL)", arg, msgbuf, bufsize); if (*buffer == NULL) { *buffer = PyMem_NEW(char, size + 1); --- 883,892 ---- format++; ! if (buffer_len == NULL) { ! Py_DECREF(s); return converterr( "(buffer_len is NULL)", arg, msgbuf, bufsize); + } if (*buffer == NULL) { *buffer = PyMem_NEW(char, size + 1); *************** *** 849,852 **** --- 897,906 ---- arg, msgbuf, bufsize); } + if(addcleanup(*buffer, freelist)) { + Py_DECREF(s); + return converterr( + "(cleanup problem)", + arg, msgbuf, bufsize); + } } else { if (size + 1 > *buffer_len) { *************** *** 875,882 **** */ ! if ((int)strlen(PyString_AS_STRING(s)) != size) return converterr( "(encoded string without NULL bytes)", arg, msgbuf, bufsize); *buffer = PyMem_NEW(char, size + 1); if (*buffer == NULL) { --- 929,938 ---- */ ! if ((int)strlen(PyString_AS_STRING(s)) != size) { ! Py_DECREF(s); return converterr( "(encoded string without NULL bytes)", arg, msgbuf, bufsize); + } *buffer = PyMem_NEW(char, size + 1); if (*buffer == NULL) { *************** *** 885,888 **** --- 941,949 ---- arg, msgbuf, bufsize); } + if(addcleanup(*buffer, freelist)) { + Py_DECREF(s); + return converterr("(cleanup problem)", + arg, msgbuf, bufsize); + } memcpy(*buffer, PyString_AS_STRING(s), *************** *** 1104,1107 **** --- 1165,1169 ---- int i, len, nargs, nkeywords; char *msg, **p; + PyObject *freelist = NULL; assert(args != NULL && PyTuple_Check(args)); *************** *** 1228,1235 **** format++; msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, ! levels, msgbuf, sizeof(msgbuf)); if (msg) { seterror(i+1, msg, levels, fname, message); ! return 0; } } --- 1290,1297 ---- format++; msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, ! levels, msgbuf, sizeof(msgbuf), &freelist); if (msg) { seterror(i+1, msg, levels, fname, message); ! return cleanreturn(0, freelist); } } *************** *** 1237,1241 **** /* handle no keyword parameters in call */ if (nkeywords == 0) ! return 1; /* convert the keyword arguments; this uses the format --- 1299,1303 ---- /* handle no keyword parameters in call */ if (nkeywords == 0) ! return cleanreturn(1, freelist); /* convert the keyword arguments; this uses the format *************** *** 1249,1257 **** Py_INCREF(item); msg = convertitem(item, &format, p_va, levels, msgbuf, ! sizeof(msgbuf)); Py_DECREF(item); if (msg) { seterror(i+1, msg, levels, fname, message); ! return 0; } --nkeywords; --- 1311,1319 ---- Py_INCREF(item); msg = convertitem(item, &format, p_va, levels, msgbuf, ! sizeof(msgbuf), &freelist); Py_DECREF(item); if (msg) { seterror(i+1, msg, levels, fname, message); ! return cleanreturn(0, freelist); } --nkeywords; *************** *** 1260,1269 **** } else if (PyErr_Occurred()) ! return 0; else { msg = skipitem(&format, p_va); if (msg) { seterror(i+1, msg, levels, fname, message); ! return 0; } } --- 1322,1331 ---- } else if (PyErr_Occurred()) ! return cleanreturn(0, freelist); else { msg = skipitem(&format, p_va); if (msg) { seterror(i+1, msg, levels, fname, message); ! return cleanreturn(0, freelist); } } *************** *** 1280,1284 **** PyErr_SetString(PyExc_TypeError, "keywords must be strings"); ! return 0; } ks = PyString_AsString(key); --- 1342,1346 ---- PyErr_SetString(PyExc_TypeError, "keywords must be strings"); ! return cleanreturn(0, freelist); } ks = PyString_AsString(key); *************** *** 1294,1303 **** "argument for this function", ks); ! return 0; } } } ! return 1; } --- 1356,1365 ---- "argument for this function", ks); ! return cleanreturn(0, freelist); } } } ! return cleanreturn(1, freelist); } From loewis@users.sourceforge.net Sat May 3 11:12:48 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:12:48 -0700 Subject: [Python-checkins] python/dist/src/Modules socketmodule.c,1.263,1.264 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv22931/Modules Modified Files: socketmodule.c Log Message: Patch #724588: Check whether the address of hstrerror and inet_pton can be taken, and define NI_MAX{HOST|SERV} if necessary. Index: socketmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/socketmodule.c,v retrieving revision 1.263 retrieving revision 1.264 diff -C2 -d -r1.263 -r1.264 *** socketmodule.c 3 May 2003 09:14:53 -0000 1.263 --- socketmodule.c 3 May 2003 10:12:45 -0000 1.264 *************** *** 294,297 **** --- 294,307 ---- #endif + /* + * Constants for getnameinfo() + */ + #if !defined(NI_MAXHOST) + #define NI_MAXHOST 1025 + #endif + #if !defined(NI_MAXSERV) + #define NI_MAXSERV 32 + #endif + /* XXX There's a problem here: *static* functions are not supposed to have a Py prefix (or use CapitalizedWords). Later... */ From loewis@users.sourceforge.net Sat May 3 11:12:48 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:12:48 -0700 Subject: [Python-checkins] python/dist/src configure,1.390,1.391 configure.in,1.401,1.402 pyconfig.h.in,1.76,1.77 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv22931 Modified Files: configure configure.in pyconfig.h.in Log Message: Patch #724588: Check whether the address of hstrerror and inet_pton can be taken, and define NI_MAX{HOST|SERV} if necessary. Index: configure =================================================================== RCS file: /cvsroot/python/python/dist/src/configure,v retrieving revision 1.390 retrieving revision 1.391 diff -C2 -d -r1.390 -r1.391 *** configure 11 Apr 2003 15:35:40 -0000 1.390 --- configure 3 May 2003 10:12:42 -0000 1.391 *************** *** 1,4 **** #! /bin/sh ! # From configure.in Revision: 1.400 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. --- 1,4 ---- #! /bin/sh ! # From configure.in Revision: 1.401 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. *************** *** 909,913 **** # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ! ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` --- 909,913 ---- # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ! ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` *************** *** 12110,12121 **** - - - for ac_func in alarm chown clock confstr ctermid execv \ fchdir fork fsync fdatasync fpathconf ftime ftruncate \ gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getpwent getwd \ ! hstrerror inet_aton inet_pton kill killpg lchown lstat mkfifo mknod mktime \ mremap nice pathconf pause plock poll pthread_init \ putenv readlink realpath \ --- 12110,12118 ---- for ac_func in alarm chown clock confstr ctermid execv \ fchdir fork fsync fdatasync fpathconf ftime ftruncate \ gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getpwent getwd \ ! kill killpg lchown lstat mkfifo mknod mktime \ mremap nice pathconf pause plock poll pthread_init \ putenv readlink realpath \ *************** *** 12503,12506 **** --- 12500,12660 ---- rm -f conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: checking for hstrerror" >&5 + echo $ECHO_N "checking for hstrerror... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" + #include "confdefs.h" + + #include "confdefs.h" + #include + + #ifdef F77_DUMMY_MAIN + # ifdef __cplusplus + extern "C" + # endif + int F77_DUMMY_MAIN() { return 1; } + #endif + int + main () + { + void* p = hstrerror + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + cat >>confdefs.h <<\_ACEOF + #define HAVE_HSTRERROR 1 + _ACEOF + + echo "$as_me:$LINENO: result: yes" >&5 + echo "${ECHO_T}yes" >&6 + else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + echo "$as_me:$LINENO: result: no" >&5 + echo "${ECHO_T}no" >&6 + + fi + rm -f conftest.$ac_objext conftest.$ac_ext + + echo "$as_me:$LINENO: checking for inet_aton" >&5 + echo $ECHO_N "checking for inet_aton... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" + #include "confdefs.h" + + #include "confdefs.h" + #include + #include + #include + + #ifdef F77_DUMMY_MAIN + # ifdef __cplusplus + extern "C" + # endif + int F77_DUMMY_MAIN() { return 1; } + #endif + int + main () + { + void* p = inet_aton + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + cat >>confdefs.h <<\_ACEOF + #define HAVE_INET_ATON 1 + _ACEOF + + echo "$as_me:$LINENO: result: yes" >&5 + echo "${ECHO_T}yes" >&6 + else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + echo "$as_me:$LINENO: result: no" >&5 + echo "${ECHO_T}no" >&6 + + fi + rm -f conftest.$ac_objext conftest.$ac_ext + + echo "$as_me:$LINENO: checking for inet_pton" >&5 + echo $ECHO_N "checking for inet_pton... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" + #include "confdefs.h" + + #include "confdefs.h" + #include + #include + #include + + #ifdef F77_DUMMY_MAIN + # ifdef __cplusplus + extern "C" + # endif + int F77_DUMMY_MAIN() { return 1; } + #endif + int + main () + { + void* p = inet_pton + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + cat >>confdefs.h <<\_ACEOF + #define HAVE_INET_PTON 1 + _ACEOF + + echo "$as_me:$LINENO: result: yes" >&5 + echo "${ECHO_T}yes" >&6 + else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + echo "$as_me:$LINENO: result: no" >&5 + echo "${ECHO_T}no" >&6 + + fi + rm -f conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: checking for setgroups" >&5 echo $ECHO_N "checking for setgroups... $ECHO_C" >&6 *************** *** 17829,17833 **** # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ! ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` --- 17983,17987 ---- # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ! ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` Index: configure.in =================================================================== RCS file: /cvsroot/python/python/dist/src/configure.in,v retrieving revision 1.401 retrieving revision 1.402 diff -C2 -d -r1.401 -r1.402 *** configure.in 11 Apr 2003 15:35:52 -0000 1.401 --- configure.in 3 May 2003 10:12:45 -0000 1.402 *************** *** 1858,1862 **** gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getpwent getwd \ ! hstrerror inet_aton inet_pton kill killpg lchown lstat mkfifo mknod mktime \ mremap nice pathconf pause plock poll pthread_init \ putenv readlink realpath \ --- 1858,1862 ---- gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getpwent getwd \ ! kill killpg lchown lstat mkfifo mknod mktime \ mremap nice pathconf pause plock poll pthread_init \ putenv readlink realpath \ *************** *** 1920,1923 **** --- 1920,1957 ---- ], void* p = getpagesize, AC_DEFINE(HAVE_GETPAGESIZE, 1, Define if you have the 'getpagesize' function.) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) + ) + + AC_MSG_CHECKING(for hstrerror) + AC_TRY_COMPILE([ + #include "confdefs.h" + #include + ], void* p = hstrerror, + AC_DEFINE(HAVE_HSTRERROR, 1, Define if you have the 'hstrerror' function.) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) + ) + + AC_MSG_CHECKING(for inet_aton) + AC_TRY_COMPILE([ + #include "confdefs.h" + #include + #include + #include + ], void* p = inet_aton, + AC_DEFINE(HAVE_INET_ATON, 1, Define if you have the 'inet_aton' function.) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) + ) + + AC_MSG_CHECKING(for inet_pton) + AC_TRY_COMPILE([ + #include "confdefs.h" + #include + #include + #include + ], void* p = inet_pton, + AC_DEFINE(HAVE_INET_PTON, 1, Define if you have the 'inet_pton' function.) AC_MSG_RESULT(yes), AC_MSG_RESULT(no) Index: pyconfig.h.in =================================================================== RCS file: /cvsroot/python/python/dist/src/pyconfig.h.in,v retrieving revision 1.76 retrieving revision 1.77 diff -C2 -d -r1.76 -r1.77 *** pyconfig.h.in 30 Mar 2003 17:23:49 -0000 1.76 --- pyconfig.h.in 3 May 2003 10:12:45 -0000 1.77 *************** *** 208,212 **** #undef HAVE_GRP_H ! /* Define to 1 if you have the `hstrerror' function. */ #undef HAVE_HSTRERROR --- 208,212 ---- #undef HAVE_GRP_H ! /* Define if you have the 'hstrerror' function. */ #undef HAVE_HSTRERROR *************** *** 214,221 **** #undef HAVE_HYPOT ! /* Define to 1 if you have the `inet_aton' function. */ #undef HAVE_INET_ATON ! /* Define to 1 if you have the `inet_pton' function. */ #undef HAVE_INET_PTON --- 214,221 ---- #undef HAVE_HYPOT ! /* Define if you have the 'inet_aton' function. */ #undef HAVE_INET_ATON ! /* Define if you have the 'inet_pton' function. */ #undef HAVE_INET_PTON From loewis@users.sourceforge.net Sat May 3 11:32:20 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:32:20 -0700 Subject: [Python-checkins] python/dist/src configure,1.391,1.392 configure.in,1.402,1.403 pyconfig.h.in,1.77,1.78 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv5610 Modified Files: configure configure.in pyconfig.h.in Log Message: Patch #730826: Enable extensions on NetBSD 2.0. Index: configure =================================================================== RCS file: /cvsroot/python/python/dist/src/configure,v retrieving revision 1.391 retrieving revision 1.392 diff -C2 -d -r1.391 -r1.392 *** configure 3 May 2003 10:12:42 -0000 1.391 --- configure 3 May 2003 10:32:17 -0000 1.392 *************** *** 1,4 **** #! /bin/sh ! # From configure.in Revision: 1.401 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. --- 1,4 ---- #! /bin/sh ! # From configure.in Revision: 1.402 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. *************** *** 1250,1253 **** --- 1250,1262 ---- cat >>confdefs.h <<\_ACEOF #define _GNU_SOURCE 1 + _ACEOF + + + # The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables + # certain features on NetBSD, so we need _NETBSD_SOURCE to re-enable + # them. + + cat >>confdefs.h <<\_ACEOF + #define _NETBSD_SOURCE 1 _ACEOF Index: configure.in =================================================================== RCS file: /cvsroot/python/python/dist/src/configure.in,v retrieving revision 1.402 retrieving revision 1.403 diff -C2 -d -r1.402 -r1.403 *** configure.in 3 May 2003 10:12:45 -0000 1.402 --- configure.in 3 May 2003 10:32:18 -0000 1.403 *************** *** 35,38 **** --- 35,43 ---- AC_DEFINE(_GNU_SOURCE, 1, [Define on Linux to activate all library features]) + # The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables + # certain features on NetBSD, so we need _NETBSD_SOURCE to re-enable + # them. + AC_DEFINE(_NETBSD_SOURCE, 1, [Define on NetBSD to activate all library features]) + define_xopen_source=yes Index: pyconfig.h.in =================================================================== RCS file: /cvsroot/python/python/dist/src/pyconfig.h.in,v retrieving revision 1.77 retrieving revision 1.78 diff -C2 -d -r1.77 -r1.78 *** pyconfig.h.in 3 May 2003 10:12:45 -0000 1.77 --- pyconfig.h.in 3 May 2003 10:32:18 -0000 1.78 *************** *** 818,821 **** --- 818,824 ---- #undef _MINIX + /* Define on NetBSD to activate all library features */ + #undef _NETBSD_SOURCE + /* Define _OSF_SOURCE to get the makedev macro. */ #undef _OSF_SOURCE From loewis@users.sourceforge.net Sat May 3 11:53:10 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:53:10 -0700 Subject: [Python-checkins] python/dist/src/Objects listobject.c,2.150,2.151 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv20734/Objects Modified Files: listobject.c Log Message: Patch #708604: Check more function results. Will backport to 2.2. Index: listobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/listobject.c,v retrieving revision 2.150 retrieving revision 2.151 diff -C2 -d -r2.150 -r2.151 *** listobject.c 24 Apr 2003 20:59:50 -0000 2.150 --- listobject.c 3 May 2003 10:53:08 -0000 2.151 *************** *** 474,477 **** --- 474,479 ---- int ret; v = list_slice(b, 0, n); + if (v == NULL) + return -1; ret = list_ass_slice(a, ilow, ihigh, v); Py_DECREF(v); *************** *** 489,494 **** item = a->ob_item; d = n - (ihigh-ilow); ! if (ihigh > ilow) p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow)); else p = recycle = NULL; --- 491,501 ---- item = a->ob_item; d = n - (ihigh-ilow); ! if (ihigh > ilow) { p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow)); + if (recycle == NULL) { + PyErr_NoMemory(); + return -1; + } + } else p = recycle = NULL; From loewis@users.sourceforge.net Sat May 3 11:53:11 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:53:11 -0700 Subject: [Python-checkins] python/dist/src/Python compile.c,2.282,2.283 Message-ID: Update of /cvsroot/python/python/dist/src/Python In directory sc8-pr-cvs1:/tmp/cvs-serv20734/Python Modified Files: compile.c Log Message: Patch #708604: Check more function results. Will backport to 2.2. Index: compile.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v retrieving revision 2.282 retrieving revision 2.283 diff -C2 -d -r2.282 -r2.283 *** compile.c 29 Apr 2003 17:07:34 -0000 2.282 --- compile.c 3 May 2003 10:53:08 -0000 2.283 *************** *** 4619,4632 **** PyList_SET_ITEM(list, 0, v); Py_INCREF(v); ! } else ! PyList_Insert(list, 0, v); } } ! if (list == NULL || PyList_GET_SIZE(list) == 0) ! return 0; /* There are cellvars that are also arguments. Create a dict to replace cellvars and put the args at the front. */ d = PyDict_New(); for (i = PyList_GET_SIZE(list); --i >= 0; ) { v = PyInt_FromLong(i); --- 4619,4639 ---- PyList_SET_ITEM(list, 0, v); Py_INCREF(v); ! } else { ! if (PyList_Insert(list, 0, v) < 0) { ! Py_DECREF(list); ! return -1; ! } ! } } } ! if (list == NULL) /* There used to be a check here for the size of */ ! return 0; /* the list being 0, which would have leaked the */ ! /* list if that condition was ever possible. JRH */ /* There are cellvars that are also arguments. Create a dict to replace cellvars and put the args at the front. */ d = PyDict_New(); + if (d == NULL) + return -1; for (i = PyList_GET_SIZE(list); --i >= 0; ) { v = PyInt_FromLong(i); *************** *** 4644,4647 **** --- 4651,4656 ---- while (PyDict_Next(*cellvars, &pos, &v, &w)) { w = PyInt_FromLong(i++); /* don't care about the old key */ + if (w == NULL) + goto fail; if (PyDict_SetItem(d, v, w) < 0) { Py_DECREF(w); *************** *** 4794,4797 **** --- 4803,4808 ---- for (i = 0; i < si.si_nlocals; ++i) { v = PyInt_FromLong(i); + if (v == NULL) + goto fail; if (PyDict_SetItem(c->c_locals, PyList_GET_ITEM(varnames, i), v) < 0) *************** *** 4866,4869 **** --- 4877,4882 ---- if (st->st_nscopes != 1) { v = PyInt_FromLong(flags); + if (v == NULL) + goto fail; if (PyDict_SetItem(st->st_global, name, v)) *************** *** 4902,4905 **** --- 4915,4919 ---- st->st_filename = NULL; + st->st_symbols = NULL; if ((st->st_stack = PyList_New(0)) == NULL) goto fail; *************** *** 4954,4959 **** if (list) ! PyList_SetSlice(list, 0, ! ((PyVarObject*)list)->ob_size, 0); child = (PySymtableEntryObject *) PyList_GET_ITEM(ste->ste_children, i); --- 4968,4979 ---- if (list) ! if (PyList_SetSlice(list, 0, ! ((PyVarObject*)list)->ob_size, 0) < 0) ! return -1; ! /* Yes, the above call CAN fail, even though it's reducing ! the size of the list. The current implementation will ! allocate temp memory equal to the size of the list: this ! is avoidable in this specific case, but probably not ! worth the effort of special-casing it. - JRH */ child = (PySymtableEntryObject *) PyList_GET_ITEM(ste->ste_children, i); *************** *** 5105,5109 **** prev = st->st_cur; if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) { ! Py_DECREF(st->st_cur); st->st_errors++; return; --- 5125,5131 ---- prev = st->st_cur; if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) { ! /* Py_DECREF(st->st_cur); */ ! /* I believe the previous line would lead to a ! double-DECREF when st is disposed - JRH */ st->st_errors++; return; *************** *** 5112,5115 **** --- 5134,5141 ---- st->st_cur = (PySymtableEntryObject *) PySymtableEntry_New(st, name, type, lineno); + if (st->st_cur == NULL) { + st->st_errors++; + return; + } if (strcmp(name, TOP) == 0) st->st_global = st->st_cur->ste_symbols; *************** *** 5188,5191 **** --- 5214,5219 ---- val = flag; o = PyInt_FromLong(val); + if (o == NULL) + return -1; if (PyDict_SetItem(dict, name, o) < 0) { Py_DECREF(o); *************** *** 5206,5209 **** --- 5234,5239 ---- val = flag; o = PyInt_FromLong(val); + if (o == NULL) + return -1; if (PyDict_SetItem(st->st_global, name, o) < 0) { Py_DECREF(o); From loewis@users.sourceforge.net Sat May 3 11:53:53 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:53:53 -0700 Subject: [Python-checkins] python/dist/src/Objects listobject.c,2.103.6.5,2.103.6.6 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv21458/Objects Modified Files: Tag: release22-maint listobject.c Log Message: Patch #708604: Check more function results. Index: listobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/listobject.c,v retrieving revision 2.103.6.5 retrieving revision 2.103.6.6 diff -C2 -d -r2.103.6.5 -r2.103.6.6 *** listobject.c 29 Dec 2002 05:59:09 -0000 2.103.6.5 --- listobject.c 3 May 2003 10:53:51 -0000 2.103.6.6 *************** *** 469,472 **** --- 469,474 ---- int ret; v = list_slice(b, 0, n); + if (v == NULL) + return -1; ret = list_ass_slice(a, ilow, ihigh, v); Py_DECREF(v); *************** *** 490,495 **** item = a->ob_item; d = n - (ihigh-ilow); ! if (ihigh > ilow) p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow)); else p = recycle = NULL; --- 492,502 ---- item = a->ob_item; d = n - (ihigh-ilow); ! if (ihigh > ilow) { p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow)); + if (recycle == NULL) { + PyErr_NoMemory(); + return -1; + } + } else p = recycle = NULL; From loewis@users.sourceforge.net Sat May 3 11:53:54 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:53:54 -0700 Subject: [Python-checkins] python/dist/src/Python compile.c,2.234.4.6,2.234.4.7 Message-ID: Update of /cvsroot/python/python/dist/src/Python In directory sc8-pr-cvs1:/tmp/cvs-serv21458/Python Modified Files: Tag: release22-maint compile.c Log Message: Patch #708604: Check more function results. Index: compile.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v retrieving revision 2.234.4.6 retrieving revision 2.234.4.7 diff -C2 -d -r2.234.4.6 -r2.234.4.7 *** compile.c 12 Feb 2003 19:09:41 -0000 2.234.4.6 --- compile.c 3 May 2003 10:53:51 -0000 2.234.4.7 *************** *** 4382,4395 **** PyList_SET_ITEM(list, 0, v); Py_INCREF(v); ! } else ! PyList_Insert(list, 0, v); } } ! if (list == NULL || PyList_GET_SIZE(list) == 0) ! return 0; /* There are cellvars that are also arguments. Create a dict to replace cellvars and put the args at the front. */ d = PyDict_New(); for (i = PyList_GET_SIZE(list); --i >= 0; ) { v = PyInt_FromLong(i); --- 4382,4402 ---- PyList_SET_ITEM(list, 0, v); Py_INCREF(v); ! } else { ! if (PyList_Insert(list, 0, v) < 0) { ! Py_DECREF(list); ! return -1; ! } ! } } } ! if (list == NULL) /* There used to be a check here for the size of */ ! return 0; /* the list being 0, which would have leaked the */ ! /* list if that condition was ever possible. JRH */ /* There are cellvars that are also arguments. Create a dict to replace cellvars and put the args at the front. */ d = PyDict_New(); + if (d == NULL) + return -1; for (i = PyList_GET_SIZE(list); --i >= 0; ) { v = PyInt_FromLong(i); *************** *** 4406,4409 **** --- 4413,4418 ---- while (PyDict_Next(*cellvars, &pos, &v, &w)) { w = PyInt_FromLong(i++); /* don't care about the old key */ + if (w == NULL) + goto fail; if (PyDict_SetItem(d, v, w) < 0) { Py_DECREF(w); *************** *** 4560,4563 **** --- 4569,4574 ---- for (i = 0; i < si.si_nlocals; ++i) { v = PyInt_FromLong(i); + if (v == NULL) + goto fail; if (PyDict_SetItem(c->c_locals, PyList_GET_ITEM(varnames, i), v) < 0) *************** *** 4632,4635 **** --- 4643,4648 ---- if (st->st_nscopes != 1) { v = PyInt_FromLong(flags); + if (v == NULL) + goto fail; if (PyDict_SetItem(st->st_global, name, v)) *************** *** 4668,4671 **** --- 4681,4685 ---- st->st_filename = NULL; + st->st_symbols = NULL; if ((st->st_stack = PyList_New(0)) == NULL) goto fail; *************** *** 4720,4725 **** if (list) ! PyList_SetSlice(list, 0, ! ((PyVarObject*)list)->ob_size, 0); child = (PySymtableEntryObject *) PyList_GET_ITEM(ste->ste_children, i); --- 4734,4745 ---- if (list) ! if (PyList_SetSlice(list, 0, ! ((PyVarObject*)list)->ob_size, 0) < 0) ! return -1; ! /* Yes, the above call CAN fail, even though it's reducing ! the size of the list. The current implementation will ! allocate temp memory equal to the size of the list: this ! is avoidable in this specific case, but probably not ! worth the effort of special-casing it. - JRH */ child = (PySymtableEntryObject *) PyList_GET_ITEM(ste->ste_children, i); *************** *** 4871,4875 **** prev = st->st_cur; if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) { ! Py_DECREF(st->st_cur); st->st_errors++; return; --- 4891,4897 ---- prev = st->st_cur; if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) { ! /* Py_DECREF(st->st_cur); */ ! /* I believe the previous line would lead to a ! double-DECREF when st is disposed - JRH */ st->st_errors++; return; *************** *** 4878,4881 **** --- 4900,4907 ---- st->st_cur = (PySymtableEntryObject *) PySymtableEntry_New(st, name, type, lineno); + if (st->st_cur == NULL) { + st->st_errors++; + return; + } if (strcmp(name, TOP) == 0) st->st_global = st->st_cur->ste_symbols; *************** *** 4946,4949 **** --- 4972,4977 ---- val = flag; o = PyInt_FromLong(val); + if (o == NULL) + return -1; if (PyDict_SetItem(dict, name, o) < 0) { Py_DECREF(o); *************** *** 4964,4967 **** --- 4992,4997 ---- val = flag; o = PyInt_FromLong(val); + if (o == NULL) + return -1; if (PyDict_SetItem(st->st_global, name, o) < 0) { Py_DECREF(o); From loewis@users.sourceforge.net Sat May 3 11:57:56 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:57:56 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libre.tex,1.97,1.98 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv23113 Modified Files: libre.tex Log Message: Patch #731514: Update recursion documentation to mention simple recursion. Index: libre.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libre.tex,v retrieving revision 1.97 retrieving revision 1.98 diff -C2 -d -r1.97 -r1.98 *** libre.tex 20 Apr 2003 01:48:59 -0000 1.97 --- libre.tex 3 May 2003 10:57:53 -0000 1.98 *************** *** 897,909 **** \end{verbatim} ! \leftline{\strong{Avoiding backtracking}} ! If you create regular expressions that require the engine to perform a lot ! of backtracking, you may encounter a RuntimeError exception with the message ! \code{maximum recursion limit exceeded}. For example, \begin{verbatim} ! >>> s = "<" + "that's a very big string!"*1000 + ">" ! >>> re.match('<.*?>', s) Traceback (most recent call last): File "", line 1, in ? --- 897,910 ---- \end{verbatim} ! \leftline{\strong{Avoiding recursion}} ! If you create regular expressions that require the engine to perform a ! lot of recursion, you may encounter a RuntimeError exception with ! the message \code{maximum recursion limit} exceeded. For example, \begin{verbatim} ! >>> import re ! >>> s = 'Begin ' + 1000*'a very long string ' + 'end' ! >>> re.match('Begin (\w| )*? end', s).end() Traceback (most recent call last): File "", line 1, in ? *************** *** 913,919 **** \end{verbatim} ! You can often restructure your regular expression to avoid backtracking. ! The above regular expression can be recast as ! \regexp{\textless[\textasciicircum \textgreater]*\textgreater}. As a ! further benefit, such regular expressions will run faster than their ! backtracking equivalents. --- 914,922 ---- \end{verbatim} ! You can often restructure your regular expression to avoid recursion. ! ! \versionadded[Simple uses of the \regexp{*?} pattern are now ! special-cased to avoid recursion. Thus, the above regular expression ! can avoid recursion by being recast as \regexp{Begin [a-zA-Z0-9_ ]*?end}. ! As a further benefit, such regular expressions will run faster than ! their recursive equivalents.]{2.3} From loewis@users.sourceforge.net Sat May 3 11:59:15 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 03:59:15 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libre.tex,1.98,1.99 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv24306 Modified Files: libre.tex Log Message: Use \versionchanged, not \versionadded. Index: libre.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libre.tex,v retrieving revision 1.98 retrieving revision 1.99 diff -C2 -d -r1.98 -r1.99 *** libre.tex 3 May 2003 10:57:53 -0000 1.98 --- libre.tex 3 May 2003 10:59:13 -0000 1.99 *************** *** 916,920 **** You can often restructure your regular expression to avoid recursion. ! \versionadded[Simple uses of the \regexp{*?} pattern are now special-cased to avoid recursion. Thus, the above regular expression can avoid recursion by being recast as \regexp{Begin [a-zA-Z0-9_ ]*?end}. --- 916,920 ---- You can often restructure your regular expression to avoid recursion. ! \versionchanged[Simple uses of the \regexp{*?} pattern are now special-cased to avoid recursion. Thus, the above regular expression can avoid recursion by being recast as \regexp{Begin [a-zA-Z0-9_ ]*?end}. From loewis@users.sourceforge.net Sat May 3 12:25:45 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 04:25:45 -0700 Subject: [Python-checkins] python/dist/src configure,1.392,1.393 configure.in,1.403,1.404 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv7925 Modified Files: configure configure.in Log Message: Patch #730170: Check for sem_init in -lpthread. Fixes #727051. Index: configure =================================================================== RCS file: /cvsroot/python/python/dist/src/configure,v retrieving revision 1.392 retrieving revision 1.393 diff -C2 -d -r1.392 -r1.393 *** configure 3 May 2003 10:32:17 -0000 1.392 --- configure 3 May 2003 11:25:40 -0000 1.393 *************** *** 1,4 **** #! /bin/sh ! # From configure.in Revision: 1.402 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. --- 1,4 ---- #! /bin/sh ! # From configure.in Revision: 1.403 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. *************** *** 9716,9720 **** rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_sem_init" = no; then ! for ac_lib in rt posix4; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF --- 9716,9720 ---- rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_sem_init" = no; then ! for ac_lib in pthread rt posix4; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF *************** *** 9772,9777 **** fi ! # 'Real Time' functions on Solaris, ! # posix4 on Solaris 2.6 # checks for system dependent C++ extensions support --- 9772,9778 ---- fi ! # 'Real Time' functions on Solaris ! # posix4 on Solaris 2.6 ! # pthread (first!) on Linux # checks for system dependent C++ extensions support Index: configure.in =================================================================== RCS file: /cvsroot/python/python/dist/src/configure.in,v retrieving revision 1.403 retrieving revision 1.404 diff -C2 -d -r1.403 -r1.404 *** configure.in 3 May 2003 10:32:18 -0000 1.403 --- configure.in 3 May 2003 11:25:43 -0000 1.404 *************** *** 1249,1254 **** AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX ! AC_SEARCH_LIBS(sem_init, rt posix4) # 'Real Time' functions on Solaris, ! # posix4 on Solaris 2.6 # checks for system dependent C++ extensions support --- 1249,1255 ---- AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX ! AC_SEARCH_LIBS(sem_init, pthread rt posix4) # 'Real Time' functions on Solaris ! # posix4 on Solaris 2.6 ! # pthread (first!) on Linux # checks for system dependent C++ extensions support From loewis@users.sourceforge.net Sat May 3 13:10:50 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sat, 03 May 2003 05:10:50 -0700 Subject: [Python-checkins] python/dist/src configure,1.393,1.394 configure.in,1.404,1.405 pyconfig.h.in,1.78,1.79 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv8842 Modified Files: configure configure.in pyconfig.h.in Log Message: Try linking hstrerror and inet_aton tests. Look for these functions in -lresolv. Index: configure =================================================================== RCS file: /cvsroot/python/python/dist/src/configure,v retrieving revision 1.393 retrieving revision 1.394 diff -C2 -d -r1.393 -r1.394 *** configure 3 May 2003 11:25:40 -0000 1.393 --- configure 3 May 2003 12:10:46 -0000 1.394 *************** *** 1,4 **** #! /bin/sh ! # From configure.in Revision: 1.403 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. --- 1,4 ---- #! /bin/sh ! # From configure.in Revision: 1.404 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. *************** *** 12510,12513 **** --- 12510,12640 ---- rm -f conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: checking for inet_aton in -lc" >&5 + echo $ECHO_N "checking for inet_aton in -lc... $ECHO_C" >&6 + if test "${ac_cv_lib_c_inet_aton+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + ac_check_lib_save_LIBS=$LIBS + LIBS="-lc $LIBS" + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" + #include "confdefs.h" + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus + extern "C" + #endif + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char inet_aton (); + #ifdef F77_DUMMY_MAIN + # ifdef __cplusplus + extern "C" + # endif + int F77_DUMMY_MAIN() { return 1; } + #endif + int + main () + { + inet_aton (); + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_c_inet_aton=yes + else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_lib_c_inet_aton=no + fi + rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_c_inet_aton" >&5 + echo "${ECHO_T}$ac_cv_lib_c_inet_aton" >&6 + if test $ac_cv_lib_c_inet_aton = yes; then + /bin/true + else + + echo "$as_me:$LINENO: checking for inet_aton in -lresolv" >&5 + echo $ECHO_N "checking for inet_aton in -lresolv... $ECHO_C" >&6 + if test "${ac_cv_lib_resolv_inet_aton+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + ac_check_lib_save_LIBS=$LIBS + LIBS="-lresolv $LIBS" + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" + #include "confdefs.h" + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus + extern "C" + #endif + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char inet_aton (); + #ifdef F77_DUMMY_MAIN + # ifdef __cplusplus + extern "C" + # endif + int F77_DUMMY_MAIN() { return 1; } + #endif + int + main () + { + inet_aton (); + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_resolv_inet_aton=yes + else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_lib_resolv_inet_aton=no + fi + rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_resolv_inet_aton" >&5 + echo "${ECHO_T}$ac_cv_lib_resolv_inet_aton" >&6 + if test $ac_cv_lib_resolv_inet_aton = yes; then + cat >>confdefs.h <<_ACEOF + #define HAVE_LIBRESOLV 1 + _ACEOF + + LIBS="-lresolv $LIBS" + + fi + + + fi + + echo "$as_me:$LINENO: checking for hstrerror" >&5 echo $ECHO_N "checking for hstrerror... $ECHO_C" >&6 *************** *** 12528,12543 **** main () { ! void* p = hstrerror ; return 0; } _ACEOF ! rm -f conftest.$ac_objext ! if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ! (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && ! { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 --- 12655,12670 ---- main () { ! void* p = hstrerror; hstrerror(0) ; return 0; } _ACEOF ! rm -f conftest.$ac_objext conftest$ac_exeext ! if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ! (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && ! { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 *************** *** 12559,12563 **** fi ! rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: checking for inet_aton" >&5 --- 12686,12690 ---- fi ! rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext echo "$as_me:$LINENO: checking for inet_aton" >&5 *************** *** 12581,12596 **** main () { ! void* p = inet_aton ; return 0; } _ACEOF ! rm -f conftest.$ac_objext ! if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ! (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && ! { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 --- 12708,12723 ---- main () { ! void* p = inet_aton;inet_aton(0,0) ; return 0; } _ACEOF ! rm -f conftest.$ac_objext conftest$ac_exeext ! if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ! (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && ! { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 *************** *** 12612,12616 **** fi ! rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: checking for inet_pton" >&5 --- 12739,12743 ---- fi ! rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext echo "$as_me:$LINENO: checking for inet_pton" >&5 Index: configure.in =================================================================== RCS file: /cvsroot/python/python/dist/src/configure.in,v retrieving revision 1.404 retrieving revision 1.405 diff -C2 -d -r1.404 -r1.405 *** configure.in 3 May 2003 11:25:43 -0000 1.404 --- configure.in 3 May 2003 12:10:48 -0000 1.405 *************** *** 1930,1938 **** ) AC_MSG_CHECKING(for hstrerror) ! AC_TRY_COMPILE([ #include "confdefs.h" #include ! ], void* p = hstrerror, AC_DEFINE(HAVE_HSTRERROR, 1, Define if you have the 'hstrerror' function.) AC_MSG_RESULT(yes), --- 1930,1944 ---- ) + dnl On some systems (e.g. Solaris 9), hstrerror and inet_aton are in -lresolv + dnl On others, they are in the C library, so we to take no action + AC_CHECK_LIB(c, inet_aton, [/bin/true], + AC_CHECK_LIB(resolv, inet_aton) + ) + AC_MSG_CHECKING(for hstrerror) ! AC_TRY_LINK([ #include "confdefs.h" #include ! ], void* p = hstrerror; hstrerror(0), AC_DEFINE(HAVE_HSTRERROR, 1, Define if you have the 'hstrerror' function.) AC_MSG_RESULT(yes), *************** *** 1941,1950 **** AC_MSG_CHECKING(for inet_aton) ! AC_TRY_COMPILE([ #include "confdefs.h" #include #include #include ! ], void* p = inet_aton, AC_DEFINE(HAVE_INET_ATON, 1, Define if you have the 'inet_aton' function.) AC_MSG_RESULT(yes), --- 1947,1956 ---- AC_MSG_CHECKING(for inet_aton) ! AC_TRY_LINK([ #include "confdefs.h" #include #include #include ! ], void* p = inet_aton;inet_aton(0,0), AC_DEFINE(HAVE_INET_ATON, 1, Define if you have the 'inet_aton' function.) AC_MSG_RESULT(yes), Index: pyconfig.h.in =================================================================== RCS file: /cvsroot/python/python/dist/src/pyconfig.h.in,v retrieving revision 1.78 retrieving revision 1.79 diff -C2 -d -r1.78 -r1.79 *** pyconfig.h.in 3 May 2003 10:32:18 -0000 1.78 --- pyconfig.h.in 3 May 2003 12:10:48 -0000 1.79 *************** *** 253,256 **** --- 253,259 ---- #undef HAVE_LIBINTL_H + /* Define to 1 if you have the `resolv' library (-lresolv). */ + #undef HAVE_LIBRESOLV + /* Define to 1 if you have the header file. */ #undef HAVE_LIBUTIL_H From goodger@users.sourceforge.net Sat May 3 17:01:35 2003 From: goodger@users.sourceforge.net (goodger@users.sourceforge.net) Date: Sat, 03 May 2003 09:01:35 -0700 Subject: [Python-checkins] python/nondist/peps pep-0001.txt,1.41,1.42 Message-ID: Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv27536 Modified Files: pep-0001.txt Log Message: converted to reStructuredText Index: pep-0001.txt =================================================================== RCS file: /cvsroot/python/python/nondist/peps/pep-0001.txt,v retrieving revision 1.41 retrieving revision 1.42 diff -C2 -d -r1.41 -r1.42 *** pep-0001.txt 2 May 2003 21:34:44 -0000 1.41 --- pep-0001.txt 3 May 2003 16:01:32 -0000 1.42 *************** *** 6,416 **** Status: Active Type: Informational ! Content-Type: text/plain Created: 13-Jun-2000 ! Post-History: 21-Mar-2001, 29-Jul-2002 What is a PEP? ! PEP stands for Python Enhancement Proposal. A PEP is a design ! document providing information to the Python community, or ! describing a new feature for Python. The PEP should provide a ! concise technical specification of the feature and a rationale for ! the feature. ! We intend PEPs to be the primary mechanisms for proposing new ! features, for collecting community input on an issue, and for ! documenting the design decisions that have gone into Python. The ! PEP author is responsible for building consensus within the ! community and documenting dissenting opinions. ! Because the PEPs are maintained as text files under CVS control, ! their revision history is the historical record of the feature ! proposal[1]. Kinds of PEPs ! There are two kinds of PEPs. A Standards Track PEP describes a ! new feature or implementation for Python. An Informational PEP ! describes a Python design issue, or provides general guidelines or ! information to the Python community, but does not propose a new ! feature. Informational PEPs do not necessarily represent a Python ! community consensus or recommendation, so users and implementors ! are free to ignore Informational PEPs or follow their advice. PEP Work Flow ! The PEP editors assign PEP numbers and change their status. The ! current PEP editors are David Goodger and Barry Warsaw. Please ! send all PEP-related email to . ! The PEP process begins with a new idea for Python. It is highly ! recommended that a single PEP contain a single key proposal or new ! idea. The more focussed the PEP, the more successfully it tends ! to be. The PEP editor reserves the right to reject PEP proposals ! if they appear too unfocussed or too broad. If in doubt, split ! your PEP into several well-focussed ones. ! Each PEP must have a champion -- someone who writes the PEP using ! the style and format described below, shepherds the discussions in ! the appropriate forums, and attempts to build community consensus ! around the idea. The PEP champion (a.k.a. Author) should first ! attempt to ascertain whether the idea is PEP-able. Small ! enhancements or patches often don't need a PEP and can be injected ! into the Python development work flow with a patch submission to ! the SourceForge patch manager[2] or feature request tracker[3]. ! The PEP champion then emails the PEP editor with ! a proposed title and a rough, but fleshed out, draft of the PEP. ! This draft must be written in PEP style as described below. ! If the PEP editor approves, he will assign the PEP a number, label ! it as Standards Track or Informational, give it status "Draft", ! and create and check-in the initial draft of the PEP. The PEP ! editor will not unreasonably deny a PEP. Reasons for denying PEP ! status include duplication of effort, being technically unsound, ! not providing proper motivation or addressing backwards ! compatibility, or not in keeping with the Python philosophy. The ! BDFL (Benevolent Dictator for Life, Guido van Rossum) can be ! consulted during the approval phase, and is the final arbitrator ! of the draft's PEP-ability. ! If a pre-PEP is rejected, the author may elect to take the pre-PEP ! to the comp.lang.python newsgroup (a.k.a. python-list@python.org ! mailing list) to help flesh it out, gain feedback and consensus ! from the community at large, and improve the PEP for ! re-submission. ! The author of the PEP is then responsible for posting the PEP to ! the community forums, and marshaling community support for it. As ! updates are necessary, the PEP author can check in new versions if ! they have CVS commit permissions, or can email new PEP versions to ! the PEP editor for committing. ! Standards Track PEPs consists of two parts, a design document and ! a reference implementation. The PEP should be reviewed and ! accepted before a reference implementation is begun, unless a ! reference implementation will aid people in studying the PEP. ! Standards Track PEPs must include an implementation - in the form ! of code, patch, or URL to same - before it can be considered ! Final. ! PEP authors are responsible for collecting community feedback on a ! PEP before submitting it for review. A PEP that has not been ! discussed on python-list@python.org and/or python-dev@python.org ! will not be accepted. However, wherever possible, long open-ended ! discussions on public mailing lists should be avoided. Strategies ! to keep the discussions efficient include, setting up a separate ! SIG mailing list for the topic, having the PEP author accept ! private comments in the early design phases, etc. PEP authors ! should use their discretion here. ! Once the authors have completed a PEP, they must inform the PEP ! editor that it is ready for review. PEPs are reviewed by the BDFL ! and his chosen consultants, who may accept or reject a PEP or send ! it back to the author(s) for revision. For a PEP that is ! pre-determined to be acceptable (e.g., it is an obvious win as-is ! and/or its implementation has already been checked in) the BDFL ! may also initiate a PEP review, first notifying the PEP author(s) ! and giving them a chance to make revisions. ! For a PEP to be accepted it must meet certain minimum criteria. ! It must be a clear and complete description of the proposed ! enhancement. The enhancement must represent a net improvement. ! The proposed implementation, if applicable, must be solid and must ! not complicate the interpreter unduly. Finally, a proposed ! enhancement must be "pythonic" in order to be accepted by the ! BDFL. (However, "pythonic" is an imprecise term; it may be ! defined as whatever is acceptable to the BDFL. This logic is ! intentionally circular.) See PEP 2 [10] for standard library ! module acceptance criteria. ! Once a PEP has been accepted, the reference implementation must be ! completed. When the reference implementation is complete and ! accepted by the BDFL, the status will be changed to "Final". ! A PEP can also be assigned status "Deferred". The PEP author or ! editor can assign the PEP this status when no progress is being ! made on the PEP. Once a PEP is deferred, the PEP editor can ! re-assign it to draft status. ! A PEP can also be "Rejected". Perhaps after all is said and done ! it was not a good idea. It is still important to have a record of ! this fact. ! PEPs can also be replaced by a different PEP, rendering the ! original obsolete. This is intended for Informational PEPs, where ! version 2 of an API can replace version 1. ! PEP work flow is as follows: ! Draft -> Accepted -> Final -> Replaced ! ^ ! +----> Rejected ! v ! Deferred ! Some Informational PEPs may also have a status of "Active" if they ! are never meant to be completed. E.g. PEP 1. What belongs in a successful PEP? ! Each PEP should have the following parts: ! 1. Preamble -- RFC822 style headers containing meta-data about the ! PEP, including the PEP number, a short descriptive title ! (limited to a maximum of 44 characters), the names, and ! optionally the contact info for each author, etc. ! 2. Abstract -- a short (~200 word) description of the technical ! issue being addressed. ! 3. Copyright/public domain -- Each PEP must either be explicitly ! labelled as placed in the public domain (see this PEP as an ! example) or licensed under the Open Publication License[4]. ! 4. Specification -- The technical specification should describe ! the syntax and semantics of any new language feature. The ! specification should be detailed enough to allow competing, ! interoperable implementations for any of the current Python ! platforms (CPython, JPython, Python .NET). ! 5. Motivation -- The motivation is critical for PEPs that want to ! change the Python language. It should clearly explain why the ! existing language specification is inadequate to address the ! problem that the PEP solves. PEP submissions without ! sufficient motivation may be rejected outright. ! 6. Rationale -- The rationale fleshes out the specification by ! describing what motivated the design and why particular design ! decisions were made. It should describe alternate designs that ! were considered and related work, e.g. how the feature is ! supported in other languages. ! The rationale should provide evidence of consensus within the ! community and discuss important objections or concerns raised ! during discussion. ! 7. Backwards Compatibility -- All PEPs that introduce backwards ! incompatibilities must include a section describing these ! incompatibilities and their severity. The PEP must explain how ! the author proposes to deal with these incompatibilities. PEP ! submissions without a sufficient backwards compatibility ! treatise may be rejected outright. ! 8. Reference Implementation -- The reference implementation must ! be completed before any PEP is given status "Final", but it ! need not be completed before the PEP is accepted. It is better ! to finish the specification and rationale first and reach ! consensus on it before writing code. ! The final implementation must include test code and ! documentation appropriate for either the Python language ! reference or the standard library reference. PEP Formats and Templates ! There are two PEP formats available to authors: plaintext and ! reStructuredText. ! Plaintext PEPs are written in plain ASCII text, contain minimal ! structural markup, and should adhere to a rigid style. PEP 9 ! contains a boilerplate template[7] you can use to get started ! writing your plaintext PEP. ! ReStructuredText PEPs allow for rich markup that is still quite ! easy to read, but results in much better-looking and more ! functional HTML. PEP 12 contains a boilerplate template[8] for ! use with reStructuredText PEPs. ! There is a Python script that converts both styles of PEPs to HTML ! for viewing on the web[5]. Parsing and conversion of plaintext ! PEPs is self-contained within the script. reStructuredText PEPs ! are parsed and converted by Docutils[9] code called from the ! script. PEP Header Preamble ! Each PEP must begin with an RFC822 style header preamble. The ! headers must appear in the following order. Headers marked with ! "*" are optional and are described below. All other headers are ! required. ! PEP: ! Title: ! Version: ! Last-Modified: ! Author: ! * Discussions-To: ! Status: ! Type: ! * Content-Type: ! * Requires: ! Created: ! * Python-Version: ! Post-History: ! * Replaces: ! * Replaced-By: ! The Author header lists the names, and optionally the email ! addresses of all the authors/owners of the PEP. The format of the ! Author header value must be ! Random J. User ! if the email address is included, and just ! Random J. User ! if the address is not given. For historical reasons the format ! "address@dom.ain (Random J. User)" may appear in a PEP, however ! new PEPs must use the mandated format above, and it is acceptable ! to change to this format when PEPs are updated. ! If there are multiple authors, each should be on a separate line ! following RFC 2822 continuation line conventions. Note that ! personal email addresses in PEPs will be obscured as a defense ! against spam harvesters. ! While a PEP is in private discussions (usually during the initial ! Draft phase), a Discussions-To header will indicate the mailing ! list or URL where the PEP is being discussed. No Discussions-To ! header is necessary if the PEP is being discussed privately with ! the author, or on the python-list or python-dev email mailing ! lists. Note that email addresses in the Discussions-To header ! will not be obscured. ! The Type header specifies the type of PEP: Informational or ! Standards Track. ! The format of a PEP is specified with a Content-Type header. The ! acceptable values are "text/plain" for plaintext PEPs (see PEP 9 ! [7]) and "text/x-rst" for reStructuredText PEPs (see PEP 12 [8]). ! Plaintext ("text/plain") is the default if no Content-Type header ! is present. ! The Created header records the date that the PEP was assigned a ! number, while Post-History is used to record the dates of when new ! versions of the PEP are posted to python-list and/or python-dev. ! Both headers should be in dd-mmm-yyyy format, e.g. 14-Aug-2001. ! Standards Track PEPs must have a Python-Version header which ! indicates the version of Python that the feature will be released ! with. Informational PEPs do not need a Python-Version header. ! PEPs may have a Requires header, indicating the PEP numbers ! that this PEP depends on. ! PEPs may also have a Replaced-By header indicating that a PEP has ! been rendered obsolete by a later document; the value is the ! number of the PEP that replaces the current document. The newer ! PEP must have a Replaces header containing the number of the PEP ! that it rendered obsolete. Reporting PEP Bugs, or Submitting PEP Updates ! How you report a bug, or submit a PEP update depends on several ! factors, such as the maturity of the PEP, the preferences of the ! PEP author, and the nature of your comments. For the early draft ! stages of the PEP, it's probably best to send your comments and ! changes directly to the PEP author. For more mature, or finished ! PEPs you may want to submit corrections to the SourceForge bug ! manager[6] or better yet, the SourceForge patch manager[2] so that ! your changes don't get lost. If the PEP author is a SF developer, ! assign the bug/patch to him, otherwise assign it to the PEP ! editor. ! When in doubt about where to send your changes, please check first ! with the PEP author and/or PEP editor. ! PEP authors who are also SF committers, can update the PEPs ! themselves by using "cvs commit" to commit their changes. ! Remember to also push the formatted PEP text out to the web by ! doing the following: % python pep2html.py -i NUM ! where NUM is the number of the PEP you want to push out. See % python pep2html.py --help ! for details. Transferring PEP Ownership ! It occasionally becomes necessary to transfer ownership of PEPs to ! a new champion. In general, we'd like to retain the original ! author as a co-author of the transferred PEP, but that's really up ! to the original author. A good reason to transfer ownership is ! because the original author no longer has the time or interest in ! updating it or following through with the PEP process, or has ! fallen off the face of the 'net (i.e. is unreachable or not ! responding to email). A bad reason to transfer ownership is ! because you don't agree with the direction of the PEP. We try to ! build consensus around a PEP, but if that's not possible, you can ! always submit a competing PEP. ! If you are interested in assuming ownership of a PEP, send a ! message asking to take over, addressed to both the original author ! and the PEP editor . If the original author ! doesn't respond to email in a timely manner, the PEP editor will ! make a unilateral decision (it's not like such decisions can't be ! reversed :). References and Footnotes ! [1] This historical record is available by the normal CVS commands ! for retrieving older revisions. For those without direct access ! to the CVS tree, you can browse the current and past PEP revisions ! via the SourceForge web site at ! ! http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/python/nondist/peps/?cvsroot=python ! [2] http://sourceforge.net/tracker/?group_id=5470&atid=305470 ! [3] http://sourceforge.net/tracker/?atid=355470&group_id=5470&func=browse ! [4] http://www.opencontent.org/openpub/ ! [5] The script referred to here is pep2html.py, which lives in ! the same directory in the CVS tree as the PEPs themselves. ! Try "pep2html.py --help" for details. ! The URL for viewing PEPs on the web is ! http://www.python.org/peps/ ! [6] http://sourceforge.net/tracker/?group_id=5470&atid=305470 ! [7] PEP 9, Sample Plaintext PEP Template, Warsaw ! http://www.python.org/peps/pep-0009.html ! [8] PEP 12, Sample reStructuredText PEP Template, Goodger, Warsaw ! http://www.python.org/peps/pep-0012.html ! [9] http://docutils.sourceforge.net/ ! [10] PEP 2, Procedure for Adding New Modules, Faassen ! http://www.python.org/peps/pep-0002.html Copyright ! This document has been placed in the public domain. ! ! Local Variables: ! mode: indented-text ! indent-tabs-mode: nil ! sentence-end-double-space: t ! fill-column: 70 ! End: --- 6,416 ---- Status: Active Type: Informational ! Content-Type: text/x-rst Created: 13-Jun-2000 ! Post-History: 21-Mar-2001, 29-Jul-2002, 03-May-2003 What is a PEP? + ============== ! PEP stands for Python Enhancement Proposal. A PEP is a design ! document providing information to the Python community, or describing ! a new feature for Python. The PEP should provide a concise technical ! specification of the feature and a rationale for the feature. ! We intend PEPs to be the primary mechanisms for proposing new ! features, for collecting community input on an issue, and for ! documenting the design decisions that have gone into Python. The PEP ! author is responsible for building consensus within the community and ! documenting dissenting opinions. ! Because the PEPs are maintained as text files under CVS control, their ! revision history is the historical record of the feature proposal ! [1]_. Kinds of PEPs + ============= ! There are two kinds of PEPs. A Standards Track PEP describes a new ! feature or implementation for Python. An Informational PEP describes ! a Python design issue, or provides general guidelines or information ! to the Python community, but does not propose a new feature. ! Informational PEPs do not necessarily represent a Python community ! consensus or recommendation, so users and implementors are free to ! ignore Informational PEPs or follow their advice. PEP Work Flow + ============= ! The PEP editors assign PEP numbers and change their status. The ! current PEP editors are David Goodger and Barry Warsaw. Please send ! all PEP-related email to . ! The PEP process begins with a new idea for Python. It is highly ! recommended that a single PEP contain a single key proposal or new ! idea. The more focussed the PEP, the more successfully it tends to ! be. The PEP editor reserves the right to reject PEP proposals if they ! appear too unfocussed or too broad. If in doubt, split your PEP into ! several well-focussed ones. ! Each PEP must have a champion -- someone who writes the PEP using the ! style and format described below, shepherds the discussions in the ! appropriate forums, and attempts to build community consensus around ! the idea. The PEP champion (a.k.a. Author) should first attempt to ! ascertain whether the idea is PEP-able. Small enhancements or patches ! often don't need a PEP and can be injected into the Python development ! work flow with a patch submission to the SourceForge `patch manager`_ ! or `feature request tracker`_. ! The PEP champion then emails the PEP editor with a ! proposed title and a rough, but fleshed out, draft of the PEP. This ! draft must be written in PEP style as described below. ! If the PEP editor approves, he will assign the PEP a number, label it ! as Standards Track or Informational, give it status "Draft", and ! create and check-in the initial draft of the PEP. The PEP editor will ! not unreasonably deny a PEP. Reasons for denying PEP status include ! duplication of effort, being technically unsound, not providing proper ! motivation or addressing backwards compatibility, or not in keeping ! with the Python philosophy. The BDFL (Benevolent Dictator for Life, ! Guido van Rossum) can be consulted during the approval phase, and is ! the final arbitrator of the draft's PEP-ability. ! If a pre-PEP is rejected, the author may elect to take the pre-PEP to ! the comp.lang.python newsgroup (a.k.a. python-list@python.org mailing ! list) to help flesh it out, gain feedback and consensus from the ! community at large, and improve the PEP for re-submission. ! The author of the PEP is then responsible for posting the PEP to the ! community forums, and marshaling community support for it. As updates ! are necessary, the PEP author can check in new versions if they have ! CVS commit permissions, or can email new PEP versions to the PEP ! editor for committing. ! Standards Track PEPs consists of two parts, a design document and a ! reference implementation. The PEP should be reviewed and accepted ! before a reference implementation is begun, unless a reference ! implementation will aid people in studying the PEP. Standards Track ! PEPs must include an implementation -- in the form of code, patch, or ! URL to same -- before it can be considered Final. ! PEP authors are responsible for collecting community feedback on a PEP ! before submitting it for review. A PEP that has not been discussed on ! python-list@python.org and/or python-dev@python.org will not be ! accepted. However, wherever possible, long open-ended discussions on ! public mailing lists should be avoided. Strategies to keep the ! discussions efficient include, setting up a separate SIG mailing list ! for the topic, having the PEP author accept private comments in the ! early design phases, etc. PEP authors should use their discretion ! here. ! Once the authors have completed a PEP, they must inform the PEP editor ! that it is ready for review. PEPs are reviewed by the BDFL and his ! chosen consultants, who may accept or reject a PEP or send it back to ! the author(s) for revision. For a PEP that is pre-determined to be ! acceptable (e.g., it is an obvious win as-is and/or its implementation ! has already been checked in) the BDFL may also initiate a PEP review, ! first notifying the PEP author(s) and giving them a chance to make ! revisions. ! For a PEP to be accepted it must meet certain minimum criteria. It ! must be a clear and complete description of the proposed enhancement. ! The enhancement must represent a net improvement. The proposed ! implementation, if applicable, must be solid and must not complicate ! the interpreter unduly. Finally, a proposed enhancement must be ! "pythonic" in order to be accepted by the BDFL. (However, "pythonic" ! is an imprecise term; it may be defined as whatever is acceptable to ! the BDFL. This logic is intentionally circular.) See PEP 2 [2]_ for ! standard library module acceptance criteria. ! Once a PEP has been accepted, the reference implementation must be ! completed. When the reference implementation is complete and accepted ! by the BDFL, the status will be changed to "Final". ! A PEP can also be assigned status "Deferred". The PEP author or ! editor can assign the PEP this status when no progress is being made ! on the PEP. Once a PEP is deferred, the PEP editor can re-assign it ! to draft status. ! A PEP can also be "Rejected". Perhaps after all is said and done it ! was not a good idea. It is still important to have a record of this ! fact. ! PEPs can also be replaced by a different PEP, rendering the original ! obsolete. This is intended for Informational PEPs, where version 2 of ! an API can replace version 1. ! PEP work flow is as follows:: ! Draft -> Accepted -> Final -> Replaced ! ^ ! +----> Rejected ! v ! Deferred ! Some Informational PEPs may also have a status of "Active" if they are ! never meant to be completed. E.g. PEP 1 (this PEP). What belongs in a successful PEP? + ================================= ! Each PEP should have the following parts: ! 1. Preamble -- RFC 822 style headers containing meta-data about the ! PEP, including the PEP number, a short descriptive title (limited ! to a maximum of 44 characters), the names, and optionally the ! contact info for each author, etc. ! 2. Abstract -- a short (~200 word) description of the technical issue ! being addressed. ! 3. Copyright/public domain -- Each PEP must either be explicitly ! labelled as placed in the public domain (see this PEP as an ! example) or licensed under the `Open Publication License`_. ! 4. Specification -- The technical specification should describe the ! syntax and semantics of any new language feature. The ! specification should be detailed enough to allow competing, ! interoperable implementations for any of the current Python ! platforms (CPython, Jython, Python .NET). ! 5. Motivation -- The motivation is critical for PEPs that want to ! change the Python language. It should clearly explain why the ! existing language specification is inadequate to address the ! problem that the PEP solves. PEP submissions without sufficient ! motivation may be rejected outright. ! 6. Rationale -- The rationale fleshes out the specification by ! describing what motivated the design and why particular design ! decisions were made. It should describe alternate designs that ! were considered and related work, e.g. how the feature is supported ! in other languages. ! The rationale should provide evidence of consensus within the ! community and discuss important objections or concerns raised ! during discussion. ! 7. Backwards Compatibility -- All PEPs that introduce backwards ! incompatibilities must include a section describing these ! incompatibilities and their severity. The PEP must explain how the ! author proposes to deal with these incompatibilities. PEP ! submissions without a sufficient backwards compatibility treatise ! may be rejected outright. ! 8. Reference Implementation -- The reference implementation must be ! completed before any PEP is given status "Final", but it need not ! be completed before the PEP is accepted. It is better to finish ! the specification and rationale first and reach consensus on it ! before writing code. ! The final implementation must include test code and documentation ! appropriate for either the Python language reference or the ! standard library reference. PEP Formats and Templates + ========================= ! There are two PEP formats available to authors: plaintext and ! reStructuredText_. ! Plaintext PEPs are written in plain ASCII text, contain minimal ! structural markup, and should adhere to a rigid style. PEP 9 contains ! a boilerplate template [3]_ you can use to get started writing your ! plaintext PEP. ! ReStructuredText_ PEPs allow for rich markup that is still quite easy ! to read, but results in much better-looking and more functional HTML. ! PEP 12 contains a boilerplate template [4]_ for use with ! reStructuredText PEPs. ! There is a Python script that converts both styles of PEPs to HTML for ! viewing on the web [5]_. Parsing and conversion of plaintext PEPs is ! self-contained within the script. reStructuredText PEPs are parsed ! and converted by Docutils_ code called from the script. PEP Header Preamble + =================== ! Each PEP must begin with an RFC 822 style header preamble. The headers ! must appear in the following order. Headers marked with "*" are ! optional and are described below. All other headers are required. :: ! PEP: ! Title: ! Version: ! Last-Modified: ! Author: ! * Discussions-To: ! Status: ! Type: ! * Content-Type: ! * Requires: ! Created: ! * Python-Version: ! Post-History: ! * Replaces: ! * Replaced-By: ! The Author header lists the names, and optionally the email addresses ! of all the authors/owners of the PEP. The format of the Author header ! value must be ! Random J. User ! if the email address is included, and just ! Random J. User ! if the address is not given. For historical reasons the format ! "address@dom.ain (Random J. User)" may appear in a PEP, however new ! PEPs must use the mandated format above, and it is acceptable to ! change to this format when PEPs are updated. ! If there are multiple authors, each should be on a separate line ! following RFC 2822 continuation line conventions. Note that personal ! email addresses in PEPs will be obscured as a defense against spam ! harvesters. ! While a PEP is in private discussions (usually during the initial ! Draft phase), a Discussions-To header will indicate the mailing list ! or URL where the PEP is being discussed. No Discussions-To header is ! necessary if the PEP is being discussed privately with the author, or ! on the python-list or python-dev email mailing lists. Note that email ! addresses in the Discussions-To header will not be obscured. ! The Type header specifies the type of PEP: Informational or Standards ! Track. ! The format of a PEP is specified with a Content-Type header. The ! acceptable values are "text/plain" for plaintext PEPs (see PEP 9 [3]_) ! and "text/x-rst" for reStructuredText PEPs (see PEP 12 [4]_). ! Plaintext ("text/plain") is the default if no Content-Type header is ! present. ! The Created header records the date that the PEP was assigned a ! number, while Post-History is used to record the dates of when new ! versions of the PEP are posted to python-list and/or python-dev. Both ! headers should be in dd-mmm-yyyy format, e.g. 14-Aug-2001. ! Standards Track PEPs must have a Python-Version header which indicates ! the version of Python that the feature will be released with. ! Informational PEPs do not need a Python-Version header. ! PEPs may have a Requires header, indicating the PEP numbers that this ! PEP depends on. ! PEPs may also have a Replaced-By header indicating that a PEP has been ! rendered obsolete by a later document; the value is the number of the ! PEP that replaces the current document. The newer PEP must have a ! Replaces header containing the number of the PEP that it rendered ! obsolete. Reporting PEP Bugs, or Submitting PEP Updates + ============================================= ! How you report a bug, or submit a PEP update depends on several ! factors, such as the maturity of the PEP, the preferences of the PEP ! author, and the nature of your comments. For the early draft stages ! of the PEP, it's probably best to send your comments and changes ! directly to the PEP author. For more mature, or finished PEPs you may ! want to submit corrections to the SourceForge `bug manager`_ or better ! yet, the SourceForge `patch manager`_ so that your changes don't get ! lost. If the PEP author is a SF developer, assign the bug/patch to ! him, otherwise assign it to the PEP editor. ! When in doubt about where to send your changes, please check first ! with the PEP author and/or PEP editor. ! PEP authors who are also SF committers, can update the PEPs themselves ! by using "cvs commit" to commit their changes. Remember to also push ! the formatted PEP text out to the web by doing the following:: % python pep2html.py -i NUM ! where NUM is the number of the PEP you want to push out. See :: % python pep2html.py --help ! for details. Transferring PEP Ownership + ========================== ! It occasionally becomes necessary to transfer ownership of PEPs to a ! new champion. In general, we'd like to retain the original author as ! a co-author of the transferred PEP, but that's really up to the ! original author. A good reason to transfer ownership is because the ! original author no longer has the time or interest in updating it or ! following through with the PEP process, or has fallen off the face of ! the 'net (i.e. is unreachable or not responding to email). A bad ! reason to transfer ownership is because you don't agree with the ! direction of the PEP. We try to build consensus around a PEP, but if ! that's not possible, you can always submit a competing PEP. ! If you are interested in assuming ownership of a PEP, send a message ! asking to take over, addressed to both the original author and the PEP ! editor . If the original author doesn't respond to ! email in a timely manner, the PEP editor will make a unilateral ! decision (it's not like such decisions can't be reversed :). References and Footnotes + ======================== ! .. [1] This historical record is available by the normal CVS commands ! for retrieving older revisions. For those without direct access to ! the CVS tree, you can browse the current and past PEP revisions via ! the SourceForge web site at ! http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/nondist/peps/ ! .. [2] PEP 2, Procedure for Adding New Modules, Faassen ! (http://www.python.org/peps/pep-0002.html) ! .. [3] PEP 9, Sample Plaintext PEP Template, Warsaw ! (http://www.python.org/peps/pep-0009.html) ! .. [4] PEP 12, Sample reStructuredText PEP Template, Goodger, Warsaw ! (http://www.python.org/peps/pep-0012.html) ! .. [5] The script referred to here is pep2html.py, which lives in the ! same directory in the CVS tree as the PEPs themselves. Try ! ``pep2html.py --help`` for details. The URL for viewing PEPs on ! the web is http://www.python.org/peps/. ! .. _patch manager: ! http://sourceforge.net/tracker/?group_id=5470&atid=305470 ! .. _feature request tracker: ! http://sourceforge.net/tracker/?atid=355470&group_id=5470&func=browse ! .. _Open Publication License: http://www.opencontent.org/openpub/ ! .. _reStructuredText: http://docutils.sourceforge.net/rst.html ! .. _Docutils: http://docutils.sourceforge.net/ ! .. _bug manager: ! http://sourceforge.net/tracker/?group_id=5470&atid=105470 Copyright + ========= ! This document has been placed in the public domain. ! .. ! Local Variables: ! mode: indented-text ! indent-tabs-mode: nil ! sentence-end-double-space: t ! fill-column: 70 ! End: From gward@users.sourceforge.net Sat May 3 20:16:39 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Sat, 03 May 2003 12:16:39 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib liboptparse.tex,1.2,1.3 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv15157 Modified Files: liboptparse.tex Log Message: Fix various markup errors: use \longprogramopt{} more, and use it correctly. (Closes SF #731689.) Use \emph{} in a few places. Index: liboptparse.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/liboptparse.tex,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** liboptparse.tex 18 Apr 2003 15:50:13 -0000 1.2 --- liboptparse.tex 3 May 2003 19:16:36 -0000 1.3 *************** *** 110,114 **** \begin{itemize} \item a hyphen followed by a few letters, e.g. \programopt{-pf} (this is ! *not* the same as multiple options merged into a single argument.) \item a hyphen followed by a whole word, e.g. \programopt{-file} (this is --- 110,114 ---- \begin{itemize} \item a hyphen followed by a few letters, e.g. \programopt{-pf} (this is ! \emph{not} the same as multiple options merged into a single argument.) \item a hyphen followed by a whole word, e.g. \programopt{-file} (this is *************** *** 450,454 **** If \module{optparse} encounters either \programopt{-h} or ! \longprogramopt{--help} on the command-line, or if you just call \method{parser.print_help()}, it prints the following to stdout: --- 450,454 ---- If \module{optparse} encounters either \programopt{-h} or ! \longprogramopt{help} on the command-line, or if you just call \method{parser.print_help()}, it prints the following to stdout: *************** *** 562,566 **** Note that ``\%prog'' is expanded just like it is in \var{usage}. Apart from that, \var{version} can contain anything you like. When you supply it, ! \module{optparse} automatically adds a\ longprogramopt{version} option to your parser. If it encounters this option on the command line, it expands your \var{version} string (by replacing ``\%prog''), prints it to --- 562,566 ---- Note that ``\%prog'' is expanded just like it is in \var{usage}. Apart from that, \var{version} can contain anything you like. When you supply it, ! \module{optparse} automatically adds a \longprogramopt{version} option to your parser. If it encounters this option on the command line, it expands your \var{version} string (by replacing ``\%prog''), prints it to *************** *** 787,791 **** Clearly, the \var{type} and \var{dest} arguments are (usually) almost as important as \var{action}. \var{action} is the only attribute that ! is meaningful for *all* options, though, so it is the most important. \subsubsection{Option actions\label{optparse-option-actions}} --- 787,792 ---- Clearly, the \var{type} and \var{dest} arguments are (usually) almost as important as \var{action}. \var{action} is the only attribute that ! is meaningful for \emph{all} options, though, so it is the most ! important. \subsubsection{Option actions\label{optparse-option-actions}} *************** *** 813,819 **** If \var{dest} is not supplied, \module{optparse} derives a destination from the first long option strings (e.g., ! \longprogramopt{foo-bar} -> \var{foo_bar}). If there are no long option strings, \module{optparse} derives a destination from the first ! short option string (e.g., \programopt{-f} -> \var{f}). Example: --- 814,820 ---- If \var{dest} is not supplied, \module{optparse} derives a destination from the first long option strings (e.g., ! \longprogramopt{foo-bar} becomes \var{foo_bar}). If there are no long option strings, \module{optparse} derives a destination from the first ! short option string (e.g., \programopt{-f} becomes \var{f}). Example: *************** *** 903,907 **** \end{verbatim} ! If, a little later on, \samp{--tracks=4} is seen, it does: \begin{verbatim} --- 904,908 ---- \end{verbatim} ! If, a little later on, \longprogramopt{tracks=4} is seen, it does: \begin{verbatim} *************** *** 911,915 **** See ``Error handling'' (section~\ref{optparse-error-handling}) for information on how \module{optparse} deals with something like ! \samp{--tracks=x}. \term{count} [required: \var{dest}] --- 912,916 ---- See ``Error handling'' (section~\ref{optparse-error-handling}) for information on how \module{optparse} deals with something like ! \longprogramopt{tracks=x}. \term{count} [required: \var{dest}] *************** *** 983,989 **** \end{verbatim} ! If \module{optparse} sees either \longprogramopt{-h} or \longprogramopt{help} on ! the command line, it will print something like the following help ! message to stdout: \begin{verbatim} --- 984,990 ---- \end{verbatim} ! If \module{optparse} sees either \programopt{-h} or ! \longprogramopt{help} on the command line, it will print something ! like the following help message to stdout: \begin{verbatim} From gward@users.sourceforge.net Sat May 3 20:41:47 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Sat, 03 May 2003 12:41:47 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib liboptparse.tex,1.3,1.4 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv27231 Modified Files: liboptparse.tex Log Message: Use TeX quotes -- ``foo'' -- as appropriate. Remove whitespace around em-dashes. Index: liboptparse.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/liboptparse.tex,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** liboptparse.tex 3 May 2003 19:16:36 -0000 1.3 --- liboptparse.tex 3 May 2003 19:41:45 -0000 1.4 *************** *** 34,38 **** With these few lines of code, users of your script can now do the ! "usual thing" on the command-line: \begin{verbatim} --- 34,38 ---- With these few lines of code, users of your script can now do the ! ``usual thing'' on the command-line: \begin{verbatim} *************** *** 189,193 **** toolsets. Can it run without any options at all and still make sense? The only exceptions I can think of are \program{find}, \program{tar}, ! and \program{dd} --- all of which are mutant oddballs that have been rightly criticized for their non-standard syntax and confusing interfaces.) --- 189,193 ---- toolsets. Can it run without any options at all and still make sense? The only exceptions I can think of are \program{find}, \program{tar}, ! and \program{dd}---all of which are mutant oddballs that have been rightly criticized for their non-standard syntax and confusing interfaces.) *************** *** 229,233 **** possible. If your program requires 17 distinct pieces of information in order to run successfully, it doesn't much matter \emph{how} you get that ! information from the user --- most people will give up and walk away before they successfully run the program. This applies whether the user interface is a command-line, a configuration file, a GUI, or whatever: --- 229,233 ---- possible. If your program requires 17 distinct pieces of information in order to run successfully, it doesn't much matter \emph{how} you get that ! information from the user---most people will give up and walk away before they successfully run the program. This applies whether the user interface is a command-line, a configuration file, a GUI, or whatever: *************** *** 236,244 **** In short, try to minimize the amount of information that users are ! absolutely required to supply --- use sensible defaults whenever possible. Of course, you also want to make your programs reasonably flexible. That's what options are for. Again, it doesn't matter if they are entries in a config file, checkboxes in the ``Preferences'' ! dialog of a GUI, or command-line options --- the more options you implement, the more flexible your program is, and the more complicated its implementation becomes. It's quite easy to overwhelm users (and --- 236,244 ---- In short, try to minimize the amount of information that users are ! absolutely required to supply---use sensible defaults whenever possible. Of course, you also want to make your programs reasonably flexible. That's what options are for. Again, it doesn't matter if they are entries in a config file, checkboxes in the ``Preferences'' ! dialog of a GUI, or command-line options---the more options you implement, the more flexible your program is, and the more complicated its implementation becomes. It's quite easy to overwhelm users (and *************** *** 282,286 **** \var{help}. ! \subsubsection{The "store" action\label{optparse-store-action}} The action tells \module{optparse} what to do when it sees one of the --- 282,286 ---- \var{help}. ! \subsubsection{The \var{store} action\label{optparse-store-action}} The action tells \module{optparse} what to do when it sees one of the *************** *** 290,294 **** store it to your chosen destination. ! For example, let's fill in the "..." of that last option: \begin{verbatim} --- 290,294 ---- store it to your chosen destination. ! For example, let's fill in the ``...'' of that last option: \begin{verbatim} *************** *** 309,313 **** When \module{optparse} sees the \programopt{-f}, it sucks in the next ! argument --- ``foo.txt'' --- and stores it in the \var{filename} attribute of a special object. That object is the first return value from \function{parse_args()}, so: --- 309,313 ---- When \module{optparse} sees the \programopt{-f}, it sucks in the next ! argument---\code{foo.txt}---and stores it in the \var{filename} attribute of a special object. That object is the first return value from \function{parse_args()}, so: *************** *** 317,324 **** \end{verbatim} ! will print ``foo.txt''. ! Other option types supported by \module{optparse} are ``int'' and ! ``float''. Here's an option that expects an integer argument: \begin{verbatim} --- 317,324 ---- \end{verbatim} ! will print \code{foo.txt}. ! Other option types supported by \module{optparse} are \code{int} and ! \code{float}. Here's an option that expects an integer argument: \begin{verbatim} *************** *** 327,334 **** Note that I didn't supply a long option, which is perfectly acceptable. ! I also didn't specify the action --- it defaults to ``store''. Let's parse another fake command-line. This time, we'll jam the ! option argument right up against the option --- \programopt{-n42} (one argument) is equivalent to \programopt{-n 42} (two arguments). : --- 327,334 ---- Note that I didn't supply a long option, which is perfectly acceptable. ! I also didn't specify the action---it defaults to ``store''. Let's parse another fake command-line. This time, we'll jam the ! option argument right up against the option---\programopt{-n42} (one argument) is equivalent to \programopt{-n 42} (two arguments). : *************** *** 360,367 **** section~\ref{optparse-adding-types}, ``Adding new types.'' ! \subsubsection{Other "store_*" actions\label{optparse-other-store-actions}} ! Flag options --- set a variable to true or false when a particular ! option is seen --- are quite common. \module{optparse} supports them with two separate actions, ``store_true'' and ``store_false''. For example, you might have a \var{verbose} flag that is turned on with --- 360,367 ---- section~\ref{optparse-adding-types}, ``Adding new types.'' ! \subsubsection{Other \var{store_*} actions\label{optparse-other-store-actions}} ! Flag options---set a variable to true or false when a particular ! option is seen---are quite common. \module{optparse} supports them with two separate actions, ``store_true'' and ``store_false''. For example, you might have a \var{verbose} flag that is turned on with *************** *** 375,379 **** Here we have two different options with the same destination, which is perfectly OK. (It just means you have to be a bit careful when setting ! default values --- see below.) When \module{optparse} sees \programopt{-v} on the command line, it --- 375,379 ---- Here we have two different options with the same destination, which is perfectly OK. (It just means you have to be a bit careful when setting ! default values---see below.) When \module{optparse} sees \programopt{-v} on the command line, it *************** *** 475,488 **** \end{verbatim} ! \module{optparse} expands "\%prog" in the usage string to the name of the current script, ie. \code{os.path.basename(sys.argv[0])}. The expanded string is then printed before the detailed option help. If you don't supply a usage string, \module{optparse} uses a bland but ! sensible default: ``usage: \%prog [options]'', which is fine if your script doesn't take any positional arguments. \item every option defines a help string, and doesn't worry about ! line-wrapping --- \module{optparse} takes care of wrapping lines and making the help output look good. --- 475,488 ---- \end{verbatim} ! \module{optparse} expands \samp{\%prog} in the usage string to the name of the current script, ie. \code{os.path.basename(sys.argv[0])}. The expanded string is then printed before the detailed option help. If you don't supply a usage string, \module{optparse} uses a bland but ! sensible default: \code{"usage: \%prog [options]"}, which is fine if your script doesn't take any positional arguments. \item every option defines a help string, and doesn't worry about ! line-wrapping---\module{optparse} takes care of wrapping lines and making the help output look good. *************** *** 498,502 **** \programopt{-m}/\longprogramopt{mode}. By default, \module{optparse} converts the destination variable name to uppercase and uses that for ! the meta-variable. Sometimes, that's not what you want --- for example, the \var{filename} option explicitly sets \code{metavar="FILE"}, resulting in this automatically-generated --- 498,502 ---- \programopt{-m}/\longprogramopt{mode}. By default, \module{optparse} converts the destination variable name to uppercase and uses that for ! the meta-variable. Sometimes, that's not what you want---for example, the \var{filename} option explicitly sets \code{metavar="FILE"}, resulting in this automatically-generated *************** *** 579,583 **** The one thing you need to know for basic usage is how \module{optparse} behaves when it encounters an error on the ! command-line --- e.g. \programopt{-n4x} where \programopt{-n} is an integer-valued option. \module{optparse} prints your usage message to stderr, followed by a useful and human-readable error message. Then --- 579,583 ---- The one thing you need to know for basic usage is how \module{optparse} behaves when it encounters an error on the ! command-line---e.g. \programopt{-n4x} where \programopt{-n} is an integer-valued option. \module{optparse} prints your usage message to stderr, followed by a useful and human-readable error message. Then *************** *** 674,678 **** This method makes it easier to track down exceptions raised by the \class{Option} constructor, which are common because of the complicated ! interdependencies among the various keyword arguments --- if you get it wrong, \module{optparse} raises \exception{OptionError}. --- 674,678 ---- This method makes it easier to track down exceptions raised by the \class{Option} constructor, which are common because of the complicated ! interdependencies among the various keyword arguments---if you get it wrong, \module{optparse} raises \exception{OptionError}. *************** *** 1085,1089 **** raises an exception (\exception{OptionConflictError}) by default when this happens. Since this is an easily-fixed programming error, you ! shouldn't try to catch this exception --- fix your mistake and get on with life. --- 1085,1089 ---- raises an exception (\exception{OptionConflictError}) by default when this happens. Since this is an easily-fixed programming error, you ! shouldn't try to catch this exception---fix your mistake and get on with life. *************** *** 1186,1190 **** \end{verbatim} ! Note that you supply a function object here --- so you must have already defined a function \function{my_callback()} when you define the callback option. In this simple case, \module{optparse} knows --- 1186,1190 ---- \end{verbatim} ! Note that you supply a function object here---so you must have already defined a function \function{my_callback()} when you define the callback option. In this simple case, \module{optparse} knows *************** *** 1238,1242 **** is the option string seen on the command-line that's triggering the callback. (If an abbreviated long option was used, \var{opt} will be ! the full, canonical option string --- e.g. if the user puts \longprogramopt{foo} on the command-line as an abbreviation for \longprogramopt{foobar}, then \var{opt} will be --- 1238,1242 ---- is the option string seen on the command-line that's triggering the callback. (If an abbreviated long option was used, \var{opt} will be ! the full, canonical option string---e.g. if the user puts \longprogramopt{foo} on the command-line as an abbreviation for \longprogramopt{foobar}, then \var{opt} will be *************** *** 1349,1353 **** \end{verbatim} ! Of course, you could put any condition in there --- you're not limited to checking the values of already-defined options. For example, if you have options that should not be called when the moon is full, all --- 1349,1353 ---- \end{verbatim} ! Of course, you could put any condition in there---you're not limited to checking the values of already-defined options. For example, if you have options that should not be called when the moon is full, all *************** *** 1364,1368 **** \end{verbatim} ! (The definition of is_full_moon() is left as an exercise for the reader.) --- 1364,1368 ---- \end{verbatim} ! (The definition of \code{is_full_moon()} is left as an exercise for the reader.) *************** *** 1568,1585 **** \begin{definitions} ! \term{"store" actions} actions that result in \module{optparse} storing a value to an attribute ! of the OptionValues instance; these options require a 'dest' attribute to be supplied to the Option constructor ! \term{"typed" actions} actions that take a value from the command line and expect it to be of a certain type; or rather, a string that can be converted to a ! certain type. These options require a 'type' attribute to the Option constructor. \end{definitions} ! Some default ``store'' actions are ``store'', ``store_const'', ! ``append'', and ``count''. The default ``typed'' actions are ! ``store'', ``append'', and ``callback''. When you add an action, you need to decide if it's a ``store'' action, --- 1568,1585 ---- \begin{definitions} ! \term{``store'' actions} actions that result in \module{optparse} storing a value to an attribute ! of the OptionValues instance; these options require a \var{dest} attribute to be supplied to the Option constructor ! \term{``typed'' actions} actions that take a value from the command line and expect it to be of a certain type; or rather, a string that can be converted to a ! certain type. These options require a \var{type} attribute to the Option constructor. \end{definitions} ! Some default ``store'' actions are \var{store}, \var{store_const}, ! \var{append}, and \var{count}. The default ``typed'' actions are ! \var{store}, \var{append}, and \var{callback}. When you add an action, you need to decide if it's a ``store'' action, *************** *** 1591,1598 **** \end{memberdesc} \begin{memberdesc}{STORE_ACTIONS} ! "store" actions are additionally listed here. \end{memberdesc} \begin{memberdesc}{TYPED_ACTIONS} ! "typed" actions are additionally listed here. \end{memberdesc} --- 1591,1598 ---- \end{memberdesc} \begin{memberdesc}{STORE_ACTIONS} ! ``store'' actions are additionally listed here. \end{memberdesc} \begin{memberdesc}{TYPED_ACTIONS} ! ``typed'' actions are additionally listed here. \end{memberdesc} *************** *** 1689,1694 **** \begin{enumerate} \item subclass OptionParser and override the error() method ! \item subclass Option and override the take_action() method --- you'll ! need to provide your own handling of the "help" action that doesn't call sys.exit() \end{enumerate} --- 1689,1694 ---- \begin{enumerate} \item subclass OptionParser and override the error() method ! \item subclass Option and override the take_action() method---you'll ! need to provide your own handling of the ``help'' action that doesn't call sys.exit() \end{enumerate} From gward@users.sourceforge.net Sat May 3 20:45:49 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Sat, 03 May 2003 12:45:49 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libossaudiodev.tex,1.6,1.7 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv28624 Modified Files: libossaudiodev.tex Log Message: Add a big comment about cross-platform issues (especially OpenBSD). This should be turned into a footnote by someone who actually understands OSS and its relationship to Linux, FreeBSD, OpenBSD, NetBSD, etc. Index: libossaudiodev.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libossaudiodev.tex,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** libossaudiodev.tex 10 Mar 2003 03:18:19 -0000 1.6 --- libossaudiodev.tex 3 May 2003 19:45:47 -0000 1.7 *************** *** 3,20 **** \declaremodule{builtin}{ossaudiodev} ! \platform{Linux, FreeBSD} \modulesynopsis{Access to OSS-compatible audio devices.} - % XXX OSS is standard for Linux and FreeBSD -- what about NetBSD? - % OpenBSD? others? This module allows you to access the OSS (Open Sound System) audio interface. OSS is available for a wide range of open-source and ! commercial Unices, and is the standard audio interface for Linux (up to ! kernel 2.4) and FreeBSD. \begin{seealso} \seetitle[http://www.opensound.com/pguide/oss.pdf] ! {Open Sound System Programmer's Guide} ! {the official documentation for the OSS C API} \seetext{The module defines a large number of constants supplied by the OSS device driver; see \file{} on either --- 3,46 ---- \declaremodule{builtin}{ossaudiodev} ! \platform{Linux, FreeBSD, possibly other \UNIX-like systems} \modulesynopsis{Access to OSS-compatible audio devices.} This module allows you to access the OSS (Open Sound System) audio interface. OSS is available for a wide range of open-source and ! commercial Unices, and is the standard audio interface for Linux and ! recent versions of FreeBSD. ! ! % Things will get more complicated for future Linux versions, since ! % ALSA is in the standard kernel as of 2.5.x. Presumably if you ! % use ALSA, you'll have to make sure its OSS compatibility layer ! % is active to use ossaudiodev, but you're gonna need it for the vast ! % majority of Linux audio apps anyways. ! % ! % Sounds like things are also complicated for other BSDs. In response ! % to my python-dev query, Thomas Wouters said: ! % ! % > Likewise, googling shows OpenBSD also uses OSS/Free -- the commercial ! % > OSS installation manual tells you to remove references to OSS/Free from the ! % > kernel :) ! % ! % but Aleksander Piotrowsk actually has an OpenBSD box, and he quotes ! % from its : ! % > * WARNING! WARNING! ! % > * This is an OSS (Linux) audio emulator. ! % > * Use the Native NetBSD API for developing new code, and this ! % > * only for compiling Linux programs. ! % ! % There's also an ossaudio manpage on OpenBSD that explains things ! % further. Presumably NetBSD and OpenBSD have a different standard ! % audio interface. That's the great thing about standards, there are so ! % many to choose from ... ;-) ! % ! % This probably all warrants a footnote or two, but I don't understand ! % things well enough right now to write it! --GPW \begin{seealso} \seetitle[http://www.opensound.com/pguide/oss.pdf] ! {Open Sound System Programmer's Guide} {the official ! documentation for the OSS C API} \seetext{The module defines a large number of constants supplied by the OSS device driver; see \file{} on either From gward@users.sourceforge.net Sat May 3 21:13:11 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Sat, 03 May 2003 13:13:11 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib liboptparse.tex,1.4,1.5 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv9372 Modified Files: liboptparse.tex Log Message: Use True/False instead of 1/0 when talking about store_true/store_false. Particularly important since they now store True and False rather than 1 and 0! Index: liboptparse.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/liboptparse.tex,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** liboptparse.tex 3 May 2003 19:41:45 -0000 1.4 --- liboptparse.tex 3 May 2003 20:13:08 -0000 1.5 *************** *** 27,31 **** help="write report to FILE", metavar="FILE") parser.add_option("-q", "--quiet", ! action="store_false", dest="verbose", default=1, help="don't print status messages to stdout") --- 27,31 ---- help="write report to FILE", metavar="FILE") parser.add_option("-q", "--quiet", ! action="store_false", dest="verbose", default=True, help="don't print status messages to stdout") *************** *** 44,48 **** (All of these result in \code{options.filename == "outfile"} and ! \code{options.verbose == 0} ...just as you might expect.) Even niftier, users can run one of --- 44,48 ---- (All of these result in \code{options.filename == "outfile"} and ! \code{options.verbose == False}, just as you might expect.) Even niftier, users can run one of *************** *** 394,402 **** First, consider the verbose/quiet example. If we want ! \module{optparse} to set \var{verbose} to 1 unless \programopt{-q} is ! seen, then we can do this: \begin{verbatim} ! parser.add_option("-v", action="store_true", dest="verbose", default=1) parser.add_option("-q", action="store_false", dest="verbose") \end{verbatim} --- 394,402 ---- First, consider the verbose/quiet example. If we want ! \module{optparse} to set \var{verbose} to \code{True} unless ! \programopt{-q} is seen, then we can do this: \begin{verbatim} ! parser.add_option("-v", action="store_true", dest="verbose", default=True) parser.add_option("-q", action="store_false", dest="verbose") \end{verbatim} *************** *** 406,410 **** \begin{verbatim} parser.add_option("-v", action="store_true", dest="verbose") ! parser.add_option("-q", action="store_false", dest="verbose", default=1) \end{verbatim} --- 406,410 ---- \begin{verbatim} parser.add_option("-v", action="store_true", dest="verbose") ! parser.add_option("-q", action="store_false", dest="verbose", default=True) \end{verbatim} *************** *** 416,424 **** \begin{verbatim} ! parser.add_option("-v", action="store_true", dest="verbose", default=0) ! parser.add_option("-q", action="store_false", dest="verbose", default=1) \end{verbatim} ! Again, the default value for \var{verbose} will be 1: the last default value supplied for any particular destination attribute is the one that counts. --- 416,424 ---- \begin{verbatim} ! parser.add_option("-v", action="store_true", dest="verbose", default=False) ! parser.add_option("-q", action="store_false", dest="verbose", default=True) \end{verbatim} ! Again, the default value for \var{verbose} will be \code{True}: the last default value supplied for any particular destination attribute is the one that counts. *************** *** 436,440 **** parser = OptionParser(usage=usage) parser.add_option("-v", "--verbose", ! action="store_true", dest="verbose", default=1, help="make lots of noise [default]") parser.add_option("-q", "--quiet", --- 436,440 ---- parser = OptionParser(usage=usage) parser.add_option("-v", "--verbose", ! action="store_true", dest="verbose", default=True, help="make lots of noise [default]") parser.add_option("-q", "--quiet", *************** *** 865,874 **** \term{store_true} [required: \var{dest}] ! A special case of ``store_const'' that stores a true value ! (specifically, the integer 1) to \var{dest}. \term{store_false} [required: \var{dest}] ! Like ``store_true'', but stores a false value (the integer 0). Example: --- 865,873 ---- \term{store_true} [required: \var{dest}] ! A special case of ``store_const'' that stores \code{True} to \var{dest}. \term{store_false} [required: \var{dest}] ! Like ``store_true'', but stores a \code{False} Example: From gward@users.sourceforge.net Sat May 3 21:41:39 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Sat, 03 May 2003 13:41:39 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib liboptparse.tex,1.5,1.6 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv23012 Modified Files: liboptparse.tex Log Message: Rename "The Tao of Option Parsing" section to "Philosophy". Remove first-person usage from it. Various wording tweaks. Index: liboptparse.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/liboptparse.tex,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** liboptparse.tex 3 May 2003 20:13:08 -0000 1.5 --- liboptparse.tex 3 May 2003 20:41:37 -0000 1.6 *************** *** 66,78 **** parsing your command-line. ! \subsection{The Tao of Option Parsing\label{optparse-tao}} ! \module{optparse} is an implementation of what I have always ! considered the most obvious, straightforward, and user-friendly way to ! design a user interface for command-line programs. In short, I have ! fairly firm ideas of the Right Way (and the many Wrong Ways) to do ! argument parsing, and \module{optparse} reflects many of those ideas. ! This section is meant to explain this philosophy, which in turn is ! heavily influenced by the \UNIX{} and GNU toolkits. \subsubsection{Terminology\label{optparse-terminology}} --- 66,76 ---- parsing your command-line. ! \subsection{Philosophy\label{optparse-philosophy}} ! The purpose of \module{optparse} is to make it very easy to provide the ! most standard, obvious, straightforward, and user-friendly user ! interface for \UNIX{} command-line programs. The \module{optparse} ! philosophy is heavily influenced by the \UNIX{} and GNU toolkits, and ! this section is meant to explain that philosophy. \subsubsection{Terminology\label{optparse-terminology}} *************** *** 89,94 **** important.) \UNIX{} shells also use the term ``word''. ! It's occasionally desirable to substitute an argument list other ! than \var{sys.argv[1:]}, so you should read ``argument'' as ``an element of \var{sys.argv[1:]}, or of some other list provided as a substitute for \var{sys.argv[1:]}''. --- 87,92 ---- important.) \UNIX{} shells also use the term ``word''. ! It is occasionally desirable to use an argument list other than ! \var{sys.argv[1:]}, so you should read ``argument'' as ``an element of \var{sys.argv[1:]}, or of some other list provided as a substitute for \var{sys.argv[1:]}''. *************** *** 121,131 **** \end{itemize} ! These option syntaxes are not supported by \module{optparse}, and they ! never will be. (If you really want to use one of those option ! syntaxes, you'll have to subclass OptionParser and override all the ! difficult bits. But please don't! \module{optparse} does things the ! traditional \UNIX/GNU way deliberately; the first three are ! non-standard anywhere, and the last one makes sense only if you're ! exclusively targeting MS-DOS/Windows and/or VMS.) \term{option argument} --- 119,129 ---- \end{itemize} ! \module{optparse} does not support these option syntaxes, and it never ! will. (If you really want to use one of those option syntaxes, you'll ! have to subclass \class{OptionParser} and override all the difficult ! bits. But please don't! \module{optparse} does things the traditional ! \UNIX/GNU way deliberately; the first three are non-standard anywhere, ! and the last one makes sense only if you're exclusively targeting ! MS-DOS/Windows and/or VMS.) \term{option argument} *************** *** 151,170 **** meaning that some options will take an argument if they see it, and won't if they don't. This is somewhat controversial, because it makes ! parsing ambiguous: if \programopt{-a} takes an optional argument and ! \programopt{-b} is another option entirely, how do we interpret ! \programopt{-ab}? \module{optparse} does not currently support this. \term{positional argument} something leftover in the argument list after options have been ! parsed, ie. after options and their arguments have been parsed and removed from the argument list. \term{required option} ! an option that must be supplied on the command-line; the phrase ! ``required option'' is an oxymoron and is usually considered poor UI ! design. \module{optparse} doesn't prevent you from implementing ! required options, but doesn't give you much help with it either. See ! ``Extending Examples'' (section~\ref{optparse-extending-examples}) for ! two ways to implement required options with \module{optparse}. \end{definitions} --- 149,170 ---- meaning that some options will take an argument if they see it, and won't if they don't. This is somewhat controversial, because it makes ! parsing ambiguous: if \programopt{-a} and \programopt{-b} are both ! options, and \programopt{-a} takes an optional argument, how do we ! interpret \programopt{-ab}? \module{optparse} does not support optional ! option arguments. \term{positional argument} something leftover in the argument list after options have been ! parsed, i.e., after options and their arguments have been parsed and removed from the argument list. \term{required option} ! an option that must be supplied on the command-line. The phrase ! ``required option'' is an oxymoron; the presence of ``required options'' ! in a program is usually a sign of careless user interface design. ! \module{optparse} doesn't prevent you from implementing required ! options, but doesn't give you much help with it either. See ``Extending ! Examples'' (section~\ref{optparse-extending-examples}) for two ways to ! implement required options with \module{optparse}. \end{definitions} *************** *** 178,188 **** \programopt{-v} and \longprogramopt{report} are both options. Assuming the \longprogramopt{report} option takes one argument, ! ``/tmp/report.txt'' is an option argument. ``foo'' and ``bar'' are ! positional arguments. \subsubsection{What are options for?\label{optparse-options}} Options are used to provide extra information to tune or customize the ! execution of a program. In case it wasn't clear, options are usually \emph{optional}. A program should be able to run just fine with no options whatsoever. (Pick a random program from the \UNIX{} or GNU --- 178,188 ---- \programopt{-v} and \longprogramopt{report} are both options. Assuming the \longprogramopt{report} option takes one argument, ! \code{/tmp/report.txt} is an option argument. \code{foo} and \code{bar} ! are positional arguments. \subsubsection{What are options for?\label{optparse-options}} Options are used to provide extra information to tune or customize the ! execution of a program. In case it wasn't clear, options should be \emph{optional}. A program should be able to run just fine with no options whatsoever. (Pick a random program from the \UNIX{} or GNU From gward@users.sourceforge.net Sat May 3 22:23:01 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Sat, 03 May 2003 14:23:01 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib liboptparse.tex,1.6,1.7 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv8404 Modified Files: liboptparse.tex Log Message: Scattered wording and typographical improvements (up to but not including the "Callback Options" section). Index: liboptparse.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/liboptparse.tex,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** liboptparse.tex 3 May 2003 20:41:37 -0000 1.6 --- liboptparse.tex 3 May 2003 21:22:58 -0000 1.7 *************** *** 278,283 **** The interesting stuff, of course, is what comes after the option ! strings. In this document, we'll only cover four of the things you ! can put there: \var{action}, \var{type}, \var{dest} (destination), and \var{help}. --- 278,283 ---- The interesting stuff, of course, is what comes after the option ! strings. For now, we'll only cover four of the things you can put ! there: \var{action}, \var{type}, \var{dest} (destination), and \var{help}. *************** *** 308,312 **** \function{parse_args()}, it automatically uses \var{sys.argv[1:]}.) ! When \module{optparse} sees the \programopt{-f}, it sucks in the next argument---\code{foo.txt}---and stores it in the \var{filename} attribute of a special object. That object is the first return value --- 308,312 ---- \function{parse_args()}, it automatically uses \var{sys.argv[1:]}.) ! When \module{optparse} sees the \programopt{-f}, it consumes the next argument---\code{foo.txt}---and stores it in the \var{filename} attribute of a special object. That object is the first return value *************** *** 326,335 **** \end{verbatim} ! Note that I didn't supply a long option, which is perfectly acceptable. ! I also didn't specify the action---it defaults to ``store''. ! Let's parse another fake command-line. This time, we'll jam the ! option argument right up against the option---\programopt{-n42} (one ! argument) is equivalent to \programopt{-n 42} (two arguments). : \begin{verbatim} --- 326,336 ---- \end{verbatim} ! This example doesn't provide a long option, which is perfectly ! acceptable. It also doesn't specify the action---it defaults to ! ``store''. ! Let's parse another fake command-line. This time, we'll jam the option ! argument right up against the option, since \programopt{-n42} (one ! argument) is equivalent to \programopt{-n 42} (two arguments). \begin{verbatim} *************** *** 338,342 **** \end{verbatim} ! will print ``42''. Trying out the ``float'' type is left as an exercise for the reader. --- 339,343 ---- \end{verbatim} ! This prints \code{42}. Trying out the ``float'' type is left as an exercise for the reader. *************** *** 377,384 **** default values---see below.) ! When \module{optparse} sees \programopt{-v} on the command line, it ! sets the \var{verbose} attribute of the special {option values} ! object to 1; when it sees \programopt{-q}, it sets \var{verbose} to ! 0. \subsubsection{Setting default values\label{optparse-setting-default-values}} --- 378,384 ---- default values---see below.) ! When \module{optparse} sees \programopt{-v} on the command line, it sets ! \var{options.verbose} to \code{True}; when it sees \programopt{-q}, it ! sets \var{options.verbose} to \code{False}. \subsubsection{Setting default values\label{optparse-setting-default-values}} *************** *** 387,395 **** ``destination'') when certain command-line options are seen. What happens if those options are never seen? Since we didn't supply any ! defaults, they are all set to None. Sometimes, this is just fine ! (which is why it's the default), but sometimes, you want more control. ! To address that need, \module{optparse} lets you supply a default ! value for each destination, which is assigned before the command-line ! is parsed. First, consider the verbose/quiet example. If we want --- 387,394 ---- ``destination'') when certain command-line options are seen. What happens if those options are never seen? Since we didn't supply any ! defaults, they are all set to \code{None}. Sometimes, this is just fine (which ! is why it's the default), but sometimes, you want more control. To ! address that need, \module{optparse} lets you supply a default value for ! each destination, which is assigned before the command-line is parsed. First, consider the verbose/quiet example. If we want *************** *** 421,426 **** Again, the default value for \var{verbose} will be \code{True}: the last ! default value supplied for any particular destination attribute is the ! one that counts. \subsubsection{Generating help\label{optparse-generating-help}} --- 420,425 ---- Again, the default value for \var{verbose} will be \code{True}: the last ! default value supplied for any particular destination is the one that ! counts. \subsubsection{Generating help\label{optparse-generating-help}} *************** *** 476,480 **** \module{optparse} expands \samp{\%prog} in the usage string to the name of the ! current script, ie. \code{os.path.basename(sys.argv[0])}. The expanded string is then printed before the detailed option help. --- 475,479 ---- \module{optparse} expands \samp{\%prog} in the usage string to the name of the ! current script, i.e. \code{os.path.basename(sys.argv[0])}. The expanded string is then printed before the detailed option help. *************** *** 524,529 **** \begin{verbatim} group = OptionGroup(parser, "Dangerous Options", ! "Caution: use these options at your own risk." ! " It is believed that some of them bite.") group.add_option("-g", action="store_true", help="Group option.") parser.add_option_group(group) --- 523,528 ---- \begin{verbatim} group = OptionGroup(parser, "Dangerous Options", ! "Caution: use these options at your own risk. " ! "It is believed that some of them bite.") group.add_option("-g", action="store_true", help="Group option.") parser.add_option_group(group) *************** *** 560,569 **** \end{verbatim} ! Note that ``\%prog'' is expanded just like it is in \var{usage}. Apart from ! that, \var{version} can contain anything you like. When you supply it, ! \module{optparse} automatically adds a \longprogramopt{version} option to your ! parser. If it encounters this option on the command line, it expands ! your \var{version} string (by replacing ``\%prog''), prints it to ! stdout, and exits. For example, if your script is called /usr/bin/foo, a user might do: --- 559,568 ---- \end{verbatim} ! \var{version} can contain anything you like; \code{\%prog} is expanded ! in \var{version} just as with \var{usage}. When you supply it, ! \module{optparse} automatically adds a \longprogramopt{version} option ! to your parser. If it encounters this option on the command line, it ! expands your \var{version} string (by replacing \code{\%prog}), prints ! it to stdout, and exits. For example, if your script is called /usr/bin/foo, a user might do: *************** *** 572,577 **** $ /usr/bin/foo --version foo 1.0 ! $ ! \end{verbatim} \subsubsection{Error-handling\label{optparse-error-handling}} --- 571,575 ---- $ /usr/bin/foo --version foo 1.0 ! \end{verbatim} % $ (avoid confusing emacs) \subsubsection{Error-handling\label{optparse-error-handling}} *************** *** 579,587 **** The one thing you need to know for basic usage is how \module{optparse} behaves when it encounters an error on the ! command-line---e.g. \programopt{-n4x} where \programopt{-n} is an ! integer-valued option. \module{optparse} prints your usage message to ! stderr, followed by a useful and human-readable error message. Then ! it terminates (calls \function{sys.exit()}) with a non-zero exit ! status. If you don't like this, subclass \class{OptionParser} and override the --- 577,585 ---- The one thing you need to know for basic usage is how \module{optparse} behaves when it encounters an error on the ! command-line---e.g. \programopt{-n 4x} where \programopt{-n} is an ! integer-valued option. In this case, \module{optparse} prints your ! usage message to stderr, followed by a useful and human-readable error ! message. Then it terminates (calls \function{sys.exit()}) with a ! non-zero exit status. If you don't like this, subclass \class{OptionParser} and override the *************** *** 591,603 **** \subsubsection{Putting it all together\label{optparse-basic-summary}} ! Here's what my \module{optparse}-based scripts usually look like: \begin{verbatim} from optparse import OptionParser ! ! ... ! ! def main (): ! usage = "usage: %prog [options] arg" parser = OptionParser(usage) parser.add_option("-f", "--file", type="string", dest="filename", --- 589,599 ---- \subsubsection{Putting it all together\label{optparse-basic-summary}} ! Here's what \module{optparse}-based scripts typically look like: \begin{verbatim} from optparse import OptionParser ! [...] ! def main(): ! usage = "usage: \%prog [-f] [-v] [-q] firstarg secondarg" parser = OptionParser(usage) parser.add_option("-f", "--file", type="string", dest="filename", *************** *** 607,611 **** parser.add_option("-q", "--quiet", action="store_false", dest="verbose") - # more options ... (options, args) = parser.parse_args() --- 603,606 ---- *************** *** 614,620 **** if options.verbose: ! print "reading %s..." % options.filename ! ! # go to work ... if __name__ == "__main__": --- 609,614 ---- if options.verbose: ! print "reading \%s..." \% options.filename ! [... go to work ...] if __name__ == "__main__": *************** *** 624,630 **** \subsection{Advanced Usage\label{optparse-advanced-usage}} - This is reference documentation. If you haven't read the basic - documentation in section~\ref{optparse-basic-usage}, do so now. - \subsubsection{Creating and populating the parser\label{optparse-creating-the-parser}} --- 618,621 ---- *************** *** 635,638 **** --- 626,631 ---- \begin{verbatim} + from optparse import OptionParser, make_option + [...] parser = OptionParser(option_list=[ make_option("-f", "--filename", *************** *** 642,653 **** \end{verbatim} ! (\function{make_option()} is an alias for ! the \class{Option} class, ie. this just calls the \class{Option} ! constructor. A future version of \module{optparse} will probably ! split \class{Option} into several classes, and ! \function{make_option()} will become a factory function that picks the ! right class to instantiate.) ! For long option lists, it's often more convenient/readable to create the list separately: --- 635,642 ---- \end{verbatim} ! (\function{make_option()} is a factory function for generating ! \class{Option} objects.) ! For long option lists, it may be more convenient/readable to create the list separately: *************** *** 655,659 **** option_list = [make_option("-f", "--filename", action="store", type="string", dest="filename"), ! # 17 other options ... make_option("-q", "--quiet", action="store_false", dest="verbose")] --- 644,648 ---- option_list = [make_option("-f", "--filename", action="store", type="string", dest="filename"), ! [... more options ...] make_option("-q", "--quiet", action="store_false", dest="verbose")] *************** *** 674,679 **** This method makes it easier to track down exceptions raised by the \class{Option} constructor, which are common because of the complicated ! interdependencies among the various keyword arguments---if you get it ! wrong, \module{optparse} raises \exception{OptionError}. \method{add_option()} can be called in one of two ways: --- 663,668 ---- This method makes it easier to track down exceptions raised by the \class{Option} constructor, which are common because of the complicated ! interdependencies among the various keyword arguments. (If you get it ! wrong, \module{optparse} raises \exception{OptionError}.) \method{add_option()} can be called in one of two ways: *************** *** 682,686 **** \item pass it an \class{Option} instance (as returned by \function{make_option()}) \item pass it any combination of positional and keyword arguments that ! are acceptable to \function{make_option()} (ie., to the \class{Option} constructor), and it will create the \class{Option} instance for you (shown above). --- 671,675 ---- \item pass it an \class{Option} instance (as returned by \function{make_option()}) \item pass it any combination of positional and keyword arguments that ! are acceptable to \function{make_option()} (i.e., to the \class{Option} constructor), and it will create the \class{Option} instance for you (shown above). *************** *** 690,694 **** Each \class{Option} instance represents a set of synonymous ! command-line options, ie. options that have the same meaning and effect, but different spellings. You can specify any number of short or long option strings, but you must specify at least one option --- 679,683 ---- Each \class{Option} instance represents a set of synonymous ! command-line options, i.e. options that have the same meaning and effect, but different spellings. You can specify any number of short or long option strings, but you must specify at least one option *************** *** 707,741 **** \end{verbatim} ! The ``...'' represents a set of keyword arguments that define ! attributes of the \class{Option} object. Just which keyword args you ! must supply for a given \class{Option} is fairly complicated (see the ! various \method{_check_*()} methods in the \class{Option} class if you ! don't believe me), but you always have to supply \emph{some}. If you ! get it wrong, \module{optparse} raises an \exception{OptionError} ! exception explaining your mistake. ! The most important attribute of an option is its action, ie. what to do when we encounter this option on the command-line. The possible actions are: ! \begin{definitions} ! \term{store} [default] ! store this option's argument. ! \term{store_const} ! store a constant value. ! \term{store_true} ! store a true value. ! \term{store_false} ! store a false value. ! \term{append} ! append this option's argument to a list. ! \term{count} ! increment a counter by one. ! \term{callback} ! call a specified function. ! \term{help} ! print a usage message including all options and the documentation for ! them. ! \end{definitions} (If you don't supply an action, the default is ``store''. For this --- 696,721 ---- \end{verbatim} ! The ``...'' represents a set of keyword arguments that define attributes ! of the \class{Option} object. The rules governing which keyword args ! you must supply for a given \class{Option} are fairly complicated, but ! you always have to supply \emph{some}. If you get it wrong, ! \module{optparse} raises an \exception{OptionError} exception explaining ! your mistake. ! The most important attribute of an option is its action, i.e. what to do when we encounter this option on the command-line. The possible actions are: ! \begin{tableii}{l|l}{code}{Action}{Meaning} ! \lineii{store}{store this option's argument (default)} ! \lineii{store_const}{store a constant value} ! \lineii{store_true}{store a true value} ! \lineii{store_false}{store a false value} ! \lineii{append}{append this option's argument to a list} ! \lineii{count}{increment a counter by one} ! \lineii{callback}{call a specified function} ! \lineii{help}{print a usage message including all options and the ! documentation for them} ! \end{tableii} (If you don't supply an action, the default is ``store''. For this *************** *** 785,789 **** \end{verbatim} ! Clearly, the \var{type} and \var{dest} arguments are (usually) almost as important as \var{action}. \var{action} is the only attribute that is meaningful for \emph{all} options, though, so it is the most --- 765,769 ---- \end{verbatim} ! Clearly, the \var{type} and \var{dest} arguments are almost as important as \var{action}. \var{action} is the only attribute that is meaningful for \emph{all} options, though, so it is the most *************** *** 802,811 **** The option must be followed by an argument, which is converted to a value according to \var{type} and stored in \var{dest}. If ! \var{nargs} > 1, multiple arguments will be consumed from the command line; all will be converted according to \var{type} and stored to \var{dest} as a tuple. See section~\ref{optparse-option-types}, ``Option types'' below. ! If \var{choices} is supplied (a list or tuple of strings), the type defaults to ``choice''. --- 782,791 ---- The option must be followed by an argument, which is converted to a value according to \var{type} and stored in \var{dest}. If ! \code{nargs > 1}, multiple arguments will be consumed from the command line; all will be converted according to \var{type} and stored to \var{dest} as a tuple. See section~\ref{optparse-option-types}, ``Option types'' below. ! If \var{choices} (a sequence of strings) is supplied, the type defaults to ``choice''. *************** *** 853,857 **** make_option("-v", "--verbose", action="store_const", const=1, dest="verbose"), ! make_option(None, "--noisy", action="store_const", const=2, dest="verbose"), \end{verbatim} --- 833,837 ---- make_option("-v", "--verbose", action="store_const", const=1, dest="verbose"), ! make_option("--noisy", action="store_const", const=2, dest="verbose"), \end{verbatim} *************** *** 869,873 **** \term{store_false} [required: \var{dest}] ! Like ``store_true'', but stores a \code{False} Example: --- 849,853 ---- \term{store_false} [required: \var{dest}] ! Like ``store_true'', but stores \code{False} Example: *************** *** 882,888 **** The option must be followed by an argument, which is appended to the list in \var{dest}. If no default value for \var{dest} is supplied ! (ie. the default is None), an empty list is automatically created when \module{optparse} first encounters this option on the command-line. ! If \samp{nargs > 1}, multiple arguments are consumed, and a tuple of length \var{nargs} is appended to \var{dest}. --- 862,868 ---- The option must be followed by an argument, which is appended to the list in \var{dest}. If no default value for \var{dest} is supplied ! (i.e. the default is \code{None}), an empty list is automatically created when \module{optparse} first encounters this option on the command-line. ! If \code{nargs > 1}, multiple arguments are consumed, and a tuple of length \var{nargs} is appended to \var{dest}. *************** *** 939,943 **** \end{verbatim} ! \term{callback} [required: \var{'callback'}; relevant: \var{type}, \var{nargs}, \var{callback_args}, \var{callback_kwargs}] --- 919,923 ---- \end{verbatim} ! \term{callback} [required: \var{callback}; relevant: \var{type}, \var{nargs}, \var{callback_args}, \var{callback_kwargs}] *************** *** 955,959 **** Callback options are covered in detail in ! section~\ref{optparse-callback-options} ``Callback Options.'' \term{help} [required: none] --- 935,939 ---- Callback options are covered in detail in ! section~\ref{optparse-callback-options}, ``Callback Options.'' \term{help} [required: none] *************** *** 1013,1017 **** \dfn{int}, \dfn{long}, \dfn{choice}, \dfn{float} and \dfn{complex}. (Of these, string, int, float, and choice are the most commonly used ! -- long and complex are there mainly for completeness.) It's easy to add new option types by subclassing the \class{Option} class; see section~\ref{optparse-extending}, ``Extending \module{optparse}.'' --- 993,997 ---- \dfn{int}, \dfn{long}, \dfn{choice}, \dfn{float} and \dfn{complex}. (Of these, string, int, float, and choice are the most commonly used ! ---long and complex are there mainly for completeness.) It's easy to add new option types by subclassing the \class{Option} class; see section~\ref{optparse-extending}, ``Extending \module{optparse}.'' *************** *** 1026,1031 **** Internally, \module{optparse} raises \exception{OptionValueError} in \function{optparse.check_builtin()}; at a higher level (in ! \class{OptionParser}) this is caught and \module{optparse} terminates ! your program with a useful error message. Likewise, float arguments are passed to \function{float()} for --- 1006,1011 ---- Internally, \module{optparse} raises \exception{OptionValueError} in \function{optparse.check_builtin()}; at a higher level (in ! \class{OptionParser}), \module{optparse} catches this exception and ! terminates your program with a useful error message. Likewise, float arguments are passed to \function{float()} for *************** *** 1037,1041 **** tuple of choices (strings) must be passed to the option constructor (\function{make_option()} or \method{OptionParser.add_option()}) as ! the ``choices'' keyword argument. Choice option arguments are compared against this master list in \function{optparse.check_choice()}, and \exception{OptionValueError} --- 1017,1021 ---- tuple of choices (strings) must be passed to the option constructor (\function{make_option()} or \method{OptionParser.add_option()}) as ! the \var{choices} keyword argument. Choice option arguments are compared against this master list in \function{optparse.check_choice()}, and \exception{OptionValueError} *************** *** 1055,1059 **** \begin{methoddesc}{get_option}{opt_str} Returns the \class{Option} instance that implements the option ! string you supplied, or None if no options implement it. \end{methoddesc} --- 1035,1039 ---- \begin{methoddesc}{get_option}{opt_str} Returns the \class{Option} instance that implements the option ! string you supplied, or \code{None} if no options implement it. \end{methoddesc} *************** *** 1108,1114 **** or via the \method{set_conflict_handler()} method. ! The default conflict-handling mechanism is ``error''. The only other ! one is ``ignore'', which restores the (arguably broken) behaviour of ! \module{optparse} 1.1 and earlier. Here's an example: first, define an \class{OptionParser} set to --- 1088,1092 ---- or via the \method{set_conflict_handler()} method. ! The default conflict-handling mechanism is \code{error}. Here's an example: first, define an \class{OptionParser} set to *************** *** 1247,1252 **** set; the type of \var{value} will be the type implied by the option's type (see~\ref{optparse-option-types}, ``Option types''). If ! \var{type} for this option is None (no argument expected), then ! \var{value} will be None. If \samp{nargs > 1}, \var{value} will be a tuple of values of the appropriate type. --- 1225,1230 ---- set; the type of \var{value} will be the type implied by the option's type (see~\ref{optparse-option-types}, ``Option types''). If ! \var{type} for this option is \code{None} (no argument expected), then ! \var{value} will be \code{None}. If \samp{nargs > 1}, \var{value} will be a tuple of values of the appropriate type. *************** *** 1258,1262 **** \begin{definitions} \term{parser.rargs} ! the current remaining argument list, ie. with \var{opt} (and \var{value}, if any) removed, and only the arguments following them still there. Feel free to modify \member{parser.rargs}, --- 1236,1240 ---- \begin{definitions} \term{parser.rargs} ! the current remaining argument list, i.e. with \var{opt} (and \var{value}, if any) removed, and only the arguments following them still there. Feel free to modify \member{parser.rargs}, *************** *** 1264,1268 **** \term{parser.largs} ! the current set of leftover arguments, ie. arguments that have been processed but have not been consumed as options (or arguments to options). Feel free to modify \member{parser.largs} e.g. by adding --- 1242,1246 ---- \term{parser.largs} ! the current set of leftover arguments, i.e. arguments that have been processed but have not been consumed as options (or arguments to options). Feel free to modify \member{parser.largs} e.g. by adding *************** *** 1464,1468 **** Also, the examples section includes several demonstrations of ! extending \module{optparse} in different ways: eg. a case-insensitive option parser, or two kinds of option parsers that implement ``required options''. --- 1442,1446 ---- Also, the examples section includes several demonstrations of ! extending \module{optparse} in different ways: e.g. a case-insensitive option parser, or two kinds of option parsers that implement ``required options''. *************** *** 1657,1661 **** If the \member{attr} attribute of \var{values} doesn't exist or is ! None, then \method{ensure_value()} first sets it to \var{value}, and then returns \var{value}. This is very handy for actions like ``extend'', ``append'', and ``count'', all of which accumulate data in --- 1635,1639 ---- If the \member{attr} attribute of \var{values} doesn't exist or is ! \code{None}, then \method{ensure_value()} first sets it to \var{value}, and then returns \var{value}. This is very handy for actions like ``extend'', ``append'', and ``count'', all of which accumulate data in *************** *** 1664,1668 **** \method{ensure_value()} means that scripts using your action don't have to worry about setting a default value for the option ! destinations in question; they can just leave the default as None and \method{ensure_value()} will take care of getting it right when it's needed. --- 1642,1646 ---- \method{ensure_value()} means that scripts using your action don't have to worry about setting a default value for the option ! destinations in question; they can just leave the default as \code{None} and \method{ensure_value()} will take care of getting it right when it's needed. *************** *** 1675,1679 **** First, the simple one: \class{OptionParser} tries to be helpful by ! calling \function{sys.exit()} when appropriate, ie. when there's an error on the command-line or when the user requests help. In the former case, the traditional course of letting the script crash with a --- 1653,1657 ---- First, the simple one: \class{OptionParser} tries to be helpful by ! calling \function{sys.exit()} when appropriate, i.e. when there's an error on the command-line or when the user requests help. In the former case, the traditional course of letting the script crash with a From tim_one@users.sourceforge.net Sun May 4 05:16:53 2003 From: tim_one@users.sourceforge.net (tim_one@users.sourceforge.net) Date: Sat, 03 May 2003 21:16:53 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_file.py,1.11,1.12 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv30029/Lib/test Modified Files: test_file.py Log Message: Somewhere along the way, the softspace attr of file objects became read- only. Repaired, and added new tests to test_file.py. Index: test_file.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_file.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** test_file.py 6 Aug 2002 15:58:24 -0000 1.11 --- test_file.py 4 May 2003 04:16:50 -0000 1.12 *************** *** 6,9 **** --- 6,29 ---- from UserList import UserList + # verify expected attributes exist + f = file(TESTFN, 'w') + softspace = f.softspace + f.name # merely shouldn't blow up + f.mode # ditto + f.closed # ditto + + # verify softspace is writable + f.softspace = softspace # merely shouldn't blow up + + # verify the others aren't + for attr in 'name', 'mode', 'closed': + try: + setattr(f, attr, 'oops') + except TypeError: + pass + else: + raise TestFailed('expected TypeError setting file attr %r' % attr) + f.close() + # verify writelines with instance sequence l = UserList(['1', '2']) From tim_one@users.sourceforge.net Sun May 4 05:16:54 2003 From: tim_one@users.sourceforge.net (tim_one@users.sourceforge.net) Date: Sat, 03 May 2003 21:16:54 -0700 Subject: [Python-checkins] python/dist/src/Misc NEWS,1.755,1.756 Message-ID: Update of /cvsroot/python/python/dist/src/Misc In directory sc8-pr-cvs1:/tmp/cvs-serv30029/Misc Modified Files: NEWS Log Message: Somewhere along the way, the softspace attr of file objects became read- only. Repaired, and added new tests to test_file.py. Index: NEWS =================================================================== RCS file: /cvsroot/python/python/dist/src/Misc/NEWS,v retrieving revision 1.755 retrieving revision 1.756 diff -C2 -d -r1.755 -r1.756 *** NEWS 3 May 2003 09:09:02 -0000 1.755 --- NEWS 4 May 2003 04:16:51 -0000 1.756 *************** *** 13,16 **** --- 13,19 ---- ----------------- + - The softspace attribute of file objects became read-only by oversight. + It's writable again. + Extension modules ----------------- From tim_one@users.sourceforge.net Sun May 4 05:16:54 2003 From: tim_one@users.sourceforge.net (tim_one@users.sourceforge.net) Date: Sat, 03 May 2003 21:16:54 -0700 Subject: [Python-checkins] python/dist/src/Objects fileobject.c,2.176,2.177 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv30029/Objects Modified Files: fileobject.c Log Message: Somewhere along the way, the softspace attr of file objects became read- only. Repaired, and added new tests to test_file.py. Index: fileobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/fileobject.c,v retrieving revision 2.176 retrieving revision 2.177 diff -C2 -d -r2.176 -r2.177 *** fileobject.c 9 Feb 2003 01:10:02 -0000 2.176 --- fileobject.c 4 May 2003 04:16:52 -0000 2.177 *************** *** 1963,1967 **** 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ ! 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ --- 1963,1968 ---- 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ ! /* softspace is writable: we must supply tp_setattro */ ! PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ From bcannon@users.sourceforge.net Sun May 4 22:15:30 2003 From: bcannon@users.sourceforge.net (bcannon@users.sourceforge.net) Date: Sun, 04 May 2003 14:15:30 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_support.py,1.52,1.53 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv3106/Lib/test Modified Files: test_support.py Log Message: 'forget' now also deletes any proper .pyo files. Added some docstrings. Index: test_support.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_support.py,v retrieving revision 1.52 retrieving revision 1.53 diff -C2 -d -r1.52 -r1.53 *** test_support.py 1 May 2003 17:45:51 -0000 1.52 --- test_support.py 4 May 2003 21:15:27 -0000 1.53 *************** *** 1,3 **** ! """Supporting definitions for the Python regression test.""" if __name__ != 'test.test_support': --- 1,3 ---- ! """Supporting definitions for the Python regression tests.""" if __name__ != 'test.test_support': *************** *** 51,54 **** --- 51,56 ---- def forget(modname): + '''"Forget" a module was ever imported by removing it from sys.modules and + deleting any .pyc and .pyo files.''' unload(modname) import os *************** *** 58,66 **** --- 60,81 ---- except os.error: pass + # Deleting the .pyo file cannot be within the 'try' for the .pyc since + # the chance exists that there is no .pyc (and thus the 'try' statement + # is exited) but there is a .pyo file. + try: + os.unlink(os.path.join(dirname, modname + '.pyo')) + except os.error: + pass def is_resource_enabled(resource): + """Test whether a resource is enabled. Known resources are set by + regrtest.py.""" return use_resources is not None and resource in use_resources def requires(resource, msg=None): + """Raise ResourceDenied if the specified resource is not available. + + If the caller's module is __main__ then automatically return True. The + possibility of False being returned occurs when regrtest.py is executing.""" # see if the caller's module is __main__ - if so, treat as if # the resource was set *************** *** 142,145 **** --- 157,163 ---- def findfile(file, here=__file__): + """Try to find a file on sys.path and the working directory. If it is not + found the argument passed to the function is returned (this does not + necessarily signal failure; could still be the legitimate path).""" import os if os.path.isabs(file): From rhettinger@users.sourceforge.net Sun May 4 22:25:21 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Sun, 04 May 2003 14:25:21 -0700 Subject: [Python-checkins] python/dist/src/Objects dictnotes.txt,1.1,1.2 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv5773 Modified Files: dictnotes.txt Log Message: * Note how dummy entry re-use benefits use cases with interspersed deletes and adds. * Note that dictionary iteration is negatively impacted by additional sparseness. Index: dictnotes.txt =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/dictnotes.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** dictnotes.txt 2 May 2003 20:11:29 -0000 1.1 --- dictnotes.txt 4 May 2003 21:25:19 -0000 1.2 *************** *** 44,47 **** --- 44,51 ---- such as with the % formatting operator. + Dynamic Mappings + Characterized by deletions interspersed with adds and replacments. + Performance benefits greatly from the re-use of dummy entries. + Data Layout (assuming a 32-bit box with 64 bytes per cache line) *************** *** 92,95 **** --- 96,105 ---- others). Any one test or benchmark is likely to prove misleading. + While making a dictionary more sparse reduces collisions, it impairs + iteration and key listing. Those methods loop over every potential + entry. Doubling the size of dictionary results in twice as many + non-overlapping memory accesses for keys(), items(), values(), + __iter__(), iterkeys(), iteritems(), itervalues(), and update(). + Results of Cache Locality Experiments *************** *** 166,170 **** is not at a premium, the user may benefit from setting the maximum load ratio at 5% or 10% instead of the usual 66.7%. This will sharply ! curtail the number of collisions. 2) Dictionary creation time can be shortened in cases where the ultimate --- 176,180 ---- is not at a premium, the user may benefit from setting the maximum load ratio at 5% or 10% instead of the usual 66.7%. This will sharply ! curtail the number of collisions but will increase iteration time. 2) Dictionary creation time can be shortened in cases where the ultimate From jhylton@users.sourceforge.net Mon May 5 00:44:51 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Sun, 04 May 2003 16:44:51 -0700 Subject: [Python-checkins] python/dist/src/Lib urllib2.py,1.39,1.40 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv22613 Modified Files: urllib2.py Log Message: Repair redirect handling and raise URLError on host-not-found. The latest changes to the redirect handler couldn't possibly have been tested, because they did not compute a newurl and failed with a NameError. The __name__ == "__main__": block has a test for redirects. Also, fix SF bug 723831. A urlopen() that failed because the host was not found raised a socket.gaierror unlike earlier versions of urllib2. The problem is that httplib actually establishes the connection at a different point starting with Python 2.2. Move the try/except to endheaders(), which is where the connection gets established. Index: urllib2.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/urllib2.py,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** urllib2.py 24 Apr 2003 15:32:12 -0000 1.39 --- urllib2.py 4 May 2003 23:44:49 -0000 1.40 *************** *** 417,428 **** raise HTTPError if no-one else should try to handle this url. Return None if you can't but another Handler might. - """ ! if (code in (301, 302, 303, 307) and req.method() in ("GET", "HEAD") or ! code in (302, 303) and req.method() == "POST"): ! # Strictly (according to RFC 2616), 302 in response to a POST ! # MUST NOT cause a redirection without confirmation from the user ! # (of urllib2, in this case). In practice, essentially all clients ! # do redirect in this case, so we do the same. return Request(newurl, headers=req.headers) else: --- 417,439 ---- raise HTTPError if no-one else should try to handle this url. Return None if you can't but another Handler might. """ ! # XXX 301 and 302 errors must have a location or uri header. ! # Not sure about the other error codes. ! if "location" in headers: ! newurl = headers["location"] ! elif "uri" in headers: ! newurl = headers["uri"] ! else: ! return ! newurl = urlparse.urljoin(req.get_full_url(), newurl) ! ! m = req.get_method() ! if (code in (301, 302, 303, 307) and m in ("GET", "HEAD") ! or code in (302, 303) and m == "POST"): ! # Strictly (according to RFC 2616), 302 in response to a ! # POST MUST NOT cause a redirection without confirmation ! # from the user (of urllib2, in this case). In practice, ! # essentially all clients do redirect in this case, so we ! # do the same. return Request(newurl, headers=req.headers) else: *************** *** 778,781 **** --- 789,795 ---- class AbstractHTTPHandler(BaseHandler): + # XXX Should rewrite do_open() to use the new httplib interface, + # would would be a little simpler. + def do_open(self, http_class, req): host = req.get_host() *************** *** 783,800 **** raise URLError('no host given') ! try: ! h = http_class(host) # will parse host:port ! if req.has_data(): ! data = req.get_data() ! h.putrequest('POST', req.get_selector()) ! if not 'Content-type' in req.headers: ! h.putheader('Content-type', ! 'application/x-www-form-urlencoded') ! if not 'Content-length' in req.headers: ! h.putheader('Content-length', '%d' % len(data)) ! else: ! h.putrequest('GET', req.get_selector()) ! except socket.error, err: ! raise URLError(err) scheme, sel = splittype(req.get_selector()) --- 797,811 ---- raise URLError('no host given') ! h = http_class(host) # will parse host:port ! if req.has_data(): ! data = req.get_data() ! h.putrequest('POST', req.get_selector()) ! if not 'Content-type' in req.headers: ! h.putheader('Content-type', ! 'application/x-www-form-urlencoded') ! if not 'Content-length' in req.headers: ! h.putheader('Content-length', '%d' % len(data)) ! else: ! h.putrequest('GET', req.get_selector()) scheme, sel = splittype(req.get_selector()) *************** *** 807,811 **** for k, v in req.headers.items(): h.putheader(k, v) ! h.endheaders() if req.has_data(): h.send(data) --- 818,825 ---- for k, v in req.headers.items(): h.putheader(k, v) ! try: ! h.endheaders() ! except socket.error, err: ! raise URLError(err) if req.has_data(): h.send(data) From jhylton@users.sourceforge.net Mon May 5 02:47:19 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Sun, 04 May 2003 18:47:19 -0700 Subject: [Python-checkins] python/dist/src/Lib urllib2.py,1.40,1.41 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv22327 Modified Files: urllib2.py Log Message: Add comment explaining try/except for endheaders(). Index: urllib2.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/urllib2.py,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** urllib2.py 4 May 2003 23:44:49 -0000 1.40 --- urllib2.py 5 May 2003 01:47:13 -0000 1.41 *************** *** 818,821 **** --- 818,823 ---- for k, v in req.headers.items(): h.putheader(k, v) + # httplib will attempt to connect() here. be prepared + # to convert a socket error to a URLError. try: h.endheaders() From jhylton@users.sourceforge.net Mon May 5 04:18:43 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Sun, 04 May 2003 20:18:43 -0700 Subject: [Python-checkins] python/dist/src/Lib urllib2.py,1.24.8.4,1.24.8.5 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv12183 Modified Files: Tag: release22-maint urllib2.py Log Message: Backport fix for SF #723831: urlopen() raises URLError. Index: urllib2.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/urllib2.py,v retrieving revision 1.24.8.4 retrieving revision 1.24.8.5 diff -C2 -d -r1.24.8.4 -r1.24.8.5 *** urllib2.py 25 Apr 2003 05:33:07 -0000 1.24.8.4 --- urllib2.py 5 May 2003 03:18:41 -0000 1.24.8.5 *************** *** 781,798 **** raise URLError('no host given') ! try: ! h = http_class(host) # will parse host:port ! if req.has_data(): ! data = req.get_data() ! h.putrequest('POST', req.get_selector()) ! if not req.headers.has_key('Content-type'): ! h.putheader('Content-type', ! 'application/x-www-form-urlencoded') ! if not req.headers.has_key('Content-length'): ! h.putheader('Content-length', '%d' % len(data)) ! else: ! h.putrequest('GET', req.get_selector()) ! except socket.error, err: ! raise URLError(err) scheme, sel = splittype(req.get_selector()) --- 781,795 ---- raise URLError('no host given') ! h = http_class(host) # will parse host:port ! if req.has_data(): ! data = req.get_data() ! h.putrequest('POST', req.get_selector()) ! if not req.headers.has_key('Content-type'): ! h.putheader('Content-type', ! 'application/x-www-form-urlencoded') ! if not req.headers.has_key('Content-length'): ! h.putheader('Content-length', '%d' % len(data)) ! else: ! h.putrequest('GET', req.get_selector()) scheme, sel = splittype(req.get_selector()) *************** *** 803,807 **** for k, v in req.headers.items(): h.putheader(k, v) ! h.endheaders() if req.has_data(): h.send(data) --- 800,809 ---- for k, v in req.headers.items(): h.putheader(k, v) ! # httplib will attempt to connect() here. be prepared ! # to convert a socket error to a URLError. ! try: ! h.endheaders() ! except socket.error, err: ! raise URLError(err) if req.has_data(): h.send(data) From jhylton@users.sourceforge.net Mon May 5 05:09:15 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Sun, 04 May 2003 21:09:15 -0700 Subject: [Python-checkins] python/dist/src/Lib urllib2.py,1.41,1.42 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv22598 Modified Files: urllib2.py Log Message: Better fix for newurl as suggested by Jim Jewett in SF bug #730963. Index: urllib2.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/urllib2.py,v retrieving revision 1.41 retrieving revision 1.42 diff -C2 -d -r1.41 -r1.42 *** urllib2.py 5 May 2003 01:47:13 -0000 1.41 --- urllib2.py 5 May 2003 04:09:13 -0000 1.42 *************** *** 409,413 **** class HTTPRedirectHandler(BaseHandler): ! def redirect_request(self, req, fp, code, msg, headers): """Return a Request or None in response to a redirect. --- 409,413 ---- class HTTPRedirectHandler(BaseHandler): ! def redirect_request(self, req, fp, code, msg, headers, newurl): """Return a Request or None in response to a redirect. *************** *** 418,431 **** None if you can't but another Handler might. """ - # XXX 301 and 302 errors must have a location or uri header. - # Not sure about the other error codes. - if "location" in headers: - newurl = headers["location"] - elif "uri" in headers: - newurl = headers["uri"] - else: - return - newurl = urlparse.urljoin(req.get_full_url(), newurl) - m = req.get_method() if (code in (301, 302, 303, 307) and m in ("GET", "HEAD") --- 418,421 ---- *************** *** 456,460 **** # request, although that might interact poorly with other # handlers that also use handler-specific request attributes ! new = self.redirect_request(req, fp, code, msg, headers) if new is None: return --- 446,450 ---- # request, although that might interact poorly with other # handlers that also use handler-specific request attributes ! new = self.redirect_request(req, fp, code, msg, headers, newurl) if new is None: return From jhylton@users.sourceforge.net Mon May 5 05:10:44 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Sun, 04 May 2003 21:10:44 -0700 Subject: [Python-checkins] python/dist/src/Lib urllib2.py,1.24.8.5,1.24.8.6 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv23057 Modified Files: Tag: release22-maint urllib2.py Log Message: Backport better fix for newurl as suggested by Jim Jewett in SF bug #730963. Index: urllib2.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/urllib2.py,v retrieving revision 1.24.8.5 retrieving revision 1.24.8.6 diff -C2 -d -r1.24.8.5 -r1.24.8.6 *** urllib2.py 5 May 2003 03:18:41 -0000 1.24.8.5 --- urllib2.py 5 May 2003 04:10:40 -0000 1.24.8.6 *************** *** 407,411 **** class HTTPRedirectHandler(BaseHandler): ! def redirect_request(self, req, fp, code, msg, headers): """Return a Request or None in response to a redirect. --- 407,411 ---- class HTTPRedirectHandler(BaseHandler): ! def redirect_request(self, req, fp, code, msg, headers, newurl): """Return a Request or None in response to a redirect. *************** *** 443,447 **** # request, although that might interact poorly with other # handlers that also use handler-specific request attributes ! new = self.redirect_request(req, fp, code, msg, headers) if new is None: return --- 443,447 ---- # request, although that might interact poorly with other # handlers that also use handler-specific request attributes ! new = self.redirect_request(req, fp, code, msg, headers, newurl) if new is None: return From loewis@users.sourceforge.net Mon May 5 06:05:33 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sun, 04 May 2003 22:05:33 -0700 Subject: [Python-checkins] python/dist/src configure,1.394,1.395 configure.in,1.405,1.406 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv3050 Modified Files: configure configure.in Log Message: Patch #732234: Check for -Kthread. Index: configure =================================================================== RCS file: /cvsroot/python/python/dist/src/configure,v retrieving revision 1.394 retrieving revision 1.395 diff -C2 -d -r1.394 -r1.395 *** configure 3 May 2003 12:10:46 -0000 1.394 --- configure 5 May 2003 05:05:26 -0000 1.395 *************** *** 1,4 **** #! /bin/sh ! # From configure.in Revision: 1.404 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. --- 1,4 ---- #! /bin/sh ! # From configure.in Revision: 1.405 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. *************** *** 3879,3882 **** --- 3879,3944 ---- fi + if test $ac_cv_kpthread = no + then + # -Kthread, if available, provides the right #defines + # and linker options to make pthread_create available + # Some compilers won't report that they do not support -Kthread, + # so we need to run a program to see whether it really made the + # function available. + echo "$as_me:$LINENO: checking whether $CC accepts -Kthread" >&5 + echo $ECHO_N "checking whether $CC accepts -Kthread... $ECHO_C" >&6 + if test "${ac_cv_kthread+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + ac_save_cc="$CC" + CC="$CC -Kthread" + if test "$cross_compiling" = yes; then + ac_cv_kthread=no + else + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" + #include "confdefs.h" + + #include + + void* routine(void* p){return NULL;} + + int main(){ + pthread_t p; + if(pthread_create(&p,NULL,routine,NULL)!=0) + return 1; + (void)pthread_detach(p); + return 0; + } + + _ACEOF + rm -f conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_kthread=yes + else + echo "$as_me: program exited with status $ac_status" >&5 + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ( exit $ac_status ) + ac_cv_kthread=no + fi + rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext + fi + CC="$ac_save_cc" + fi + + echo "$as_me:$LINENO: result: $ac_cv_kthread" >&5 + echo "${ECHO_T}$ac_cv_kthread" >&6 + fi + # checks for header files *************** *** 9129,9132 **** --- 9191,9196 ---- if test "$ac_cv_kpthread" = "yes" then CC="$CC -Kpthread" + elif test "$ac_cv_kthread" = "yes" + then CC="$CC -Kthread" fi echo "$as_me:$LINENO: checking for pthread_t" >&5 *************** *** 10134,10137 **** --- 10198,10210 ---- then CC="$CC -Kpthread" + cat >>confdefs.h <<\_ACEOF + #define WITH_THREAD 1 + _ACEOF + + posix_threads=yes + THREADOBJ="Python/thread.o" + elif test "$ac_cv_kthread" = "yes" + then + CC="$CC -Kthread" cat >>confdefs.h <<\_ACEOF #define WITH_THREAD 1 Index: configure.in =================================================================== RCS file: /cvsroot/python/python/dist/src/configure.in,v retrieving revision 1.405 retrieving revision 1.406 diff -C2 -d -r1.405 -r1.406 *** configure.in 3 May 2003 12:10:48 -0000 1.405 --- configure.in 5 May 2003 05:05:30 -0000 1.406 *************** *** 753,756 **** --- 753,787 ---- fi + if test $ac_cv_kpthread = no + then + # -Kthread, if available, provides the right #defines + # and linker options to make pthread_create available + # Some compilers won't report that they do not support -Kthread, + # so we need to run a program to see whether it really made the + # function available. + AC_MSG_CHECKING(whether $CC accepts -Kthread) + AC_CACHE_VAL(ac_cv_kthread, + [ac_save_cc="$CC" + CC="$CC -Kthread" + AC_TRY_RUN([ + #include + + void* routine(void* p){return NULL;} + + int main(){ + pthread_t p; + if(pthread_create(&p,NULL,routine,NULL)!=0) + return 1; + (void)pthread_detach(p); + return 0; + } + ], + ac_cv_kthread=yes, + ac_cv_kthread=no, + ac_cv_kthread=no) + CC="$ac_save_cc"]) + AC_MSG_RESULT($ac_cv_kthread) + fi + dnl # check for ANSI or K&R ("traditional") preprocessor dnl AC_MSG_CHECKING(for C preprocessor type) *************** *** 941,944 **** --- 972,977 ---- if test "$ac_cv_kpthread" = "yes" then CC="$CC -Kpthread" + elif test "$ac_cv_kthread" = "yes" + then CC="$CC -Kthread" fi AC_MSG_CHECKING(for pthread_t) *************** *** 1365,1368 **** --- 1398,1407 ---- then CC="$CC -Kpthread" + AC_DEFINE(WITH_THREAD) + posix_threads=yes + THREADOBJ="Python/thread.o" + elif test "$ac_cv_kthread" = "yes" + then + CC="$CC -Kthread" AC_DEFINE(WITH_THREAD) posix_threads=yes From loewis@users.sourceforge.net Mon May 5 06:13:21 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Sun, 04 May 2003 22:13:21 -0700 Subject: [Python-checkins] python/dist/src configure,1.395,1.396 configure.in,1.406,1.407 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv4882 Modified Files: configure configure.in Log Message: Patch #732284: Disable _XOPEN_SOURCE on UnixWare 7. Index: configure =================================================================== RCS file: /cvsroot/python/python/dist/src/configure,v retrieving revision 1.395 retrieving revision 1.396 diff -C2 -d -r1.395 -r1.396 *** configure 5 May 2003 05:05:26 -0000 1.395 --- configure 5 May 2003 05:13:16 -0000 1.396 *************** *** 1,4 **** #! /bin/sh ! # From configure.in Revision: 1.405 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. --- 1,4 ---- #! /bin/sh ! # From configure.in Revision: 1.406 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. *************** *** 1354,1357 **** --- 1354,1361 ---- # of union __?sigval. Reported by Stuart Bishop. SunOS/5.6) + define_xopen_source=no;; + # On UnixWare 7, u_short is never defined with _XOPEN_SOURCE, + # but used in struct sockaddr.sa_family. Reported by Tim Rice. + OpenUNIX/8.0| UnixWare/7.1.[13]) define_xopen_source=no;; esac Index: configure.in =================================================================== RCS file: /cvsroot/python/python/dist/src/configure.in,v retrieving revision 1.406 retrieving revision 1.407 diff -C2 -d -r1.406 -r1.407 *** configure.in 5 May 2003 05:05:30 -0000 1.406 --- configure.in 5 May 2003 05:13:18 -0000 1.407 *************** *** 130,133 **** --- 130,137 ---- SunOS/5.6) define_xopen_source=no;; + # On UnixWare 7, u_short is never defined with _XOPEN_SOURCE, + # but used in struct sockaddr.sa_family. Reported by Tim Rice. + OpenUNIX/8.0| UnixWare/7.1.@<:@13@:>@) + define_xopen_source=no;; esac From montanaro@users.sourceforge.net Mon May 5 15:16:45 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Mon, 05 May 2003 07:16:45 -0700 Subject: [Python-checkins] python/dist/src/Lib dbhash.py,1.6,1.7 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv553 Modified Files: dbhash.py Log Message: typo Index: dbhash.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/dbhash.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** dbhash.py 5 Jun 2001 05:33:19 -0000 1.6 --- dbhash.py 5 May 2003 14:16:41 -0000 1.7 *************** *** 1,3 **** ! """Provide a (g)dbm-compatible interface to bsdhash.hashopen.""" import sys --- 1,3 ---- ! """Provide a (g)dbm-compatible interface to bsddb.hashopen.""" import sys From jhylton@users.sourceforge.net Mon May 5 17:13:59 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Mon, 05 May 2003 09:13:59 -0700 Subject: [Python-checkins] python/dist/src/Lib httplib.py,1.74,1.75 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv30924/Lib Modified Files: httplib.py Log Message: SF bug 622042: Don't expect response body from HEAD request. Bug fix candidate. Index: httplib.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/httplib.py,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** httplib.py 18 Apr 2003 10:39:51 -0000 1.74 --- httplib.py 5 May 2003 16:13:56 -0000 1.75 *************** *** 209,216 **** # See RFC 2616 sec 19.6 and RFC 1945 sec 6 for details. ! def __init__(self, sock, debuglevel=0, strict=0): self.fp = sock.makefile('rb', 0) self.debuglevel = debuglevel self.strict = strict self.msg = None --- 209,217 ---- # See RFC 2616 sec 19.6 and RFC 1945 sec 6 for details. ! def __init__(self, sock, debuglevel=0, strict=0, method=None): self.fp = sock.makefile('rb', 0) self.debuglevel = debuglevel self.strict = strict + self._method = method self.msg = None *************** *** 327,331 **** if (status == 204 or # No Content status == 304 or # Not Modified ! 100 <= status < 200): # 1xx codes self.length = 0 --- 328,333 ---- if (status == 204 or # No Content status == 304 or # Not Modified ! 100 <= status < 200 or # 1xx codes ! self._method == 'HEAD'): self.length = 0 *************** *** 498,501 **** --- 500,504 ---- self.__response = None self.__state = _CS_IDLE + self._method = None self._set_hostport(host, port) *************** *** 627,630 **** --- 630,635 ---- raise CannotSendRequest() + # Save the method we use, we need it later in the response phase + self._method = method if not url: url = '/' *************** *** 764,770 **** if self.debuglevel > 0: response = self.response_class(self.sock, self.debuglevel, ! strict=self.strict) else: ! response = self.response_class(self.sock, strict=self.strict) response.begin() --- 769,777 ---- if self.debuglevel > 0: response = self.response_class(self.sock, self.debuglevel, ! strict=self.strict, ! method=self._method) else: ! response = self.response_class(self.sock, strict=self.strict, ! method=self._method) response.begin() From jhylton@users.sourceforge.net Mon May 5 17:14:00 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Mon, 05 May 2003 09:14:00 -0700 Subject: [Python-checkins] python/dist/src/Misc ACKS,1.234,1.235 Message-ID: Update of /cvsroot/python/python/dist/src/Misc In directory sc8-pr-cvs1:/tmp/cvs-serv30924/Misc Modified Files: ACKS Log Message: SF bug 622042: Don't expect response body from HEAD request. Bug fix candidate. Index: ACKS =================================================================== RCS file: /cvsroot/python/python/dist/src/Misc/ACKS,v retrieving revision 1.234 retrieving revision 1.235 diff -C2 -d -r1.234 -r1.235 *** ACKS 25 Apr 2003 05:48:32 -0000 1.234 --- ACKS 5 May 2003 16:13:58 -0000 1.235 *************** *** 262,265 **** --- 262,266 ---- Greg Humphreys Jeremy Hylton + Mihai Ibanescu Juan David Ibáñez Palomar Tony Ingraldi From jhylton@users.sourceforge.net Mon May 5 17:14:00 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Mon, 05 May 2003 09:14:00 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_httplib.py,1.10,1.11 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv30924/Lib/test Modified Files: test_httplib.py Log Message: SF bug 622042: Don't expect response body from HEAD request. Bug fix candidate. Index: test_httplib.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_httplib.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** test_httplib.py 23 Jan 2003 18:02:18 -0000 1.10 --- test_httplib.py 5 May 2003 16:13:57 -0000 1.11 *************** *** 79,81 **** --- 79,94 ---- raise AssertionError, "multiple headers not combined properly" + # test that the library doesn't attempt to read any data + # from a head request + conn = httplib.HTTPConnection("www.python.org") + conn.connect() + conn.request("HEAD", "/", headers={"Connection" : "keep-alive"}) + resp = conn.getresponse() + if resp.status != 200: + raise AssertionError, "Expected status 200, got %d" % resp.status + if resp.read() != "": + raise AssertionError, "Did not expect response from HEAD request" + resp.close() + conn.close() + test() From jhylton@users.sourceforge.net Mon May 5 17:46:29 2003 From: jhylton@users.sourceforge.net (jhylton@users.sourceforge.net) Date: Mon, 05 May 2003 09:46:29 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libtime.tex,1.55,1.56 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv12859 Modified Files: libtime.tex Log Message: Refer reader to platform library docs for specific semantics. Resolves SF bugs 697989, 697988, 697986. Index: libtime.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libtime.tex,v retrieving revision 1.55 retrieving revision 1.56 diff -C2 -d -r1.55 -r1.56 *** libtime.tex 4 Feb 2003 15:12:06 -0000 1.55 --- libtime.tex 5 May 2003 16:46:26 -0000 1.56 *************** *** 6,12 **** ! This module provides various time-related functions. ! It is always available, but not all functions are available ! on all platforms. An explanation of some terminology and conventions is in order. --- 6,15 ---- ! This module provides various time-related functions. It is always ! available, but not all functions are available on all platforms. Most ! of the functions defined in this module call platform C library ! functions with the same name. It may sometimes be helpful to consult ! the platform documentation, because the semantics of these functions ! varies among platforms. An explanation of some terminology and conventions is in order. From doerwalter@users.sourceforge.net Mon May 5 21:37:35 2003 From: doerwalter@users.sourceforge.net (doerwalter@users.sourceforge.net) Date: Mon, 05 May 2003 13:37:35 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_grp.py,1.16,1.17 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv11889/Lib/test Modified Files: test_grp.py Log Message: On Mac OS X pwd.getpwall() might return the tuples ('pgsql', '*', 252, []) and ('postgres', '*', 252, ['skip']), but pwd.getgrgid(252) might return ('pgsql', '', 252, ['skip']). Drop the test that tried to find a tuple similar to the one returned from pwd.getgrgid() among those for the same gid returned by pwd.getgrall(), as the only working definition of 'similar' seems to be 'has the same gid'. This check can be done more directly. This should fix SF bug #732783. Index: test_grp.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_grp.py,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** test_grp.py 1 May 2003 17:45:37 -0000 1.16 --- test_grp.py 5 May 2003 20:37:33 -0000 1.17 *************** *** 20,55 **** self.assert_(isinstance(value.gr_mem, list)) - def valueseq(self, value1, value2): - # are two grp tuples equal (don't compare passwords) - return value1.gr_name==value2.gr_name and \ - value1.gr_gid==value2.gr_gid and value1.gr_mem==value2.gr_mem - def test_values(self): entries = grp.getgrall() - entriesbygid = {} - entriesbyname = {} - - # we can't use the same strategy as in test_pwd, because - # we can't compare gr_passwd (Mac OS X returns - # "*" in getgrall() and "" in getgrgid()) for e in entries: self.check_value(e) - entriesbygid.setdefault(e.gr_gid, []).append(e) - entriesbyname.setdefault(e.gr_name, []).append(e) for e in entries: e2 = grp.getgrgid(e.gr_gid) self.check_value(e2) ! # make sure that at least one of the entries ! # for this gid compares equal to e2 ! self.assert_(max([self.valueseq(e2, x) \ ! for x in entriesbygid[e.gr_gid]])) e2 = grp.getgrnam(e.gr_name) self.check_value(e2) ! # make sure that at least one of the entries ! # for this name compares equal to e2 ! self.assert_(max([self.valueseq(e2, x) \ ! for x in entriesbyname[e.gr_name]])) def test_errors(self): --- 20,36 ---- self.assert_(isinstance(value.gr_mem, list)) def test_values(self): entries = grp.getgrall() for e in entries: self.check_value(e) for e in entries: e2 = grp.getgrgid(e.gr_gid) self.check_value(e2) ! self.assertEqual(e2.gr_gid, e.gr_gid) e2 = grp.getgrnam(e.gr_name) self.check_value(e2) ! self.assertEqual(e2.gr_name, e.gr_name) def test_errors(self): From tim_one@users.sourceforge.net Mon May 5 21:39:46 2003 From: tim_one@users.sourceforge.net (tim_one@users.sourceforge.net) Date: Mon, 05 May 2003 13:39:46 -0700 Subject: [Python-checkins] python/dist/src/Objects longobject.c,1.159,1.160 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv11556/python/Objects Modified Files: longobject.c Log Message: SF patch 730594: assert from longobject.c, line 1215. Some version of gcc in the "RTEMS port running on the Coldfire (m5200) processor" generates bad code for a loop in long_from_binary_base(), comparing the wrong half of an int to a short. The patch changes the decl of the short temp to be an int temp instead. This "simplifies" the code enough that gcc no longer blows it. Index: longobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/longobject.c,v retrieving revision 1.159 retrieving revision 1.160 diff -C2 -d -r1.159 -r1.160 *** longobject.c 1 May 2003 21:31:53 -0000 1.159 --- longobject.c 5 May 2003 20:39:43 -0000 1.160 *************** *** 1202,1207 **** pdigit = z->ob_digit; while (--p >= start) { ! unsigned char ch = (unsigned char)*p; ! digit k; if (ch <= '9') --- 1202,1207 ---- pdigit = z->ob_digit; while (--p >= start) { ! int k; ! char ch = *p; if (ch <= '9') *************** *** 1213,1218 **** k = ch - 'A' + 10; } ! assert(k < base); ! accum |= k << bits_in_accum; bits_in_accum += bits_per_char; if (bits_in_accum >= SHIFT) { --- 1213,1218 ---- k = ch - 'A' + 10; } ! assert(k >= 0 && k < base); ! accum |= (twodigits)(k << bits_in_accum); bits_in_accum += bits_per_char; if (bits_in_accum >= SHIFT) { From rhettinger@users.sourceforge.net Mon May 5 22:31:54 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Mon, 05 May 2003 14:31:54 -0700 Subject: [Python-checkins] python/dist/src/Objects dictnotes.txt,1.2,1.3 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv8919 Modified Files: dictnotes.txt Log Message: Add notes from python-dev about readonly dictionaries. Index: dictnotes.txt =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/dictnotes.txt,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dictnotes.txt 4 May 2003 21:25:19 -0000 1.2 --- dictnotes.txt 5 May 2003 21:31:51 -0000 1.3 *************** *** 198,199 **** --- 198,220 ---- the need to test for dummy entries on each probe. The preconditions for this strategy arise in symbol tables and in the builtin dictionary. + + + Readonly Dictionaries + --------------------- + Some dictionary use cases pass through a build stage and then move to a + more heavily exercised lookup stage with no further changes to the + dictionary. + + An idea that emerged on python-dev is to be able to convert a dictionary + to a read-only state. This can help prevent programming errors and also + provide knowledge that can be exploited for lookup optimization. + + The dictionary can be immediately rebuilt (eliminating dummy entries), + resized (to an appropriate level of sparseness), and the keys can be + jostled (to minimize collisions). The lookdict() routine can then + eliminate the test for dummy entries (saving about 1/4 of the time + spend in the collision resolution loop). + + An additional possibility is to insert links into the empty spaces + so that dictionary iteration can proceed in len(d) steps instead of + (mp->mask + 1) steps. From loewis@users.sourceforge.net Mon May 5 23:00:20 2003 From: loewis@users.sourceforge.net (loewis@users.sourceforge.net) Date: Mon, 05 May 2003 15:00:20 -0700 Subject: [Python-checkins] python/dist/src configure,1.396,1.397 configure.in,1.407,1.408 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv21154 Modified Files: configure configure.in Log Message: Patch #732479: Fix typos. Index: configure =================================================================== RCS file: /cvsroot/python/python/dist/src/configure,v retrieving revision 1.396 retrieving revision 1.397 diff -C2 -d -r1.396 -r1.397 *** configure 5 May 2003 05:13:16 -0000 1.396 --- configure 5 May 2003 22:00:01 -0000 1.397 *************** *** 1,4 **** #! /bin/sh ! # From configure.in Revision: 1.406 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. --- 1,4 ---- #! /bin/sh ! # From configure.in Revision: 1.407 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.53 for python 2.3. *************** *** 12825,12828 **** --- 12825,12829 ---- #include "confdefs.h" + #include #include #include *************** *** 12878,12882 **** #include "confdefs.h" ! #include #ifdef F77_DUMMY_MAIN --- 12879,12883 ---- #include "confdefs.h" ! #include #ifdef F77_DUMMY_MAIN Index: configure.in =================================================================== RCS file: /cvsroot/python/python/dist/src/configure.in,v retrieving revision 1.407 retrieving revision 1.408 diff -C2 -d -r1.407 -r1.408 *** configure.in 5 May 2003 05:13:18 -0000 1.407 --- configure.in 5 May 2003 22:00:11 -0000 1.408 *************** *** 2004,2007 **** --- 2004,2008 ---- AC_TRY_COMPILE([ #include "confdefs.h" + #include #include #include *************** *** 2016,2020 **** AC_TRY_COMPILE([ #include "confdefs.h" ! #include ], void* p = setgroups, --- 2017,2021 ---- AC_TRY_COMPILE([ #include "confdefs.h" ! #include ], void* p = setgroups, From rhettinger@users.sourceforge.net Mon May 5 23:22:13 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Mon, 05 May 2003 15:22:13 -0700 Subject: [Python-checkins] python/dist/src/Objects dictobject.c,2.144,2.145 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv30762 Modified Files: dictobject.c Log Message: SF patch #729395: Dictionary tuning * Increase dictionary growth rate resulting in more sparse dictionaries, fewer lookup collisions, increased memory use, and better cache performance. For dicts with over 50k entries, keep the current growth rate in case an application is suffering from tight memory constraints. * Set the most common case (no resize) to fall-through the test. Index: dictobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v retrieving revision 2.144 retrieving revision 2.145 diff -C2 -d -r2.144 -r2.145 *** dictobject.c 3 May 2003 06:51:59 -0000 2.144 --- dictobject.c 5 May 2003 22:22:10 -0000 2.145 *************** *** 532,546 **** Py_INCREF(key); insertdict(mp, key, hash, value); ! /* If we added a key, we can safely resize. Otherwise skip this! ! * If fill >= 2/3 size, adjust size. Normally, this doubles the ! * size, but it's also possible for the dict to shrink (if ma_fill is ! * much larger than ma_used, meaning a lot of dict keys have been ! * deleted). */ ! if (mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2) { ! if (dictresize(mp, mp->ma_used*2) != 0) ! return -1; ! } ! return 0; } --- 532,552 ---- Py_INCREF(key); insertdict(mp, key, hash, value); ! /* If we added a key, we can safely resize. Otherwise just return! ! * If fill >= 2/3 size, adjust size. Normally, this doubles or ! * quaduples the size, but it's also possible for the dict to shrink ! * (if ma_fill is much larger than ma_used, meaning a lot of dict ! * keys have been * deleted). ! * ! * Quadrupling the size improves average dictionary sparseness ! * (reducing collisions) at the cost of some memory and iteration ! * speed (which loops over every possible entry). It also halves ! * the number of expensive resize operations in a growing dictionary. ! * ! * Very large dictionaries (over 50K items) use doubling instead. ! * This may help applications with severe memory constraints. */ ! if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2)) ! return 0; ! return dictresize(mp, mp->ma_used*(mp->ma_used>50000 ? 2 : 4)); } From doerwalter@users.sourceforge.net Tue May 6 09:57:43 2003 From: doerwalter@users.sourceforge.net (doerwalter@users.sourceforge.net) Date: Tue, 06 May 2003 01:57:43 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_uu.py,1.5,1.6 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv18131/Lib/test Modified Files: test_uu.py Log Message: Port test_uu.py to PyUnit. From SF patch #662807. Index: test_uu.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_uu.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** test_uu.py 9 Aug 2002 16:37:36 -0000 1.5 --- test_uu.py 6 May 2003 08:57:41 -0000 1.6 *************** *** 4,157 **** """ ! from test.test_support import verify, TestFailed, verbose, TESTFN ! import sys, os import uu from StringIO import StringIO ! teststr = "The smooth-scaled python crept over the sleeping dog\n" ! expected = """\ M5&AE('-M;V]T:\"US8V%L960@<'ET:&]N(&-R97!T(&]V97(@=&AE('-L965P (:6YG(&1O9PH """ - encoded1 = "begin 666 t1\n"+expected+"\n \nend\n" - if verbose: - print '1. encode file->file' - inp = StringIO(teststr) - out = StringIO() - uu.encode(inp, out, "t1") - verify(out.getvalue() == encoded1) - inp = StringIO(teststr) - out = StringIO() - uu.encode(inp, out, "t1", 0644) - verify(out.getvalue() == "begin 644 t1\n"+expected+"\n \nend\n") ! if verbose: ! print '2. decode file->file' ! inp = StringIO(encoded1) ! out = StringIO() ! uu.decode(inp, out) ! verify(out.getvalue() == teststr) ! inp = StringIO("""UUencoded files may contain many lines, ! even some that have 'begin' in them.\n"""+encoded1) ! out = StringIO() ! uu.decode(inp, out) ! verify(out.getvalue() == teststr) ! stdinsave = sys.stdin ! stdoutsave = sys.stdout ! try: ! if verbose: ! print '3. encode stdin->stdout' ! sys.stdin = StringIO(teststr) ! sys.stdout = StringIO() ! uu.encode("-", "-", "t1", 0666) ! verify(sys.stdout.getvalue() == encoded1) ! if verbose: ! print >>stdoutsave, '4. decode stdin->stdout' ! sys.stdin = StringIO(encoded1) ! sys.stdout = StringIO() ! uu.decode("-", "-") ! verify(sys.stdout.getvalue() == teststr) ! finally: ! sys.stdin = stdinsave ! sys.stdout = stdoutsave ! if verbose: ! print '5. encode file->file' ! tmpIn = TESTFN + "i" ! tmpOut = TESTFN + "o" ! try: ! fin = open(tmpIn, 'wb') ! fin.write(teststr) ! fin.close() ! fin = open(tmpIn, 'rb') ! fout = open(tmpOut, 'w') ! uu.encode(fin, fout, tmpIn, mode=0644) ! fin.close() ! fout.close() ! fout = open(tmpOut, 'r') ! s = fout.read() ! fout.close() ! verify(s == 'begin 644 ' + tmpIn + '\n' + expected + '\n \nend\n') ! os.unlink(tmpIn) ! if verbose: ! print '6. decode file-> file' ! uu.decode(tmpOut) ! fin = open(tmpIn, 'rb') ! s = fin.read() ! fin.close() ! verify(s == teststr) ! # XXX is there an xp way to verify the mode? ! finally: ! try: ! fin.close() ! except: ! pass ! try: ! fout.close() ! except: ! pass ! try: ! os.unlink(tmpIn) ! except: ! pass ! try: ! os.unlink(tmpOut) ! except: ! pass ! if verbose: ! print '7. error: truncated input' ! inp = StringIO("begin 644 t1\n"+expected) ! out = StringIO() ! try: ! uu.decode(inp, out) ! raise TestFailed("No exception thrown") ! except uu.Error, e: ! verify(str(e) == 'Truncated input file') ! if verbose: ! print '8. error: missing begin' ! inp = StringIO("") ! out = StringIO() ! try: ! uu.decode(inp, out) ! raise TestFailed("No exception thrown") ! except uu.Error, e: ! verify(str(e) == 'No valid begin line found in input file') ! # Test to verify that decode() will refuse to overwrite an existing file ! outfile = TESTFN + "out" ! inp = StringIO('Here is a message to be uuencoded') ! out = StringIO() ! uu.encode(inp, out, outfile) ! out.seek(0) ! try: ! if verbose: ! print '9. decode w/file not exists is okay' ! uu.decode(out) ! if not os.path.exists(outfile): ! raise TestFailed('uudecode w/ out_file=None failed') ! fp = open(outfile) ! data = fp.read() ! fp.close() ! if data <> inp.getvalue(): ! raise TestFailed('uudecode stored something weird') ! # Try to write it again, which should cause a failure ! if verbose: ! print '10. uudecode w/file exists fails' ! out.seek(0) ! try: ! uu.decode(out) ! except uu.Error: ! pass ! else: ! raise TestFailed('expected to get a "file exists" error') ! finally: ! try: ! os.unlink(outfile) ! except OSError: ! pass --- 4,172 ---- """ ! import unittest ! from test import test_support ! ! import sys, os, uu, cStringIO import uu from StringIO import StringIO ! plaintext = "The smooth-scaled python crept over the sleeping dog\n" ! ! encodedtext = """\ M5&AE('-M;V]T:\"US8V%L960@<'ET:&]N(&-R97!T(&]V97(@=&AE('-L965P (:6YG(&1O9PH """ ! encodedtextwrapped = "begin %03o %s\n" + encodedtext.replace("%", "%%") + "\n \nend\n" ! class UUTest(unittest.TestCase): ! def test_encode(self): ! inp = cStringIO.StringIO(plaintext) ! out = cStringIO.StringIO() ! uu.encode(inp, out, "t1") ! self.assertEqual(out.getvalue(), encodedtextwrapped % (0666, "t1")) ! inp = cStringIO.StringIO(plaintext) ! out = cStringIO.StringIO() ! uu.encode(inp, out, "t1", 0644) ! self.assertEqual(out.getvalue(), encodedtextwrapped % (0644, "t1")) ! def test_decode(self): ! inp = cStringIO.StringIO(encodedtextwrapped % (0666, "t1")) ! out = cStringIO.StringIO() ! uu.decode(inp, out) ! self.assertEqual(out.getvalue(), plaintext) ! inp = cStringIO.StringIO( ! "UUencoded files may contain many lines,\n" + ! "even some that have 'begin' in them.\n" + ! encodedtextwrapped % (0666, "t1") ! ) ! out = cStringIO.StringIO() ! uu.decode(inp, out) ! self.assertEqual(out.getvalue(), plaintext) ! def test_truncatedinput(self): ! inp = cStringIO.StringIO("begin 644 t1\n" + encodedtext) ! out = cStringIO.StringIO() ! try: ! uu.decode(inp, out) ! self.fail("No exception thrown") ! except uu.Error, e: ! self.assertEqual(str(e), "Truncated input file") ! def test_missingbegin(self): ! inp = cStringIO.StringIO("") ! out = cStringIO.StringIO() ! try: ! uu.decode(inp, out) ! self.fail("No exception thrown") ! except uu.Error, e: ! self.assertEqual(str(e), "No valid begin line found in input file") ! class UUStdIOTest(unittest.TestCase): ! def setUp(self): ! self.stdin = sys.stdin ! self.stdout = sys.stdout ! def tearDown(self): ! sys.stdin = self.stdin ! sys.stdout = self.stdout ! def test_encode(self): ! sys.stdin = cStringIO.StringIO(plaintext) ! sys.stdout = cStringIO.StringIO() ! uu.encode("-", "-", "t1", 0666) ! self.assertEqual( ! sys.stdout.getvalue(), ! encodedtextwrapped % (0666, "t1") ! ) ! ! def test_decode(self): ! sys.stdin = cStringIO.StringIO(encodedtextwrapped % (0666, "t1")) ! sys.stdout = cStringIO.StringIO() ! uu.decode("-", "-") ! self.assertEqual(sys.stdout.getvalue(), plaintext) ! ! class UUFileTest(unittest.TestCase): ! ! def _kill(self, f): ! # close and remove file ! try: ! f.close() ! except (SystemExit, KeyboardInterrupt): ! raise ! except: ! pass ! try: ! os.unlink(f.name) ! except (SystemExit, KeyboardInterrupt): ! raise ! except: ! pass ! ! def setUp(self): ! self.tmpin = test_support.TESTFN + "i" ! self.tmpout = test_support.TESTFN + "o" ! ! def tearDown(self): ! del self.tmpin ! del self.tmpout ! ! def test_encode(self): ! try: ! fin = open(self.tmpin, 'wb') ! fin.write(plaintext) ! fin.close() ! ! fin = open(self.tmpin, 'rb') ! fout = open(self.tmpout, 'w') ! uu.encode(fin, fout, self.tmpin, mode=0644) ! fin.close() ! fout.close() ! ! fout = open(self.tmpout, 'r') ! s = fout.read() ! fout.close() ! self.assertEqual(s, encodedtextwrapped % (0644, self.tmpin)) ! finally: ! self._kill(fin) ! self._kill(fout) ! ! def test_decode(self): ! try: ! f = open(self.tmpin, 'wb') ! f.write(encodedtextwrapped % (0644, self.tmpout)) ! f.close() ! ! f = open(self.tmpin, 'rb') ! uu.decode(f) ! f.close() ! ! f = open(self.tmpout, 'r') ! s = f.read() ! f.close() ! self.assertEqual(s, plaintext) ! # XXX is there an xp way to verify the mode? ! finally: ! self._kill(f) ! ! def test_decodetwice(self): ! # Verify that decode() will refuse to overwrite an existing file ! try: ! f = cStringIO.StringIO(encodedtextwrapped % (0644, self.tmpout)) ! ! f = open(self.tmpin, 'rb') ! uu.decode(f) ! f.close() ! ! f = open(self.tmpin, 'rb') ! self.assertRaises(uu.Error, uu.decode, f) ! f.close() ! finally: ! self._kill(f) ! ! def test_main(): ! test_support.run_unittest(UUTest, UUStdIOTest, UUFileTest) ! ! if __name__=="__main__": ! test_main() From rhettinger@users.sourceforge.net Tue May 6 10:01:44 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Tue, 06 May 2003 02:01:44 -0700 Subject: [Python-checkins] python/dist/src/Objects funcobject.c,2.61,2.62 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv19382 Modified Files: funcobject.c Log Message: SF bug #692959: new.function ignores keyword arguments Index: funcobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/funcobject.c,v retrieving revision 2.61 retrieving revision 2.62 diff -C2 -d -r2.61 -r2.62 *** funcobject.c 8 Apr 2003 21:28:47 -0000 2.61 --- funcobject.c 6 May 2003 09:01:41 -0000 2.62 *************** *** 317,322 **** PyFunctionObject *newfunc; int nfree, nclosure; ! if (!PyArg_ParseTuple(args, "O!O!|OOO:function", &PyCode_Type, &code, &PyDict_Type, &globals, --- 317,325 ---- PyFunctionObject *newfunc; int nfree, nclosure; + static char *kwlist[] = {"code", "globals", "name", + "argdefs", "closure", 0}; ! if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function", ! kwlist, &PyCode_Type, &code, &PyDict_Type, &globals, From jackjansen@users.sourceforge.net Tue May 6 13:44:03 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Tue, 06 May 2003 05:44:03 -0700 Subject: [Python-checkins] python/dist/src/Lib/plat-mac pimp.py,1.19,1.20 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/plat-mac In directory sc8-pr-cvs1:/tmp/cvs-serv13618 Modified Files: pimp.py Log Message: When doing a forced install of a package depending on a pseudo-package you got a strange error message. Fixed. Index: pimp.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/pimp.py,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** pimp.py 2 May 2003 20:27:40 -0000 1.19 --- pimp.py 6 May 2003 12:44:00 -0000 1.20 *************** *** 133,137 **** names = [member.name for member in skip if member.name[-1] != '/'] if names: ! return "Not all files were unpacked: %s" % " ".join(names) ARCHIVE_FORMATS = [ --- 133,137 ---- names = [member.name for member in skip if member.name[-1] != '/'] if names: ! return "Not all files were unpacked: %s" % " ".join(names) ARCHIVE_FORMATS = [ *************** *** 469,472 **** --- 469,477 ---- rv = [] if not self._dict.get('Download-URL'): + # For pseudo-packages that are already installed we don't + # return an error message + status, _ = self.installed() + if status == "yes": + return [] return [(None, "%s: This package cannot be installed automatically (no Download-URL field)" % From jackjansen@users.sourceforge.net Tue May 6 14:07:35 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Tue, 06 May 2003 06:07:35 -0700 Subject: [Python-checkins] python/dist/src/Lib/plat-mac pimp.py,1.20,1.21 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/plat-mac In directory sc8-pr-cvs1:/tmp/cvs-serv23514 Modified Files: pimp.py Log Message: Allow for Version, Flavor and Download-URL not being set. Index: pimp.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/pimp.py,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** pimp.py 6 May 2003 12:44:00 -0000 1.20 --- pimp.py 6 May 2003 13:07:32 -0000 1.21 *************** *** 381,389 **** def name(self): return self._dict['Name'] ! def version(self): return self._dict['Version'] ! def flavor(self): return self._dict['Flavor'] def description(self): return self._dict['Description'] def homepage(self): return self._dict.get('Home-page') ! def downloadURL(self): return self._dict['Download-URL'] def fullname(self): --- 381,389 ---- def name(self): return self._dict['Name'] ! def version(self): return self._dict.get('Version') ! def flavor(self): return self._dict.get('Flavor') def description(self): return self._dict['Description'] def homepage(self): return self._dict.get('Home-page') ! def downloadURL(self): return self._dict.get('Download-URL') def fullname(self): From jackjansen@users.sourceforge.net Tue May 6 15:28:35 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Tue, 06 May 2003 07:28:35 -0700 Subject: [Python-checkins] python/dist/src/Mac/Tools/IDE PyConsole.py,1.15,1.16 PyEdit.py,1.39,1.40 PythonIDEMain.py,1.34,1.35 Wapplication.py,1.21,1.22 Message-ID: Update of /cvsroot/python/python/dist/src/Mac/Tools/IDE In directory sc8-pr-cvs1:/tmp/cvs-serv28244 Modified Files: PyConsole.py PyEdit.py PythonIDEMain.py Wapplication.py Log Message: Fix for #731643: allow "lookup in documentation" to also work if the interactive window is frontmost. Index: PyConsole.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/Tools/IDE/PyConsole.py,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** PyConsole.py 6 Feb 2003 22:32:35 -0000 1.15 --- PyConsole.py 6 May 2003 14:28:30 -0000 1.16 *************** *** 237,241 **** prefs.save() ! class OutputTextWidget(W.EditText): --- 237,243 ---- prefs.save() ! def getselectedtext(self): ! return self.consoletext.getselectedtext() ! class OutputTextWidget(W.EditText): Index: PyEdit.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/Tools/IDE/PyEdit.py,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** PyEdit.py 25 Feb 2003 15:08:01 -0000 1.39 --- PyEdit.py 6 May 2003 14:28:31 -0000 1.40 *************** *** 169,172 **** --- 169,175 ---- def setselection(self, selstart, selend): self.editgroup.editor.setselection(selstart, selend) + + def getselectedtext(self): + return self.editgroup.editor.getselectedtext() def getfilename(self): Index: PythonIDEMain.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/Tools/IDE/PythonIDEMain.py,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** PythonIDEMain.py 2 May 2003 23:40:29 -0000 1.34 --- PythonIDEMain.py 6 May 2003 14:28:31 -0000 1.35 *************** *** 415,422 **** def _getsearchstring(self): ! import PyEdit ! editor = PyEdit.findeditor(None, fromtop=1) ! if editor: ! text = editor.getselectedtext() if text: return text --- 415,422 ---- def _getsearchstring(self): ! # First we get the frontmost window ! front = self.getfrontwindow() ! if front and hasattr(front, 'getselectedtext'): ! text = front.getselectedtext() if text: return text Index: Wapplication.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/Tools/IDE/Wapplication.py,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** Wapplication.py 6 Feb 2003 22:32:35 -0000 1.21 --- Wapplication.py 6 May 2003 14:28:31 -0000 1.22 *************** *** 132,135 **** --- 132,141 ---- apply(handler, args) return 1 + + def getfrontwindow(self): + wid = MyFrontWindow() + if wid and self._windows.has_key(wid): + return self._windows[wid] + return None def appendwindow(self, wid, window): From montanaro@users.sourceforge.net Tue May 6 16:30:23 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 08:30:23 -0700 Subject: [Python-checkins] python/dist/src Makefile.pre.in,1.121,1.122 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv30258 Modified Files: Makefile.pre.in Log Message: add testall target - just adds -uall to the regrtest runs Index: Makefile.pre.in =================================================================== RCS file: /cvsroot/python/python/dist/src/Makefile.pre.in,v retrieving revision 1.121 retrieving revision 1.122 diff -C2 -d -r1.121 -r1.122 *** Makefile.pre.in 17 Apr 2003 14:55:39 -0000 1.121 --- Makefile.pre.in 6 May 2003 15:30:20 -0000 1.122 *************** *** 523,526 **** --- 523,531 ---- $(TESTPYTHON) $(TESTPROG) $(TESTOPTS) + testall: all platform + -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f + -$(TESTPYTHON) $(TESTPROG) $(TESTOPTS) -uall + $(TESTPYTHON) $(TESTPROG) $(TESTOPTS) -uall + QUICKTESTOPTS= $(TESTOPTS) -x test_thread test_signal test_strftime \ test_unicodedata test_re test_sre test_select test_poll \ From montanaro@users.sourceforge.net Tue May 6 16:56:08 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 08:56:08 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_csv.py,1.6,1.7 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv10838 Modified Files: test_csv.py Log Message: add not-yet-supported Unicode test just so it doesn't get lost. Index: test_csv.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_csv.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** test_csv.py 1 May 2003 17:45:36 -0000 1.6 --- test_csv.py 6 May 2003 15:56:05 -0000 1.7 *************** *** 1,2 **** --- 1,3 ---- + # -*- coding: iso-8859-1 -*- # Copyright (C) 2001,2002 Python Software Foundation # csv package unit tests *************** *** 640,643 **** --- 641,663 ---- # if writer leaks during write, last delta should be 5 or more self.assertEqual(delta < 5, True) + + # commented out for now - csv module doesn't yet support Unicode + if 0: + from StringIO import StringIO + import csv + + class TestUnicode(unittest.TestCase): + def test_unicode_read(self): + import codecs + f = codecs.EncodedFile(StringIO("Martin von Löwis," + "Marc André Lemburg," + "Guido van Rossum," + "François Pinard\r\n"), + data_encoding='iso-8859-1') + reader = csv.reader(f) + self.assertEqual(list(reader), [[u"Martin von Löwis", + u"Marc André Lemburg", + u"Guido van Rossum", + u"François Pinardn"]]) def test_main(): From montanaro@users.sourceforge.net Tue May 6 17:17:30 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 09:17:30 -0700 Subject: [Python-checkins] python/dist/src Makefile.pre.in,1.122,1.123 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv20452 Modified Files: Makefile.pre.in Log Message: add Guido's reasoning behind running all tests twice Index: Makefile.pre.in =================================================================== RCS file: /cvsroot/python/python/dist/src/Makefile.pre.in,v retrieving revision 1.122 retrieving revision 1.123 diff -C2 -d -r1.122 -r1.123 *** Makefile.pre.in 6 May 2003 15:30:20 -0000 1.122 --- Makefile.pre.in 6 May 2003 16:17:27 -0000 1.123 *************** *** 515,518 **** --- 515,525 ---- # Test the interpreter (twice, once without .pyc files, once with) + # In the past, we've had problems where bugs in the marshalling or + # elsewhere caused bytecode read from .pyc files to behave differently + # than bytecode generated directly from a .py source file. Sometimes + # the bytecode read from a .pyc file had the bug, somtimes the directly + # generated bytecode. This is sometimes a very shy bug needing a lot of + # sample data. + TESTOPTS= -l TESTPROG= $(srcdir)/Lib/test/regrtest.py From montanaro@users.sourceforge.net Tue May 6 21:36:30 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:36:30 -0700 Subject: [Python-checkins] python/dist/src/Lib/test regrtest.py,1.138,1.139 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv17228 Modified Files: regrtest.py Log Message: the new bsddb185 module is an expected skip on most platforms (this may not be needed - just being anal) Index: regrtest.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/regrtest.py,v retrieving revision 1.138 retrieving revision 1.139 diff -C2 -d -r1.138 -r1.139 *** regrtest.py 24 Apr 2003 19:05:41 -0000 1.138 --- regrtest.py 6 May 2003 20:36:24 -0000 1.139 *************** *** 556,559 **** --- 556,560 ---- """ test_al + test_bsddb185 test_bsddb3 test_cd *************** *** 591,594 **** --- 592,596 ---- """ test_al + test_bsddb185 test_cd test_cl *************** *** 610,613 **** --- 612,616 ---- test_atexit test_bsddb + test_bsddb185 test_bsddb3 test_bz2 *************** *** 652,655 **** --- 655,659 ---- test_al test_bsddb + test_bsddb185 test_cd test_cl *************** *** 672,675 **** --- 676,680 ---- test_al test_bsddb + test_bsddb185 test_cd test_cl *************** *** 693,696 **** --- 698,702 ---- test_asynchat test_bsddb + test_bsddb185 test_cd test_cl *************** *** 722,725 **** --- 728,732 ---- test_asynchat test_bsddb + test_bsddb185 test_cd test_cl *************** *** 782,785 **** --- 789,793 ---- test_al test_bsddb + test_bsddb185 test_cd test_cl *************** *** 801,804 **** --- 809,813 ---- test_al test_bsddb + test_bsddb185 test_cd test_cl *************** *** 825,828 **** --- 834,838 ---- """ test_al + test_bsddb185 test_cd test_cl *************** *** 848,851 **** --- 858,862 ---- """ test_al + test_bsddb185 test_bsddb3 test_cd *************** *** 869,872 **** --- 880,884 ---- test_al test_audioop + test_bsddb185 test_bsddb3 test_cd From montanaro@users.sourceforge.net Tue May 6 21:37:01 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:37:01 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_bsddb185.py,NONE,1.1 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv17550 Added Files: test_bsddb185.py Log Message: test case for bsddb185 module --- NEW FILE: test_bsddb185.py --- from test.test_support import verbose, run_unittest, findfile import unittest import bsddb185 import anydbm import whichdb import os import tempfile class Bsddb185Tests(unittest.TestCase): def test_open_existing_hash(self): "verify we can open a file known to be a hash v2 file" # do we need to worry about big vs little endian? db = bsddb185.hashopen(findfile("185test.db")) self.assertEqual(db["1"], "1") db.close() def test_whichdb(self): "verify that whichdb correctly sniffs the known hash v2 file" self.assertEqual(whichdb.whichdb(findfile("185test.db")), "bsddb185") def test_anydbm_create(self): "verify that anydbm.open does *not* create a bsddb185 file" tmpdir = tempfile.mkdtemp() try: try: dbfile = os.path.join(tmpdir, "foo.db") anydbm.open(dbfile, "c").close() ftype = whichdb.whichdb(findfile("foo.db")) self.assertNotEqual(ftype, "bsddb185") finally: os.unlink(dbfile) finally: os.rmdir(tmpdir) def test_main(): run_unittest(Bsddb185Tests) if __name__ == "__main__": test_main() From montanaro@users.sourceforge.net Tue May 6 21:37:28 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:37:28 -0700 Subject: [Python-checkins] python/dist/src/Lib/test 185test.db,NONE,1.1 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv17620/Lib/test Added Files: 185test.db Log Message: Data file for bsddb185 test --- NEW FILE: 185test.db --- (This appears to be a binary file; contents omitted.) From montanaro@users.sourceforge.net Tue May 6 21:37:58 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:37:58 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_bsddb185.py,1.1,1.2 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv18047 Modified Files: test_bsddb185.py Log Message: don't need to worry about file endianness Index: test_bsddb185.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_bsddb185.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_bsddb185.py 6 May 2003 20:36:57 -0000 1.1 --- test_bsddb185.py 6 May 2003 20:37:56 -0000 1.2 *************** *** 11,15 **** def test_open_existing_hash(self): "verify we can open a file known to be a hash v2 file" - # do we need to worry about big vs little endian? db = bsddb185.hashopen(findfile("185test.db")) self.assertEqual(db["1"], "1") --- 11,14 ---- From montanaro@users.sourceforge.net Tue May 6 21:38:55 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:38:55 -0700 Subject: [Python-checkins] python/dist/src/Modules bsddbmodule.c,1.38,1.39 Message-ID: Update of /cvsroot/python/python/dist/src/Modules In directory sc8-pr-cvs1:/tmp/cvs-serv18646 Modified Files: bsddbmodule.c Log Message: add open function to bsddb185 module so the file format sniffing can be restricted to the whichdb module Index: bsddbmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/bsddbmodule.c,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** bsddbmodule.c 19 Nov 2002 08:09:52 -0000 1.38 --- bsddbmodule.c 6 May 2003 20:38:52 -0000 1.39 *************** *** 839,842 **** --- 839,844 ---- {"btopen", (PyCFunction)bsdbtopen, METH_VARARGS}, {"rnopen", (PyCFunction)bsdrnopen, METH_VARARGS}, + /* strictly for use by dbhhash!!! */ + {"open", (PyCFunction)bsdhashopen, METH_VARARGS}, {0, 0}, }; From montanaro@users.sourceforge.net Tue May 6 21:39:57 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:39:57 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libbsddb.tex,1.8,1.9 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv19130 Modified Files: libbsddb.tex Log Message: add a note about the undocumented bsddb185 module Index: libbsddb.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libbsddb.tex,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** libbsddb.tex 17 Nov 2002 11:09:50 -0000 1.8 --- libbsddb.tex 6 May 2003 20:39:55 -0000 1.9 *************** *** 87,90 **** --- 87,96 ---- \end{seealso} + \begin{notice} + Beginning in 2.3 some Unix versions of Python may have a \module{bsddb185} + module. This is present \emph{only} to allow backwards compatibility with + systems which ship with the old Berkeley DB 1.85 database library. The + \module{bsddb185} module should never be used directly in new code. + \end{notice} \subsection{Hash, BTree and Record Objects \label{bsddb-objects}} From montanaro@users.sourceforge.net Tue May 6 21:40:20 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:40:20 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libundoc.tex,1.84,1.85 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv19329 Modified Files: libundoc.tex Log Message: add a note about the undocumented bsddb185 module Index: libundoc.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libundoc.tex,v retrieving revision 1.84 retrieving revision 1.85 diff -C2 -d -r1.84 -r1.85 *** libundoc.tex 24 Apr 2003 15:24:46 -0000 1.84 --- libundoc.tex 6 May 2003 20:40:17 -0000 1.85 *************** *** 63,66 **** --- 63,72 ---- \end{description} + \item[\module{bsddb185}] + --- Backwards compatibility module for systems which still use the Berkeley + DB 1.85 module. It is normally only available on certain BSD Unix-based + systems. It should never be used directly. + \end{description} + \section{Multimedia} From montanaro@users.sourceforge.net Tue May 6 21:42:13 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:42:13 -0700 Subject: [Python-checkins] python/dist/src/Lib whichdb.py,1.13,1.14 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv20191 Modified Files: whichdb.py Log Message: detect old version 2 hash files and return "bsddb185" as the appropriate module to load them Index: whichdb.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/whichdb.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** whichdb.py 2 Aug 2002 17:12:15 -0000 1.13 --- whichdb.py 6 May 2003 20:42:10 -0000 1.14 *************** *** 87,95 **** return "gdbm" ! # Check for BSD hash if magic in (0x00061561, 0x61150600): ! return "dbhash" ! # BSD hash v2 has a 12-byte NULL pad in front of the file type try: (magic,) = struct.unpack("=l", s16[-4:]) --- 87,96 ---- return "gdbm" ! # Check for old Berkeley db hash file format v2 if magic in (0x00061561, 0x61150600): ! return "bsddb185" ! # Later versions of Berkeley db hash file have a 12-byte pad in ! # front of the file type try: (magic,) = struct.unpack("=l", s16[-4:]) From montanaro@users.sourceforge.net Tue May 6 21:42:39 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:42:39 -0700 Subject: [Python-checkins] python/dist/src/Misc NEWS,1.756,1.757 Message-ID: Update of /cvsroot/python/python/dist/src/Misc In directory sc8-pr-cvs1:/tmp/cvs-serv20438 Modified Files: NEWS Log Message: add note about bsddb185 module Index: NEWS =================================================================== RCS file: /cvsroot/python/python/dist/src/Misc/NEWS,v retrieving revision 1.756 retrieving revision 1.757 diff -C2 -d -r1.756 -r1.757 *** NEWS 4 May 2003 04:16:51 -0000 1.756 --- NEWS 6 May 2003 20:42:37 -0000 1.757 *************** *** 22,25 **** --- 22,29 ---- Fixes SF bug #730685. + - the bsddb185 module is built in one restricted instance - + /usr/include/db.h exists and defines HASHVERSION to be 2. This is true + for many BSD-derived systems. + Library ------- From montanaro@users.sourceforge.net Tue May 6 21:43:37 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:43:37 -0700 Subject: [Python-checkins] python/dist/src setup.py,1.162,1.163 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv20887 Modified Files: setup.py Log Message: build bsddb185 module in certain restricted circumstances Index: setup.py =================================================================== RCS file: /cvsroot/python/python/dist/src/setup.py,v retrieving revision 1.162 retrieving revision 1.163 diff -C2 -d -r1.162 -r1.163 *** setup.py 3 May 2003 08:45:51 -0000 1.162 --- setup.py 6 May 2003 20:43:34 -0000 1.163 *************** *** 288,291 **** --- 288,296 ---- inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep) + # OSF/1 has some stuff in /usr/ccs/lib (like -ldb) + if platform[:4] == 'osf1': + platform = 'osf1' + lib_dirs += ['/usr/ccs/lib'] + # Check for MacOS X, which doesn't need libm.a at all math_libs = ['m'] *************** *** 560,563 **** --- 565,591 ---- dblibs = [] dblib_dir = None + + + # Look for Berkeley db 1.85. Note that it is built as a different + # module name so it can be included even when later versions are + # available. A very restrictive search is performed to avoid + # accidentally building this module with a later version of the + # underlying db library. May BSD-ish Unixes incorporate db 1.85 + # symbols into libc and place the include file in /usr/include. + f = "/usr/include/db.h" + if os.path.exists(f): + data = open(f).read() + m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data) + if m is not None: + # bingo - old version used hash file format version 2 + ### XXX this should be fixed to not be platform-dependent + ### but I don't have direct access to an osf1 platform and + ### seemed to be muffing the search somehow + libraries = platform == "osf1" and ['db'] or None + if libraries is not None: + exts.append(Extension('bsddb185', ['bsddbmodule.c'], + libraries=libraries)) + else: + exts.append(Extension('bsddb185', ['bsddbmodule.c'])) # The standard Unix dbm module: From montanaro@users.sourceforge.net Tue May 6 21:59:59 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Tue, 06 May 2003 13:59:59 -0700 Subject: [Python-checkins] python/dist/src setup.py,1.163,1.164 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv28626a Modified Files: setup.py Log Message: p.strip(os.sep) can't have possibly worked. It would have stripped both leading and trailing '/' characters on Unix systems. Index: setup.py =================================================================== RCS file: /cvsroot/python/python/dist/src/setup.py,v retrieving revision 1.163 retrieving revision 1.164 diff -C2 -d -r1.163 -r1.164 *** setup.py 6 May 2003 20:43:34 -0000 1.163 --- setup.py 6 May 2003 20:59:57 -0000 1.164 *************** *** 60,65 **** for p in std_dirs: # Ensure path doesn't end with path separator ! if p.endswith(os.sep): ! p = p.strip(os.sep) if p == dirname: return [ ] --- 60,64 ---- for p in std_dirs: # Ensure path doesn't end with path separator ! p = p.rstrip(os.sep) if p == dirname: return [ ] *************** *** 69,74 **** for p in paths: # Ensure path doesn't end with path separator ! if p.endswith(os.sep): ! p = p.strip(os.sep) if p == dirname: return [p] --- 68,72 ---- for p in paths: # Ensure path doesn't end with path separator ! p = p.rstrip(os.sep) if p == dirname: return [p] From gward@users.sourceforge.net Wed May 7 01:03:15 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Tue, 06 May 2003 17:03:15 -0700 Subject: [Python-checkins] python/nondist/peps pep-0001.txt,1.42,1.43 Message-ID: Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv4374 Modified Files: pep-0001.txt Log Message: Grammar fix. Index: pep-0001.txt =================================================================== RCS file: /cvsroot/python/python/nondist/peps/pep-0001.txt,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** pep-0001.txt 3 May 2003 16:01:32 -0000 1.42 --- pep-0001.txt 7 May 2003 00:03:13 -0000 1.43 *************** *** 51,55 **** The PEP process begins with a new idea for Python. It is highly recommended that a single PEP contain a single key proposal or new ! idea. The more focussed the PEP, the more successfully it tends to be. The PEP editor reserves the right to reject PEP proposals if they appear too unfocussed or too broad. If in doubt, split your PEP into --- 51,55 ---- The PEP process begins with a new idea for Python. It is highly recommended that a single PEP contain a single key proposal or new ! idea. The more focussed the PEP, the more successful it tends to be. The PEP editor reserves the right to reject PEP proposals if they appear too unfocussed or too broad. If in doubt, split your PEP into From rhettinger@users.sourceforge.net Wed May 7 01:49:43 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Tue, 06 May 2003 17:49:43 -0700 Subject: [Python-checkins] python/dist/src/Objects dictobject.c,2.145,2.146 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv17525 Modified Files: dictobject.c Log Message: SF patch #729395: Dictionary tuning Adjust resize argument for dict.update() and dict.copy(). Extends the previous change to dict.__setitem__(). Index: dictobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v retrieving revision 2.145 retrieving revision 2.146 diff -C2 -d -r2.145 -r2.146 *** dictobject.c 5 May 2003 22:22:10 -0000 2.145 --- dictobject.c 7 May 2003 00:49:40 -0000 2.146 *************** *** 1152,1156 **** */ if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) { ! if (dictresize(mp, (mp->ma_used + other->ma_used)*3/2) != 0) return -1; } --- 1152,1156 ---- */ if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) { ! if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0) return -1; } *************** *** 1237,1241 **** return NULL; if (mp->ma_used > 0) { ! if (dictresize(copy, mp->ma_used*3/2) != 0) return NULL; for (i = 0; i <= mp->ma_mask; i++) { --- 1237,1241 ---- return NULL; if (mp->ma_used > 0) { ! if (dictresize(copy, mp->ma_used*2) != 0) return NULL; for (i = 0; i <= mp->ma_mask; i++) { From gward@users.sourceforge.net Wed May 7 01:54:45 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Tue, 06 May 2003 17:54:45 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_textwrap.py,1.19,1.20 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv18955 Modified Files: test_textwrap.py Log Message: SF #726446: ensure wrap() raises ValueError when width <= 0. Index: test_textwrap.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_textwrap.py,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** test_textwrap.py 1 May 2003 17:45:51 -0000 1.19 --- test_textwrap.py 7 May 2003 00:54:42 -0000 1.20 *************** *** 263,266 **** --- 263,272 ---- "ball,", " ", "use", " ", "the", " ", "-b", " ", "option!"]) + def test_bad_width(self): + # Ensure that width <= 0 is caught. + text = "Whatever, it doesn't matter." + self.assertRaises(ValueError, wrap, text, 0) + self.assertRaises(ValueError, wrap, text, -1) + class LongWordTestCase (BaseTestCase): From gward@users.sourceforge.net Wed May 7 01:55:39 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Tue, 06 May 2003 17:55:39 -0700 Subject: [Python-checkins] python/dist/src/Lib textwrap.py,1.24,1.25 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv19191 Modified Files: textwrap.py Log Message: SF #726446: raise ValueError if width <= 0. Index: textwrap.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/textwrap.py,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** textwrap.py 14 Feb 2003 01:14:15 -0000 1.24 --- textwrap.py 7 May 2003 00:55:35 -0000 1.25 *************** *** 198,201 **** --- 198,203 ---- """ lines = [] + if self.width <= 0: + raise ValueError("invalid width %r (must be > 0)" % self.width) while chunks: From gward@users.sourceforge.net Wed May 7 02:19:24 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Tue, 06 May 2003 18:19:24 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_textwrap.py,1.20,1.21 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv27769 Modified Files: test_textwrap.py Log Message: SF #596434: add test_funky_parens() to probe some more of the tricky edge cases that David Goodger reported long ago (July 2002?). Index: test_textwrap.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_textwrap.py,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** test_textwrap.py 7 May 2003 00:54:42 -0000 1.20 --- test_textwrap.py 7 May 2003 01:19:22 -0000 1.21 *************** *** 225,233 **** self.check_split("--text--.", ["--text--."]) ! # My initial mis-interpretation of part of the bug report -- ! # These were always handled correctly, but it can't hurt to make ! # sure that they *stay* correct! self.check_split("--option", ["--option"]) self.check_split("--option-opt", ["--option-", "opt"]) def test_initial_whitespace(self): --- 225,249 ---- self.check_split("--text--.", ["--text--."]) ! # When I first read bug #596434, this is what I thought David ! # was talking about. I was wrong; these have always worked ! # fine. The real problem is tested in test_funky_parens() ! # below... self.check_split("--option", ["--option"]) self.check_split("--option-opt", ["--option-", "opt"]) + self.check_split("foo --option-opt bar", + ["foo", " ", "--option-", "opt", " ", "bar"]) + + def test_funky_parens (self): + # Second part of SF bug #596434: long option strings inside + # parentheses. + self.check_split("foo (--option) bar", + ["foo", " ", "(--option)", " ", "bar"]) + + # Related stuff -- make sure parens work in simpler contexts. + self.check_split("foo (bar) baz", + ["foo", " ", "(bar)", " ", "baz"]) + self.check_split("blah (ding dong), wubba", + ["blah", " ", "(ding", " ", "dong),", + " ", "wubba"]) def test_initial_whitespace(self): From gward@users.sourceforge.net Wed May 7 02:21:01 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Tue, 06 May 2003 18:21:01 -0700 Subject: [Python-checkins] python/dist/src/Lib textwrap.py,1.25,1.26 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv28249 Modified Files: textwrap.py Log Message: SF #596434: tweak wordsep_re so the definition of an em-dash is stricter: specifically, "--" must be preceded by a limited set of characters, not by any non-whitespace character. Index: textwrap.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/textwrap.py,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** textwrap.py 7 May 2003 00:55:35 -0000 1.25 --- textwrap.py 7 May 2003 01:20:58 -0000 1.26 *************** *** 76,80 **** wordsep_re = re.compile(r'(\s+|' # any whitespace r'-*\w{2,}-(?=\w{2,})|' # hyphenated words ! r'(?<=\S)-{2,}(?=\w))') # em-dash # XXX will there be a locale-or-charset-aware version of --- 76,80 ---- wordsep_re = re.compile(r'(\s+|' # any whitespace r'-*\w{2,}-(?=\w{2,})|' # hyphenated words ! r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') # em-dash # XXX will there be a locale-or-charset-aware version of From rhettinger@users.sourceforge.net Wed May 7 02:28:50 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Tue, 06 May 2003 18:28:50 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_types.py,1.50,1.51 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv29652/Lib/test Modified Files: test_types.py Log Message: SF bug #730296: Unexpected Changes in list Iterator Reverted a Py2.3b1 change to iterator in subclasses of list and tuple. They had been changed to use __getitem__ whenever it had been overriden in the subclass. This caused some usabilty and performance problems. Also, it was inconsistent with the rest of python where many container methods access the underlying object directly without first checking for an overridden getter. Users needing a change in iterator behavior should override it directly. Index: test_types.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_types.py,v retrieving revision 1.50 retrieving revision 1.51 diff -C2 -d -r1.50 -r1.51 *** test_types.py 24 Apr 2003 16:52:45 -0000 1.50 --- test_types.py 7 May 2003 01:28:47 -0000 1.51 *************** *** 257,265 **** vereq(list(tuple(f())), range(1000)) ! # Verify that __getitem__ overrides are recognized by __iter__ class T(tuple): def __getitem__(self, key): return str(key) + '!!!' ! vereq(iter(T()).next(), '0!!!') print '6.5.3 Lists' --- 257,265 ---- vereq(list(tuple(f())), range(1000)) ! # Verify that __getitem__ overrides are not recognized by __iter__ class T(tuple): def __getitem__(self, key): return str(key) + '!!!' ! vereq(iter(T((1,2))).next(), 1) print '6.5.3 Lists' *************** *** 454,462 **** vereq(a, [0, 1, 1, 3, 2, 5, 3, 7, 4, 9]) ! # Verify that __getitem__ overrides are recognized by __iter__ class L(list): def __getitem__(self, key): return str(key) + '!!!' ! vereq(iter(L()).next(), '0!!!') --- 454,462 ---- vereq(a, [0, 1, 1, 3, 2, 5, 3, 7, 4, 9]) ! # Verify that __getitem__ overrides are not recognized by __iter__ class L(list): def __getitem__(self, key): return str(key) + '!!!' ! vereq(iter(L([1,2])).next(), 1) From rhettinger@users.sourceforge.net Wed May 7 02:28:49 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Tue, 06 May 2003 18:28:49 -0700 Subject: [Python-checkins] python/dist/src/Misc NEWS,1.757,1.758 Message-ID: Update of /cvsroot/python/python/dist/src/Misc In directory sc8-pr-cvs1:/tmp/cvs-serv29652/Misc Modified Files: NEWS Log Message: SF bug #730296: Unexpected Changes in list Iterator Reverted a Py2.3b1 change to iterator in subclasses of list and tuple. They had been changed to use __getitem__ whenever it had been overriden in the subclass. This caused some usabilty and performance problems. Also, it was inconsistent with the rest of python where many container methods access the underlying object directly without first checking for an overridden getter. Users needing a change in iterator behavior should override it directly. Index: NEWS =================================================================== RCS file: /cvsroot/python/python/dist/src/Misc/NEWS,v retrieving revision 1.757 retrieving revision 1.758 diff -C2 -d -r1.757 -r1.758 *** NEWS 6 May 2003 20:42:37 -0000 1.757 --- NEWS 7 May 2003 01:28:47 -0000 1.758 *************** *** 16,19 **** --- 16,24 ---- It's writable again. + - Reverted a 2.3 beta 1 change to iterators for subclasses of list and + tuple. By default, the iterators now access data elements directly + instead of going through __getitem__. If __getitem__ access is + preferred, then __iter__ can be overriden. + Extension modules ----------------- From rhettinger@users.sourceforge.net Wed May 7 02:28:49 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Tue, 06 May 2003 18:28:49 -0700 Subject: [Python-checkins] python/dist/src/Objects listobject.c,2.151,2.152 tupleobject.c,2.80,2.81 Message-ID: Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv29652/Objects Modified Files: listobject.c tupleobject.c Log Message: SF bug #730296: Unexpected Changes in list Iterator Reverted a Py2.3b1 change to iterator in subclasses of list and tuple. They had been changed to use __getitem__ whenever it had been overriden in the subclass. This caused some usabilty and performance problems. Also, it was inconsistent with the rest of python where many container methods access the underlying object directly without first checking for an overridden getter. Users needing a change in iterator behavior should override it directly. Index: listobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/listobject.c,v retrieving revision 2.151 retrieving revision 2.152 diff -C2 -d -r2.151 -r2.152 *** listobject.c 3 May 2003 10:53:08 -0000 2.151 --- listobject.c 7 May 2003 01:28:47 -0000 2.152 *************** *** 2383,2388 **** return NULL; } - if (seq->ob_type->tp_as_sequence->sq_item != (intargfunc)list_item) - return PySeqIter_New(seq); it = PyObject_GC_New(listiterobject, &PyListIter_Type); if (it == NULL) --- 2383,2386 ---- Index: tupleobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/tupleobject.c,v retrieving revision 2.80 retrieving revision 2.81 diff -C2 -d -r2.80 -r2.81 *** tupleobject.c 24 Apr 2003 20:59:52 -0000 2.80 --- tupleobject.c 7 May 2003 01:28:47 -0000 2.81 *************** *** 754,759 **** return NULL; } - if (seq->ob_type->tp_as_sequence->sq_item != (intargfunc)tupleitem) - return PySeqIter_New(seq); it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type); if (it == NULL) --- 754,757 ---- From jackjansen@users.sourceforge.net Wed May 7 09:58:13 2003 From: jackjansen@users.sourceforge.net (jackjansen@users.sourceforge.net) Date: Wed, 07 May 2003 01:58:13 -0700 Subject: [Python-checkins] python/dist/src/Mac/OSX/Dist build,1.2,1.3 Message-ID: Update of /cvsroot/python/python/dist/src/Mac/OSX/Dist In directory sc8-pr-cvs1:/tmp/cvs-serv23308 Modified Files: build Log Message: Merged 1.2.2.1 fixes: - Don't generate README, but ask the user to provide it. - Create destination dir, if needed. - Updated for 2.3b1. Index: build =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/OSX/Dist/build,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** build 22 Mar 2003 00:02:23 -0000 1.2 --- build 7 May 2003 08:58:11 -0000 1.3 *************** *** 6,12 **** # Script configs ! PYVERSION=2.3a2 PYVER=2.3 ! BUILDNUM=3 DOCLEANUP=no --- 6,12 ---- # Script configs ! PYVERSION=2.3b1 PYVER=2.3 ! BUILDNUM=1 DOCLEANUP=no *************** *** 41,44 **** --- 41,52 ---- pushd $BUILDROOT + # Ask the user whether s/he has edited Welcome.txt + read -p "Have you updated $RESOURCEDIR/Welcome.txt (Y/n)? " welcome + + if [ "$welcome" = "n" -o "$welcome" = "N" ]; then + echo "Please do so and retry" + exit + fi + # Check if we should build and install the docs, but only if it # doesn't appear to be done already. TODO: fix this path to be version independent *************** *** 86,99 **** python $PYTHONSRC/Mac/scripts/zappycfiles.py $INSTALLROOT/Library/Frameworks/Python.framework/Versions/$PYVER/Mac/Tools - # Make the welcome message - cat > $RESOURCEDIR/Welcome.txt < Update of /cvsroot/python/python/dist/src/Mac/OSX/Dist/resources In directory sc8-pr-cvs1:/tmp/cvs-serv18347 Modified Files: Welcome.txt Log Message: Merged 2.3b1 welcome message to the trunk. Index: Welcome.txt =================================================================== RCS file: /cvsroot/python/python/dist/src/Mac/OSX/Dist/resources/Welcome.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Welcome.txt 21 Mar 2003 23:52:36 -0000 1.1 --- Welcome.txt 7 May 2003 09:41:56 -0000 1.2 *************** *** 1,6 **** ! Welcome! ! This program will install Python 2.3a2 for Mac OS X as a Framework. ! Build number: 3 ! Build date: Thu Mar 20 18:54:52 PST 2003 --- 1,19 ---- ! This program will install MacPython 2.3b1 for Mac OS X. ! MacPython consists of the Python programming language interpreter, plus ! a set of programs to allow easy access to it for Mac users (an ! integrated development environment, a Python extension package manager), ! plus a set of pre-built extension modules that open up specific ! Macintosh technologies to Python programs (Carbon, AppleScript, ! Quicktime, more). ! The installer puts the applications in MacPython-2.3 in your ! Applications folder, command-line tools in /usr/local/bin and the ! underlying machinery in /Library/Frameworks/Python.framework. ! ! The PythonIDE application has a Help command that gets you started ! quickly with MacPython and contains references to other documentation. ! ! More information on MacPython can be found at ! http://www.cwi.nl/~jack/macpython.html, more information on Python in ! general at http://www.python.org. From akuchling@users.sourceforge.net Wed May 7 15:50:51 2003 From: akuchling@users.sourceforge.net (akuchling@users.sourceforge.net) Date: Wed, 07 May 2003 07:50:51 -0700 Subject: [Python-checkins] python/nondist/peps pep-0314.txt,1.9,1.10 Message-ID: Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv12777 Modified Files: pep-0314.txt Log Message: Remove mention of 2.2 plans Add Download-URL Remove mention of separating lines in author field Index: pep-0314.txt =================================================================== RCS file: /cvsroot/python/python/nondist/peps/pep-0314.txt,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** pep-0314.txt 29 Apr 2003 17:37:08 -0000 1.9 --- pep-0314.txt 7 May 2003 14:50:49 -0000 1.10 *************** *** 38,43 **** parseable by the rfc822.py module. The field names listed in the following section are used as the header names. There's no ! extension mechanism in this simple format; the Catalog and Distutils ! SIGs will aim at getting a more flexible format ready for Python 2.2. --- 38,42 ---- parseable by the rfc822.py module. The field names listed in the following section are used as the header names. There's no ! extension mechanism in this simple format. *************** *** 98,102 **** Platform: POSIX, Windows ! Summary --- 97,101 ---- Platform: POSIX, Windows ! Summary *************** *** 139,153 **** Home-page: http://www.example.com/~cschultz/bvote/ Author (optional) ! A string containing at a minimum the author's name. Contact ! information can also be added, separating each line with ! newlines. Example: ! Author: C. Schultz ! Universal Features Syndicate ! Los Angeles, CA Author-email --- 138,156 ---- Home-page: http://www.example.com/~cschultz/bvote/ + Download-URL + + A string containing the URL from which this version of the package + can be downloaded. (This means that the URL can't be something like + ".../package-latest.tgz", but instead must be "../package-0.45.tgz".) + Author (optional) ! A string containing the author's name at a minimum; additional ! contact information may be provided. Example: ! Author: C. Schultz, Universal Features Syndicate, ! Los Angeles, CA Author-email From montanaro@users.sourceforge.net Wed May 7 16:29:14 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Wed, 07 May 2003 08:29:14 -0700 Subject: [Python-checkins] python/dist/src/Doc/tut tut.tex,1.180,1.181 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/tut In directory sc8-pr-cvs1:/tmp/cvs-serv30681 Modified Files: tut.tex Log Message: replace most uses of `...` by repr(...), noting that `...` is discouraged, but convenient in interactive sessions. Index: tut.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/tut/tut.tex,v retrieving revision 1.180 retrieving revision 1.181 diff -C2 -d -r1.180 -r1.181 *** tut.tex 22 Apr 2003 14:30:53 -0000 1.180 --- tut.tex 7 May 2003 15:29:12 -0000 1.181 *************** *** 2766,2772 **** One question remains, of course: how do you convert values to strings? Luckily, Python has ways to convert any value to a string: pass it to ! the \function{repr()} or \function{str()} functions, or just write ! the value between reverse quotes (\code{``}, equivalent to ! \function{repr()}). The \function{str()} function is meant to return representations of --- 2766,2772 ---- One question remains, of course: how do you convert values to strings? Luckily, Python has ways to convert any value to a string: pass it to ! the \function{repr()} or \function{str()} functions. Reverse quotes ! (\code{``}) are equivalent to \function{repr()}, but their use is ! discouraged. The \function{str()} function is meant to return representations of *************** *** 2787,2812 **** >>> str(s) 'Hello, world.' ! >>> `s` "'Hello, world.'" >>> str(0.1) '0.1' ! >>> `0.1` '0.10000000000000001' >>> x = 10 * 3.25 >>> y = 200 * 200 ! >>> s = 'The value of x is ' + `x` + ', and y is ' + `y` + '...' >>> print s The value of x is 32.5, and y is 40000... ! >>> # Reverse quotes work on other types besides numbers: ! ... p = [x, y] ! >>> ps = repr(p) ! >>> ps ! '[32.5, 40000]' ! >>> # Converting a string adds string quotes and backslashes: ... hello = 'hello, world\n' ! >>> hellos = `hello` >>> print hellos 'hello, world\n' ! >>> # The argument of reverse quotes may be a tuple: ... `x, y, ('spam', 'eggs')` "(32.5, 40000, ('spam', 'eggs'))" --- 2787,2810 ---- >>> str(s) 'Hello, world.' ! >>> repr(s) "'Hello, world.'" >>> str(0.1) '0.1' ! >>> repr(0.1) '0.10000000000000001' >>> x = 10 * 3.25 >>> y = 200 * 200 ! >>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...' >>> print s The value of x is 32.5, and y is 40000... ! >>> # The repr() of a string adds string quotes and backslashes: ... hello = 'hello, world\n' ! >>> hellos = repr(hello) >>> print hellos 'hello, world\n' ! >>> # The argument to repr() may be any Python object: ! ... repr(x, y, ('spam', 'eggs')) ! "(32.5, 40000, ('spam', 'eggs'))" ! >>> # reverse quotes are convenient in interactive sessions: ... `x, y, ('spam', 'eggs')` "(32.5, 40000, ('spam', 'eggs'))" *************** *** 2818,2824 **** >>> import string >>> for x in range(1, 11): ! ... print string.rjust(`x`, 2), string.rjust(`x*x`, 3), ... # Note trailing comma on previous line ! ... print string.rjust(`x*x*x`, 4) ... 1 1 1 --- 2816,2822 ---- >>> import string >>> for x in range(1, 11): ! ... print string.rjust(repr(x), 2), string.rjust(repr(x*x), 3), ... # Note trailing comma on previous line ! ... print string.rjust(repr(x*x*x), 4) ... 1 1 1 *************** *** 3358,3362 **** ... self.value = value ... def __str__(self): ! ... return `self.value` ... >>> try: --- 3356,3360 ---- ... self.value = value ... def __str__(self): ! ... return repr(self.value) ... >>> try: From montanaro@users.sourceforge.net Wed May 7 16:29:56 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Wed, 07 May 2003 08:29:56 -0700 Subject: [Python-checkins] python/dist/src/Doc/tut tut.tex,1.156.4.1.2.15,1.156.4.1.2.16 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/tut In directory sc8-pr-cvs1:/tmp/cvs-serv31046 Modified Files: Tag: release22-maint tut.tex Log Message: replace most uses of `...` by repr(...), noting that `...` is discouraged, but convenient in interactive sessions. Index: tut.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/tut/tut.tex,v retrieving revision 1.156.4.1.2.15 retrieving revision 1.156.4.1.2.16 diff -C2 -d -r1.156.4.1.2.15 -r1.156.4.1.2.16 *** tut.tex 28 Oct 2002 19:30:45 -0000 1.156.4.1.2.15 --- tut.tex 7 May 2003 15:29:53 -0000 1.156.4.1.2.16 *************** *** 2748,2754 **** One question remains, of course: how do you convert values to strings? Luckily, Python has ways to convert any value to a string: pass it to ! the \function{repr()} or \function{str()} functions, or just write ! the value between reverse quotes (\code{``}, equivalent to ! \function{repr()}). The \function{str()} function is meant to return representations of --- 2748,2754 ---- One question remains, of course: how do you convert values to strings? Luckily, Python has ways to convert any value to a string: pass it to ! the \function{repr()} or \function{str()} functions. Reverse quotes ! (\code{``}) are equivalent to \function{repr()}, but their use is ! discouraged. The \function{str()} function is meant to return representations of *************** *** 2769,2794 **** >>> str(s) 'Hello, world.' ! >>> `s` "'Hello, world.'" >>> str(0.1) '0.1' ! >>> `0.1` '0.10000000000000001' >>> x = 10 * 3.25 >>> y = 200 * 200 ! >>> s = 'The value of x is ' + `x` + ', and y is ' + `y` + '...' >>> print s The value of x is 32.5, and y is 40000... ! >>> # Reverse quotes work on other types besides numbers: ! ... p = [x, y] ! >>> ps = repr(p) ! >>> ps ! '[32.5, 40000]' ! >>> # Converting a string adds string quotes and backslashes: ... hello = 'hello, world\n' ! >>> hellos = `hello` >>> print hellos 'hello, world\n' ! >>> # The argument of reverse quotes may be a tuple: ... `x, y, ('spam', 'eggs')` "(32.5, 40000, ('spam', 'eggs'))" --- 2769,2792 ---- >>> str(s) 'Hello, world.' ! >>> repr(s) "'Hello, world.'" >>> str(0.1) '0.1' ! >>> repr(0.1) '0.10000000000000001' >>> x = 10 * 3.25 >>> y = 200 * 200 ! >>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...' >>> print s The value of x is 32.5, and y is 40000... ! >>> # The repr() of a string adds string quotes and backslashes: ... hello = 'hello, world\n' ! >>> hellos = repr(hello) >>> print hellos 'hello, world\n' ! >>> # The argument to repr() may be any Python object: ! ... repr(x, y, ('spam', 'eggs')) ! "(32.5, 40000, ('spam', 'eggs'))" ! >>> # reverse quotes are convenient in interactive sessions: ... `x, y, ('spam', 'eggs')` "(32.5, 40000, ('spam', 'eggs'))" *************** *** 2800,2806 **** >>> import string >>> for x in range(1, 11): ! ... print string.rjust(`x`, 2), string.rjust(`x*x`, 3), ... # Note trailing comma on previous line ! ... print string.rjust(`x*x*x`, 4) ... 1 1 1 --- 2798,2804 ---- >>> import string >>> for x in range(1, 11): ! ... print string.rjust(repr(x), 2), string.rjust(repr(x*x), 3), ... # Note trailing comma on previous line ! ... print string.rjust(repr(x*x*x), 4) ... 1 1 1 *************** *** 3340,3344 **** ... self.value = value ... def __str__(self): ! ... return `self.value` ... >>> try: --- 3338,3342 ---- ... self.value = value ... def __str__(self): ! ... return repr(self.value) ... >>> try: From montanaro@users.sourceforge.net Wed May 7 16:38:50 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Wed, 07 May 2003 08:38:50 -0700 Subject: [Python-checkins] python/dist/src setup.py,1.164,1.165 Message-ID: Update of /cvsroot/python/python/dist/src In directory sc8-pr-cvs1:/tmp/cvs-serv2976 Modified Files: setup.py Log Message: set platform properly for OSF/1 Index: setup.py =================================================================== RCS file: /cvsroot/python/python/dist/src/setup.py,v retrieving revision 1.164 retrieving revision 1.165 diff -C2 -d -r1.164 -r1.165 *** setup.py 6 May 2003 20:59:57 -0000 1.164 --- setup.py 7 May 2003 15:38:47 -0000 1.165 *************** *** 244,247 **** --- 244,249 ---- elif platform[:6] == 'atheos': platform = 'atheos' + elif platform[:4] == 'osf1': + platform = 'osf1' return platform *************** *** 287,292 **** # OSF/1 has some stuff in /usr/ccs/lib (like -ldb) ! if platform[:4] == 'osf1': ! platform = 'osf1' lib_dirs += ['/usr/ccs/lib'] --- 289,293 ---- # OSF/1 has some stuff in /usr/ccs/lib (like -ldb) ! if platform == 'osf1': lib_dirs += ['/usr/ccs/lib'] From thomas@xs4all.net Wed May 7 16:45:06 2003 From: thomas@xs4all.net (Thomas Wouters) Date: Wed, 7 May 2003 17:45:06 +0200 Subject: [Python-checkins] python/dist/src/Doc/tut tut.tex,1.180,1.181 In-Reply-To: References: Message-ID: <20030507154506.GJ26254@xs4all.nl> On Wed, May 07, 2003 at 08:29:14AM -0700, montanaro@users.sourceforge.net wrote: > ! >>> # The argument to repr() may be any Python object: > ! ... repr(x, y, ('spam', 'eggs')) > ! "(32.5, 40000, ('spam', 'eggs'))" Close, but no cigar: >>> repr(x, y, ('spam', 'eggs')) Traceback (most recent call last): File "", line 1, in ? TypeError: repr() takes exactly one argument (3 given) >>> repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))" This is what Fred meant in his 'it needs an additional set of parentheses' comment to the patch. -- Thomas Wouters Hi! I'm a .signature virus! copy me into your .signature file to help me spread! From skip@pobox.com Wed May 7 16:59:24 2003 From: skip@pobox.com (Skip Montanaro) Date: Wed, 7 May 2003 10:59:24 -0500 Subject: [Python-checkins] python/dist/src/Doc/tut tut.tex,1.180,1.181 In-Reply-To: <20030507154506.GJ26254@xs4all.nl> References: <20030507154506.GJ26254@xs4all.nl> Message-ID: <16057.11612.877632.172234@montanaro.dyndns.org> Thomas> On Wed, May 07, 2003 at 08:29:14AM -0700, montanaro@users.sourceforge.net wrote: >> ! >>> # The argument to repr() may be any Python object: >> ! ... repr(x, y, ('spam', 'eggs')) >> ! "(32.5, 40000, ('spam', 'eggs'))" Thomas> Close, but no cigar: >>>> repr(x, y, ('spam', 'eggs')) Thomas> Traceback (most recent call last): Thomas> File "", line 1, in ? Thomas> TypeError: repr() takes exactly one argument (3 given) Whoops! Yeah, Fred said something about a missing paren, but I thought he meant missing right paren. I'll fix it in a jiff. Skip From montanaro@users.sourceforge.net Wed May 7 17:01:46 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Wed, 07 May 2003 09:01:46 -0700 Subject: [Python-checkins] python/dist/src/Doc/tut tut.tex,1.181,1.182 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/tut In directory sc8-pr-cvs1:/tmp/cvs-serv15146 Modified Files: tut.tex Log Message: add missing parens - verified w/ interpreter - sorry to dismiss your comment Fred Index: tut.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/tut/tut.tex,v retrieving revision 1.181 retrieving revision 1.182 diff -C2 -d -r1.181 -r1.182 *** tut.tex 7 May 2003 15:29:12 -0000 1.181 --- tut.tex 7 May 2003 16:01:43 -0000 1.182 *************** *** 2804,2808 **** 'hello, world\n' >>> # The argument to repr() may be any Python object: ! ... repr(x, y, ('spam', 'eggs')) "(32.5, 40000, ('spam', 'eggs'))" >>> # reverse quotes are convenient in interactive sessions: --- 2804,2808 ---- 'hello, world\n' >>> # The argument to repr() may be any Python object: ! ... repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))" >>> # reverse quotes are convenient in interactive sessions: From akuchling@users.sourceforge.net Wed May 7 17:21:59 2003 From: akuchling@users.sourceforge.net (akuchling@users.sourceforge.net) Date: Wed, 07 May 2003 09:21:59 -0700 Subject: [Python-checkins] python/nondist/peps pep-0314.txt,1.10,1.11 Message-ID: Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv24589 Modified Files: pep-0314.txt Log Message: Fix field name; add Download-URL to list of changes Index: pep-0314.txt =================================================================== RCS file: /cvsroot/python/python/nondist/peps/pep-0314.txt,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** pep-0314.txt 7 May 2003 14:50:49 -0000 1.10 --- pep-0314.txt 7 May 2003 16:21:57 -0000 1.11 *************** *** 112,116 **** assume any maximum size for this field, though one hopes that people won't include their instruction manual as the ! long-description.) Example: --- 112,116 ---- assume any maximum size for this field, though one hopes that people won't include their instruction manual as the ! description.) Example: *************** *** 321,325 **** * Added the Classifiers field from PEP 301. ! * Added fields: Requires, Provides, Obsoletes, Conflicts. --- 321,325 ---- * Added the Classifiers field from PEP 301. ! * Added fields: Download-URL, Requires, Provides, Obsoletes, Conflicts. From montanaro@users.sourceforge.net Wed May 7 17:02:08 2003 From: montanaro@users.sourceforge.net (montanaro@users.sourceforge.net) Date: Wed, 07 May 2003 09:02:08 -0700 Subject: [Python-checkins] python/dist/src/Doc/tut tut.tex,1.156.4.1.2.16,1.156.4.1.2.17 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/tut In directory sc8-pr-cvs1:/tmp/cvs-serv15343 Modified Files: Tag: release22-maint tut.tex Log Message: add missing parens - verified w/ interpreter - sorry to dismiss your comment Fred Index: tut.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/tut/tut.tex,v retrieving revision 1.156.4.1.2.16 retrieving revision 1.156.4.1.2.17 diff -C2 -d -r1.156.4.1.2.16 -r1.156.4.1.2.17 *** tut.tex 7 May 2003 15:29:53 -0000 1.156.4.1.2.16 --- tut.tex 7 May 2003 16:02:06 -0000 1.156.4.1.2.17 *************** *** 2786,2790 **** 'hello, world\n' >>> # The argument to repr() may be any Python object: ! ... repr(x, y, ('spam', 'eggs')) "(32.5, 40000, ('spam', 'eggs'))" >>> # reverse quotes are convenient in interactive sessions: --- 2786,2790 ---- 'hello, world\n' >>> # The argument to repr() may be any Python object: ! ... repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))" >>> # reverse quotes are convenient in interactive sessions: From akuchling@users.sourceforge.net Wed May 7 17:34:55 2003 From: akuchling@users.sourceforge.net (akuchling@users.sourceforge.net) Date: Wed, 07 May 2003 09:34:55 -0700 Subject: [Python-checkins] python/nondist/peps pep-0314.txt,1.11,1.12 Message-ID: Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv30141 Modified Files: pep-0314.txt Log Message: Describe Supported-Platform on its own Index: pep-0314.txt =================================================================== RCS file: /cvsroot/python/python/nondist/peps/pep-0314.txt,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** pep-0314.txt 7 May 2003 16:21:57 -0000 1.11 --- pep-0314.txt 7 May 2003 16:34:52 -0000 1.12 *************** *** 89,100 **** POSIX, MacOS, Windows, BeOS, PalmOS. - Binary distributions will use the Supported-Platform field in - their metadata to specify the OS and CPU for which the binary - package was compiled. The semantics of the Supported-Platform - are not specified in this PEP. - Example: Platform: POSIX, Windows Summary --- 89,107 ---- POSIX, MacOS, Windows, BeOS, PalmOS. Example: Platform: POSIX, Windows + + Supported-Platform + + Binary distributions containing a PKG-INFO file will use the + Supported-Platform field in their metadata to specify the OS and + CPU for which the binary package was compiled. The semantics of + the Supported-Platform field are not specified in this PEP. + + Example: + + Supported-Platform: RedHat 7.2 + Supported-Platform: i386-win32-2791 Summary From akuchling@users.sourceforge.net Wed May 7 17:53:31 2003 From: akuchling@users.sourceforge.net (akuchling@users.sourceforge.net) Date: Wed, 07 May 2003 09:53:31 -0700 Subject: [Python-checkins] python/nondist/peps pep-0314.txt,1.12,1.13 Message-ID: Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv4120 Modified Files: pep-0314.txt Log Message: Mention use of reST in description Index: pep-0314.txt =================================================================== RCS file: /cvsroot/python/python/nondist/peps/pep-0314.txt,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** pep-0314.txt 7 May 2003 16:34:52 -0000 1.12 --- pep-0314.txt 7 May 2003 16:53:28 -0000 1.13 *************** *** 116,123 **** A longer description of the package that can run to several ! paragraphs. (Software that deals with metadata should not ! assume any maximum size for this field, though one hopes that ! people won't include their instruction manual as the ! description.) Example: --- 116,128 ---- A longer description of the package that can run to several ! paragraphs. Software that deals with metadata should not assume ! any maximum size for this field, though people shouldn't include ! their instruction manual as the description. ! ! The contents of this field can be written using reStructuredText ! markup [1]. For programs that work with the metadata, ! supporting markup is optional; programs can also display the ! contents of the field as-is. This means that authors should be ! conservative in the markup they use. Example: *************** *** 125,129 **** Description: This module collects votes from beagles in order to determine their electoral wishes. ! Do NOT try to use this module with basset hounds; it makes them grumpy. --- 130,134 ---- Description: This module collects votes from beagles in order to determine their electoral wishes. ! Do *not* try to use this module with basset hounds; it makes them grumpy. *************** *** 231,235 **** Each entry is a string giving a single classification value ! for the package. Classifiers are described in PEP 301 [1]. Examples: --- 236,240 ---- Each entry is a string giving a single classification value ! for the package. Classifiers are described in PEP 301 [2]. Examples: *************** *** 339,348 **** Acknowledgements ! None yet. References ! [1] PEP 301 http://www.python.org/peps/pep-0301.html --- 344,356 ---- Acknowledgements ! Richard Jones suggested using reST for the Description field. References ! [1] reStructured text ! http://docutils.sourceforge.net/ ! ! [2] PEP 301 http://www.python.org/peps/pep-0301.html From akuchling@users.sourceforge.net Wed May 7 18:00:40 2003 From: akuchling@users.sourceforge.net (akuchling@users.sourceforge.net) Date: Wed, 07 May 2003 10:00:40 -0700 Subject: [Python-checkins] python/dist/src/Doc/whatsnew whatsnew23.tex,1.144,1.145 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/whatsnew In directory sc8-pr-cvs1:/tmp/cvs-serv6782 Modified Files: whatsnew23.tex Log Message: Add list.insert() change for negative positions Add ~ to MvL's last name Fix use of all-caps for a name Bump version number Index: whatsnew23.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/whatsnew/whatsnew23.tex,v retrieving revision 1.144 retrieving revision 1.145 diff -C2 -d -r1.144 -r1.145 *** whatsnew23.tex 30 Apr 2003 15:03:46 -0000 1.144 --- whatsnew23.tex 7 May 2003 17:00:35 -0000 1.145 *************** *** 4,8 **** \title{What's New in Python 2.3} ! \release{0.10} \author{A.M.\ Kuchling} \authoraddress{\email{amk@amk.ca}} --- 4,8 ---- \title{What's New in Python 2.3} ! \release{0.11} \author{A.M.\ Kuchling} \authoraddress{\email{amk@amk.ca}} *************** *** 301,306 **** \seepep{263}{Defining Python Source Code Encodings}{Written by ! Marc-Andr\'e Lemburg and Martin von L\"owis; implemented by SUZUKI ! Hisao and Martin von L\"owis.} \end{seealso} --- 301,306 ---- \seepep{263}{Defining Python Source Code Encodings}{Written by ! Marc-Andr\'e Lemburg and Martin von~L\"owis; implemented by Suzuki ! Hisao and Martin von~L\"owis.} \end{seealso} *************** *** 336,340 **** \seepep{277}{Unicode file name support for Windows NT}{Written by Neil ! Hodgson; implemented by Neil Hodgson, Martin von L\"owis, and Mark Hammond.} --- 336,340 ---- \seepep{277}{Unicode file name support for Windows NT}{Written by Neil ! Hodgson; implemented by Neil Hodgson, Martin von~L\"owis, and Mark Hammond.} *************** *** 1092,1095 **** --- 1092,1101 ---- Martelli.) + \item \code{list.insert(\var{pos}, \var{value})} used to + insert \var{value} at the front of the list when \var{pos} was + negative. The behaviour has now been changed to be consistent with + slice indexing, so when \var{pos} is -1 the value will be inserted + before the last element, and so forth. + \item Dictionaries have a new method, \method{pop(\var{key}\optional{, \var{default}})}, that returns the value corresponding to \var{key} *************** *** 1787,1791 **** \url{http://mail.python.org/pipermail/python-dev/2002-December/031107.html} % for a more detailed explanation of this change. (Implemented by ! Martin von L\"owis.) \item Calling Tcl methods through \module{_tkinter} no longer --- 1793,1797 ---- \url{http://mail.python.org/pipermail/python-dev/2002-December/031107.html} % for a more detailed explanation of this change. (Implemented by ! Martin von~L\"owis.) \item Calling Tcl methods through \module{_tkinter} no longer *************** *** 2329,2336 **** Andrew Dalke, Scott David Daniels, Fred~L. Drake, Jr., Kelly Gerber, Raymond Hettinger, Michael Hudson, Chris Lambert, Detlef Lannert, ! Martin von L\"owis, Andrew MacIntyre, Lalo Martins, Gustavo Niemeyer, ! Neal Norwitz, Hans Nowak, Chris Reedy, Francesco Ricciardi, ! Vinay Sajip, Neil Schemenauer, ! Roman Suzi, Jason Tishler, Just van~Rossum. \end{document} --- 2335,2342 ---- Andrew Dalke, Scott David Daniels, Fred~L. Drake, Jr., Kelly Gerber, Raymond Hettinger, Michael Hudson, Chris Lambert, Detlef Lannert, ! Martin von~L\"owis, Andrew MacIntyre, Lalo Martins, Chad Netzer, ! Gustavo Niemeyer, Neal Norwitz, Hans Nowak, Chris Reedy, Francesco ! Ricciardi, Vinay Sajip, Neil Schemenauer, Roman Suzi, Jason Tishler, ! Just van~Rossum. \end{document} From rhettinger@users.sourceforge.net Wed May 7 18:11:19 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Wed, 07 May 2003 10:11:19 -0700 Subject: [Python-checkins] python/dist/src/Doc/tut tut.tex,1.182,1.183 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/tut In directory sc8-pr-cvs1:/tmp/cvs-serv11160 Modified Files: tut.tex Log Message: Update traceback message Index: tut.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/tut/tut.tex,v retrieving revision 1.182 retrieving revision 1.183 diff -C2 -d -r1.182 -r1.183 *** tut.tex 7 May 2003 16:01:43 -0000 1.182 --- tut.tex 7 May 2003 17:11:15 -0000 1.183 *************** *** 851,855 **** Traceback (most recent call last): File "", line 1, in ? ! UnicodeError: ASCII encoding error: ordinal not in range(128) \end{verbatim} --- 851,855 ---- Traceback (most recent call last): File "", line 1, in ? ! UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) \end{verbatim} From rhettinger@users.sourceforge.net Wed May 7 18:49:39 2003 From: rhettinger@users.sourceforge.net (rhettinger@users.sourceforge.net) Date: Wed, 07 May 2003 10:49:39 -0700 Subject: [Python-checkins] python/dist/src/Doc/tut tut.tex,1.183,1.184 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/tut In directory sc8-pr-cvs1:/tmp/cvs-serv25734 Modified Files: tut.tex Log Message: More message updates and minor fixes. Index: tut.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/tut/tut.tex,v retrieving revision 1.183 retrieving revision 1.184 diff -C2 -d -r1.183 -r1.184 *** tut.tex 7 May 2003 17:11:15 -0000 1.183 --- tut.tex 7 May 2003 17:49:36 -0000 1.184 *************** *** 1468,1472 **** Traceback (most recent call last): File "", line 1, in ? ! TypeError: keyword parameter redefined \end{verbatim} --- 1468,1472 ---- Traceback (most recent call last): File "", line 1, in ? ! TypeError: function() got multiple values for keyword argument 'a' \end{verbatim} *************** *** 1876,1882 **** >>> [x**3 for x in range(5)] [0, 1, 8, 27, 64] ! >>> x ! 4 # the final value for range(5) ! >> \end{verbatim} --- 1876,1881 ---- >>> [x**3 for x in range(5)] [0, 1, 8, 27, 64] ! >>> x # the final value for range(5) ! 4 \end{verbatim} *************** *** 1890,1895 **** \begin{verbatim} ! >>> a ! [-1, 1, 66.6, 333, 333, 1234.5] >>> del a[0] >>> a --- 1889,1893 ---- \begin{verbatim} ! >>> a = [-1, 1, 66.6, 333, 333, 1234.5] >>> del a[0] >>> a *************** *** 2037,2041 **** ['guido', 'irv', 'jack'] >>> tel.has_key('guido') ! 1 \end{verbatim} --- 2035,2039 ---- ['guido', 'irv', 'jack'] >>> tel.has_key('guido') ! True \end{verbatim} *************** *** 2429,2433 **** C> print 'Yuck!' Yuck! ! C> \end{verbatim} --- 2427,2432 ---- C> print 'Yuck!' Yuck! ! C> ! \end{verbatim} *************** *** 3136,3140 **** Traceback (most recent call last): File "", line 1, in ? ! ZeroDivisionError: integer division or modulo >>> 4 + spam*3 Traceback (most recent call last): --- 3135,3139 ---- Traceback (most recent call last): File "", line 1, in ? ! ZeroDivisionError: integer division or modulo by zero >>> 4 + spam*3 Traceback (most recent call last): *************** *** 3144,3148 **** Traceback (most recent call last): File "", line 1, in ? ! TypeError: illegal argument type for built-in operation \end{verbatim} --- 3143,3147 ---- Traceback (most recent call last): File "", line 1, in ? ! TypeError: cannot concatenate 'str' and 'int' objects \end{verbatim} From dcjim@users.sourceforge.net Wed May 7 20:48:16 2003 From: dcjim@users.sourceforge.net (dcjim@users.sourceforge.net) Date: Wed, 07 May 2003 12:48:16 -0700 Subject: [Python-checkins] python/dist/src/Doc/ext noddy2.c,NONE,1.1 noddy3.c,NONE,1.1 newtypes.tex,1.21,1.22 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/ext In directory sc8-pr-cvs1:/tmp/cvs-serv13294 Modified Files: newtypes.tex Added Files: noddy2.c noddy3.c Log Message: Rewrote the basic section of the chapter on defining new types. Changed the example to show how to create types the new way: - Use a class new method rather than a new function. - Use self->ob_type->tp_free in deallocators - Use attribute descriptors rather than set/getattr methods. - Make the type usable as a base type. I split the example into 3 parts: 1. The minimal new type 2. Adding attributes and methods. 3. Finer control over attributes. It's much simpler to define builtin types. These updates hopefully show this. I also made minor wording changes in two other places. I still need to update xxobject.c --- NEW FILE: noddy2.c --- #include #include "structmember.h" typedef struct { PyObject_HEAD PyObject *first; PyObject *last; int number; } Noddy; static void Noddy_dealloc(Noddy* self) { Py_XDECREF(self->first); Py_XDECREF(self->last); self->ob_type->tp_free(self); } static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { Noddy *self; self = (Noddy *)type->tp_alloc(type, 0); if (self != NULL) { self->first = PyString_FromString(""); if (self->first == NULL) { Py_DECREF(self); return NULL; } self->last = PyString_FromString(""); if (self->last == NULL) { Py_DECREF(self); return NULL; } self->number = 0; } return (PyObject *)self; } static PyObject * Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) { PyObject *first=NULL, *last=NULL; static char *kwlist[] = {"first", "last", "number", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, &first, &last, &self->number)) return NULL; if (first) { Py_XDECREF(self->first); Py_INCREF(first); self->first = first; } if (last) { Py_XDECREF(self->last); Py_INCREF(last); self->last = last; } Py_INCREF(Py_None); return Py_None; } static PyMemberDef Noddy_members[] = { {"first", T_OBJECT_EX, offsetof(Noddy, first), 0, "first name"}, {"last", T_OBJECT_EX, offsetof(Noddy, last), 0, "last name"}, {"number", T_INT, offsetof(Noddy, number), 0, "noddy number"}, {NULL} /* Sentinel */ }; static PyObject * Noddy_name(Noddy* self) { static PyObject *format = NULL; PyObject *args, *result; if (format == NULL) { format = PyString_FromString("%s %s"); if (format == NULL) return NULL; } if (self->first == NULL) { PyErr_SetString(PyExc_AttributeError, "first"); return NULL; } if (self->last == NULL) { PyErr_SetString(PyExc_AttributeError, "last"); return NULL; } args = Py_BuildValue("OO", self->first, self->last); if (args == NULL) return NULL; result = PyString_Format(format, args); Py_DECREF(args); return result; } static PyMethodDef Noddy_methods[] = { {"name", (PyCFunction)Noddy_name, METH_NOARGS, "Return the name, combining the first and last name" }, {NULL} /* Sentinel */ }; static PyTypeObject NoddyType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "noddy.Noddy", /*tp_name*/ sizeof(Noddy), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)Noddy_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "Noddy objects", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ Noddy_methods, /* tp_methods */ Noddy_members, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)Noddy_init, /* tp_init */ 0, /* tp_alloc */ Noddy_new, /* tp_new */ }; static PyMethodDef module_methods[] = { {NULL} /* Sentinel */ }; PyMODINIT_FUNC initnoddy2(void) { PyObject* m; if (PyType_Ready(&NoddyType) < 0) return; m = Py_InitModule3("noddy2", module_methods, "Example module that creates an extension type."); if (m == NULL) return; PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType); } --- NEW FILE: noddy3.c --- #include #include "structmember.h" typedef struct { PyObject_HEAD PyObject *first; PyObject *last; int number; } Noddy; static void Noddy_dealloc(Noddy* self) { Py_XDECREF(self->first); Py_XDECREF(self->last); self->ob_type->tp_free(self); } static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { Noddy *self; self = (Noddy *)type->tp_alloc(type, 0); if (self != NULL) { self->first = PyString_FromString(""); if (self->first == NULL) { Py_DECREF(self); return NULL; } self->last = PyString_FromString(""); if (self->last == NULL) { Py_DECREF(self); return NULL; } self->number = 0; } return (PyObject *)self; } static PyObject * Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) { PyObject *first=NULL, *last=NULL; static char *kwlist[] = {"first", "last", "number", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, &first, &last, &self->number)) return NULL; if (first) { Py_DECREF(self->first); Py_INCREF(first); self->first = first; } if (last) { Py_DECREF(self->last); Py_INCREF(last); self->last = last; } Py_INCREF(Py_None); return Py_None; } static PyMemberDef Noddy_members[] = { {"number", T_INT, offsetof(Noddy, number), 0, "noddy number"}, {NULL} /* Sentinel */ }; static PyObject * Noddy_getfirst(Noddy *self, void *closure) { Py_INCREF(self->first); return self->first; } static int Noddy_setfirst(Noddy *self, PyObject *value, void *closure) { if (value == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute"); return -1; } if (! PyString_Check(value)) { PyErr_SetString(PyExc_TypeError, "The first attribute value must be a string"); return -1; } Py_DECREF(self->first); Py_INCREF(value); self->first = value; return 0; } static PyObject * Noddy_getlast(Noddy *self, void *closure) { Py_INCREF(self->last); return self->last; } static int Noddy_setlast(Noddy *self, PyObject *value, void *closure) { if (value == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute"); return -1; } if (! PyString_Check(value)) { PyErr_SetString(PyExc_TypeError, "The last attribute value must be a string"); return -1; } Py_DECREF(self->last); Py_INCREF(value); self->last = value; return 0; } static PyGetSetDef Noddy_getseters[] = { {"first", (getter)Noddy_getfirst, (setter)Noddy_setfirst, "first name", NULL}, {"last", (getter)Noddy_getlast, (setter)Noddy_setlast, "last name", NULL}, {NULL} /* Sentinel */ }; static PyObject * Noddy_name(Noddy* self) { static PyObject *format = NULL; PyObject *args, *result; if (format == NULL) { format = PyString_FromString("%s %s"); if (format == NULL) return NULL; } args = Py_BuildValue("OO", self->first, self->last); if (args == NULL) return NULL; result = PyString_Format(format, args); Py_DECREF(args); return result; } static PyMethodDef Noddy_methods[] = { {"name", (PyCFunction)Noddy_name, METH_NOARGS, "Return the name, combining the first and last name" }, {NULL} /* Sentinel */ }; static PyTypeObject NoddyType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "noddy.Noddy", /*tp_name*/ sizeof(Noddy), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)Noddy_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "Noddy objects", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ Noddy_methods, /* tp_methods */ Noddy_members, /* tp_members */ Noddy_getseters, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)Noddy_init, /* tp_init */ 0, /* tp_alloc */ Noddy_new, /* tp_new */ }; static PyMethodDef module_methods[] = { {NULL} /* Sentinel */ }; PyMODINIT_FUNC initnoddy3(void) { PyObject* m; if (PyType_Ready(&NoddyType) < 0) return; m = Py_InitModule3("noddy3", module_methods, "Example module that creates an extension type."); if (m == NULL) return; PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType); } Index: newtypes.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/ext/newtypes.tex,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** newtypes.tex 8 Jan 2003 03:02:26 -0000 1.21 --- newtypes.tex 7 May 2003 19:48:13 -0000 1.22 *************** *** 3,6 **** --- 3,7 ---- \sectionauthor{Michael Hudson}{mwh@python.net} \sectionauthor{Dave Kuhlman}{dkuhlman@rexx.com} + \sectionauthor{Jim Fulton}{jim@zope.com} As mentioned in the last chapter, Python allows the writer of an *************** *** 39,51 **** \begin{verbatim} - static PyTypeObject noddy_NoddyType; - \end{verbatim} - - This names the type object that will be defining further down in the - file. It can't be defined here because its definition has to refer to - functions that have not yet been defined, but we need to be able to - refer to it, hence the declaration. - - \begin{verbatim} typedef struct { PyObject_HEAD --- 40,43 ---- *************** *** 74,152 **** \end{verbatim} - Next up is: - - \begin{verbatim} - static PyObject* - noddy_new_noddy(PyObject* self, PyObject* args) - { - noddy_NoddyObject* noddy; - - if (!PyArg_ParseTuple(args,":new_noddy")) - return NULL; - - noddy = PyObject_New(noddy_NoddyObject, &noddy_NoddyType); - - return (PyObject*)noddy; - } - \end{verbatim} - - This is in fact just a regular module function, as described in the - last chapter. The reason it gets special mention is that this is - where we create our Noddy object. Defining \ctype{PyTypeObject} - structures is all very well, but if there's no way to actually - \emph{create} one of the wretched things it is not going to do anyone - much good. - - Almost always, you create objects with a call of the form: - - \begin{verbatim} - PyObject_New(, &); - \end{verbatim} - - This allocates the memory and then initializes the object (sets - the reference count to one, makes the \member{ob_type} pointer point at - the right place and maybe some other stuff, depending on build options). - You \emph{can} do these steps separately if you have some reason to - --- but at this level we don't bother. - - Note that \cfunction{PyObject_New()} is a polymorphic macro rather - than a real function. The first parameter is the name of the C - structure that represents an object of our new type, and the return - value is a pointer to that type. This would be - \ctype{noddy_NoddyObject} in our example: - - \begin{verbatim} - noddy_NoddyObject *my_noddy; - - my_noddy = PyObject_New(noddy_NoddyObject, &noddy_NoddyType); - \end{verbatim} - - We cast the return value to a \ctype{PyObject*} because that's what - the Python runtime expects. This is safe because of guarantees about - the layout of structures in the C standard, and is a fairly common C - programming trick. One could declare \cfunction{noddy_new_noddy} to - return a \ctype{noddy_NoddyObject*} and then put a cast in the - definition of \cdata{noddy_methods} further down the file --- it - doesn't make much difference. - - Now a Noddy object doesn't do very much and so doesn't need to - implement many type methods. One you can't avoid is handling - deallocation, so we find - - \begin{verbatim} - static void - noddy_noddy_dealloc(PyObject* self) - { - PyObject_Del(self); - } - \end{verbatim} - - This is so short as to be self explanatory. This function will be - called when the reference count on a Noddy object reaches \code{0} (or - it is found as part of an unreachable cycle by the cyclic garbage - collector). \cfunction{PyObject_Del()} is what you call when you want - an object to go away. If a Noddy object held references to other - Python objects, one would decref them here. - Moving on, we come to the crunch --- the type object. --- 66,69 ---- *************** *** 154,176 **** static PyTypeObject noddy_NoddyType = { PyObject_HEAD_INIT(NULL) ! 0, /* ob_size */ ! "Noddy", /* tp_name */ ! sizeof(noddy_NoddyObject), /* tp_basicsize */ ! 0, /* tp_itemsize */ ! noddy_noddy_dealloc, /* tp_dealloc */ ! 0, /* tp_print */ ! 0, /* tp_getattr */ ! 0, /* tp_setattr */ ! 0, /* tp_compare */ ! 0, /* tp_repr */ ! 0, /* tp_as_number */ ! 0, /* tp_as_sequence */ ! 0, /* tp_as_mapping */ ! 0, /* tp_hash */ }; \end{verbatim} Now if you go and look up the definition of \ctype{PyTypeObject} in ! \file{object.h} you'll see that it has many, many more fields that the definition above. The remaining fields will be filled with zeros by the C compiler, and it's common practice to not specify them --- 71,117 ---- static PyTypeObject noddy_NoddyType = { PyObject_HEAD_INIT(NULL) ! 0, /*ob_size*/ ! "noddy.Noddy", /*tp_name*/ ! sizeof(noddy_NoddyObject), /*tp_basicsize*/ ! 0, /*tp_itemsize*/ ! 0, /*tp_dealloc*/ ! 0, /*tp_print*/ ! 0, /*tp_getattr*/ ! 0, /*tp_setattr*/ ! 0, /*tp_compare*/ ! 0, /*tp_repr*/ ! 0, /*tp_as_number*/ ! 0, /*tp_as_sequence*/ ! 0, /*tp_as_mapping*/ ! 0, /*tp_hash */ ! 0, /*tp_call*/ ! 0, /*tp_str*/ ! 0, /*tp_getattro*/ ! 0, /*tp_setattro*/ ! 0, /*tp_as_buffer*/ ! Py_TPFLAGS_DEFAULT, /*tp_flags*/ ! "Noddy objects", /* tp_doc */ ! 0, /* tp_traverse */ ! 0, /* tp_clear */ ! 0, /* tp_richcompare */ ! 0, /* tp_weaklistoffset */ ! 0, /* tp_iter */ ! 0, /* tp_iternext */ ! 0, /* tp_methods */ ! 0, /* tp_members */ ! 0, /* tp_getset */ ! 0, /* tp_base */ ! 0, /* tp_dict */ ! 0, /* tp_descr_get */ ! 0, /* tp_descr_set */ ! 0, /* tp_dictoffset */ ! 0, /* tp_init */ ! 0, /* tp_alloc */ ! PyType_GenericNew, /* tp_new */ }; \end{verbatim} Now if you go and look up the definition of \ctype{PyTypeObject} in ! \file{object.h} you'll see that it has many more fields that the definition above. The remaining fields will be filled with zeros by the C compiler, and it's common practice to not specify them *************** *** 191,197 **** as the type of a type object is ``type'', but this isn't strictly ! conforming C and some compilers complain. So instead we fill in the ! \member{ob_type} field of \cdata{noddy_NoddyType} at the earliest ! oppourtunity --- in \cfunction{initnoddy()}. \begin{verbatim} --- 132,137 ---- as the type of a type object is ``type'', but this isn't strictly ! conforming C and some compilers complain. Fortunately, this member ! will be filled in for us by \cfunction{PyType_Ready()}. \begin{verbatim} *************** *** 205,209 **** \begin{verbatim} ! "Noddy", /* tp_name */ \end{verbatim} --- 145,149 ---- \begin{verbatim} ! "noddy.Noddy", /* tp_name */ \end{verbatim} *************** *** 215,221 **** Traceback (most recent call last): File "", line 1, in ? ! TypeError: cannot add type "Noddy" to string \end{verbatim} \begin{verbatim} sizeof(noddy_NoddyObject), /* tp_basicsize */ --- 155,166 ---- Traceback (most recent call last): File "", line 1, in ? ! TypeError: cannot add type "noddy.Noddy" to string \end{verbatim} + Note that the name is a dotted name that includes both the module name + and the name of the type within the module. The module in this case is + \module{noddy} and the type is \class{Noddy}, so we set the type name + to \class{noddy.Noddy}. + \begin{verbatim} sizeof(noddy_NoddyObject), /* tp_basicsize */ *************** *** 232,266 **** Ignore this for now. Now we get into the type methods, the things that make your objects ! different from the others. Of course, the Noddy object doesn't ! implement many of these, but as mentioned above you have to implement ! the deallocation function. \begin{verbatim} ! noddy_noddy_dealloc, /* tp_dealloc */ \end{verbatim} ! From here, all the type methods are \NULL, so we'll go over them later ! --- that's for the next section! ! Everything else in the file should be familiar, except for this line in \cfunction{initnoddy}: \begin{verbatim} ! noddy_NoddyType.ob_type = &PyType_Type; \end{verbatim} ! This was alluded to above --- the \cdata{noddy_NoddyType} object should ! have type ``type'', but \code{\&PyType_Type} is not constant and so ! can't be used in its initializer. To work around this, we patch it up ! in the module initialization. That's it! All that remains is to build it; put the above code in a ! file called \file{noddymodule.c} and \begin{verbatim} from distutils.core import setup, Extension setup(name="noddy", version="1.0", ! ext_modules=[Extension("noddy", ["noddymodule.c"])]) \end{verbatim} --- 177,244 ---- Ignore this for now. + Skipping a number of type methods that we don't provide, we set the + class flags to \constant{Py_TPFLAGS_DEFAULT}. + + \begin{verbatim} + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + \end{verbatim} + + All types should include this constant in their flags. It enables all + of the members defined by the current version of Python. + + We provide a doc string for the type in \member{tp_doc}. + + \begin{verbatim} + "Noddy objects", /* tp_doc */ + \end{verbatim} + Now we get into the type methods, the things that make your objects ! different from the others. We aren't going to implement any of these ! in this version of the module. We'll expand this example later to ! have more interesting behavior. ! ! For now, all we want to be able to do is to create new \class{Noddy} ! objects. To enable object creation, we have to provide a ! \member{tp_new} implementation. In this case, we can just use the ! default implementation provided by the API function ! \cfunction{PyType_GenericNew}. \begin{verbatim} ! PyType_GenericNew, /* tp_new */ \end{verbatim} ! All the other type methods are \NULL, so we'll go over them later ! --- that's for a later section! ! Everything else in the file should be familiar, except for some code in \cfunction{initnoddy}: \begin{verbatim} ! if (PyType_Ready(&noddy_NoddyType) < 0) ! return; \end{verbatim} ! This initializes the \class{Noddy} type, filing in a number of ! members, including \member{ob_type} that we initially set to \NULL. ! ! \begin{verbatim} ! PyModule_AddObject(m, "Noddy", (PyObject *)&noddy_NoddyType); ! \end{verbatim} ! ! This adds the type to the module dictionary. This allows us to create ! \class{Noddy} instances by calling the \class{Noddy} class: ! ! \begin{verbatim} ! import noddy ! mynoddy = noddy.Noddy() ! \end{verbatim} That's it! All that remains is to build it; put the above code in a ! file called \file{noddy.c} and \begin{verbatim} from distutils.core import setup, Extension setup(name="noddy", version="1.0", ! ext_modules=[Extension("noddy", ["noddy.c"])]) \end{verbatim} *************** *** 277,280 **** --- 255,676 ---- That wasn't so hard, was it? + Of course, the current Noddy type is pretty uninteresting. It has no + data and doesn't do anything. It can't even be subclasses. + + \subsection{Adding data and methods to the Basic example} + + Let's expend the basic example to add some data and methods. Let's + also make the type usable as a base class. We'll create + a new module, \module{noddy2} that adds these capabilities: + + \verbatiminput{noddy2.c} + + This version of the module has a number of changes. + + We've added an extra include: + + \begin{verbatim} + #include "structmember.h" + \end{verbatim} + + This include provides declarations that we use to handle attributes, + as described a bit later. + + The name of the \class{Noddy} object structure has been shortened to + \class{Noddy}. The type object name has been shortened to + \class{NoddyType}. + + The \class{Noddy} type now has three data attributes, \var{first}, + \var{last}, and \var{number}. The \var{first} and \var{last} + variables are Python strings containing first and last names. The + \var{number} attribute is an integer. + + The object structure is updated accordingly: + + \begin{verbatim} + typedef struct { + PyObject_HEAD + PyObject *first; + PyObject *last; + int number; + } Noddy; + \end{verbatim} + + Because we now have data to manage, we have to be more careful about + object allocation and deallocation. At a minimum, we need a + deallocation method: + + \begin{verbatim} + static void + Noddy_dealloc(Noddy* self) + { + Py_XDECREF(self->first); + Py_XDECREF(self->last); + self->ob_type->tp_free(self); + } + \end{verbatim} + + which is assigned to the \member{tp_dealloc} member: + + \begin{verbatim} + (destructor)Noddy_dealloc, /*tp_dealloc*/ + \end{verbatim} + + This method decrements the reference counts of the two Python + attributes. We use \cfunction{Py_XDECREF} here because the + \member{first} and \member{last} members could be \NULL. It then + calls the \member{tp_free} member of the object's type to free the + object's memory. Note that the object's type might not be + \class{NoddyType}, because the object may be an instance of a + subclass. + + We want to make sure that the first and last names are initialized to + empty strings, so we provide a new method: + + \begin{verbatim} + static PyObject * + Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) + { + Noddy *self; + + self = (Noddy *)type->tp_alloc(type, 0); + if (self != NULL) { + self->first = PyString_FromString(""); + if (self->first == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->last = PyString_FromString(""); + if (self->last == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->number = 0; + } + + return (PyObject *)self; + } + \end{verbatim} + + and install it in the \member{tp_new} member: + + \begin{verbatim} + Noddy_new, /* tp_new */ + \end{verbatim} + + The new member is responsible for creating (as opposed to + initializing) objects of the type. It is exposed in Python as the + \method{__new__} method. See the paper titled ``Unifying types and + classes in Python'' for a detailed discussion of the \method{__new__} + method. One reason to implement a new method is to assure the initial + values of instance variables. In this case, we use the new method to + make sure that the initial values of the members \member{first} and + \member{last} are not \NULL. If we didn't care whether the initial + values were \NULL, we could have used \cfunction{PyType_GenericNew} as + our new method, as we did before. \cfunction{PyType_GenericNew} + initializes all of the instance variable members to NULLs. + + The new method is a static method that is passed the type being + instantiated and any arguments passed when the type was called, + and that returns the new object created. New methods always accept + positional and keyword arguments, but they often ignore the arguments, + leaving the argument handling to initializer methods. Note that if the + type supports subclassing, the type passed may not be the type being + defined. The new method calls the tp_alloc slot to allocate memory. + We don't fill the \member{tp_alloc} slot ourselves. Rather + \cfunction{PyType_Ready()} fills it for us by inheriting it from our + base class, which is \class{object} by default. Most types use the + default allocation. + + We provide an initialization function: + + \begin{verbatim} + static PyObject * + Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) + { + PyObject *first=NULL, *last=NULL; + + static char *kwlist[] = {"first", "last", "number", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, + &first, &last, + &self->number)) + return NULL; + + if (first) { + Py_XDECREF(self->first); + Py_INCREF(first); + self->first = first; + } + + if (last) { + Py_XDECREF(self->last); + Py_INCREF(last); + self->last = last; + } + + Py_INCREF(Py_None); + return Py_None; + } + \end{verbatim} + + by filling the \member{tp_init} slot. + + \begin{verbatim} + (initproc)Noddy_init, /* tp_init */ + \end{verbatim} + + The \member{tp_init} slot is exposed in Python as the + \method{__init__} method. It is used to initialize an object after + it's created. Unlike the new method, we can't guarantee that the + initializer is called. The initializer isn't called when unpickling + objects and it can be overridden. Our initializer accepts arguments + to provide initial values for our instance. Initializers always accept + positional and keyword arguments. + + We want to want to expose our instance variables as attributes. There + are a number of ways to do that. The simplest way is to define member + definitions: + + \begin{verbatim} + static PyMemberDef Noddy_members[] = { + {"first", T_OBJECT_EX, offsetof(Noddy, first), 0, + "first name"}, + {"last", T_OBJECT_EX, offsetof(Noddy, last), 0, + "last name"}, + {"number", T_INT, offsetof(Noddy, number), 0, + "noddy number"}, + {NULL} /* Sentinel */ + }; + \end{verbatim} + + and put the definitions in the \member{tp_members} slot: + + \begin{verbatim} + Noddy_members, /* tp_members */ + \end{verbatim} + + Each member definition has a member name, type, offset, access flags + and documentation string. See the ``Generic Attribute Management'' + section below for details. + + A disadvantage of this approach is that it doesn't provide a way to + restrict the types of objects that can be assigned to the Python + attributes. We expect the first and last names to be strings, but any + Python objects can be assigned. Further, the attributes can be + deleted, setting the C pointers to \NULL. Even though we can make + sure the members are initialized to non-\NULL values, the members can + be set to \NULL if the attributes are deleted. + + We define a single method, \method{name}, that outputs the objects + name as the concatenation of the first and last names. + + \begin{verbatim} + static PyObject * + Noddy_name(Noddy* self) + { + static PyObject *format = NULL; + PyObject *args, *result; + + if (format == NULL) { + format = PyString_FromString("%s %s"); + if (format == NULL) + return NULL; + } + + if (self->first == NULL) { + PyErr_SetString(PyExc_AttributeError, "first"); + return NULL; + } + + if (self->last == NULL) { + PyErr_SetString(PyExc_AttributeError, "last"); + return NULL; + } + + args = Py_BuildValue("OO", self->first, self->last); + if (args == NULL) + return NULL; + + result = PyString_Format(format, args); + Py_DECREF(args); + + return result; + } + \end{verbatim} + + The method is implemented as a C function that takes a \class{Noddy} (or + \class{Noddy} subclass) instance as the first argument. Methods + always take an instance as the first argument. Methods often take + positional and keyword arguments as well, but in this cased we don't + take any and don't need to accept a positional argument tuple or + keyword argument dictionary. This method is equivalent to the Python + method: + + \begin{verbatim} + def name(self): + return "%s %s" % (self.first, self.last) + \end{verbatim} + + Note that we have to check for the possibility that our \member{first} + and \member{last} members are \NULL. This is because they can be + deleted, in which case they are set to \NULL. It would be better to + prevent deletion of these attributes and to restrict the attribute + values to be strings. We'll see how to do that in the next section. + + Now that we've defined the method, we need to create an array of + method definitions: + + \begin{verbatim} + static PyMethodDef Noddy_methods[] = { + {"name", (PyCFunction)Noddy_name, METH_NOARGS, + "Return the name, combining the first and last name" + }, + {NULL} /* Sentinel */ + }; + \end{verbatim} + + and assign them to the \member{tp_methods} slot: + + \begin{verbatim} + Noddy_methods, /* tp_methods */ + \end{verbatim} + + Note that used the \constant{METH_NOARGS} flag to indicate that the + method is passed no arguments. + + Finally, we'll make our type usable as a base class. We've written + our methods carefully so far so that they don't make any assumptions + about the type of the object being created or used, so all we need to + do is to add the \constant{Py_TPFLAGS_BASETYPE} to our class flag + definition: + + \begin{verbatim} + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + \end{verbatim} + + We rename \cfunction{initnoddy} to \cfunction{initnoddy2} + and update the module name passed to \cfunction{Py_InitModule3}. + + Finally, we update our \file{setup.py} file to build the new module: + + \begin{verbatim} + from distutils.core import setup, Extension + setup(name="noddy", version="1.0", + ext_modules=[ + Extension("noddy", ["noddy.c"]), + Extension("noddy2", ["noddy2.c"]), + ]) + \end{verbatim} + + \subsection{Providing finer control over data attributes} + + In this section, we'll provide finer control over how the + \member{first} and \member{last} attributes are set in the + \class{Noddy} example. In the previous version of our module, the + instance variables \member{first} and \member{last} could be set to + non-string values or even deleted. We want to make sure that these + attributes always contain strings. + + \verbatiminput{noddy3.c} + + To provide greater control, over the \member{first} and \member{last} + attributes, we'll use custom getter and setter functions. Here are + the functions for getting and setting the \member{first} attribute: + + \begin{verbatim} + Noddy_getfirst(Noddy *self, void *closure) + { + Py_INCREF(self->first); + return self->first; + } + + static int + Noddy_setfirst(Noddy *self, PyObject *value, void *closure) + { + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute"); + return -1; + } + + if (! PyString_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "The first attribute value must be a string"); + return -1; + } + + Py_DECREF(self->first); + Py_INCREF(value); + self->first = value; + + return 0; + } + \end{verbatim} + + The getter function is passed a \class{Noddy} object and a + ``closure'', which is void pointer. In this case, the closure is + ignored. (The closure supports an advanced usage in which definition + data is passed to the getter and setter. This could, for example, be + used to allow a single set of getter and setter functions that decide + the attribute to get or set based on data in the closure.) + + The setter function is passed the \class{Noddy} object, the new value, + and the closure. The new value may be \NULL, in which case the + attribute is being deleted. In our setter, we raise an error if the + attribute is deleted or if the attribute value is not a string. + + We create an array of \ctype{PyGetSetDef} structures: + + \begin{verbatim} + static PyGetSetDef Noddy_getseters[] = { + {"first", + (getter)Noddy_getfirst, (setter)Noddy_setfirst, + "first name", + NULL}, + {"last", + (getter)Noddy_getlast, (setter)Noddy_setlast, + "last name", + NULL}, + {NULL} /* Sentinel */ + }; + \end{verbatim} + + and register it in the \member{tp_getset} slot: + + \begin{verbatim} + Noddy_getseters, /* tp_getset */ + \end{verbatim} + + to register out attribute getters and setters. + + The last item in a \ctype{PyGetSetDef} structure is the closure + mentioned above. In this case, we aren't using the closure, so we just + pass \NULL. + + We also remove the member definitions for these attributes: + + \begin{verbatim} + static PyMemberDef Noddy_members[] = { + {"number", T_INT, offsetof(Noddy, number), 0, + "noddy number"}, + {NULL} /* Sentinel */ + }; + \end{verbatim} + + With these changes, we can assure that the \member{first} and + \member{last} members are never NULL so we can remove checks for \NULL + values in almost all cases. This means that most of the + \cfunction{Py_XDECREF} calls can be converted to \cfunction{Py_DECREF} + calls. The only place we can't change these calls is in the + deallocator, where there is the possibility that the initialization of + these members failed in the constructor. + + We also rename the module initialization function and module name in + the initialization function, as we did before, and we add an extra + definition to the \file{setup.py} file. \section{Type Methods *************** *** 354,358 **** { free(obj->obj_UnderlyingDatatypePtr); ! PyObject_DEL(obj); } \end{verbatim} --- 750,754 ---- { free(obj->obj_UnderlyingDatatypePtr); ! obj->ob_type->tp_free(self); } \end{verbatim} *************** *** 397,401 **** Py_DECREF(self->my_callback); } ! PyObject_DEL(obj); } \end{verbatim} --- 793,797 ---- Py_DECREF(self->my_callback); } ! obj->ob_type->tp_free(self); } \end{verbatim} *************** *** 717,721 **** The \member{tp_compare} handler is called when comparisons are needed ! are the object does not implement the specific rich comparison method which matches the requested comparison. (It is always used if defined and the \cfunction{PyObject_Compare()} or \cfunction{PyObject_Cmp()} --- 1113,1117 ---- The \member{tp_compare} handler is called when comparisons are needed ! and the object does not implement the specific rich comparison method which matches the requested comparison. (It is always used if defined and the \cfunction{PyObject_Compare()} or \cfunction{PyObject_Cmp()} *************** *** 773,780 **** which depend on several handler routines from the type implementation, the older protocols have been defined as optional blocks of handlers ! referenced by the type object, while newer protocols have been added ! using additional slots in the main type object, with a flag bit being ! set to indicate that the slots are present. (The flag bit does not ! indicate that the slot values are non-\NULL.) \begin{verbatim} --- 1169,1178 ---- which depend on several handler routines from the type implementation, the older protocols have been defined as optional blocks of handlers ! referenced by the type object. For newer protocols there are ! additional slots in the main type object, with a flag bit being set to ! indicate that the slots are present and should be checked by the ! interpreter. (The flag bit does not indicate that the slot values are ! non-\NULL. The flag may be set to indicate the presense of a slot, ! but a slot may still be unfilled.) \begin{verbatim} From goodger@users.sourceforge.net Wed May 7 22:35:10 2003 From: goodger@users.sourceforge.net (goodger@users.sourceforge.net) Date: Wed, 07 May 2003 14:35:10 -0700 Subject: [Python-checkins] python/nondist/peps pep-0314.txt,1.13,1.14 Message-ID: Update of /cvsroot/python/python/nondist/peps In directory sc8-pr-cvs1:/tmp/cvs-serv31741 Modified Files: pep-0314.txt Log Message: all one word Index: pep-0314.txt =================================================================== RCS file: /cvsroot/python/python/nondist/peps/pep-0314.txt,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** pep-0314.txt 7 May 2003 16:53:28 -0000 1.13 --- pep-0314.txt 7 May 2003 21:35:05 -0000 1.14 *************** *** 349,353 **** References ! [1] reStructured text http://docutils.sourceforge.net/ --- 349,353 ---- References ! [1] reStructuredText http://docutils.sourceforge.net/ From bcannon@users.sourceforge.net Wed May 7 23:02:19 2003 From: bcannon@users.sourceforge.net (bcannon@users.sourceforge.net) Date: Wed, 07 May 2003 15:02:19 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libtest.tex,NONE,1.1 lib.tex,1.220,1.221 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv11116/Doc/lib Modified Files: lib.tex Added Files: libtest.tex Log Message: Library documentation for the 'test' package. Still needs to be checked by Fred. --- NEW FILE: libtest.tex --- \section{\module{test} --- Regression tests package for Python} \declaremodule{standard}{test} \sectionauthor{Brett Cannon}{brett@python.org} \modulesynopsis{Regression tests package containing the testing suite for Python.} The \module{test} package contains all regression tests for Python as well as the modules \module{test_support} and \module{regrtest.py}. \module{test_support} is used to enhance your tests while \module{regrtest.py} drives the testing suite. Each module in the \module{test} package whose name starts with \code{'test_'} is a testing suite for a specific module or feature. All new tests should be written using the \module{unittest} module; using \module{unittest} is not required but makes the tests more flexible and maintenance of the tests easier. Some older tests are written to use \module{doctest} and a ``traditional'' testing style; these styles of tests will not be covered. \begin{seealso} \seemodule{unittest}{Writing PyUnit regression tests.} \seemodule{doctest}{Tests embedded in documentation strings.} \end{seealso} \subsection{test_support \label{test_support-docs}} The \module{test_support} module contains functions for assisting with writing regression tests. The \module{test_support} module defines the following exceptions: \begin{excdesc}{TestFailed} Exception to be raised when a test fails. \end{excdesc} \begin{excdesc}{TestSkipped} Subclass of \exception{TestFailed}. Raised when a test is skipped. This occurs when a needed resource (such as a network connection) is not available at the time of testing. \end{excdesc} \begin{excdesc}{ResourceDenied} Subclass of \exception{TestSkipped}. Raised when a resource (such as a network connection) is not available. Raised by the \function{requires} function. \end{excdesc} The \module{test_support} module defines the following constants: \begin{datadesc}{verbose} \constant{True} when verbose output is enabled. Should be checked when more detailed information is desired about a running test. \var{verbose} is set by \module{regrtest.py}. \end{datadesc} \begin{datadesc}{have_unicode} \constant{True} when Unicode support is available. \end{datadesc} \begin{datadesc}{is_jython} \constant{True} if the running interpreter is Jython. \end{datadesc} \begin{datadesc}{TESTFN} Set to the path that a temporary file may be created at. Any temporary that is created should be closed and unlinked (removed). \end{datadesc} The \module{test_support} module defines the following functions: \begin{funcdesc}{forget}{module_name} Removes the module named \var{module_name} from \module{sys.modules} and deletes any byte-compiled files of the module. \end{funcdesc} \begin{funcdesc}{is_resource_enabled}{resource} Returns \constant{True} if \var{resource} is enabled and available. The list of available resources is only set when \module{regrtest.py} is executing the tests. \end{funcdest} \begin{funcdesc}{requires}{resource\optional{, msg}} Raises \exception{ResourceDenied} if \var{resource} is not available. \var{msg} is the argument to \exception{ResourceDenied} if it is raised. Always returns true if called by a function whose \var{__name__} is \code{"__main__"}. Used when tests are executed by \module{regrtest.py}. \end{funcdesc} \begin{funcdesc}{findfile}{filename} Return the path to the file named \var{filename}. If no match is found \var{filename} is returned. This does not equal a failure since it could be the path to the file. \end{funcdesc} \begin{funcdesc}{run_unittest}{*classes} Execute \class{unittest.TestCase} subclasses passed to the function. The function scans the classes for methods starting with the name \code{"test_"} and executes the tests individually. This is the preferred way to execute tests. \end{datadesc} \begin{funcdesc}{run_suite}{suite\optional{, testclass=None}} Execute the \class{unittest.TestSuite} instance, \var{suite}. The optional argument \var{testclass} accepts one of the test classes in the suite so as to print out more detailed information on where the testing suite originated from. \end{funcdesc} \subsection{Writing Unit Tests for the \module{test} package \label{writing-tests}} It is preferred that tests for the \module{test} package use the \module{unittest} module and follow a few guidelines. One is to have the name of all the test methods start with \code{"test_"} as well as the module's name. This is needed so that the methods are recognized by the test driver as test methods. Also, no documentation string for the method should be included. A comment (such as \var{# Tests function returns only True or False}) should be used to provide documentation for test methods. This is done because documentation strings get printed out if they exist and thus what test is being run is not stated. A basic boilerplate is often used: \begin{verbatim} import unittest from test import test_support class MyTestCase1(unittest.TestCase): # Only use setUp() and tearDown() if necessary def setUp(self): ... code to execute in preparation for tests ... def tearDown(self): ... code to execute to clean up after tests ... def test_feature_one(self): # Test feature one. ... testing code ... def test_feature_two(self): # Test feature two. ... testing code ... ... more test methods ... class MyTestCase2(unittest.TestCase): ... same structure as MyTestCase1 ... ... more test classes ... def test_main(): test_support.run_unittest(MyTestCase1, MyTestCase2, ... list other tests ... ) if __name__ == '__main__': test_main() \end{verbatim} This boilerplate code allows the testing suite to be run by \module{regrtest.py} as well as on its own as a script. The goal for regression testing is to try to break code. This leads to a few guidelines to be followed: \begin{itemize} \item The testing suite should exercise all classes, functions, and constants. This includes not just the external API that is to be presented to the outside world but also "private" code. \item Whitebox testing (examining the code being tested when the tests are being written) is preferred. Blackbox testing (testing only the published user interface) is not complete enough to make sure all boundary and edge cases are tested. \item Make sure all possible values are tested including invalid ones. This makes sure that not only all valid values are acceptable but also that improper values are handled correctly. \item Exhaust as many code paths as possible. Test where branching occurs and thus tailor input to make sure as many different paths through the code are taken. \item Add an explicit test for any bugs discovered for the tested code. This will make sure that the error does not crop up again if the code is changed in the future. \item Make sure to clean up after your tests (such as close and remove all temporary files). \item Import as few modules as possible and do it as soon as possible. This minimizes external dependencies of tests and also minimizes possible anomalous behavior from side-effects of importing a module. \item Try to maximize code reuse. On occasion tests will vary by something as small as what type of input they take. Minimize code duplication by subclassing a basic test class with a class that specifies the input: \begin{verbatim} class TestFuncAcceptsSequences(unittest.TestCase): func = mySuperWhammyFunction def test_func(self): self.func(self.arg) class AcceptLists(TestFuncAcceptsSequences): arg = [1,2,3] class AcceptStrings(TestFuncAcceptsSequences): arg = 'abc' class AcceptTuples(TestFuncAcceptsSequences): arg = (1,2,3) \end{verbatim} \end{itemize} \begin{seealso} \seetitle{Test Driven Development}{A book by Kent Beck on writing tests before code} \end{seealso} \subsection{Running tests Using \module{regrtest.py} \label{regrtest}} \module{regrtest.py} is the script used to drive Python's regression test suite. Running the script by itself automatically starts running all regression tests in the \module{test} package. It does this by finding all modules in the package whose name starts with \code{test_}, importing them, and executing the function \function{test_main} if present. The names of tests to execute may also be passed to the script. Specifying a single regression test (\code{python regrtest.py test_spam.py}) will minimize output and only print whether the test passed or failed and thus minimize output. Running \module{regrtest.py} directly allows what resources are available for tests to use to be set. You do this by using the \code{-u} command-line option. Run \code{python regrtest.py -uall} to turn on all resources; specifying \code{all} as an option for \code{-u} enables all possible resources. If all but one resource is desired (a more common case), a comma-separated list of resources that are not desired may be listed after \code{all}. The command \code{python regrtest.py -uall,-audio,-largefile} will run \module{regrtest.py} with all resources except the audio and largefile resources. For a list of all resources and more command-line options, run \code{python regrtest.py -h}. Some other ways to execute the regression tests depend on what platform the tests are being executed on. On \UNIX{}, you can run \code{make test} at the top-level directory where Python was built. On Windows, executing \code{rt.bat} from your PCBuild directory will run all regression tests. Index: lib.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/lib.tex,v retrieving revision 1.220 retrieving revision 1.221 diff -C2 -d -r1.220 -r1.221 *** lib.tex 18 Apr 2003 21:04:33 -0000 1.220 --- lib.tex 7 May 2003 22:02:16 -0000 1.221 *************** *** 119,122 **** --- 119,123 ---- \input{libdoctest} \input{libunittest} + \input{libtest} \input{libmath} \input{libcmath} From gward@users.sourceforge.net Thu May 8 02:38:55 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Wed, 07 May 2003 18:38:55 -0700 Subject: [Python-checkins] python/dist/src/Lib optparse.py,1.4,1.5 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv27439 Modified Files: optparse.py Log Message: Update to Optik 1.4.1+: adds __all__ (Optik SF bug #728563). Index: optparse.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/optparse.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** optparse.py 24 Apr 2003 16:02:42 -0000 1.4 --- optparse.py 8 May 2003 01:38:52 -0000 1.5 *************** *** 5,9 **** Originally distributed as Optik; see http://optik.sourceforge.net/ . ! If you have problems with this module, please do not files bugs, patches, or feature requests with Python; instead, use Optik's SourceForge project page: --- 5,9 ---- Originally distributed as Optik; see http://optik.sourceforge.net/ . ! If you have problems with this module, please do not file bugs, patches, or feature requests with Python; instead, use Optik's SourceForge project page: *************** *** 17,22 **** # it is automatically generated from the Optik source code. ! __version__ = "1.4.1" __copyright__ = """ --- 17,39 ---- # it is automatically generated from the Optik source code. + __version__ = "1.4.1+" ! __all__ = ['Option', ! 'SUPPRESS_HELP', ! 'SUPPRESS_USAGE', ! 'STD_HELP_OPTION', ! 'STD_VERSION_OPTION', ! 'Values', ! 'OptionContainer', ! 'OptionGroup', ! 'OptionParser', ! 'HelpFormatter', ! 'IndentedHelpFormatter', ! 'TitledHelpFormatter', ! 'OptParseError', ! 'OptionError', ! 'OptionConflictError', ! 'OptionValueError', ! 'BadOptionError'] __copyright__ = """ From gward@users.sourceforge.net Thu May 8 02:58:07 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Wed, 07 May 2003 18:58:07 -0700 Subject: [Python-checkins] python/dist/src/Lib textwrap.py,1.26,1.27 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv32627 Modified Files: textwrap.py Log Message: SF patch #598163 (Ville Vainio, vvainio@users.sourceforge.net): add dedent() function, to remove indentation from multiline strings (eg. triple-quoted strings). Differs from inspect.getdoc() by not special-casing the first line (often a sensible approach for non-docstring multiline strings). This should make this function more general (symmetric 'indent' also possible), and more fitting for the textwrap module. Index: textwrap.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/textwrap.py,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** textwrap.py 7 May 2003 01:20:58 -0000 1.26 --- textwrap.py 8 May 2003 01:58:05 -0000 1.27 *************** *** 307,308 **** --- 307,350 ---- w = TextWrapper(width=width, **kwargs) return w.fill(text) + + + # -- Loosely related functionality ------------------------------------- + + def dedent(text): + """dedent(text : string) -> string + + Remove any whitespace than can be uniformly removed from the left + of every line in `text`. + + This can be used e.g. to make triple-quoted strings line up with + the left edge of screen/whatever, while still presenting it in the + source code in indented form. + + For example: + + def test(): + # end first line with \ to avoid the empty line! + s = '''\ + Hey + there + ''' + print repr(s) # prints ' Hey\n there\n ' + print repr(dedent(s)) # prints 'Hey\nthere\n' + """ + lines = text.expandtabs().split('\n') + margin = None + for line in lines: + content = len(line.lstrip()) + if not content: + continue + indent = len(line) - content + if margin is None: + margin = indent + else: + margin = min(margin, indent) + + if margin is not None: + for i in range(len(lines)): + lines[i] = lines[i][margin:] + + return '\n'.join(lines) From gward@users.sourceforge.net Thu May 8 02:58:28 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Wed, 07 May 2003 18:58:28 -0700 Subject: [Python-checkins] python/dist/src/Lib/test test_textwrap.py,1.21,1.22 Message-ID: Update of /cvsroot/python/python/dist/src/Lib/test In directory sc8-pr-cvs1:/tmp/cvs-serv32729 Modified Files: test_textwrap.py Log Message: Add DedentTestCase to test dedent() function. Index: test_textwrap.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_textwrap.py,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** test_textwrap.py 7 May 2003 01:19:22 -0000 1.21 --- test_textwrap.py 8 May 2003 01:58:26 -0000 1.22 *************** *** 12,16 **** from test import test_support ! from textwrap import TextWrapper, wrap, fill --- 12,16 ---- from test import test_support ! from textwrap import TextWrapper, wrap, fill, dedent *************** *** 324,328 **** - class IndentTestCases(BaseTestCase): --- 324,327 ---- *************** *** 374,379 **** def test_main(): ! test_support.run_unittest(WrapTestCase, LongWordTestCase, IndentTestCases) if __name__ == '__main__': --- 373,444 ---- + # Despite the similar names, DedentTestCase is *not* the inverse + # of IndentTestCase! + class DedentTestCase(unittest.TestCase): + + def test_dedent_nomargin(self): + # No lines indented. + text = "Hello there.\nHow are you?\nOh good, I'm glad." + self.assertEquals(dedent(text), text) + + # Similar, with a blank line. + text = "Hello there.\n\nBoo!" + self.assertEquals(dedent(text), text) + + # Some lines indented, but overall margin is still zero. + text = "Hello there.\n This is indented." + self.assertEquals(dedent(text), text) + + # Again, add a blank line. + text = "Hello there.\n\n Boo!\n" + self.assertEquals(dedent(text), text) + + def test_dedent_even(self): + # All lines indented by two spaces. + text = " Hello there.\n How are ya?\n Oh good." + expect = "Hello there.\nHow are ya?\nOh good." + self.assertEquals(dedent(text), expect) + + # Same, with blank lines. + text = " Hello there.\n\n How are ya?\n Oh good.\n" + expect = "Hello there.\n\nHow are ya?\nOh good.\n" + self.assertEquals(dedent(text), expect) + + # Now indent one of the blank lines. + text = " Hello there.\n \n How are ya?\n Oh good.\n" + expect = "Hello there.\n\nHow are ya?\nOh good.\n" + self.assertEquals(dedent(text), expect) + + def test_dedent_uneven(self): + # Lines indented unevenly. + text = '''\ + def foo(): + while 1: + return foo + ''' + expect = '''\ + def foo(): + while 1: + return foo + ''' + self.assertEquals(dedent(text), expect) + + # Uneven indentation with a blank line. + text = " Foo\n Bar\n\n Baz\n" + expect = "Foo\n Bar\n\n Baz\n" + self.assertEquals(dedent(text), expect) + + # Uneven indentation with a whitespace-only line. + text = " Foo\n Bar\n \n Baz\n" + expect = "Foo\n Bar\n\n Baz\n" + self.assertEquals(dedent(text), expect) + + + def test_main(): ! test_support.run_unittest(WrapTestCase, ! LongWordTestCase, ! IndentTestCases, ! DedentTestCase) if __name__ == '__main__': From gward@users.sourceforge.net Thu May 8 03:02:53 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Wed, 07 May 2003 19:02:53 -0700 Subject: [Python-checkins] python/dist/src/Lib textwrap.py,1.27,1.28 Message-ID: Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv1561 Modified Files: textwrap.py Log Message: Minor clarification of dedent(). Index: textwrap.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/textwrap.py,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** textwrap.py 8 May 2003 01:58:05 -0000 1.27 --- textwrap.py 8 May 2003 02:02:50 -0000 1.28 *************** *** 335,342 **** margin = None for line in lines: ! content = len(line.lstrip()) if not content: continue ! indent = len(line) - content if margin is None: margin = indent --- 335,342 ---- margin = None for line in lines: ! content = line.lstrip() if not content: continue ! indent = len(line) - len(content) if margin is None: margin = indent *************** *** 344,348 **** margin = min(margin, indent) ! if margin is not None: for i in range(len(lines)): lines[i] = lines[i][margin:] --- 344,348 ---- margin = min(margin, indent) ! if margin is not None and margin > 0: for i in range(len(lines)): lines[i] = lines[i][margin:] From gward@users.sourceforge.net Thu May 8 03:09:52 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Wed, 07 May 2003 19:09:52 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libtextwrap.tex,1.4,1.5 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv3249 Modified Files: libtextwrap.tex Log Message: SF patch #598163 (Ville Vainio, vvainio@users.sourceforge.net): document dedent() function. Index: libtextwrap.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libtextwrap.tex,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** libtextwrap.tex 3 Jul 2002 05:08:48 -0000 1.4 --- libtextwrap.tex 8 May 2003 02:09:49 -0000 1.5 *************** *** 11,18 **** The \module{textwrap} module provides two convenience functions, \function{wrap()} and \function{fill()}, as well as ! \class{TextWrapper}, the class that does all the work. If you're just ! wrapping or filling one or two text strings, the convenience functions ! should be good enough; otherwise, you should use an instance of ! \class{TextWrapper} for efficiency. \begin{funcdesc}{wrap}{text\optional{, width\optional{, \moreargs}}} --- 11,18 ---- The \module{textwrap} module provides two convenience functions, \function{wrap()} and \function{fill()}, as well as ! \class{TextWrapper}, the class that does all the work, and a utility function ! \function{dedent()}. If you're just wrapping or filling one or two ! text strings, the convenience functions should be good enough; otherwise, ! you should use an instance of \class{TextWrapper} for efficiency. \begin{funcdesc}{wrap}{text\optional{, width\optional{, \moreargs}}} *************** *** 42,45 **** --- 42,70 ---- strings, it will be more efficient for you to create your own \class{TextWrapper} object. + + An additional utility function, \function{dedent()}, is provided to + remove indentation from strings that have unwanted whitespace to the + left of the text. + + \begin{funcdesc}{dedent}{text} + Remove any whitespace than can be uniformly removed from the left + of every line in \var{text}. + + This is typically used to make triple-quoted strings line up with + the left edge of screen/whatever, while still presenting it in the + source code in indented form. + + For example: + \begin{verbatim} + def test(): + # end first line with \ to avoid the empty line! + s = '''\ + Hey + there + ''' + print repr(s) # prints ' Hey\n there\n ' + print repr(dedent(s)) # prints 'Hey\nthere\n' + \end{verbatim} + \end{funcdesc} \begin{classdesc}{TextWrapper}{...} From gward@users.sourceforge.net Thu May 8 03:12:37 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Wed, 07 May 2003 19:12:37 -0700 Subject: [Python-checkins] python/dist/src/Doc/lib libtextwrap.tex,1.5,1.6 Message-ID: Update of /cvsroot/python/python/dist/src/Doc/lib In directory sc8-pr-cvs1:/tmp/cvs-serv3866/Doc/lib Modified Files: libtextwrap.tex Log Message: Clarify the dedent() example a bit by indenting the input lines unevenly. Index: libtextwrap.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/lib/libtextwrap.tex,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** libtextwrap.tex 8 May 2003 02:09:49 -0000 1.5 --- libtextwrap.tex 8 May 2003 02:12:35 -0000 1.6 *************** *** 60,68 **** # end first line with \ to avoid the empty line! s = '''\ ! Hey ! there ''' ! print repr(s) # prints ' Hey\n there\n ' ! print repr(dedent(s)) # prints 'Hey\nthere\n' \end{verbatim} \end{funcdesc} --- 60,68 ---- # end first line with \ to avoid the empty line! s = '''\ ! hello ! world ''' ! print repr(s) # prints ' hello\n world\n ' ! print repr(dedent(s)) # prints 'hello\n world\n' \end{verbatim} \end{funcdesc} From gward@users.sourceforge.net Thu May 8 03:12:37 2003 From: gward@users.sourceforge.net (gward@users.sourceforge.net) Date: Wed, 07 May 2003 19