From e2ae77b8b8a62e648bb1864a9b36ef3280984404 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 24 Oct 2001 20:42:55 +0000 Subject: SF patch #474590 -- RISC OS support --- Include/pyport.h | 4 +++ Lib/dumbdbm.py | 10 ++---- Lib/fileinput.py | 2 +- Lib/os.py | 7 ++++ Lib/plat-riscos/riscosenviron.py | 5 ++- Lib/plat-riscos/riscospath.py | 4 ++- Lib/plat-riscos/rourl2path.py | 77 +++++++++++++++++----------------------- Lib/site.py | 7 +--- Lib/socket.py | 2 +- Lib/tempfile.py | 6 +++- Lib/test/regrtest.py | 46 ++++++++++++++++++++++-- Lib/test/test_imageop.py | 10 +++--- Lib/test/test_import.py | 6 ++-- Lib/test/test_mailbox.py | 2 +- Lib/test/test_mhlib.py | 4 +-- Lib/test/test_minidom.py | 4 +-- Lib/test/test_pkg.py | 54 ++++++++++++++-------------- Lib/test/test_pkgimport.py | 4 +-- Lib/test/test_repr.py | 14 ++++---- Lib/test/test_rgbimg.py | 10 +++--- Lib/test/test_sax.py | 15 ++++---- Lib/test/test_signal.py | 4 +-- Lib/test/test_tokenize.py | 2 +- Lib/test/test_urllib2.py | 5 +++ Lib/test/test_zipfile.py | 8 ++--- Lib/whichdb.py | 13 +++---- Modules/selectmodule.c | 8 ----- Modules/socketmodule.c | 25 ++++++------- Modules/structmodule.c | 26 +++++++------- Modules/timemodule.c | 2 -- Objects/floatobject.c | 7 ++++ Python/bltinmodule.c | 15 ++++++++ Python/import.c | 38 ++++++++++++++++---- 33 files changed, 257 insertions(+), 189 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h index 9c19e7a..847a332 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -153,6 +153,10 @@ typedef LONG_LONG Py_intptr_t; #define HAVE_FSTAT #endif +#ifdef RISCOS +#include +#endif + #ifndef DONT_HAVE_SYS_STAT_H #include #elif defined(HAVE_STAT_H) diff --git a/Lib/dumbdbm.py b/Lib/dumbdbm.py index 287a8a0..d5df1d5 100644 --- a/Lib/dumbdbm.py +++ b/Lib/dumbdbm.py @@ -33,13 +33,9 @@ error = IOError # For anydbm class _Database: def __init__(self, file): - if _os.sep == '.': - endsep = '/' - else: - endsep = '.' - self._dirfile = file + endsep + 'dir' - self._datfile = file + endsep + 'dat' - self._bakfile = file + endsep + 'bak' + self._dirfile = file + _os.extsep + 'dir' + self._datfile = file + _os.extsep + 'dat' + self._bakfile = file + _os.extsep + 'bak' # Mod by Jack: create data file if needed try: f = _open(self._datfile, 'r') diff --git a/Lib/fileinput.py b/Lib/fileinput.py index 794d575..c18995b 100644 --- a/Lib/fileinput.py +++ b/Lib/fileinput.py @@ -235,7 +235,7 @@ class FileInput: else: if self._inplace: self._backupfilename = ( - self._filename + (self._backup or ".bak")) + self._filename + (self._backup or os.extsep+"bak")) try: os.unlink(self._backupfilename) except os.error: pass # The next few lines may raise IOError diff --git a/Lib/os.py b/Lib/os.py index 9a7417b..e13c2f9 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -7,6 +7,7 @@ This exports: - os.curdir is a string representing the current directory ('.' or ':') - os.pardir is a string representing the parent directory ('..' or '::') - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\') + - os.extsep is the extension separator ('.' or '/') - os.altsep is the alternate pathname separator (None or '/') - os.pathsep is the component separator used in $PATH etc - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n') @@ -168,6 +169,12 @@ elif 'riscos' in _names: else: raise ImportError, 'no os specific module found' + +if sep=='.': + extsep = '/' +else: + extsep = '.' + __all__.append("path") del _names diff --git a/Lib/plat-riscos/riscosenviron.py b/Lib/plat-riscos/riscosenviron.py index bfb8447..d92aa31 100644 --- a/Lib/plat-riscos/riscosenviron.py +++ b/Lib/plat-riscos/riscosenviron.py @@ -1,4 +1,4 @@ -"""A more or less complete user-defined wrapper around dictionary objects.""" +"""A more or less complete dictionary like interface for the RISC OS environment.""" import riscos @@ -8,8 +8,7 @@ class _Environ: def __repr__(self): return repr(riscos.getenvdict()) def __cmp__(self, dict): - if isinstance(dict, UserDict): - return cmp(riscos.getenvdict(), dict) + return cmp(riscos.getenvdict(), dict) def __len__(self): return len(riscos.getenvdict()) def __getitem__(self, key): diff --git a/Lib/plat-riscos/riscospath.py b/Lib/plat-riscos/riscospath.py index c25572b..fb0e477 100644 --- a/Lib/plat-riscos/riscospath.py +++ b/Lib/plat-riscos/riscospath.py @@ -103,8 +103,10 @@ def join(a, *p): j= a for b in p: (fs, drive, path)= _split(b) - if fs!='' or drive!='' or path[:1] in _roots: + if j=='' or fs!='' or drive!='' or path[:1] in _roots: j= b + elif j[-1]==':': + j= j+b else: j= j+'.'+b return j diff --git a/Lib/plat-riscos/rourl2path.py b/Lib/plat-riscos/rourl2path.py index 522d7ea..9c21386 100644 --- a/Lib/plat-riscos/rourl2path.py +++ b/Lib/plat-riscos/rourl2path.py @@ -6,15 +6,26 @@ import string import urllib import os -def url2pathname(pathname): - "Convert /-delimited pathname to mac pathname" - # - # XXXX The .. handling should be fixed... - # - tp = urllib.splittype(pathname)[0] +__all__ = ["url2pathname","pathname2url"] + +__slash_dot = string.maketrans("/.", "./") + +def url2pathname(url): + "Convert URL to a RISC OS path." + tp = urllib.splittype(url)[0] if tp and tp <> 'file': raise RuntimeError, 'Cannot convert non-local URL to pathname' - components = string.split(pathname, '/') + # Turn starting /// into /, an empty hostname means current host + if url[:3] == '///': + url = url[2:] + elif url[:2] == '//': + raise RuntimeError, 'Cannot convert non-local URL to pathname' + components = string.split(url, '/') + if not components[0]: + if '$' in components: + del components[0] + else: + components[0] = '$' # Remove . and embedded .. i = 0 while i < len(components): @@ -23,59 +34,35 @@ def url2pathname(pathname): elif components[i] == '..' and i > 0 and \ components[i-1] not in ('', '..'): del components[i-1:i+1] - i = i-1 + i -= 1 + elif components[i] == '..': + components[i] = '^' + i += 1 elif components[i] == '' and i > 0 and components[i-1] <> '': del components[i] else: - if components[i]<>'..' and string.find(components[i], '.')<>-1 : - components[i] = string.join(string.split(components[i],'.'),'/') - i = i+1 - if not components[0]: - # Absolute unix path, don't start with colon - return string.join(components[1:], '.') - else: - # relative unix path, start with colon. First replace - # leading .. by empty strings (giving ::file) - i = 0 - while i < len(components) and components[i] == '..': - components[i] = '^' - i = i + 1 - return string.join(components, '.') + i += 1 + components = map(lambda x: urllib.unquote(x).translate(__slash_dot), components) + return '.'.join(components) def pathname2url(pathname): - "convert mac pathname to /-delimited pathname" - if '/' in pathname: - raise RuntimeError, "Cannot convert pathname containing slashes" - components = string.split(pathname, ':') - # Replace empty string ('::') by .. (will result in '/../' later) - for i in range(1, len(components)): - if components[i] == '': - components[i] = '..' - # Truncate names longer than 31 bytes - components = map(lambda x: x[:31], components) - - if os.path.isabs(pathname): - return '/' + string.join(components, '/') - else: - return string.join(components, '/') + "Convert a RISC OS path name to a file url." + return urllib.quote('///' + pathname.translate(__slash_dot), "/$:") def test(): for url in ["index.html", "/SCSI::SCSI4/$/Anwendung/Comm/Apps/!Fresco/Welcome", + "/SCSI::SCSI4/$/Anwendung/Comm/Apps/../!Fresco/Welcome", "../index.html", "bar/index.html", "/foo/bar/index.html", "/foo/bar/", "/"]: print `url`, '->', `url2pathname(url)` - for path in ["drive:", - "drive:dir:", - "drive:dir:file", - "drive:file", - "file", - ":file", - ":dir:", - ":dir:file"]: + print "*******************************************************" + for path in ["SCSI::SCSI4.$.Anwendung", + "PythonApp:Lib", + "PythonApp:Lib.rourl2path/py"]: print `path`, '->', `pathname2url(path)` if __name__ == '__main__': diff --git a/Lib/site.py b/Lib/site.py index 86698df..e27174e 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -59,11 +59,6 @@ ImportError exception, it is silently ignored. import sys, os -if os.sep==".": - endsep = "/" -else: - endsep = "." - def makepath(*paths): dir = os.path.abspath(os.path.join(*paths)) @@ -129,7 +124,7 @@ def addsitedir(sitedir): return names.sort() for name in names: - if name[-4:] == endsep + "pth": + if name[-4:] == os.extsep + "pth": addpackage(sitedir, name) if reset: _dirs_in_sys_path = None diff --git a/Lib/socket.py b/Lib/socket.py index ec8d610..b951809 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -48,7 +48,7 @@ __all__.extend(os._get_exports_list(_socket)) if (sys.platform.lower().startswith("win") or (hasattr(os, 'uname') and os.uname()[0] == "BeOS") - or (sys.platform=="RISCOS")): + or (sys.platform=="riscos")): _realsocketcall = _socket.socket diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 7a1fc26..f1d53db 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -34,6 +34,10 @@ def gettempdir(): attempdirs.insert(0, dirname) except macfs.error: pass + elif os.name == 'riscos': + scrapdir = os.getenv('Wimp$ScrapDir') + if scrapdir: + attempdirs.insert(0, scrapdir) for envname in 'TMPDIR', 'TEMP', 'TMP': if os.environ.has_key(envname): attempdirs.insert(0, os.environ[envname]) @@ -87,7 +91,7 @@ if os.name == "posix": # string. elif os.name == "nt": template = '~' + `os.getpid()` + '-' -elif os.name == 'mac': +elif os.name in ('mac', 'riscos'): template = 'Python-Tmp-' else: template = 'tmp' # XXX might choose a better one diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 0c5d85a..b2bb7ac 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -156,7 +156,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=0, generate=0, pass for i in range(len(args)): # Strip trailing ".py" from arguments - if args[i][-3:] == '.py': + if args[i][-3:] == os.extsep+'py': args[i] = args[i][:-3] stdtests = STDTESTS[:] nottests = NOTTESTS[:] @@ -272,7 +272,7 @@ def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): names = os.listdir(testdir) tests = [] for name in names: - if name[:5] == "test_" and name[-3:] == ".py": + if name[:5] == "test_" and name[-3:] == os.extsep+"py": modname = name[:-3] if modname not in stdtests and modname not in nottests: tests.append(modname) @@ -576,6 +576,48 @@ _expectations = { test_winreg test_winsound """, + 'riscos': + """ + test_al + test_asynchat + test_bsddb + test_cd + test_cl + test_commands + test_crypt + test_dbm + test_dl + test_fcntl + test_fork1 + test_gdbm + test_gl + test_grp + test_imgfile + test_largefile + test_linuxaudiodev + test_locale + test_mmap + test_nis + test_ntpath + test_openpty + test_poll + test_popen2 + test_pty + test_pwd + test_socket_ssl + test_socketserver + test_strop + test_sunaudiodev + test_sundry + test_thread + test_threaded_import + test_threadedtempfile + test_threading + test_timing + test_unicode_file + test_winreg + test_winsound + """, } class _ExpectedSkips: diff --git a/Lib/test/test_imageop.py b/Lib/test/test_imageop.py index 7a6981e..ff83c45 100755 --- a/Lib/test/test_imageop.py +++ b/Lib/test/test_imageop.py @@ -7,17 +7,17 @@ from test_support import verbose, unlink -import imageop, uu +import imageop, uu, os def main(use_rgbimg=1): # Create binary test files - uu.decode(get_qualified_path('testrgb.uue'), 'test.rgb') + uu.decode(get_qualified_path('testrgb'+os.extsep+'uue'), 'test'+os.extsep+'rgb') if use_rgbimg: - image, width, height = getrgbimage('test.rgb') + image, width, height = getrgbimage('test'+os.extsep+'rgb') else: - image, width, height = getimage('test.rgb') + image, width, height = getimage('test'+os.extsep+'rgb') # Return the selected part of image, which should by width by height # in size and consist of pixels of psize bytes. @@ -114,7 +114,7 @@ def main(use_rgbimg=1): image = imageop.grey22grey (grey2image, width, height) # Cleanup - unlink('test.rgb') + unlink('test'+os.extsep+'rgb') def getrgbimage(name): """return a tuple consisting of image (in 'imgfile' format but diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py index b2e3fb6..305c297 100644 --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -18,11 +18,11 @@ import double_const # don't blink -- that *was* the test def test_with_extension(ext): # ext normally ".py"; perhaps ".pyw" source = TESTFN + ext - pyo = TESTFN + ".pyo" + pyo = TESTFN + os.extsep + "pyo" if sys.platform.startswith('java'): pyc = TESTFN + "$py.class" else: - pyc = TESTFN + ".pyc" + pyc = TESTFN + os.extsep + "pyc" f = open(source, "w") print >> f, "# This tests Python's ability to import a", ext, "file." @@ -63,7 +63,7 @@ def test_with_extension(ext): # ext normally ".py"; perhaps ".pyw" sys.path.insert(0, os.curdir) try: - test_with_extension(".py") + test_with_extension(os.extsep + "py") if sys.platform.startswith("win"): for ext in ".PY", ".Py", ".pY", ".pyw", ".PYW", ".pYw": test_with_extension(ext) diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index 4e23398..bb75e64 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -42,7 +42,7 @@ class MaildirTestCase(unittest.TestCase): t = int(time.time() % 1000000) pid = self._counter self._counter += 1 - filename = "%s.%s.myhostname.mydomain" % (t, pid) + filename = os.extsep.join((str(t), str(pid), "myhostname", "mydomain")) tmpname = os.path.join(self._dir, "tmp", filename) newname = os.path.join(self._dir, dir, filename) fp = open(tmpname, "w") diff --git a/Lib/test/test_mhlib.py b/Lib/test/test_mhlib.py index 9d5f101..91c1a1a 100644 --- a/Lib/test/test_mhlib.py +++ b/Lib/test/test_mhlib.py @@ -12,8 +12,8 @@ import os, StringIO import sys import mhlib -if sys.platform.startswith("win"): - raise TestSkipped("test_mhlib skipped on Windows -- " +if sys.platform.startswith("win") or sys.platform=="riscos": + raise TestSkipped("test_mhlib skipped on %s -- "%sys.platform + "too many Unix assumptions") _mhroot = TESTFN+"_MH" diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 2a290aa..ab985b8 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -4,7 +4,7 @@ from xml.dom.minidom import parse, Node, Document, parseString from xml.dom import HierarchyRequestErr import xml.parsers.expat -import os.path +import os import sys import traceback from test_support import verbose @@ -13,7 +13,7 @@ if __name__ == "__main__": base = sys.argv[0] else: base = __file__ -tstfile = os.path.join(os.path.dirname(base), "test.xml") +tstfile = os.path.join(os.path.dirname(base), "test"+os.extsep+"xml") del base def confirm(test, testname = "Test"): diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py index f699af40..c9e771d 100644 --- a/Lib/test/test_pkg.py +++ b/Lib/test/test_pkg.py @@ -1,7 +1,7 @@ # Test packages (dotted-name import) import sys, os, tempfile, traceback -from os import mkdir, rmdir # Can't test if these fail +from os import mkdir, rmdir, extsep # Can't test if these fail del mkdir, rmdir from test_support import verify, verbose, TestFailed @@ -77,15 +77,15 @@ def runtest(hier, code): # Test descriptions tests = [ - ("t1", [("t1", None), ("t1 __init__.py", "")], "import t1"), + ("t1", [("t1", None), ("t1 __init__"+os.extsep+"py", "")], "import t1"), ("t2", [ ("t2", None), - ("t2 __init__.py", "'doc for t2'; print __name__, 'loading'"), + ("t2 __init__"+os.extsep+"py", "'doc for t2'; print __name__, 'loading'"), ("t2 sub", None), - ("t2 sub __init__.py", ""), + ("t2 sub __init__"+os.extsep+"py", ""), ("t2 sub subsub", None), - ("t2 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"), + ("t2 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), ], """ import t2 @@ -111,11 +111,11 @@ print dir() ("t3", [ ("t3", None), - ("t3 __init__.py", "print __name__, 'loading'"), + ("t3 __init__"+os.extsep+"py", "print __name__, 'loading'"), ("t3 sub", None), - ("t3 sub __init__.py", ""), + ("t3 sub __init__"+os.extsep+"py", ""), ("t3 sub subsub", None), - ("t3 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"), + ("t3 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), ], """ import t3.sub.subsub @@ -126,15 +126,15 @@ reload(t3.sub.subsub) """), ("t4", [ - ("t4.py", "print 'THIS SHOULD NOT BE PRINTED (t4.py)'"), + ("t4"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (t4"+os.extsep+"py)'"), ("t4", None), - ("t4 __init__.py", "print __name__, 'loading'"), - ("t4 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"), + ("t4 __init__"+os.extsep+"py", "print __name__, 'loading'"), + ("t4 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"), ("t4 sub", None), - ("t4 sub __init__.py", ""), - ("t4 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"), + ("t4 sub __init__"+os.extsep+"py", ""), + ("t4 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"), ("t4 sub subsub", None), - ("t4 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"), + ("t4 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), ], """ from t4.sub.subsub import * @@ -143,9 +143,9 @@ print "t4.sub.subsub.spam =", spam ("t5", [ ("t5", None), - ("t5 __init__.py", "import t5.foo"), - ("t5 string.py", "print __name__, 'loading'; spam = 1"), - ("t5 foo.py", + ("t5 __init__"+os.extsep+"py", "import t5.foo"), + ("t5 string"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), + ("t5 foo"+os.extsep+"py", "print __name__, 'loading'; import string; print string.spam"), ], """ @@ -160,10 +160,10 @@ print fixdir(dir(t5.string)) ("t6", [ ("t6", None), - ("t6 __init__.py", "__all__ = ['spam', 'ham', 'eggs']"), - ("t6 spam.py", "print __name__, 'loading'"), - ("t6 ham.py", "print __name__, 'loading'"), - ("t6 eggs.py", "print __name__, 'loading'"), + ("t6 __init__"+os.extsep+"py", "__all__ = ['spam', 'ham', 'eggs']"), + ("t6 spam"+os.extsep+"py", "print __name__, 'loading'"), + ("t6 ham"+os.extsep+"py", "print __name__, 'loading'"), + ("t6 eggs"+os.extsep+"py", "print __name__, 'loading'"), ], """ import t6 @@ -174,15 +174,15 @@ print dir() """), ("t7", [ - ("t7.py", "print 'Importing t7.py'"), + ("t7"+os.extsep+"py", "print 'Importing t7"+os.extsep+"py'"), ("t7", None), - ("t7 __init__.py", "print __name__, 'loading'"), - ("t7 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"), + ("t7 __init__"+os.extsep+"py", "print __name__, 'loading'"), + ("t7 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"), ("t7 sub", None), - ("t7 sub __init__.py", ""), - ("t7 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"), + ("t7 sub __init__"+os.extsep+"py", ""), + ("t7 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"), ("t7 sub subsub", None), - ("t7 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"), + ("t7 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), ], """ t7, sub, subsub = None, None, None diff --git a/Lib/test/test_pkgimport.py b/Lib/test/test_pkgimport.py index 72889f9..8c7a99b 100644 --- a/Lib/test/test_pkgimport.py +++ b/Lib/test/test_pkgimport.py @@ -23,8 +23,8 @@ class TestImport(unittest.TestCase): self.package_dir = os.path.join(self.test_dir, self.package_name) os.mkdir(self.package_dir) - open(os.path.join(self.package_dir, '__init__.py'), 'w') - self.module_path = os.path.join(self.package_dir, 'foo.py') + open(os.path.join(self.package_dir, '__init__'+os.extsep+'py'), 'w') + self.module_path = os.path.join(self.package_dir, 'foo'+os.extsep+'py') def tearDown(self): for file in os.listdir(self.package_dir): diff --git a/Lib/test/test_repr.py b/Lib/test/test_repr.py index 1c63e4d..e7b564e 100644 --- a/Lib/test/test_repr.py +++ b/Lib/test/test_repr.py @@ -173,9 +173,9 @@ class LongReprTest(unittest.TestCase): self.subpkgname = os.path.join(longname, longname) # Make the package and subpackage os.mkdir(self.pkgname) - touch(os.path.join(self.pkgname, '__init__.py')) + touch(os.path.join(self.pkgname, '__init__'+os.extsep+'py')) os.mkdir(self.subpkgname) - touch(os.path.join(self.subpkgname, '__init__.py')) + touch(os.path.join(self.subpkgname, '__init__'+os.extsep+'py')) # Remember where we are self.here = os.getcwd() sys.path.insert(0, self.here) @@ -195,14 +195,14 @@ class LongReprTest(unittest.TestCase): def test_module(self): eq = self.assertEquals - touch(os.path.join(self.subpkgname, self.pkgname + '.py')) + touch(os.path.join(self.subpkgname, self.pkgname + os.extsep + 'py')) from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import areallylongpackageandmodulenametotestreprtruncation eq(repr(areallylongpackageandmodulenametotestreprtruncation), "" % areallylongpackageandmodulenametotestreprtruncation.__file__) def test_type(self): eq = self.assertEquals - touch(os.path.join(self.subpkgname, 'foo.py'), '''\ + touch(os.path.join(self.subpkgname, 'foo'+os.extsep+'py'), '''\ class foo(object): pass ''') @@ -216,7 +216,7 @@ class foo(object): pass def test_class(self): - touch(os.path.join(self.subpkgname, 'bar.py'), '''\ + touch(os.path.join(self.subpkgname, 'bar'+os.extsep+'py'), '''\ class bar: pass ''') @@ -225,7 +225,7 @@ class bar: " #endif -#ifdef RISCOS -#define NO_DUP -#undef off_t -#undef uid_t -#undef gid_t -#undef errno -#include -#include "socklib.h" -#include "inetlib.h" -#include "netdb.h" -#include "unixlib.h" -#include "netinet/in.h" -#include "sys/ioctl.h" -#else /*RISCOS*/ #include @@ -165,13 +151,18 @@ Socket methods: #endif #endif +#ifndef RISCOS #include #else +#include +#define NO_DUP +int h_errno; /* not used */ +#endif +#else #include #include #endif -#endif /*RISCOS*/ #ifdef HAVE_SYS_UN_H #include @@ -1804,7 +1795,11 @@ gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af) if (h == NULL) { /* Let's get real error message to return */ +#ifndef RISCOS PyH_Err(h_errno); +#else + PyErr_SetString(PySocket_Error, "host not found"); +#endif return NULL; } if (h->h_addrtype != af) { diff --git a/Modules/structmodule.c b/Modules/structmodule.c index 61436f9..8cc4945 100644 --- a/Modules/structmodule.c +++ b/Modules/structmodule.c @@ -53,19 +53,19 @@ static PyObject *StructError; #endif #endif /* __MWERKS__ */ -typedef struct { char c; short x; } s_short; -typedef struct { char c; int x; } s_int; -typedef struct { char c; long x; } s_long; -typedef struct { char c; float x; } s_float; -typedef struct { char c; double x; } s_double; -typedef struct { char c; void *x; } s_void_p; - -#define SHORT_ALIGN (sizeof(s_short) - sizeof(short)) -#define INT_ALIGN (sizeof(s_int) - sizeof(int)) -#define LONG_ALIGN (sizeof(s_long) - sizeof(long)) -#define FLOAT_ALIGN (sizeof(s_float) - sizeof(float)) -#define DOUBLE_ALIGN (sizeof(s_double) - sizeof(double)) -#define VOID_P_ALIGN (sizeof(s_void_p) - sizeof(void *)) +typedef struct { char c; short x; } st_short; +typedef struct { char c; int x; } st_int; +typedef struct { char c; long x; } st_long; +typedef struct { char c; float x; } st_float; +typedef struct { char c; double x; } st_double; +typedef struct { char c; void *x; } st_void_p; + +#define SHORT_ALIGN (sizeof(st_short) - sizeof(short)) +#define INT_ALIGN (sizeof(st_int) - sizeof(int)) +#define LONG_ALIGN (sizeof(st_long) - sizeof(long)) +#define FLOAT_ALIGN (sizeof(st_float) - sizeof(float)) +#define DOUBLE_ALIGN (sizeof(st_double) - sizeof(double)) +#define VOID_P_ALIGN (sizeof(st_void_p) - sizeof(void *)) /* We can't support q and Q in native mode unless the compiler does; in std mode, they're 8 bytes on all platforms. */ diff --git a/Modules/timemodule.c b/Modules/timemodule.c index bb7f358..ef5ab92 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -17,9 +17,7 @@ #define GUSI_TO_MSL_EPOCH (4*365*24*60*60) #endif /* USE_GUSI2 */ #else -#ifndef RISCOS #include -#endif /* RISCOS */ #endif #ifdef QUICKWIN diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 12d4905..b8c3772 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -610,6 +610,13 @@ float_int(PyObject *v) long aslong; /* (long)wholepart */ (void)modf(x, &wholepart); +#ifdef RISCOS + /* conversion from floating to integral type would raise exception */ + if (wholepart>LONG_MAX || wholepart #endif +#ifdef RISCOS +#include "unixstuff.h" +#endif + /* The default encoding used by the platform file system APIs Can remain NULL for all platforms that don't have such a concept */ @@ -536,7 +540,9 @@ builtin_execfile(PyObject *self, PyObject *args) FILE* fp = NULL; PyCompilerFlags cf; int exists; +#ifndef RISCOS struct stat s; +#endif if (!PyArg_ParseTuple(args, "s|O!O!:execfile", &filename, @@ -558,12 +564,21 @@ builtin_execfile(PyObject *self, PyObject *args) exists = 0; /* Test for existence or directory. */ +#ifndef RISCOS if (!stat(filename, &s)) { if (S_ISDIR(s.st_mode)) errno = EISDIR; else exists = 1; } +#else + if (object_exists(filename)) { + if (isdir(filename)) + errno = EISDIR; + else + exists = 1; + } +#endif /* RISCOS */ if (exists) { Py_BEGIN_ALLOW_THREADS diff --git a/Python/import.c b/Python/import.c index 626695c..f00a563 100644 --- a/Python/import.c +++ b/Python/import.c @@ -983,13 +983,10 @@ find_module(char *realname, PyObject *path, char *buf, size_t buflen, #else /* XXX How are you going to test for directories? */ #ifdef RISCOS - { - static struct filedescr fd = {"", "", PKG_DIRECTORY}; - if (isdir(buf)) { - if (find_init_module(buf)) - return &fd; - } - } + if (isdir(buf) && + find_init_module(buf) && + case_ok(buf, len, namelen, name)) + return &fd_package; #endif #endif #ifdef macintosh @@ -1069,6 +1066,8 @@ find_module(char *realname, PyObject *path, char *buf, size_t buflen, #include #include +#elif defined(RISCOS) +#include "oslib/osfscontrol.h" #endif static int @@ -1198,6 +1197,31 @@ case_ok(char *buf, int len, int namelen, char *name) } return 0 ; /* Not found */ +/* RISC OS */ +#elif defined(RISCOS) + char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */ + char buf2[MAXPATHLEN+2]; + char *nameWithExt = buf+len-namelen; + int canonlen; + os_error *e; + + if (Py_GETENV("PYTHONCASEOK") != NULL) + return 1; + + /* workaround: + append wildcard, otherwise case of filename wouldn't be touched */ + strcpy(buf2, buf); + strcat(buf2, "*"); + + e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen); + canonlen = MAXPATHLEN+1-canonlen; + if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) ) + return 0; + if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0) + return 1; /* match */ + + return 0; + /* assuming it's a case-sensitive filesystem, so there's nothing to do! */ #else return 1; -- cgit v0.12