Change 14076 by pudge@pudge-mobile on 2002/01/04 20:44:23 First go at fixing Mac::Memory::_open (MacPerl Bug #494481)
Affected files ... .... //depot/maint-5.6/macperl/macos/HandleSocket.cp#1 add .... //depot/maint-5.6/macperl/macos/ext/Mac/Memory/Memory.xs#2 edit .... //depot/maint-5.6/macperl/macos/ext/Mac/Memory/t/Memory.t#2 edit .... //depot/maint-5.6/macperl/macos/macperl.sym#3 edit Differences ... ==== //depot/maint-5.6/macperl/macos/ext/Mac/Memory/Memory.xs#2 (text) ==== Index: perl/macos/ext/Mac/Memory/Memory.xs --- perl/macos/ext/Mac/Memory/Memory.xs.~1~ Fri Jan 4 14:00:05 2002 +++ perl/macos/ext/Mac/Memory/Memory.xs Fri Jan 4 14:00:05 2002 @@ -6,6 +6,12 @@ * as specified in the README file. * * $Log: Memory.xs,v $ + * Revision 1.4 2002/01/04 03:38:19 pudge + * Disable Mac::Memory::_open (HandleSocket::OpenHandle) for now + * + * Revision 1.3 2001/12/19 22:57:11 pudge + * Start to make Mac::Memory::_open work. HandleSocket.cp still needs some lovin ' +... the entire thing is a bit unstable. + * * Revision 1.2 2000/09/09 22:18:27 neeri * Dynamic libraries compile under 5.6 * @@ -245,6 +251,10 @@ NOT DEFINED AT THE MOMENT +=cut + +#ifdef NOT_YET + SysRet _open(hand, mode) Handle hand @@ -254,6 +264,8 @@ OUTPUT: RETVAL +#endif + =item dispose Disposes of the handle. ==== //depot/maint-5.6/macperl/macos/ext/Mac/Memory/t/Memory.t#2 (text) ==== Index: perl/macos/ext/Mac/Memory/t/Memory.t --- perl/macos/ext/Mac/Memory/t/Memory.t.~1~ Fri Jan 4 14:00:05 2002 +++ perl/macos/ext/Mac/Memory/t/Memory.t Fri Jan 4 14:00:05 2002 @@ -14,8 +14,27 @@ END $h = new Handle("xyzzy"); -$fh = $h->open("<"); +$r = $h->open("r"); + +# should be "xyzzy" +print <$r>, "\n"; + +$w = $h->open("w"); +print $w "wysiwyg"; + +# should be "wysiwyg" +print $h->get, "\n"; -$_ = <$fh>; +truncate $w, 0; +# should be " (0)" +printf "%s (%d)\n", $h->get, $h->size; +# should be blank +print <$r>, "\n"; +# should be " (0)" +undef $w; +printf "%s (%d)\n", $h->get, $h->size; -print; +truncate $r, 0; +# should be " (0)" +printf "%s (%d)\n", $h->get, $h->size; +__END__ ==== //depot/maint-5.6/macperl/macos/macperl.sym#3 (text) ==== Index: perl/macos/macperl.sym --- perl/macos/macperl.sym.~1~ Fri Jan 4 14:00:05 2002 +++ perl/macos/macperl.sym Fri Jan 4 14:00:05 2002 @@ -261,3 +261,5 @@ # more symbols, Fri, Aug 31, 2001 20:21:48 gMacPerl_Perl5DB gMacPerl_ErrorFormat +# added Wed, Dec 19, 2001 00:07:51 +#OpenHandle ==== //depot/maint-5.6/macperl/macos/HandleSocket.cp#1 (text) ==== Index: perl/macos/HandleSocket.cp --- perl/macos/HandleSocket.cp.~1~ Fri Jan 4 14:00:05 2002 +++ perl/macos/HandleSocket.cp Fri Jan 4 14:00:05 2002 @@ -0,0 +1,170 @@ +/********************************************************************* +Project : GUSI - Grand Unified Socket +Interface +File : HandleSocket.cp- Handle sockets +Author : Matthias Neeracher <[EMAIL PROTECTED]> +Language : MPW C++ + +$Log: HandleSocket.cp,v $ +Revision 1.1 2001/12/19 22:57:11 pudge +Start to make Mac::Memory::_open work. HandleSocket.cp still needs some lovin ' ... +the entire thing is a bit unstable. + +Revision 1.1 1997/04/07 20:46:13 neeri +Synchronized with MacPerl 5.1.4a1 + +*********************************************************************/ + +#define GUSI_SOURCE +#define GUSI_INTERNAL + +#include <GUSISocket.h> +#include <GUSIDevice.h> +#include <GUSISocketMixins.h> +#include <GUSIDescriptor.h> +#include <GUSIConfig.h> + +extern "C" int OpenHandle(Handle h, int oflag); + +class HandleSocket : public GUSISocket { + friend int OpenHandle(Handle h, int oflag); +protected: + HandleSocket(Handle h, int oflag); +public: + virtual bool Supports(ConfigOption config); + virtual ssize_t read(const GUSIScatterer & buf); + virtual ssize_t write(const GUSIGatherer & buf); + virtual int ioctl(unsigned int request, va_list argp); + virtual long lseek(long offset, int whence); + virtual int ftruncate(long offset); +private: + Handle data; + long pos; + Boolean append; +}; + +/************************ HandleSocket members ************************/ + +HandleSocket::HandleSocket(Handle h, int oflag) + : GUSISocket(), data(h), pos(0) +{ + if (oflag & O_TRUNC) + SetHandleSize(data, 0); + append = (oflag & O_APPEND) != 0; +} + +ssize_t HandleSocket::read(const GUSIScatterer & scatterer) +{ + int length = scatterer.Length(); + int left = GetHandleSize(data)-pos; + + if (length > left) + length = left; + + if (length) { + HLock(data); + memcpy(scatterer.Buffer(), *data+pos, length); + pos += length; + HUnlock(data); + } + + return length; +} + +ssize_t HandleSocket::write(const GUSIGatherer & gatherer) +{ + char * buffer = reinterpret_cast<char *>(gatherer.Buffer()); + int buflen = gatherer.Length(); + char * dork; + + if (append) + pos = GetHandleSize(data); + + long size = GetHandleSize(data); + if (pos+buflen > size) { + SetHandleSize(data, pos+buflen); + while (size < pos) + (*data)[size++] = 0; + } + if (buflen) { + HLock(data); + memcpy(*data+pos, gatherer.Buffer(), buflen); + pos += buflen; + HUnlock(data); + } + + return buflen; +} + +int HandleSocket::ioctl(unsigned int request, va_list argp) +{ + switch (request) { + case FIONREAD: + *va_arg(argp, long *) = GetHandleSize(data) - pos; + + return 0; + default : + return GUSISocket::ioctl(request, argp); + } + + GUSI_ASSERT_CLIENT(false, ("ioctl: illegal request %d\n", request)); + + return GUSISetPosixError(EOPNOTSUPP); +} + +long HandleSocket::lseek(long offset, int whence) +{ + long newPos; + + switch (whence) { + case SEEK_CUR: + newPos = pos+offset; + break; + case SEEK_END: + newPos = GetHandleSize(data)+offset; + break; + case SEEK_SET: + newPos = offset; + break; + default: + return GUSISetPosixError(EINVAL); + } + if (newPos < 0) + return GUSISetPosixError(EINVAL); + else + return pos = newPos; +} + +int HandleSocket::ftruncate(long offset) +{ +long size = GetHandleSize(data); + if (offset > GetHandleSize(data)) { + lseek(offset, SEEK_SET); + write(GUSIGatherer(nil, 0)); + } else + SetHandleSize(data, offset); + + return 0; +} + +bool HandleSocket::Supports(ConfigOption config) +{ + return config == kSimpleCalls; +} + +int OpenHandle(Handle h, int oflag) +{ + int fd; + GUSISocket * sock = new HandleSocket(h, oflag); + GUSIDescriptorTable * table = GUSIDescriptorTable::Instance(); + + if (sock) + if ((fd = table->InstallSocket(sock)) > -1) + return fd; + else + delete sock; + + if (!errno) + return GUSISetPosixError(ENOMEM); + else + return -1; +} + End of Patch.