Has been dead so long that there's no use keeping it in the active bit of the repository.

This commit is contained in:
Jack Jansen 2001-05-10 12:17:03 +00:00
parent 95bf9390a4
commit d454b578e2
27 changed files with 0 additions and 8246 deletions

View file

@ -1,369 +0,0 @@
/*********************************************************************
Project : GUSI - Grand Unified Socket Interface
File : GUSI.h - Socket calls
Author : Matthias Neeracher
Language : MPW C/C++
$Log$
Revision 1.1 2000/09/12 20:24:50 jack
Moved to Unsupported.
Revision 1.1 1998/08/18 14:52:33 jack
Putting Python-specific GUSI modifications under CVS.
Revision 1.2 1994/12/31 01:45:54 neeri
Fix alignment.
Revision 1.1 1994/02/25 02:56:49 neeri
Initial revision
Revision 0.15 1993/06/27 00:00:00 neeri
f?truncate
Revision 0.14 1993/06/20 00:00:00 neeri
Changed sa_constr_ppc
Revision 0.13 1993/02/14 00:00:00 neeri
AF_PAP
Revision 0.12 1992/12/08 00:00:00 neeri
getcwd()
Revision 0.11 1992/11/15 00:00:00 neeri
remove netdb.h definitions
Revision 0.10 1992/09/26 00:00:00 neeri
Separate dirent and stat
Revision 0.9 1992/09/12 00:00:00 neeri
Hostname stuff
Revision 0.8 1992/09/07 00:00:00 neeri
readlink()
Revision 0.7 1992/08/03 00:00:00 neeri
sa_constr_ppc
Revision 0.6 1992/07/21 00:00:00 neeri
sockaddr_atlk_sym
Revision 0.5 1992/06/26 00:00:00 neeri
choose()
Revision 0.4 1992/05/18 00:00:00 neeri
PPC stuff
Revision 0.3 1992/04/27 00:00:00 neeri
getsockopt()
Revision 0.2 1992/04/19 00:00:00 neeri
C++ compatibility
Revision 0.1 1992/04/17 00:00:00 neeri
bzero()
*********************************************************************/
#ifndef _GUSI_
#define _GUSI_
#include <sys/types.h>
/* Feel free to increase FD_SETSIZE as needed */
#define GUSI_MAX_FD FD_SETSIZE
#include <sys/cdefs.h>
#include <compat.h>
#include <sys/ioctl.h>
#include <sys/fcntl.h>
#include <sys/stat.h>
#include <dirent.h>
#include <Types.h>
#include <Events.h>
#include <Files.h>
#include <AppleTalk.h>
#include <CTBUtilities.h>
#include <Packages.h>
#include <PPCToolBox.h>
#include <StandardFile.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/un.h>
#include <unistd.h>
#include <machine/endian.h>
typedef enum spin_msg {
SP_MISC, /* some weird thing, usually just return immediately if you get this */
SP_SELECT, /* in a select call */
SP_NAME, /* getting a host by name */
SP_ADDR, /* getting a host by address */
SP_STREAM_READ, /* Stream read call */
SP_STREAM_WRITE, /* Stream write call */
SP_DGRAM_READ, /* Datagram read call */
SP_DGRAM_WRITE, /* Datagram write call */
SP_SLEEP, /* sleeping, passes ticks left to sleep */
SP_AUTO_SPIN /* Autospin, passes argument to SpinCursor */
} spin_msg;
typedef int (*GUSISpinFn)(spin_msg msg, long param);
typedef void (*GUSIEvtHandler)(EventRecord * ev);
typedef GUSIEvtHandler GUSIEvtTable[24];
/*
* Address families, defined in sys/socket.h
*
#define AF_UNSPEC 0 // unspecified
#define AF_UNIX 1 // local to host (pipes, portals)
#define AF_INET 2 // internetwork: UDP, TCP, etc.
#define AF_CTB 3 // Apple Comm Toolbox (not yet supported)
#define AF_FILE 4 // Normal File I/O (used internally)
#define AF_PPC 5 // PPC Toolbox
#define AF_PAP 6 // Printer Access Protocol (client only)
#define AF_APPLETALK 16 // Apple Talk
*/
#define ATALK_SYMADDR 272 /* Symbolic Address for AppleTalk */
/*
* Some Implementations of GUSI require you to call GUSISetup for the
* socket families you'd like to have defined. It's a good idea to call
* this for *all* implementations.
*
* GUSIDefaultSetup() will include all socket families.
*
* Never call any of the GUSIwithXXX routines directly.
*/
__BEGIN_DECLS
void GUSIwithAppleTalkSockets();
void GUSIwithInternetSockets();
void GUSIwithPAPSockets();
void GUSIwithPPCSockets();
void GUSIwithUnixSockets();
void GUSIwithSIOUXSockets();
void GUSIwithMPWSockets();
void GUSISetup(void (*socketfamily)());
void GUSIDefaultSetup();
void GUSILoadConfiguration(Handle);
__END_DECLS
/*
* Types, defined in sys/socket.h
*
#define SOCK_STREAM 1 // stream socket
#define SOCK_DGRAM 2 // datagram socket
*/
/*
* Defined in sys/un.h
*
struct sockaddr_un {
short sun_family;
char sun_path[108];
};
*/
#ifndef PRAGMA_ALIGN_SUPPORTED
#error Apple had some fun with the conditional macros again
#endif
#if PRAGMA_ALIGN_SUPPORTED
#pragma options align=mac68k
#endif
struct sockaddr_atlk {
short family;
AddrBlock addr;
};
struct sockaddr_atlk_sym {
short family;
EntityName name;
};
struct sockaddr_ppc {
short family;
LocationNameRec location;
PPCPortRec port;
};
/* Definitions for choose() */
#define CHOOSE_DEFAULT 1 /* Use *name as default name */
#define CHOOSE_NEW 2 /* Choose new entity name, not existing one */
#define CHOOSE_DIR 4 /* Choose a directory name, not a file */
typedef struct {
short numTypes;
SFTypeList types;
} sa_constr_file;
typedef struct {
short numTypes;
NLType types;
} sa_constr_atlk;
/* Definitions for sa_constr_ppc */
#define PPC_CON_NEWSTYLE 0x8000 /* Required */
#define PPC_CON_MATCH_NAME 0x0001 /* Match name */
#define PPC_CON_MATCH_TYPE 0x0002 /* Match port type */
#define PPC_CON_MATCH_NBP 0x0004 /* Match NBP type */
typedef struct {
short flags;
Str32 nbpType;
PPCPortRec match;
} sa_constr_ppc;
#if PRAGMA_ALIGN_SUPPORTED
#pragma options align=reset
#endif
__BEGIN_DECLS
/*
* IO/Socket stuff, defined elsewhere (unistd.h, sys/socket.h
*
int socket(int domain, int type, short protocol);
int bind(int s, void *name, int namelen);
int connect(int s, void *addr, int addrlen);
int listen(int s, int qlen);
int accept(int s, void *addr, int *addrlen);
int close(int s);
int read(int s, char *buffer, unsigned buflen);
int readv(int s, struct iovec *iov, int count);
int recv(int s, void *buffer, int buflen, int flags);
int recvfrom(int s, void *buffer, int buflen, int flags, void *from, int *fromlen);
int recvmsg(int s,struct msghdr *msg,int flags);
int write(int s, const char *buffer, unsigned buflen);
int writev(int s, struct iovec *iov, int count);
int send(int s, void *buffer, int buflen, int flags);
int sendto (int s, void *buffer, int buflen, int flags, void *to, int tolen);
int sendmsg(int s,struct msghdr *msg,int flags);
int select(int width, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
int getdtablesize(void);
int getsockname(int s, void *name, int *namelen);
int getpeername(int s, struct sockaddr *name, int *namelen);
int shutdown(int s, int how);
int fcntl(int s, unsigned int cmd, int arg);
int dup(int s);
int dup2(int s, int s1);
int ioctl(int d, unsigned int request, long *argp);
int getsockopt(int s, int level, int optname, char *optval, int * optlen);
int setsockopt(int s, int level, int optname, char *optval, int optlen);
int isatty(int);
int remove(const char *filename);
int rename(const char *oldname, const char *newname);
int creat(const char*);
int faccess(char*, unsigned int, long*);
long lseek(int, long, int);
int open(const char*, int);
int unlink(char*);
int symlink(char* linkto, char* linkname);
int readlink(char* path, char* buf, int bufsiz);
int truncate(char *path, long length);
int ftruncate(int fd, long length);
int chdir(char * path);
int mkdir(char * path);
int rmdir(char * path);
char * getcwd(char * buf, int size);
*/
/*
* Defined in stdio.h
*/
#ifdef __MWERKS__
void fsetfileinfo (char *filename, unsigned long newcreator, unsigned long newtype);
#endif
void fgetfileinfo (char *filename, unsigned long * creator, unsigned long * type);
#ifdef __MWERKS__
FILE *fdopen(int fd, const char *mode);
int fwalk(int (*func)(FILE * stream));
#endif
int choose(
int domain,
int type,
char * prompt,
void * constraint,
int flags,
void * name,
int * namelen);
/*
* Hostname routines, defined in netdb.h
*
struct hostent * gethostbyname(char *name);
struct hostent * gethostbyaddr(struct in_addr *addrP, int, int);
int gethostname(char *machname, long buflen);
struct servent * getservbyname (char * name, char * proto);
struct protoent * getprotobyname(char * name);
*/
char * inet_ntoa(struct in_addr inaddr);
struct in_addr inet_addr(char *address);
/*
* GUSI supports a number of hooks. Every one of them has a different prototype, but needs
* to be passed as a GUSIHook
*/
typedef enum {
GUSI_SpinHook, /* A GUSISpinFn, to be called when a call blocks */
GUSI_ExecHook, /* Boolean (*hook)(const GUSIFileRef & ref), decides if file is executable */
GUSI_FTypeHook,/* Boolean (*hook)(const FSSpec & spec) sets a default file type */
GUSI_SpeedHook /* A long integer, to be added to the cursor spin variable */
} GUSIHookCode;
typedef void (*GUSIHook)(void);
void GUSISetHook(GUSIHookCode code, GUSIHook hook);
GUSIHook GUSIGetHook(GUSIHookCode code);
/*
* What to do when a routine blocks
*/
/* Defined for compatibility */
#define GUSISetSpin(routine) GUSISetHook(GUSI_SpinHook, (GUSIHook)routine)
#define GUSIGetSpin() (GUSISpinFn) GUSIGetHook(GUSI_SpinHook)
int GUSISetEvents(GUSIEvtTable table);
GUSIEvtHandler * GUSIGetEvents(void);
extern GUSIEvtHandler GUSISIOWEvents[];
#define SIGPIPE 13
#define SIGALRM 14
/*
* BSD memory routines, defined in compat.h
*
#define index(a, b) strchr(a, b)
#define rindex(a, b) strrchr(a, b)
#define bzero(from, len) memset(from, 0, len)
#define bcopy(from, to, len) memcpy(to, from, len)
#define bcmp(s1, s2, len) memcmp(s1, s2, len)
#define bfill(from, len, x) memset(from, x, len)
*/
__END_DECLS
#endif /* !_GUSI_ */

View file

@ -1,171 +0,0 @@
/*********************************************************************
Project : GUSI - Grand Unified Socket Interface
File : GUSI.r - Include this
Author : Matthias Neeracher
Language : MPW Rez 3.0
$Log$
Revision 1.1 2000/09/12 20:24:45 jack
Moved to Unsupported.
Revision 1.1 1998/08/18 14:52:37 jack
Putting Python-specific GUSI modifications under CVS.
Revision 1.3 1994/12/30 19:33:34 neeri
Enlargened message box for select folder dialog.
Revision 1.2 1994/08/10 00:34:18 neeri
Sanitized for universal headers.
Revision 1.1 1994/02/25 02:12:04 neeri
Initial revision
Revision 0.5 1993/05/21 00:00:00 neeri
suffixes
Revision 0.4 1993/01/31 00:00:00 neeri
Daemon
Revision 0.3 1993/01/03 00:00:00 neeri
autoSpin
Revision 0.2 1992/09/24 00:00:00 neeri
Don't include CKID, create GUSIRsrc_P.h
Revision 0.1 1992/07/13 00:00:00 neeri
.rsrc
*********************************************************************/
#include "Types.r"
#include "GUSIRsrc_P.h"
include "GUSI.rsrc" not 'ckid';
/* Define a resource ('GU…I', GUSIRsrcID) to override GUSI defaults
To avoid having to change the Rez file every time I introduce another
feature, the preprocessor variable GUSI_PREF_VERSION by default keeps
everything compatible with version 1.0.2. Just define GUSI_PREF_VERSION
to be the version you want to use.
*/
#ifndef GUSI_PREF_VERSION
#define GUSI_PREF_VERSION '0102'
#endif
type 'GU…I' {
literal longint text = 'TEXT'; /* Type for creat'ed files */
literal longint mpw = 'MPS '; /* Creator for creat'ed files */
byte noAutoSpin, autoSpin; /* Automatically spin cursor ? */
#if GUSI_PREF_VERSION > '0102'
boolean useChdir, dontUseChdir; /* Use chdir() ? */
boolean approxStat, accurateStat; /* statbuf.st_nlink = # of subdirectories ? */
#if GUSI_PREF_VERSION >= '0181'
boolean noDelayConsole, DelayConsole; /* Delay opening console window until needed? */
fill bit[1];
#else
boolean noTCPDaemon, isTCPDaemon; /* Inetd client ? */
boolean noUDPDaemon, isUDPDaemon;
#endif
#if GUSI_PREF_VERSION >= '0150'
#if GUSI_PREF_VERSION >= '0181'
boolean wantAppleEvents, noAppleEvents; /* Always solicit AppleEvents */
#else
boolean noConsole, hasConsole; /* Are we providing our own dev:console ? (Obsolete) */
#endif
#if GUSI_PREF_VERSION >= '0180'
boolean autoInitGraf, noAutoInitGraf; /* Automatically do InitGraf ? */
boolean exclusiveOpen, sharedOpen; /* Shared open() ? */
boolean noSigPipe, sigPipe; /* raise SIGPIPE on write to closed PIPE */
#else
fill bit[3];
#endif
#else
fill bit[4];
#endif
literal longint = GUSI_PREF_VERSION;
#if GUSI_PREF_VERSION >= '0120'
integer = $$Countof(SuffixArray);
wide array SuffixArray {
literal longint; /* Suffix of file */
literal longint; /* Type for file */
literal longint; /* Creator for file */
};
#endif
#endif
};
type 'TMPL' {
wide array {
pstring;
literal longint;
};
};
resource 'TMPL' (GUSIRsrcID, "GU…I") {
{
"Type of created files", 'TNAM',
"Creator of created files", 'TNAM',
"Automatically spin cursor", 'DBYT',
#if GUSI_PREF_VERSION > '0102'
"Not using chdir()", 'BBIT',
"Accurate stat()", 'BBIT',
"TCP daemon", 'BBIT',
"UDP daemon", 'BBIT',
#if GUSI_PREF_VERSION >= '0150'
"Own Console", 'BBIT',
#else
"Reserved", 'BBIT',
#endif
#if GUSI_PREF_VERSION >= '0180'
"Don't initialize QuickDraw", 'BBIT',
"Open files shared", 'BBIT',
"Raise SIGPIPE", 'BBIT',
#else
"Reserved", 'BBIT',
"Reserved", 'BBIT',
"Reserved", 'BBIT',
#endif
"Version (don't change)", 'TNAM',
#if GUSI_PREF_VERSION >= '0120'
"NumSuffices", 'OCNT',
"*****", 'LSTC',
"Suffix", 'TNAM',
"Type for suffix", 'TNAM',
"Creator for suffix", 'TNAM',
"*****", 'LSTE',
#endif
#endif
}
};
resource 'DLOG' (GUSIRsrcID, "Get Directory") {
{0, 0, 217, 348},
dBoxProc,
invisible,
noGoAway,
0x0,
10240,
"",
alertPositionMainScreen
};
resource 'DITL' (GUSIRsrcID, "Get Directory") {
{
{ 142, 256, 160, 336}, Button {enabled,"Open"},
{1152, 59, 1232, 77}, Button {enabled,"Hidden"},
{ 193, 256, 211, 336}, Button {enabled,"Cancel"},
{ 43, 232, 63, 347}, UserItem {disabled},
{ 72, 256, 90, 336}, Button {enabled,"Eject"},
{ 97, 256, 115, 336}, Button {enabled,"Drive"},
{ 43, 12, 189, 230}, UserItem {enabled},
{ 43, 229, 189, 246}, UserItem {enabled},
{ 128, 252, 129, 340}, UserItem {disabled},
{1044, 20, 1145, 116}, StaticText {disabled,""},
{ 167, 256, 185, 336}, Button {enabled,"Directory"},
{ 0, 30, 18, 215}, Button {enabled,"Select Current Directory:"},
{ 200, 20, 1145, 222}, StaticText {disabled,"Select a Folder"}
}
};

File diff suppressed because it is too large Load diff

View file

@ -1,582 +0,0 @@
/*********************************************************************
Project : GUSI - Grand Unified Socket Interface
File : GUSINetDB.cp - Convert internet names to adresses
Author : Matthias Neeracher
This file was derived from the socket library by
Charlie Reiman <creiman@ncsa.uiuc.edu> and
Tom Milligan <milligan@madhaus.utcs.utoronto.ca>
Language : MPW C++
$Log$
Revision 1.1 2000/09/12 20:24:49 jack
Moved to Unsupported.
Revision 1.1 1998/08/18 14:52:38 jack
Putting Python-specific GUSI modifications under CVS.
Revision 1.3 1994/08/10 00:07:30 neeri
Sanitized for universal headers.
Revision 1.2 1994/05/01 23:43:31 neeri
getservbyname() without /etc/services would fail.
Revision 1.1 1994/02/25 02:29:36 neeri
Initial revision
Revision 0.5 1993/10/31 00:00:00 neeri
Deferred opening of resolver
Revision 0.4 1993/07/29 00:00:00 neeri
Real getservent code (adapted from Sak Wathanasin)
Revision 0.3 1993/01/19 00:00:00 neeri
Can't set aliases to NULL.
Revision 0.2 1992/11/21 00:00:00 neeri
Remove force_active
Revision 0.1 1992/09/14 00:00:00 neeri
Maybe it works, maybe it doesn't
*********************************************************************/
#include "GUSIINET_P.h"
#include "TFileSpec.h"
#include "Folders.h"
#include "PLStringFuncs.h"
#ifdef __MWERKS__
//
// I disapprove of the way dnr.c is written
// This disapproval gets stronger with every version
//
#include "dnr.c"
#pragma require_prototypes reset
#pragma cplusplus reset
#endif
#if GENERATING68K
#pragma segment GUSIINET
#endif
static pascal void DNRDone(struct hostInfo *, Boolean * done)
{
*done = true;
}
#if GENERATINGCFM
RoutineDescriptor uDNRDone =
BUILD_ROUTINE_DESCRIPTOR(uppResultProcInfo, DNRDone);
#else
#define uDNRDone DNRDone
#endif
int h_errno;
/*
* Gethostbyname and gethostbyaddr each return a pointer to an
* object with the following structure describing an Internet
* host referenced by name or by address, respectively. This
* structure contains the information obtained from the MacTCP
* name server.
*
* struct hostent
* {
* char *h_name;
* char **h_aliases;
* int h_addrtype;
* int h_length;
* char **h_addr_list;
* };
* #define h_addr h_addr_list[0]
*
* The members of this structure are:
*
* h_name Official name of the host.
*
* h_aliases A zero terminated array of alternate names for the host.
*
* h_addrtype The type of address being returned; always AF_INET.
*
* h_length The length, in bytes, of the address.
*
* h_addr_list A zero terminated array of network addresses for the host.
*
* Error return status from gethostbyname and gethostbyaddr is
* indicated by return of a null pointer. The external integer
* h_errno may then be checked to see whether this is a
* temporary failure or an invalid or unknown host. The
* routine herror can be used to print an error message
* describing the failure. If its argument string is non-NULL,
* it is printed, followed by a colon and a space. The error
* message is printed with a trailing newline.
*
* h_errno can have the following values:
*
* HOST_NOT_FOUND No such host is known.
*
* TRY_AGAIN This is usually a temporary error and
* means that the local server did not
* receive a response from an authoritative
* server. A retry at some later time may
* succeed.
*
* NO_RECOVERY Some unexpected server failure was encountered.
* This is a non-recoverable error.
*
* NO_DATA The requested name is valid but does not
* have an IP address; this is not a
* temporary error. This means that the name
* is known to the name server but there is
* no address associated with this name.
* Another type of request to the name server
* using this domain name will result in an
* answer; for example, a mail-forwarder may
* be registered for this domain.
* (NOT GENERATED BY THIS IMPLEMENTATION)
*/
static struct hostInfo macHost;
#define MAXALIASES 0
static char *aliasPtrs[MAXALIASES+1] = {NULL};
static ip_addr *addrPtrs[NUM_ALT_ADDRS+1];
static struct hostent unixHost =
{
macHost.cname,
aliasPtrs,
AF_INET,
sizeof(ip_addr),
(char **) addrPtrs
};
inline struct in_addr make_in_addr(ip_addr addr)
{
struct in_addr res;
res.s_addr = addr;
return res;
}
struct hostent * gethostbyname(char *name)
{
Boolean done;
int i;
if (!strcmp(name, "localhost")) {
in_addr ipaddr;
ipaddr = make_in_addr(ip_addr(gethostid()));
if (ipaddr.s_addr)
return gethostbyaddr((char *) &ipaddr, sizeof(in_addr), AF_INET);
h_errno = HOST_NOT_FOUND;
return NULL;
}
if (INETSockets.Resolver()) {
h_errno = NO_RECOVERY;
return NULL;
}
for (i=0; i<NUM_ALT_ADDRS; i++)
macHost.addr[i] = 0;
done = false;
if (StrToAddr(name, &macHost, ResultUPP(&uDNRDone), (char *) &done) == cacheFault)
SPINP(!done,SP_NAME,0L);
switch (macHost.rtnCode) {
case noErr: break;
case nameSyntaxErr: h_errno = HOST_NOT_FOUND; return(NULL);
case cacheFault: h_errno = NO_RECOVERY; return(NULL);
case noResultProc: h_errno = NO_RECOVERY; return(NULL);
case noNameServer: h_errno = HOST_NOT_FOUND; return(NULL);
case authNameErr: h_errno = HOST_NOT_FOUND; return(NULL);
case noAnsErr: h_errno = TRY_AGAIN; return(NULL);
case dnrErr: h_errno = NO_RECOVERY; return(NULL);
case outOfMemory: h_errno = TRY_AGAIN; return(NULL);
default: h_errno = NO_RECOVERY; return(NULL);
}
/* was the 'name' an IP address? */
if (macHost.cname[0] == 0) {
h_errno = HOST_NOT_FOUND;
return(NULL);
}
/* for some reason there is a dot at the end of the name */
i = int(strlen(macHost.cname)) - 1;
if (macHost.cname[i] == '.')
macHost.cname[i] = 0;
for (i=0; i<NUM_ALT_ADDRS && macHost.addr[i]!=0; i++)
addrPtrs[i] = (ip_addr *) &macHost.addr[i];
addrPtrs[i] = NULL;
return &unixHost;
}
struct hostent * gethostbyaddr(const char *addrP, int, int)
{
Boolean done;
int i;
if (INETSockets.Resolver()) {
h_errno = NO_RECOVERY;
return NULL;
}
for (i=0; i<NUM_ALT_ADDRS; i++)
macHost.addr[i] = 0;
done = false;
ip_addr addr = FIX_LOOPBACK(*(ip_addr *)addrP);
if (AddrToName(addr, &macHost, ResultUPP(&uDNRDone), (char *) &done) == cacheFault)
SPINP(!done,SP_ADDR,0L);
switch (macHost.rtnCode) {
case noErr: break;
case cacheFault: h_errno = NO_RECOVERY; return(NULL);
case noNameServer: h_errno = HOST_NOT_FOUND; return(NULL);
case authNameErr: h_errno = HOST_NOT_FOUND; return(NULL);
case noAnsErr: h_errno = TRY_AGAIN; return(NULL);
case dnrErr: h_errno = NO_RECOVERY; return(NULL);
case outOfMemory: h_errno = TRY_AGAIN; return(NULL);
default: h_errno = NO_RECOVERY; return(NULL);
}
/* for some reason there is a dot at the end of the name */
i = int(strlen(macHost.cname)) - 1;
if (macHost.cname[i] == '.')
macHost.cname[i] = 0;
/* For some reason, the IP address usually seems to be set to 0 */
if (!macHost.addr[0])
macHost.addr[0] = addr;
for (i=0; i<NUM_ALT_ADDRS; i++)
addrPtrs[i] = (ip_addr *) &macHost.addr[i];
addrPtrs[NUM_ALT_ADDRS] = NULL;
return &unixHost;
}
char * inet_ntoa(struct in_addr inaddr)
{
if (INETSockets.Resolver()) {
h_errno = NO_RECOVERY;
return NULL;
}
(void) AddrToStr(inaddr.s_addr, macHost.cname);
return macHost.cname;
}
struct in_addr inet_addr(char *address)
{
if (INETSockets.Resolver()) {
h_errno = NO_RECOVERY;
return make_in_addr(0xFFFFFFFF);
}
if (StrToAddr(address,&macHost,NULL,NULL) != noErr)
return make_in_addr(0xFFFFFFFF);
/* was the 'address' really a name? */
if (macHost.cname[0] != 0)
return make_in_addr(0xFFFFFFFF);
return make_in_addr(macHost.addr[0]);
}
/*
* gethostid()
*
* Get internet address of current host
*/
long gethostid()
{
static long sHostID = 0;
if (sHostID)
return sHostID;
struct GetAddrParamBlock pbr;
pbr.ioCRefNum = INETSockets.Driver();
pbr.csCode = ipctlGetAddr;
if (PBControlSync(ParmBlkPtr(&pbr)))
return 0;
else
return sHostID = (long)pbr.ourAddress;
}
/*
* gethostname()
*
* Try to get my host name from DNR. If it fails, just return my
* IP address as ASCII. This is non-standard, but it's a mac,
* what do you want me to do?
*/
int gethostname(char *machname, int buflen)
{
static char * sHostName = nil;
if (!sHostName) {
in_addr ipaddr;
struct hostent *hp;
ipaddr = make_in_addr(ip_addr(gethostid()));
if (!ipaddr.s_addr) // TCP/IP not up at all
return GUSI_error(ENETDOWN);
hp = gethostbyaddr((char *) &ipaddr, sizeof(in_addr), AF_INET);
if (!hp) {
// No good name
if (buflen < 16) // Not enough space
return GUSI_error(EINVAL);
sprintf(machname, "%d.%d.%d.%d",
ipaddr.s_addr>>24,
ipaddr.s_addr>>16 & 0xff,
ipaddr.s_addr>>8 & 0xff,
ipaddr.s_addr & 0xff);
return 0;
} else {
// We only cache satisfactory replies in sHostName
sHostName = new char[strlen(hp->h_name)+1];
strcpy(sHostName, hp->h_name);
}
}
strncpy(machname, sHostName, unsigned(buflen));
machname[buflen-1] = 0; /* extra safeguard */
return 0;
}
/*
* getservbybname()
*
*/
static char * servlist[] =
{
"echo 7/udp",
"discard 9/udp",
"time 37/udp",
"domain 53/udp",
"sunrpc 111/udp",
"tftp 69/udp",
"biff 512/udp",
"who 513/udp",
"talk 517/udp",
"ftp-data 20/tcp",
"ftp 21/tcp",
"telnet 23/tcp",
"smtp 25/tcp",
"time 37/tcp",
"whois 43/tcp",
"domain 53/tcp",
"hostnames 101/tcp",
"nntp 119/tcp",
"finger 79/tcp",
"ntp 123/tcp",
"uucp 540/tcp",
NULL
};
static char servline[128];
static struct servent serv;
static FILE * servfil;
static int servptr;
static char * servalias[8];
static int servstay = 0;
void setservent(int stayopen)
{
if (servfil && servfil != (FILE *) -1) {
rewind(servfil);
}
servptr = 0;
servstay = servstay || stayopen;
}
void endservent()
{
if (servfil && servfil != (FILE *) -1) {
fclose(servfil);
servfil = NULL;
}
servstay = 0;
}
struct servent * getservent()
{
char * p;
int aliascount;
if (!servfil) {
TFileSpec serv;
if (!FindFolder(
kOnSystemDisk,
kPreferencesFolderType,
kDontCreateFolder,
&serv.vRefNum,
&serv.parID)
) {
PLstrcpy(serv.name, (StringPtr) "\p/etc/services");
if (servfil = fopen(serv.FullPath(), "r"))
goto retry;
}
servfil = (FILE *) -1;
servptr = 0;
}
retry:
if (servfil == (FILE *) -1)
if (!servlist[servptr])
return (struct servent *) NULL;
else
strcpy(servline, servlist[servptr++]);
else if (!(fgets(servline, 128, servfil)))
return (struct servent *) NULL;
if (p = strpbrk(servline, "#\n\r"))
*p = 0;
if (!servline[0])
goto retry;
if (!(serv.s_name = strtok(servline, " \t")))
goto retry;
if (!(p = strtok(NULL, " \t")))
goto retry;
if (!(serv.s_proto = strpbrk(p, "/,")))
goto retry;
*serv.s_proto++ = 0;
serv.s_port = htons(atoi(p));
serv.s_aliases = servalias;
for (aliascount = 0; aliascount < 7; )
if (!(servalias[aliascount++] = strtok(NULL, " \t")))
break;
servalias[aliascount] = NULL;
return &serv;
}
struct servent * getservbyname(const char * name, const char * proto)
{
struct servent * ent;
char ** al;
setservent(0);
while (ent = getservent()) {
if (!strcmp(name, ent->s_name))
goto haveName;
for (al = ent->s_aliases; *al; ++al)
if (!strcmp(name, *al))
goto haveName;
continue;
haveName:
if (!proto || !strcmp(proto, ent->s_proto))
break;
}
if (!servstay)
endservent();
return ent;
}
struct servent * getservbyport(int port, const char * proto)
{
struct servent * ent;
setservent(0);
while (ent = getservent())
if (port == ent->s_port && (!proto || !strcmp(proto, ent->s_proto)))
break;
if (!servstay)
endservent();
return ent;
}
static char tcp[] = "tcp";
static char udp[] = "udp";
#define MAX_PROTOENT 10
static struct protoent protoents[MAX_PROTOENT];
static int protoent_count=0;
struct protoent * getprotobyname(const char * name)
{
struct protoent *pe;
pe = &protoents[protoent_count];
if (strcmp(name, "udp") == 0) {
pe->p_name = udp;
pe->p_proto = IPPROTO_UDP;
} else if (strcmp (name, "tcp") == 0) {
pe->p_name = tcp;
pe->p_proto = IPPROTO_TCP;
} else {
errno = EPROTONOSUPPORT;
return NULL;
}
pe->p_aliases = aliasPtrs;
protoent_count = (protoent_count +1) % MAX_PROTOENT;
return pe;
}
struct protoent * getprotobynumber(int proto)
{
struct protoent *pe;
pe = &protoents[protoent_count];
if (proto == IPPROTO_UDP) {
pe->p_name = udp;
pe->p_proto = IPPROTO_UDP;
} else if (proto == IPPROTO_TCP) {
pe->p_name = tcp;
pe->p_proto = IPPROTO_TCP;
} else {
errno = EPROTONOSUPPORT;
return NULL;
}
pe->p_aliases = aliasPtrs;
protoent_count = (protoent_count +1) % MAX_PROTOENT;
return pe;
}

View file

@ -1,249 +0,0 @@
/*********************************************************************
Project : GUSI - Grand unified socket interface
File : GUSISIOUX.cp - Interface to Metrowerks SIOUX library
Author : Matthias Neeracher
Language : MPW C/C++
$Log$
Revision 1.1 2000/09/12 20:24:49 jack
Moved to Unsupported.
Revision 1.1 1998/08/18 14:52:38 jack
Putting Python-specific GUSI modifications under CVS.
*********************************************************************/
#include <GUSIFile_P.h>
#include <ioctl.h>
#include <console.h>
#include <Events.h>
#include <LowMem.h>
/************************ SIOUXSocket members ************************/
/* This declaration lies about the return type */
extern "C" void SIOUXHandleOneEvent(EventRecord *userevent);
GUSIEvtHandler GUSISIOUXEvents[] = {
SIOUXHandleOneEvent, // nullEvent
SIOUXHandleOneEvent, // mouseDown
SIOUXHandleOneEvent, // mouseUp
nil, // keyDown
nil,
nil, // autoKey
SIOUXHandleOneEvent, // updateEvt
SIOUXHandleOneEvent, // diskEvt
SIOUXHandleOneEvent, // activateEvt
nil,
nil,
nil,
nil,
nil,
nil,
SIOUXHandleOneEvent, // osEvt
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
};
/************************ Declaration of SIOUXSocket ************************/
class SIOUXSocket : public Socket {
friend class SIOUXSocketDomain;
SIOUXSocket();
virtual ~SIOUXSocket();
protected:
int initialized;
void DoInitialize(void);
public:
virtual int read(void * buffer, int buflen);
virtual int write(void * buffer, int buflen);
virtual int select(Boolean * canRead, Boolean * canWrite, Boolean * exception);
virtual int ioctl(unsigned int request, void *argp);
virtual int isatty();
};
class SIOUXSocketDomain : public FileSocketDomain {
SIOUXSocket * singleton;
public:
SIOUXSocketDomain() : FileSocketDomain(AF_UNSPEC, true, false), singleton(nil) { }
virtual Boolean Yours(const GUSIFileRef & ref, Request request);
virtual Socket * open(const GUSIFileRef & ref, int oflag);
};
#if GENERATING68K
#pragma segment SIOUX
#endif
/************************ SIOUXSocket members ************************/
void SIOUXSocket::DoInitialize()
{
if ( initialized ) return;
initialized++;
InstallConsole(0);
GUSISetEvents(GUSISIOUXEvents);
}
SIOUXSocket::SIOUXSocket()
{
initialized = 0;
if ( !GUSIConfig.DelayConsole() )
DoInitialize();
}
SIOUXSocket::~SIOUXSocket()
{
RemoveConsole();
}
int SIOUXSocket::ioctl(unsigned int request, void *)
{
if ( !initialized) DoInitialize();
switch (request) {
case FIOINTERACTIVE:
return 0;
default:
return GUSI_error(EOPNOTSUPP);
}
}
int SIOUXSocket::read(void * buffer, int buflen)
{
if ( !initialized) DoInitialize();
fflush(stdout);
return ReadCharsFromConsole((char *) buffer, buflen);
}
int SIOUXSocket::write(void * buffer, int buflen)
{
if ( !initialized) DoInitialize();
return WriteCharsToConsole((char *) buffer, buflen);
}
static Boolean input_pending()
{
QHdrPtr eventQueue = LMGetEventQueue();
EvQElPtr element = (EvQElPtr)eventQueue->qHead;
// now, count the number of pending keyDown events.
while (element != nil) {
if (element->evtQWhat == keyDown || element->evtQWhat == autoKey)
return true;
element = (EvQElPtr)element->qLink;
}
return false;
}
int SIOUXSocket::select(Boolean * canRead, Boolean * canWrite, Boolean * exception)
{
int goodies = 0;
if ( !initialized) DoInitialize();
fflush(stdout);
if (canRead)
if (*canRead = input_pending())
++goodies;
if (canWrite) {
*canWrite = true;
++goodies;
}
if (exception)
*exception = false;
return goodies;
}
int SIOUXSocket::isatty()
{
return 1;
}
/********************* SIOUXSocketDomain members **********************/
#ifdef MSLGUSI
#ifndef SFIOGUSI
extern void GUSISetupMSLSIOUX();
#endif
#endif
extern "C" void GUSIwithSIOUXSockets()
{
static SIOUXSocketDomain SIOUXSockets;
SIOUXSockets.DontStrip();
#ifdef MSLGUSI
#ifndef SFIOGUSI
GUSISetupMSLSIOUX();
#endif
#endif
}
Boolean SIOUXSocketDomain::Yours(const GUSIFileRef & ref, FileSocketDomain::Request request)
{
if (ref.spec || (request != willOpen && request != willStat))
return false;
switch (ref.name[4] | 0x20) {
case 's':
if ((ref.name[5] | 0x20) != 't' || (ref.name[6] | 0x20) != 'd')
return false;
switch (ref.name[7] | 0x20) {
case 'i':
if ((ref.name[8] | 0x20) != 'n' || ref.name[9])
return false;
return true;
case 'o':
if ((ref.name[8] | 0x20) != 'u' || (ref.name[9] | 0x20) != 't' || ref.name[10])
return false;
return true;
case 'e':
if ((ref.name[8] | 0x20) != 'r' || (ref.name[9] | 0x20) != 'r' || ref.name[10])
return false;
return true;
default:
return false;
}
case 'c':
if ( (ref.name[5] | 0x20) != 'o' || (ref.name[6] | 0x20) != 'n'
|| (ref.name[7] | 0x20) != 's' || (ref.name[8] | 0x20) != 'o'
|| (ref.name[9] | 0x20) != 'l' || (ref.name[10] | 0x20) != 'e')
return false;
switch (ref.name[11]) {
case 0:
return true;
default:
return false;
}
default:
return false;
}
}
Socket * SIOUXSocketDomain::open(const GUSIFileRef &, int)
{
if (!singleton)
singleton = new SIOUXSocket();
++*singleton;
return singleton;
}

View file

@ -1,474 +0,0 @@
/*********************************************************************
Project : GUSI - Grand Unified Socket Interface
File : GUSI_P.h - Private stuff
Author : Matthias Neeracher
Language : MPW C/C++
$Log$
Revision 1.1 2000/09/12 20:24:46 jack
Moved to Unsupported.
Revision 1.1 1998/08/18 14:52:33 jack
Putting Python-specific GUSI modifications under CVS.
Revision 1.3 1994/12/31 01:30:26 neeri
Reorganize filename dispatching.
Revision 1.2 1994/08/10 00:41:05 neeri
Sanitized for universal headers.
Revision 1.1 1994/02/25 02:57:01 neeri
Initial revision
Revision 0.22 1993/07/17 00:00:00 neeri
GUSIRingBuffer::proc -> defproc
Revision 0.21 1993/07/17 00:00:00 neeri
GUSIO_MAX_DOMAIN -> AF_MAX
Revision 0.20 1993/06/27 00:00:00 neeri
Socket::{pre,post}_select
Revision 0.19 1993/06/27 00:00:00 neeri
Socket::ftruncate
Revision 0.18 1993/02/09 00:00:00 neeri
Socket::lurking, Socket::lurkdescr
Revision 0.17 1993/01/31 00:00:00 neeri
GUSIConfiguration::daemon
Revision 0.16 1993/01/17 00:00:00 neeri
Destructors for Socketdomain
Revision 0.15 1993/01/17 00:00:00 neeri
SAFESPIN
Revision 0.14 1993/01/03 00:00:00 neeri
GUSIConfig
Revision 0.13 1992/09/24 00:00:00 neeri
Include GUSIRsrc_P.h
Revision 0.12 1992/09/13 00:00:00 neeri
SPINVOID didn't return
Revision 0.11 1992/08/30 00:00:00 neeri
AppleTalkIdentity()
Revision 0.10 1992/08/03 00:00:00 neeri
RingBuffer
Revision 0.9 1992/07/30 00:00:00 neeri
Initializer Features
Revision 0.8 1992/07/26 00:00:00 neeri
UnixSockets.choose()
Revision 0.7 1992/07/13 00:00:00 neeri
Make AppleTalkSockets global
Revision 0.6 1992/06/27 00:00:00 neeri
choose(), hasNewSF
Revision 0.5 1992/06/07 00:00:00 neeri
Feature
Revision 0.4 1992/05/21 00:00:00 neeri
Implemented select()
Revision 0.3 1992/04/19 00:00:00 neeri
C++ rewrite
Revision 0.2 1992/04/18 00:00:00 neeri
changed read/write/send/recv dispatchers
Revision 0.1 1992/04/18 00:00:00 neeri
ppc Domain
*********************************************************************/
#ifndef __GUSI_P__
#define __GUSI_P__
#define __useAppleExts__
#include <GUSI.h>
#include <GUSIRsrc_P.h>
#include <TFileSpec.h>
#include <sys/errno.h>
#include <sys/uio.h>
#include <sys/socket.h>
extern "C" {
#include <stdio.h>
#include <string.h>
int GUSI_error(int err);
void * GUSI_error_nil(int err);
}
#include <Memory.h>
#include <Gestalt.h>
#include <Traps.h>
#include <AppleEvents.h>
#include <Processes.h>
#include <MixedMode.h>
#if MSLGUSI
using namespace std;
#endif
#if GENERATING68K
#pragma segment GUSI
#endif
#define GUSI_MAX_DOMAIN AF_MAX
#define DEFAULT_BUFFER_SIZE 4096
/*
* In use and shutdown status.
*/
#define SOCK_STATUS_USED 0x1 /* Used socket table entry */
#define SOCK_STATUS_NOREAD 0x2 /* No more reading allowed from socket */
#define SOCK_STATUS_NOWRITE 0x4 /* No more writing allowed to socket */
/*
* Socket connection states.
*/
#define SOCK_STATE_NO_STREAM 0 /* Socket doesn't have a MacTCP stream yet */
#define SOCK_STATE_UNCONNECTED 1 /* Socket is unconnected. */
#define SOCK_STATE_LISTENING 2 /* Socket is listening for connection. */
#define SOCK_STATE_LIS_CON 3 /* Socket is in transition from listen to connected. */
#define SOCK_STATE_CONNECTING 4 /* Socket is initiating a connection. */
#define SOCK_STATE_CONNECTED 5 /* Socket is connected. */
#define SOCK_STATE_CLOSING 6 /* Socket is closing */
#define SOCK_STATE_LIS_CLOSE 7 /* Socket closed while listening */
#define min(a,b) ( (a) < (b) ? (a) : (b))
#define max(a,b) ( (a) > (b) ? (a) : (b))
extern GUSISpinFn GUSISpin;
extern "C" int GUSIDefaultSpin(spin_msg, long);
extern int GUSICheckAlarm();
#define GUSI_INTERRUPT(mesg,param) (GUSICheckAlarm() || (GUSISpin && (*GUSISpin)(mesg,param)))
/* SPIN returns a -1 on user cancel for fn returning integers */
#define SPIN(cond,mesg,param) \
do { \
if (GUSI_INTERRUPT(mesg,param)) \
return GUSI_error(EINTR); \
} while(cond)
/* SPINP returns a NULL on user cancel, for fn returning pointers */
#define SPINP(cond,mesg,param) \
do { \
if (GUSI_INTERRUPT(mesg,param)) { \
GUSI_error(EINTR); \
return NULL; \
} \
} while(cond)
/* SPINVOID just returns on user cancel, for fn returning void */
#define SPINVOID(cond,mesg,param) \
do { \
if (GUSI_INTERRUPT(mesg,param)) { \
GUSI_error(EINTR); \
return; \
} \
} while(cond)
/* SAFESPIN doesn't return, you have to check errno */
#define SAFESPIN(cond,mesg,param) \
do { \
if (GUSI_INTERRUPT(mesg,param)) { \
GUSI_error(EINTR); \
break; \
} else \
errno = 0; \
} while(cond)
//
// Library functions are never allowed to clear errno, so we have to save
//
class ErrnoSaver {
public:
ErrnoSaver() { fSavedErrno = ::errno; ::errno = 0; }
~ErrnoSaver() { if (!::errno) ::errno = fSavedErrno; }
private:
int fSavedErrno;
};
#define SAVE_AND_CLEAR_ERRNO ErrnoSaver saveErrno
class SocketTable;
#if PRAGMA_ALIGN_SUPPORTED
#pragma options align=mac68k
#endif
class Socket {
friend class SocketTable;
short refCount;
protected:
Socket();
public:
virtual int bind(void * name, int namelen);
virtual int connect(void * address, int addrlen);
virtual int listen(int qlen);
virtual Socket * accept(void * address, int * addrlen);
virtual int read(void * buffer, int buflen);
virtual int write(void * buffer, int buflen);
virtual int recvfrom(void * buffer, int buflen, int flags, void * from, int * fromlen);
virtual int sendto(void * buffer, int buflen, int flags, void * to, int tolen);
virtual int getsockname(void * name, int * namelen);
virtual int getpeername(void * name, int * namelen);
virtual int getsockopt(int level, int optname, void *optval, int * optlen);
virtual int setsockopt(int level, int optname, void *optval, int optlen);
virtual int fcntl(unsigned int cmd, int arg);
virtual int ioctl(unsigned int request, void *argp);
virtual int fstat(struct stat * buf);
virtual long lseek(long offset, int whence);
virtual int ftruncate(long offset);
virtual int isatty();
virtual int shutdown(int how);
virtual void pre_select(Boolean wantRead, Boolean wantWrite, Boolean wantExcept);
virtual int select(Boolean * canRead, Boolean * canWrite, Boolean * exception);
virtual void post_select(Boolean wantRead, Boolean wantWrite, Boolean wantExcept);
virtual ~Socket();
void operator++() { ++refCount; }
void operator--() { if (!--refCount) delete this; }
};
#if PRAGMA_ALIGN_SUPPORTED
#pragma options align=reset
#endif
class SocketDomain {
static SocketDomain * domains[GUSI_MAX_DOMAIN];
static ProcessSerialNumber process;
protected:
SocketDomain(int domain);
virtual ~SocketDomain();
public:
inline static SocketDomain * Domain(int domain);
static void Ready();
// Optionally override the following
virtual Socket * socket(int type, short protocol);
// Optionally override the following
virtual int socketpair(int type, short protocol, Socket * sockets[]);
// Optionally define the following
virtual int choose(
int type,
char * prompt,
void * constraint,
int flags,
void * name,
int * namelen);
// Never override the following
void DontStrip();
};
class SocketTable {
Socket * sockets[GUSI_MAX_FD];
Boolean needsConsole;
public:
SocketTable();
~SocketTable();
void InitConsole();
int Install(Socket * sock, int start = 0);
int Remove(int fd);
Socket * operator[](int fd);
};
struct GUSISuffix {
char suffix[4];
OSType suffType;
OSType suffCreator;
};
#if PRAGMA_ALIGN_SUPPORTED
#pragma options align=mac68k
#endif
//
// I learned the hard way not to rely on bit field alignments
//
struct GUSIConfigRsrc {
OSType defaultType;
OSType defaultCreator;
char autoSpin;
unsigned char flags;
OSType version;
short numSuffices;
GUSISuffix suffices[1];
};
#if PRAGMA_ALIGN_SUPPORTED
#pragma options align=reset
#endif
struct GUSIConfiguration {
OSType defaultType;
OSType defaultCreator;
char autoSpin;
Boolean noChdir; // Set current directory without chdir()
Boolean accurStat; // Return # of subdirectories + 2 in st_nlink
Boolean hasConsole; // Do we have our own console ?
Boolean noAutoInitGraf; // Never automatically do InitGraf
Boolean sharedOpen; // Open files with shared permissions
Boolean sigPipe; // raise SIGPIPE on write to closed socket
Boolean noAppleEvents; // Don't solicit AppleEvents for MPW tools
Boolean delayConsole; // Do not open console until needed
OSType version;
short numSuffices;
GUSISuffix * suffices;
GUSIConfiguration();
void GUSILoadConfiguration(Handle config);
void SetDefaultFType(const TFileSpec & name) const;
void DoAutoSpin() const;
void AutoInitGraf() const { if (!noAutoInitGraf) DoAutoInitGraf(); }
void DoAutoInitGraf() const;
Boolean DelayConsole() const;
private:
static Boolean firstTime;
static short we;
};
extern GUSIConfiguration GUSIConfig;
extern SocketTable Sockets;
typedef pascal OSErr (*OSErrInitializer)();
typedef pascal void (*voidInitializer)();
class Feature {
Boolean good;
public:
Feature(unsigned short trapNum, TrapType tTyp);
Feature(OSType type, long value);
Feature(OSType type, long mask, long value);
Feature(const Feature & precondition, OSErrInitializer init);
Feature(OSErrInitializer init);
Feature(const Feature & precondition, voidInitializer init);
Feature(voidInitializer init);
Feature(const Feature & cond1, const Feature & cond2);
operator void*() const { return (void *) good; }
};
extern Feature hasMakeFSSpec;
extern Feature hasAlias;
extern Feature hasNewSF;
extern Feature hasProcessMgr;
extern Feature hasCRM;
extern Feature hasCTB;
extern Feature hasStdNBP;
extern Feature hasCM;
extern Feature hasFT;
extern Feature hasTM;
extern Feature hasPPC;
extern Feature hasRevisedTimeMgr;
class ScattGath {
Handle scratch;
protected:
void * buf;
int len;
int count;
const struct iovec * io;
ScattGath(const struct iovec *iov, int cnt);
virtual ~ScattGath();
public:
void * buffer() { return buf; }
int buflen() { return len; }
int length(int l) { return len = l; }
operator void *() { return buf; }
};
class Scatterer : public ScattGath {
public:
Scatterer(const struct iovec *iov, int count);
virtual ~Scatterer();
};
class Gatherer : public ScattGath {
public:
Gatherer(const struct iovec *iov, int count);
virtual ~Gatherer();
};
typedef pascal void (*Deferred)(void *);
class RingBuffer {
// Valid bytes are between consume and produce
// Free bytes are between produce and consume
// bytes between endbuf-spare and endbuf are neither
Ptr buffer;
Ptr endbuf;
Ptr consume;
Ptr produce;
u_short free;
u_short valid;
u_short spare;
Boolean lock;
Deferred defproc;
void * arg;
public:
RingBuffer(u_short bufsiz);
~RingBuffer();
Ptr Producer(long & len); // Find continuous memory for producer
Ptr Consumer(long & len); // Find continuous memory for consumer
void Validate(long len); // Validate this, unallocate rest
void Invalidate(long len);
void Produce(Ptr from, long & len);// Allocate, copy & validate
void Consume(Ptr to, long & len); // Copy & invalidate
long Free() { return free; }
long Valid() { return valid; }
void Defer() { lock = true; }
void Undefer() { lock = false; if (defproc) defproc(arg);}
Boolean Locked() { return lock; }
void Later(Deferred def, void * ar){ defproc = def; arg = ar; }
operator void *() { return buffer; }
};
Boolean GUSIInterrupt();
Boolean CopyIconFamily(short srcResFile, short srcID, short dstResFile, short dstID);
pascal OSErr PPCInit_P();
OSErr AppleTalkIdentity(short & net, short & node);
void CopyC2PStr(const char * cstr, StringPtr pstr);
#endif

View file

@ -1,62 +0,0 @@
#
# MACTCP - event codes for the mactcp module
#
# UDP asr event codes
UDPDataArrival=1 # A datagram has arrived
UDPICMPReceived=2 # An ICMP error was received
# TCP asr event codes
TCPClosing=1 # All incoming data has been received and read.
TCPULPTimeout=2 # No response from remote process.
TCPTerminate=3 # Connection terminated. Has a detail parameter.
TCPDataArrival=4 # Data has arrived (and no Rcv call is outstanding)
TCPUrgent=5 # Urgent data is outstanding
TCPICMPReceived=6 # An ICMP error was received
PassiveOpenDone=32766 # (python only) a PassiveOpen has completed.
# TCP termination reasons
TCPRemoteAbort=2
TCPNetworkFailure=3
TCPSecPrecMismatch=4
TCPULPTimeoutTerminate=5
TCPULPAbort=6
TCPULPClose=7
TCPServiceError=8
# MacTCP/DNR errors
ipBadLapErr = -23000 # bad network configuration
ipBadCnfgErr = -23001 # bad IP configuration error
ipNoCnfgErr = -23002 # missing IP or LAP configuration error
ipLoadErr = -23003 # error in MacTCP load
ipBadAddr = -23004 # error in getting address
connectionClosing = -23005 # connection is closing
invalidLength = -23006
connectionExists = -23007 # request conflicts with existing connection
connectionDoesntExist = -23008 # connection does not exist
insufficientResources = -23009 # insufficient resources to perform request
invalidStreamPtr = -23010
streamAlreadyOpen = -23011
connectionTerminated = -23012
invalidBufPtr = -23013
invalidRDS = -23014
invalidWDS = -23014
openFailed = -23015
commandTimeout = -23016
duplicateSocket = -23017
# Error codes from internal IP functions
ipDontFragErr = -23032 # Packet too large to send w/o fragmenting
ipDestDeadErr = -23033 # destination not responding
icmpEchoTimeoutErr = -23035 # ICMP echo timed-out
ipNoFragMemErr = -23036 # no memory to send fragmented pkt
ipRouteErr = -23037 # can't route packet off-net
nameSyntaxErr = -23041
cacheFault = -23042
noResultProc = -23043
noNameServer = -23044
authNameErr = -23045
noAnsErr = -23046
dnrErr = -23047
outOfMemory = -23048

View file

@ -1,35 +0,0 @@
ipBadLapErr = -23000 # bad network configuration
ipBadCnfgErr = -23001 # bad IP configuration error
ipNoCnfgErr = -23002 # missing IP or LAP configuration error
ipLoadErr = -23003 # error in MacTCP load
ipBadAddr = -23004 # error in getting address
connectionClosing = -23005 # connection is closing
invalidLength = -23006
connectionExists = -23007 # request conflicts with existing connection
connectionDoesntExist = -23008 # connection does not exist
insufficientResources = -23009 # insufficient resources to perform request
invalidStreamPtr = -23010
streamAlreadyOpen = -23011
connectionTerminated = -23012
invalidBufPtr = -23013
invalidRDS = -23014
invalidWDS = -23014
openFailed = -23015
commandTimeout = -23016
duplicateSocket = -23017
# Error codes from internal IP functions
ipDontFragErr = -23032 # Packet too large to send w/o fragmenting
ipDestDeadErr = -23033 # destination not responding
icmpEchoTimeoutErr = -23035 # ICMP echo timed-out
ipNoFragMemErr = -23036 # no memory to send fragmented pkt
ipRouteErr = -23037 # can't route packet off-net
nameSyntaxErr = -23041
cacheFault = -23042
noResultProc = -23043
noNameServer = -23044
authNameErr = -23045
noAnsErr = -23046
dnrErr = -23047
outOfMemory = -23048

View file

@ -1,459 +0,0 @@
/***********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/
#include "allobjects.h"
#include "modsupport.h" /* For getargs() etc. */
#include "macglue.h"
#include <AddressXlation.h>
#include <Desk.h>
#ifndef HAVE_UNIVERSAL_HEADERS
#define ResultUPP ResultProcPtr
#define NewResultProc(x) (x)
#define ResultProc2UPP ResultProc2Ptr
#define NewResultProc2Proc(x) (x)
#endif
static object *ErrorObject;
/* ----------------------------------------------------- */
/* Declarations for objects of type MacTCP DNR Result */
/* Types of records we have */
#define DNR_ADDR 0
#define DNR_HINFO 1
#define DNR_MX 2
typedef struct {
OB_HEAD
int type; /* DNR_XXX */
int waiting; /* True while completion proc not called */
struct returnRec hinfo;
} dnrrobject;
staticforward typeobject Dnrrtype;
#define is_dnrrobject(v) ((v)->ob_type == &Dnrrtype)
/* ---------------------------------------------------------------- */
static pascal void
dnrr_done(rrp, udp)
struct hostInfo *rrp; /* Unused */
dnrrobject *udp;
{
if ( !udp->waiting ) {
printf("macdnr: dnrr_done: spurious completion call!\n");
return;
}
udp->waiting = 0;
DECREF(udp);
}
static int dnrwait(self)
dnrrobject *self;
{
while ( self->waiting ) {
if ( PyMac_Idle() )
return 0;
}
return 1;
}
static object *
dnrr_wait(self, args)
dnrrobject *self;
object *args;
{
if (!newgetargs(args, ""))
return NULL;
if ( !dnrwait(self) ) {
/* XXX An interrupt is pending -- is this correct? */
INCREF(None);
return None;
}
if ( self->hinfo.rtnCode ) {
PyErr_Mac(ErrorObject, self->hinfo.rtnCode);
return NULL;
}
INCREF(None);
return None;
}
static object *
dnrr_isdone(self, args)
dnrrobject *self;
object *args;
{
if (!newgetargs(args, ""))
return NULL;
return newintobject(!self->waiting);
}
static struct methodlist dnrr_methods[] = {
{"wait", (method)dnrr_wait, 1},
{"isdone", (method)dnrr_isdone, 1},
{NULL, NULL} /* sentinel */
};
/* ---------- */
static dnrrobject *
newdnrrobject(tp)
int tp;
{
dnrrobject *self;
self = NEWOBJ(dnrrobject, &Dnrrtype);
if (self == NULL)
return NULL;
self->type = tp;
self->waiting = 0;
memset(&self->hinfo, 0, sizeof(self->hinfo));
return self;
}
static void
dnrr_dealloc(self)
dnrrobject *self;
{
self->waiting = 0; /* Not really needed, since we incref for completion */
DEL(self);
}
/* Code to access structure members by accessing attributes */
#include "structmember.h"
#define OFF(x) offsetof(struct returnRec, x)
static struct memberlist dnrr_memberlist_addr[] = {
{ "rtnCode", T_INT, OFF(rtnCode), RO},
{ "cname", T_STRING_INPLACE, OFF(cname), RO},
{ "ip0", T_UINT, OFF(rdata.addr[0]), RO},
{ "ip1", T_UINT, OFF(rdata.addr[1]), RO},
{ "ip2", T_UINT, OFF(rdata.addr[2]), RO},
{ "ip3", T_UINT, OFF(rdata.addr[3]), RO},
{NULL} /* Sentinel */
};
static struct memberlist dnrr_memberlist_hinfo[] = {
{ "rtnCode", T_INT, OFF(rtnCode), RO},
{ "cname", T_STRING_INPLACE, OFF(cname), RO},
{ "cpuType", T_STRING_INPLACE, OFF(rdata.hinfo.cpuType), RO},
{ "osType", T_STRING_INPLACE, OFF(rdata.hinfo.osType), RO},
{NULL} /* Sentinel */
};
static struct memberlist dnrr_memberlist_mx[] = {
{ "rtnCode", T_INT, OFF(rtnCode), RO},
{ "cname", T_STRING_INPLACE, OFF(cname), RO},
{ "preference", T_USHORT, OFF(rdata.mx.preference), RO},
{ "exchange", T_STRING_INPLACE, OFF(rdata.mx.exchange), RO},
{NULL} /* Sentinel */
};
static struct memberlist *dnrr_mlists[3] = {
dnrr_memberlist_addr,
dnrr_memberlist_hinfo,
dnrr_memberlist_mx
};
static object *
dnrr_getattr(self, name)
dnrrobject *self;
char *name;
{
object *rv;
int tp;
rv = findmethod(dnrr_methods, (object *)self, name);
if ( rv ) return rv;
err_clear();
if ( self->waiting )
if ( !dnrwait(self) ) {
/* XXX An interrupt is pending -- is this correct? */
err_setstr(ErrorObject, "Resolver busy");
return NULL;
}
tp = self->type;
return getmember((char *)&self->hinfo, dnrr_mlists[tp], name);
}
static typeobject Dnrrtype = {
OB_HEAD_INIT(&Typetype)
0, /*ob_size*/
"MacTCP DNR Result", /*tp_name*/
sizeof(dnrrobject), /*tp_basicsize*/
0, /*tp_itemsize*/
/* methods */
(destructor)dnrr_dealloc, /*tp_dealloc*/
(printfunc)0, /*tp_print*/
(getattrfunc)dnrr_getattr, /*tp_getattr*/
(setattrfunc)0, /*tp_setattr*/
(cmpfunc)0, /*tp_compare*/
(reprfunc)0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
(hashfunc)0, /*tp_hash*/
};
/* End of code for MacTCP DNR Result objects */
/* -------------------------------------------------------- */
int dnr_is_open;
static int
opendnr(fn)
char *fn;
{
OSErr err;
if ( dnr_is_open ) return 1;
if ( (err=OpenResolver(fn)) ) {
PyErr_Mac(ErrorObject, err);
return 0;
}
dnr_is_open = 1;
return 1;
}
static object *
dnr_Open(self, args)
object *self; /* Not used */
object *args;
{
char *fn = NULL;
if (!newgetargs(args, "|s", &fn))
return NULL;
if ( dnr_is_open ) {
err_setstr(ErrorObject, "DNR already open");
return NULL;
}
if ( !opendnr(fn) )
return NULL;
INCREF(None);
return None;
}
static object *
dnr_Close(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
if (!newgetargs(args, ""))
return NULL;
dnr_is_open = 0;
if ( (err=CloseResolver()) ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
INCREF(None);
return None;
}
static object *
dnr_StrToAddr(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
char *hostname;
dnrrobject *rv;
ResultUPP cb_upp = NewResultProc(dnrr_done);
if (!newgetargs(args, "s", &hostname))
return NULL;
if ( !opendnr(NULL) )
return NULL;
if ( (rv=newdnrrobject(DNR_ADDR)) == NULL )
return NULL;
err = StrToAddr(hostname, (struct hostInfo *)&rv->hinfo, cb_upp, (char *)rv);
if ( err == cacheFault ) {
rv->waiting++;
INCREF(rv);
} else if ( err ) {
DECREF(rv);
PyErr_Mac(ErrorObject, err);
return NULL;
}
return (object *)rv;
}
static object *
dnr_AddrToName(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
unsigned long ipaddr;
dnrrobject *rv;
ResultUPP cb_upp = NewResultProc(dnrr_done);
if (!newgetargs(args, "l", &ipaddr))
return NULL;
if ( !opendnr(NULL) )
return NULL;
if ( (rv=newdnrrobject(DNR_ADDR)) == NULL )
return NULL;
err = AddrToName(ipaddr, (struct hostInfo *)&rv->hinfo, cb_upp, (char *)rv);
if ( err == cacheFault ) {
rv->waiting++;
INCREF(rv);
} else if ( err ) {
DECREF(rv);
PyErr_Mac(ErrorObject, err);
return NULL;
}
return (object *)rv;
}
static object *
dnr_AddrToStr(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
unsigned long ipaddr;
char ipname[16];
if (!newgetargs(args, "l", &ipaddr))
return NULL;
if ( !opendnr(NULL) )
return NULL;
if ( (err=AddrToStr(ipaddr, ipname)) ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
return newstringobject(ipname);
}
static object *
dnr_HInfo(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
char *hostname;
dnrrobject *rv;
ResultProc2UPP cb_upp = NewResultProc2Proc(dnrr_done);
if (!newgetargs(args, "s", &hostname))
return NULL;
if ( !opendnr(NULL) )
return NULL;
if ( (rv=newdnrrobject(DNR_HINFO)) == NULL )
return NULL;
err = HInfo(hostname, &rv->hinfo, cb_upp, (char *)rv);
if ( err == cacheFault ) {
rv->waiting++;
INCREF(rv);
} else if ( err ) {
DECREF(rv);
PyErr_Mac(ErrorObject, err);
return NULL;
}
return (object *)rv;
if (!newgetargs(args, ""))
return NULL;
INCREF(None);
return None;
}
static object *
dnr_MXInfo(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
char *hostname;
dnrrobject *rv;
ResultProc2UPP cb_upp = NewResultProc2Proc(dnrr_done);
if (!newgetargs(args, "s", &hostname))
return NULL;
if ( !opendnr(NULL) )
return NULL;
if ( (rv=newdnrrobject(DNR_MX)) == NULL )
return NULL;
err = MXInfo(hostname, &rv->hinfo, cb_upp, (char *)rv);
if ( err == cacheFault ) {
rv->waiting++;
INCREF(rv);
} else if ( err ) {
DECREF(rv);
PyErr_Mac(ErrorObject, err);
return NULL;
}
return (object *)rv;
}
/* List of methods defined in the module */
static struct methodlist dnr_methods[] = {
{"Open", dnr_Open, 1},
{"Close", dnr_Close, 1},
{"StrToAddr", dnr_StrToAddr, 1},
{"AddrToStr", dnr_AddrToStr, 1},
{"AddrToName", dnr_AddrToName, 1},
{"HInfo", dnr_HInfo, 1},
{"MXInfo", dnr_MXInfo, 1},
{NULL, NULL} /* sentinel */
};
/* Initialization function for the module (*must* be called initmacdnr) */
void
initmacdnr()
{
object *m, *d;
/* Create the module and add the functions */
m = initmodule("macdnr", dnr_methods);
/* Add some symbolic constants to the module */
d = getmoduledict(m);
ErrorObject = newstringobject("macdnr.error");
dictinsert(d, "error", ErrorObject);
#if 0
/* Not needed, after all */
#define CONST(name, value) o = newintobject(value); dictinsert(d, name, o);
CONST("ADDR", DNR_ADDR);
CONST("HINFO", DNR_HINFO);
CONST("MX", DNR_MX);
#endif
/* Check for errors */
if (err_occurred())
fatal("can't initialize module macdnr");
}

View file

@ -1,990 +0,0 @@
/***********************************************************
Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Amsterdam, The Netherlands.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/
#include "allobjects.h"
#include "modsupport.h" /* For getargs() etc. */
#include "macglue.h"
#include "tcpglue.h"
#include <Desk.h>
/* State of a tcp stream, in the connectionState field */
#define STATE_CLOSED 0
#define STATE_LISTEN 2
#define STATE_ESTAB 8
#define STATE_CWAIT 18
/* Python code has an additional reason for asr call: open done */
#define MY_OPEN_DONE 32766
static object *ErrorObject;
TCPIOCompletionUPP upp_tcp_done;
TCPNotifyUPP upp_tcp_asr;
#if 0
UDPIOCompletionUPP upp_udp_done;
#endif
UDPNotifyUPP upp_udp_asr;
/* ----------------------------------------------------- */
/* Declarations for objects of type MacTCP connection status */
typedef struct {
OB_HEAD
TCPStatusPB status;
} tcpcsobject;
staticforward typeobject Tcpcstype;
#define is_tcpcsobject(v) ((v)->ob_type == &Tcpcstype)
/* ---------------------------------------------------------------- */
/* Declarations for objects of type MacTCP global status */
#ifdef TCP_GS
typedef struct {
OB_HEAD
TCPParam *ptr;
} tcpgsobject;
staticforward typeobject Tcpgstype;
#define is_tcpgsobject(v) ((v)->ob_type == &Tcpgstype)
#endif /* TCP_GS */
/* ---------------------------------------------------------------- */
/* Declarations for objects of type MacTCP TCP stream */
typedef struct {
OB_HEAD
TCPiopb iop;
long localhost; /* Our IP address */
short localport; /* Our port number */
object *asr; /* Optional async notification routine */
int asr_ec; /* error code parameter to asr */
int asr_reason; /* detail for some errors */
int async_busy; /* True when completion routine pending */
int async_err; /* the error for the async call */
} tcpsobject;
staticforward typeobject Tcpstype;
#define is_tcpsobject(v) ((v)->ob_type == &Tcpstype)
/* ---------------------------------------------------------------- */
/* Declarations for objects of type MacTCP UDP stream */
typedef struct {
OB_HEAD
UDPiopb iop;
object *asr;
int asr_ec; /* error code parameter to asr */
ip_port port;
} udpsobject;
staticforward typeobject Udpstype;
#define is_udpsobject(v) ((v)->ob_type == &Udpstype)
/* ---------------------------------------------------------------- */
static tcpcsobject *
newtcpcsobject(ptr)
TCPStatusPB *ptr;
{
tcpcsobject *self;
self = NEWOBJ(tcpcsobject, &Tcpcstype);
if (self == NULL)
return NULL;
self->status = *ptr;
return self;
}
static void
tcpcs_dealloc(self)
tcpcsobject *self;
{
DEL(self);
}
/* Code to access structure members by accessing attributes */
#include "structmember.h"
#define OFF(x) offsetof(TCPStatusPB, x)
static struct memberlist tcpcs_memberlist[] = {
{"remoteHost", T_ULONG, OFF(remoteHost), RO},
{"remotePort", T_USHORT, OFF(remotePort), RO},
{"localHost", T_UINT, OFF(localHost), RO},
{"localPort", T_USHORT, OFF(localPort), RO},
{"tosFlags", T_BYTE, OFF(tosFlags), RO},
#if 0 /* Bug in header file: cannot access precedence */
{"precedence" T_BYTE, OFF(precedence), RO},
#endif
{"connectionState", T_BYTE, OFF(connectionState), RO},
{"sendWindow", T_USHORT, OFF(sendWindow), RO},
{"rcvWindow", T_USHORT, OFF(rcvWindow), RO},
{"amtUnackedData", T_USHORT, OFF(amtUnackedData), RO},
{"amtUnreadData", T_USHORT, OFF(amtUnreadData), RO},
{"sendUnacked", T_UINT, OFF(sendUnacked), RO},
{"sendNext", T_UINT, OFF(sendNext), RO},
{"congestionWindow", T_UINT, OFF(congestionWindow), RO},
{"rcvNext", T_UINT, OFF(rcvNext), RO},
{"srtt", T_UINT, OFF(srtt), RO},
{"lastRTT", T_UINT, OFF(lastRTT), RO},
{"sendMaxSegSize", T_UINT, OFF(sendMaxSegSize), RO},
{NULL} /* Sentinel */
};
static object *
tcpcs_getattr(self, name)
tcpcsobject *self;
char *name;
{
return getmember((char *)&self->status, tcpcs_memberlist, name);
}
static typeobject Tcpcstype = {
OB_HEAD_INIT(&Typetype)
0, /*ob_size*/
"MacTCP connection status", /*tp_name*/
sizeof(tcpcsobject), /*tp_basicsize*/
0, /*tp_itemsize*/
/* methods */
(destructor)tcpcs_dealloc, /*tp_dealloc*/
(printfunc)0, /*tp_print*/
(getattrfunc)tcpcs_getattr, /*tp_getattr*/
(setattrfunc)0, /*tp_setattr*/
(cmpfunc)0, /*tp_compare*/
(reprfunc)0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
(hashfunc)0, /*tp_hash*/
};
/* End of code for MacTCP connection status objects */
/* -------------------------------------------------------- */
#ifdef TCP_GS
static tcpgsobject *
newtcpgsobject(ptr)
TCPParam *ptr;
{
tcpgsobject *self;
self = NEWOBJ(tcpgsobject, &Tcpgstype);
if (self == NULL)
return NULL;
self->ptr = ptr;
return self;
}
static void
tcpgs_dealloc(self)
tcpgsobject *self;
{
DEL(self);
}
/* Code to access structure members by accessing attributes */
#undef OFF
#define OFF(x) offsetof(TCPParam, x)
static struct memberlist tcpgs_memberlist[] = {
{"RtoA", T_UINT, OFF(tcpRtoA), RO},
{"RtoMin", T_UINT, OFF(tcpRtoMin), RO},
{"RtoMax", T_UINT, OFF(tcpRtoMax), RO},
{"MaxSegSize", T_UINT, OFF(tcpMaxSegSize), RO},
{"MaxConn", T_UINT, OFF(tcpMaxConn), RO},
{"MaxWindow", T_UINT, OFF(tcpMaxWindow), RO},
{NULL} /* Sentinel */
};
static object *
tcpgs_getattr(self, name)
tcpgsobject *self;
char *name;
{
object *rv;
return getmember((char *)self->ptr, tcpgs_memberlist, name);
}
static typeobject Tcpgstype = {
OB_HEAD_INIT(&Typetype)
0, /*ob_size*/
"MacTCP global status", /*tp_name*/
sizeof(tcpgsobject), /*tp_basicsize*/
0, /*tp_itemsize*/
/* methods */
(destructor)tcpgs_dealloc, /*tp_dealloc*/
(printfunc)0, /*tp_print*/
(getattrfunc)tcpgs_getattr, /*tp_getattr*/
(setattrfunc)0, /*tp_setattr*/
(cmpfunc)0, /*tp_compare*/
(reprfunc)0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
(hashfunc)0, /*tp_hash*/
};
#endif /* TCP_GS */
/* End of code for MacTCP global status objects */
/* -------------------------------------------------------- */
static int
tcps_checkstate(self, state, state2)
tcpsobject *self;
int state, state2;
{
OSErr err;
TCPStatusPB *pb;
char buf[80];
if ( self->async_busy ) {
err_setstr(ErrorObject, "Operation not allowed, PassiveOpen in progress");
return -1;
}
if ( state < 0 && state2 < 0 )
return 0;
err = xTCPStatus(&self->iop, &pb);
if ( err ) {
PyErr_Mac(ErrorObject, err);
return -1;
}
if ( state == pb->connectionState ||
state2 == pb->connectionState )
return 0;
sprintf(buf, "Operation not allowed, connection state=%d", pb->connectionState);
err_setstr(ErrorObject, buf);
return -1;
}
static int
tcps_asr_safe(arg)
void *arg;
{
tcpsobject *self = (tcpsobject *)arg;
object *args, *rv;
if ( self->asr == None )
return 0;
args = mkvalue("(ii)", self->asr_ec, self->asr_reason);
rv = call_object(self->asr, args);
DECREF(args);
if ( rv ) {
DECREF(rv);
return 0;
}
return -1;
}
static pascal void
tcps_asr(str, ec, self, reason, icmp)
StreamPtr str;
unsigned short ec;
tcpsobject *self;
unsigned short reason;
struct ICMPReport icmp;
{
if ( self->asr == None )
return;
self->asr_ec = ec;
self->asr_reason = reason;
Py_AddPendingCall(tcps_asr_safe, (void *)self);
}
static void
tcps_done(pb)
TCPiopb *pb;
{
tcpsobject *self = (tcpsobject *)pb->csParam.open.userDataPtr;
if ( pb != &self->iop || !self->async_busy ) {
/* Oops... problems */
printf("tcps_done: unexpected call\n");
return;
}
self->async_busy = 0;
self->async_err = pb->ioResult;
/* Extension of mactcp semantics: also call asr on open complete */
if ( self->asr == None )
return;
self->asr_ec = MY_OPEN_DONE;
self->asr_reason = 0;
Py_AddPendingCall(tcps_asr_safe, (void *)self);
}
static object *
tcps_isdone(self, args)
tcpsobject *self;
object *args;
{
if (!newgetargs(args, ""))
return NULL;
return newintobject(!self->async_busy);
}
static object *
tcps_wait(self, args)
tcpsobject *self;
object *args;
{
if (!newgetargs(args, ""))
return NULL;
while ( self->async_busy ) {
if ( PyMac_Idle() ) {
INCREF(None);
return None;
}
}
if ( self->async_err ) {
PyErr_Mac(ErrorObject, self->async_err);
self->async_err = 0;
return NULL;
}
INCREF(None);
return None;
}
static object *
tcps_PassiveOpen(self, args)
tcpsobject *self;
object *args;
{
short port;
OSErr err;
if (!newgetargs(args, "h", &port))
return NULL;
if ( tcps_checkstate(self, -1, -1) < 0 )
return NULL;
self->async_busy = 1;
self->async_err = 0;
err = xTCPPassiveOpen(&self->iop, port, upp_tcp_done,
(void *)self);
if ( err ) {
self->async_busy = 0;
PyErr_Mac(ErrorObject, err);
return NULL;
}
self->localhost = self->iop.csParam.open.localHost;
self->localport = self->iop.csParam.open.localPort;
INCREF(None);
return None;
}
static object *
tcps_ActiveOpen(self, args)
tcpsobject *self;
object *args;
{
short lport, rport;
long rhost;
OSErr err;
if (!newgetargs(args, "hlh", &lport, &rhost, &rport))
return NULL;
if ( tcps_checkstate(self, -1, -1) < 0 )
return NULL;
err = xTCPActiveOpen(&self->iop, lport, rhost, rport, (TCPIOCompletionUPP)0);
if ( err ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
self->localhost = self->iop.csParam.open.localHost;
self->localport = self->iop.csParam.open.localPort;
INCREF(None);
return None;
}
static object *
tcps_Send(self, args)
tcpsobject *self;
object *args;
{
char *buf;
int bufsize;
int push = 0, urgent = 0;
OSErr err;
miniwds wds;
if (!newgetargs(args, "s#|ii", &buf, &bufsize, &push, &urgent))
return NULL;
if ( tcps_checkstate(self, STATE_ESTAB, STATE_CWAIT) < 0 )
return NULL;
wds.length = bufsize;
wds.ptr = buf;
wds.terminus = 0;
err = xTCPSend(&self->iop, (wdsEntry *)&wds, (Boolean)push, (Boolean)urgent,
(TCPIOCompletionUPP)0);
if ( err ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
INCREF(None);
return None;
}
static object *
tcps_Rcv(self, args)
tcpsobject *self;
object *args;
{
int timeout;
rdsEntry rds[2];
OSErr err;
object *rv;
int urgent, mark;
if (!newgetargs(args, "i", &timeout))
return NULL;
if ( tcps_checkstate(self, -1, -1) < 0 )
return NULL;
memset((char *)&rds, 0, sizeof(rds));
err = xTCPNoCopyRcv(&self->iop, rds, 1, timeout, (TCPIOCompletionUPP)0);
if ( err ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
urgent = self->iop.csParam.receive.urgentFlag;
mark = self->iop.csParam.receive.markFlag;
rv = newsizedstringobject((char *)rds[0].ptr, rds[0].length);
err = xTCPBufReturn(&self->iop, rds, (TCPIOCompletionUPP)0);
if ( err ) {
/* Should not happen */printf("mactcp module: BufReturn failed?\n");
PyErr_Mac(ErrorObject, err);
DECREF(rv);
return NULL;
}
return mkvalue("(Oii)", rv, urgent, mark);
}
static object *
tcps_Close(self, args)
tcpsobject *self;
object *args;
{
OSErr err;
if (!newgetargs(args, ""))
return NULL;
err = xTCPClose(&self->iop, (TCPIOCompletionUPP)0);
if ( err ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
INCREF(None);
return None;
}
static object *
tcps_Abort(self, args)
tcpsobject *self;
object *args;
{
OSErr err;
if (!newgetargs(args, ""))
return NULL;
err = xTCPAbort(&self->iop);
if ( err ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
INCREF(None);
return None;
}
static object *
tcps_Status(self, args)
tcpsobject *self;
object *args;
{
OSErr err;
TCPStatusPB *pb;
if (!newgetargs(args, ""))
return NULL;
if ( tcps_checkstate(self, -1, -1) < 0 )
return NULL;
err = xTCPStatus(&self->iop, &pb);
if ( err ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
return (object *)newtcpcsobject(pb);
}
static object *
tcps_GetSockName(self, args)
tcpsobject *self;
object *args;
{
/* This routine is needed so we can get at the local port even when
** a PassiveOpen is in progress (when we can't do a Status call).
** This is needed for socket listen(); getsockname(); accept() emulation
** as used by ftp and the like.
*/
if (!newgetargs(args, ""))
return NULL;
return mkvalue("(lh)", self->localhost, self->localport);
}
static struct methodlist tcps_methods[] = {
{"isdone", (method)tcps_isdone, 1},
{"wait", (method)tcps_wait, 1},
{"PassiveOpen", (method)tcps_PassiveOpen, 1},
{"ActiveOpen", (method)tcps_ActiveOpen, 1},
{"Send", (method)tcps_Send, 1},
{"Rcv", (method)tcps_Rcv, 1},
{"Close", (method)tcps_Close, 1},
{"Abort", (method)tcps_Abort, 1},
{"Status", (method)tcps_Status, 1},
{"GetSockName", (method)tcps_GetSockName, 1},
{NULL, NULL} /* sentinel */
};
/* ---------- */
static object *
tcps_getattr(self, name)
tcpsobject *self;
char *name;
{
if ( strcmp(name, "asr") == 0 ) {
INCREF(self->asr);
return self->asr;
}
return findmethod(tcps_methods, (object *)self, name);
}
static int
tcps_setattr(self, name, value)
tcpsobject *self;
char *name;
object *value;
{
if ( strcmp(name, "asr") != 0 || value == NULL )
return -1;
self->asr = value; /* XXXX Assuming I don't have to incref */
return 0;
}
static tcpsobject *
newtcpsobject(bufsize)
int bufsize;
{
tcpsobject *self;
OSErr err;
self = NEWOBJ(tcpsobject, &Tcpstype);
if (self == NULL)
return NULL;
memset((char *)&self->iop, 0, sizeof(self->iop));
err= xTCPCreate(bufsize, upp_tcp_asr, (void *)self, &self->iop);
if ( err ) {
DEL(self);
PyErr_Mac(ErrorObject, err);
return NULL;
}
INCREF(None);
self->localhost = 0;
self->localport = 0;
self->asr = None;
self->async_busy = 0;
self->async_err = 0;
return self;
}
static void
tcps_dealloc(self)
tcpsobject *self;
{
if ( self->async_busy ) {
printf("mactcp module: error: dealloc with async busy\n");
return;
}
xTCPRelease(&self->iop);
DEL(self);
}
static typeobject Tcpstype = {
OB_HEAD_INIT(&Typetype)
0, /*ob_size*/
"MacTCP TCP stream", /*tp_name*/
sizeof(tcpsobject), /*tp_basicsize*/
0, /*tp_itemsize*/
/* methods */
(destructor)tcps_dealloc, /*tp_dealloc*/
(printfunc)0, /*tp_print*/
(getattrfunc)tcps_getattr, /*tp_getattr*/
(setattrfunc)tcps_setattr, /*tp_setattr*/
(cmpfunc)0, /*tp_compare*/
(reprfunc)0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
(hashfunc)0, /*tp_hash*/
};
/* End of code for MacTCP TCP stream objects */
/* -------------------------------------------------------- */
static int
udps_asr_safe(arg)
void *arg;
{
udpsobject *self = (udpsobject *)arg;
object *args, *rv;
if ( self->asr == None )
return 0;
args = mkvalue("(i)", self->asr_ec);
rv = call_object(self->asr, args);
DECREF(args);
if ( rv ) {
DECREF(rv);
return 0;
}
return -1;
}
static pascal void
udps_asr(str, ec, self, icmp)
StreamPtr str;
unsigned short ec;
udpsobject *self;
struct ICMPReport icmp;
{
if ( self->asr == None )
return;
self->asr_ec = ec;
Py_AddPendingCall(udps_asr_safe, (void *)self);
}
static object *
udps_Read(self, args)
udpsobject *self;
object *args;
{
OSErr err;
object *rv;
int timeout;
if (!newgetargs(args, "i", &timeout))
return NULL;
err = xUDPRead(&self->iop, timeout, (UDPIOCompletionUPP)0);
if ( err ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
rv = newsizedstringobject((char *)self->iop.csParam.receive.rcvBuff,
self->iop.csParam.receive.rcvBuffLen);
err = xUDPBfrReturn(&self->iop, self->iop.csParam.receive.rcvBuff);
if ( err ) {
PyErr_Mac(ErrorObject, err);
DECREF(rv);
return NULL;
}
return rv;
}
static object *
udps_Write(self, args)
udpsobject *self;
object *args;
{
unsigned long host;
unsigned short port;
char *buf;
int bufsize;
OSErr err;
miniwds wds;
if (!newgetargs(args, "lhs#", &host, &port, &buf, &bufsize))
return NULL;
wds.length = bufsize;
wds.ptr = buf;
wds.terminus = 0;
err = xUDPWrite(&self->iop, host, port, &wds, (UDPIOCompletionUPP)0);
if ( err ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
INCREF(None);
return None;
}
static struct methodlist udps_methods[] = {
{"Read", (method)udps_Read, 1},
{"Write", (method)udps_Write, 1},
{NULL, NULL} /* sentinel */
};
/* ---------- */
static object *
udps_getattr(self, name)
udpsobject *self;
char *name;
{
if ( strcmp(name, "asr") == 0 ) {
INCREF(self->asr);
return self->asr;
}
if ( strcmp(name, "port") == 0 )
return newintobject((int)self->port);
return findmethod(udps_methods, (object *)self, name);
}
static int
udps_setattr(self, name, value)
udpsobject *self;
char *name;
object *value;
{
if ( strcmp(name, "asr") != 0 || value == NULL )
return -1;
self->asr = value; /* XXXX Assuming I don't have to incref */
return 0;
}
static udpsobject *
newudpsobject(bufsize, port)
int bufsize;
int port;
{
udpsobject *self;
OSErr err;
self = NEWOBJ(udpsobject, &Udpstype);
if (self == NULL)
return NULL;
memset((char *)&self->iop, 0, sizeof(self->iop));
self->port = port;
err= xUDPCreate(&self->iop, bufsize, &self->port, upp_udp_asr,
(void *)self);
if ( err ) {
DEL(self);
PyErr_Mac(ErrorObject, err);
return NULL;
}
INCREF(None);
self->asr = None;
return self;
}
static void
udps_dealloc(self)
udpsobject *self;
{
xUDPRelease(&self->iop);
DEL(self);
}
static typeobject Udpstype = {
OB_HEAD_INIT(&Typetype)
0, /*ob_size*/
"MacTCP UDP stream", /*tp_name*/
sizeof(udpsobject), /*tp_basicsize*/
0, /*tp_itemsize*/
/* methods */
(destructor)udps_dealloc, /*tp_dealloc*/
(printfunc)0, /*tp_print*/
(getattrfunc)udps_getattr, /*tp_getattr*/
(setattrfunc)udps_setattr, /*tp_setattr*/
(cmpfunc)0, /*tp_compare*/
(reprfunc)0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
(hashfunc)0, /*tp_hash*/
};
/* End of code for MacTCP UDP stream objects */
/* -------------------------------------------------------- */
static object *
mactcp_TCPCreate(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
object *rv;
int bufsize;
if (!newgetargs(args, "i", &bufsize))
return NULL;
if ( (err = xOpenDriver()) != noErr ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
rv = (object *)newtcpsobject(bufsize);
return rv;
}
static object *
mactcp_UDPCreate(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
object *rv;
int bufsize, port;
if (!newgetargs(args, "ii", &bufsize, &port))
return NULL;
if ( (err = xOpenDriver()) != noErr ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
rv = (object *)newudpsobject(bufsize, port);
return rv;
}
static object *
mactcp_MTU(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
unsigned short mtu;
if (!newgetargs(args, ""))
return NULL;
if ( (err = xOpenDriver()) != noErr ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
mtu = xMaxMTU();
return newintobject((int)mtu);
}
static object *
mactcp_IPAddr(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
unsigned long rv;
if (!newgetargs(args, ""))
return NULL;
if ( (err = xOpenDriver()) != noErr ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
rv = xIPAddr();
return newintobject((int)rv);
}
static object *
mactcp_NetMask(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
unsigned long rv;
if (!newgetargs(args, ""))
return NULL;
if ( (err = xOpenDriver()) != noErr ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
rv = xNetMask();
return newintobject((int)rv);
}
#ifdef TCP_GS
static object *
mactcp_GlobalInfo(self, args)
object *self; /* Not used */
object *args;
{
OSErr err;
if (!newgetargs(args, ""))
return NULL;
if ( (err = xOpenDriver()) != noErr ) {
PyErr_Mac(ErrorObject, err);
return NULL;
}
/* XXXX Allocate, fill */
INCREF(None);
return None;
}
#endif /* TCP_GS */
/* List of methods defined in the module */
static struct methodlist mactcp_methods[] = {
{"TCPCreate", mactcp_TCPCreate, 1},
{"UDPCreate", mactcp_UDPCreate, 1},
{"MTU", mactcp_MTU, 1},
{"IPAddr", mactcp_IPAddr, 1},
{"NetMask", mactcp_NetMask, 1},
#ifdef TCP_GS
{"GlobalInfo", mactcp_GlobalInfo, 1},
#endif
{NULL, NULL} /* sentinel */
};
/* Initialization function for the module (*must* be called initmactcp) */
void
initmactcp()
{
object *m, *d;
/* Create the module and add the functions */
m = initmodule("mactcp", mactcp_methods);
/* Add some symbolic constants to the module */
d = getmoduledict(m);
ErrorObject = newstringobject("mactcp.error");
dictinsert(d, "error", ErrorObject);
upp_tcp_done = NewTCPIOCompletionProc(tcps_done);
upp_tcp_asr = NewTCPNotifyProc(tcps_asr);
#if 0
upp_udp_done = NewUDPIOCompletionProc(udps_done);
#endif
upp_udp_asr = NewUDPNotifyProc(udps_asr);
/* XXXX Add constants here */
/* Check for errors */
if (err_occurred())
fatal("can't initialize module mactcp");
}

View file

@ -1,2 +0,0 @@
initmacdnr
initmactcp

View file

@ -1,212 +0,0 @@
(This file must be converted with BinHex 4.0)
:%'eKBh4MF'e[C(9XCA-ZEA8!68e38N0A588!N!3Dd!!!+q@Mh@0[Ef`!!!!"!!!
!(!!!'Q3!!"U!!!!!8!!!!!3!!!"S!!)!-!!#!"`(8fpeFQ0PFpf3#!#3'3)!-!!
#!#J*6'PLFQ&bD@9chC!'!*!C!J!!!!)!+!P-D@*bBA*TCA2GN!B!N"d#!#J!q2r
`!*!&!G58!*!'-XB!!!!"!*5fU!#3$3)!!-c-!$,-c*Q3"!!cc-bCQ@CQ!$6-c*Q
C-c-!0Fc-QCN!!!!fc-aQC[rr!$I-c'CQc-`!1-c-CQB!!`!"3!F!N!3-5@jdCA*
QB@0P6'PL!*!6V%qP3!'"Fh4eBUa2T8!!!J!$!*!%$QeKBf4ZFQe[C(9XC5jM!*!
4VA-b@3'"9%9B9+ec-PN!!`!$!*!%$QeKBh4MF'e[C(9XC5jM!*!4VA-b@J'"9%9
B9+ec-PS!"!!$!*!%#A4MF'GXG@8ZB`#3&Uec-PS"J94&@&5YFc*D!!8!!`#3"!a
KE'a[BQTPBh4c,QJ!N"1Z#C!!13'!9%9B9+i*N!!j!!B!!`#3"!KMEfjQD@FZD!#
3&kec-NF"J&4&@&5YFc*(!!G!!`#3"!GcG'4TEbjS!*!BV6qZp!#!9%9B9+drV[3
!#%!$!*!%"hPfB@ac,QJ!N"LYXp4*!)"849K8VE2853!*3!-!N!3)Fh4bD@jR,QJ
!N"HY2kld!)"849K8V6qZp!!+3!-!N!3(CA*bEQmZD!#3'+drV[)!J&4&@&5Y2kl
b!!X!!`#3"!PYHA"bEh4[,QJ!N"DYFc)H!B"849K8VA-b(J!-!!-!N!3*FQ9ZB@e
P-LjS!*!@VJQ3!$N"J&4&@&5Z#C!!13!0!!-!N!3)Ef*UC@0d,QJ!N"HZ#C!!13'
!9%9B9+i*N!!j!!i!!`#3"!P[BQTTEA"X,QJ!N"DYFc)H!B"849K8VA-b(J!2!!-
!N!31B@0MCA0cEf*UC@0d,QJ!N"'YFc)C!B"849K8VA-b'3!3!!-!N!3,D@jdEf*
UC@0d,QJ!N"5YFc)F!B"849K8VA-b(!!4!!-!N!3-E'pZCfpLDQ9MG#jS!*!6VA-
b(3'!9%9B9+ec-Kd!%J!$!*!%$@CXEf&dEf*UC@0d,QJ!N"+YFc)E!B"849K8VA-
b'`!6!!-!N!30FQ&ZCf9[BQTPBh3ZD!#3%Uec-Km"J&4&@&5YFc)I!"3!!`#3"!j
cG(*TEQG[BQTPBh3ZD!#3%Dec-Km"J&4&@&5YFc)I!"8!!`#3"!edGA"XC@pLDQ9
MG#jS!*!5VA-b)!'!9%9B9+ec-L!!&J!$!*!%$'aTFh4[BQTPBh3ZD!#3%kec-Kd
"J&4&@&5YFc)G!"F!!`#3"!pYBA"`D@jREf*UC@0d,QJ!N"#YFc)G!B"849K8VA-
b(3!B!!-!N!31E@9dD'pNEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!C!!-!N!3
1E@pNG@aPEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!D!!-!N!3-CR9ZBfpLDQ9
MG#jS!*!6VA-b(!'!9%9B9+ec-K`!'`!$!*!%$@0XBA0cEf*UC@0d,QJ!N"+YFc)
D!B"849K8VA-b'J!F!!-!N!3-CQPXC@pLDQ9MG#jS!*!6VJQ3!$N"J&4&@&5Z#C!
!13!G!!-!N!3+EAPYB@aXEf-ZD!#3&Dec-Ki"J&4&@&5YFc)H!"j!!`#3"!KcG'4
XD@)ZD!#3&kdrV[3!J&4&@&5Y2kld!"m!!`#3"!aYEf4cGA"`Eh*d,QJ!N"1YFc)
G!B"849K8VA-b(3!J3!-!N!3)Fh4NBA*R,QJ!N"HY2kqp!)"849K8V6q[[3!K3!-
!N!3*Ah0dC'&bCbjS!*!@UX`2e`#!9%9B9+V-$pF!)J!$!*!%"f0PGQ&X,QJ!N"L
YFc)D!B"849K8VA-b'J!M!!-!N!3+B@*cG(*KBh3ZD!#3&Dec-KN"J&4&@&5YFc)
C!#3!!`#3"!PYB@0RE(9P,QJ!N"DZ*8AF!B"849K8VL9&h!!P3!B!N!3(9(P`CA-
ZD!#3'+fY'UN!J&4&@&5YV4UT!#C!"J#3""0$EfjNDA4TEfjKE%eKBh*[FbjS!*!
-V4rb3!#!9%9B9+dImN!!*d!'!*!%"dCTE'9c,QJ!N"LX)B$!!)"849K8V#'!`!!
S3!B!N!3,6@PiC@40Ef4P,QJ!N"5Y8ec!!)"849K8V90F`!!T3!B!N!3*6e09G'P
XFbjS!*!@VE291`#!9%9B9+fce6X!+N!'!*!%#%ePE@pbH5jS!*!AV#'!`!#!9%9
B9+`KJ-!!+d!'!*!%#%9fC@jdFbjS!*!AV4rb3!#!9%9B9+dImN!!,%!'!*!%#e&
eD@0VC(*KGbjS!*!8V')D3!#!9%9B9+aL'N!!,8!'!*!%$e&eD@0VC(*KGe4PH(3
ZD!#3%+`KJ-!!J&4&@&5X)B$!!#j!"J#3"!j6G'&ZC'&bC%CTE'8ZD!#3%D`KJ-!
!J&4&@&5X)B$!!#p!"J#3"!P%D@&XEfGc,QJ!N"DX)B$!!)"849K8V#'!`!!`3!B
!N!3)4A*bEh*c,QJ!N"HY(r*!!)"849K8V4rb3!!a3!B!N!3(6@9ZGA-ZD!#3'+`
KJ-!!J&4&@&5X)B$!!$*!"J#3"!T$EfjdFQpXFbjS!*!9V#'!`!#!9%9B9+`KJ-!
!-d!'!*!%#9GTEQ4[Gh-ZD!#3&UaL'N!!J&4&@&5XBKT!!$4!"J#3"!T8CAKd4@4
TG#jS!*!9V#'!`!#!9%9B9+`KJ-!!08!&!*!%%%&NC(*PFh0BE'&dD@pZ,QJ!N!q
VZre!!)"849K8Ul[p3!!f3!B!N!3)6@&M9%03,QJ!N"HYQ6a!!)"849K8VCNm3!!
h3!B!N!3,3A"`E'98B@aV,QJ!N"5X)B$!!)"849K8V#'!`!!i3!B!N!3'4'9cDbj
S!*!CV#'!`!#!9%9B9+`KJ-!!18!'!*!%#84PGQPMCA-ZD!#3&UdImN!!J&4&@&5
Y(r*!!$S!!`#3"!jcG(*eBh4YC@eLCA)ZD!#3%Dec-Km"J&4&@&5YFc)I!$X!!`#
3"!PdBh"RE(9P,QJ!N"DYFc*E!B"849K8VA-b@`!m3!8!N!366@&M9%033fpYE@p
Z9(P`CA-ZD!#3$+X%`dB!J&4&@&5V"-0'!$e!"3#3"!e(CA40H8P33@4NFLjS!*!
5U`6$83#!9%9B9+X%`e%!2N!&!*!%"e4$8&"#,QJ!N"LV"--T!)"849K8U`6$+3!
r3!8!N!3(98438%)ZD!#3'+X%`b!!J&4&@&5V"--J!%!!"!#3"!PbG@jdD@eP,Q-
!N"DXVa"e!B"849K8V+m3G3""!!-!N!3@EAGPFQYcAh"XG@GTEPpMEfjQD@FZD!#
3#Dec-QX"J&4&@&5YFc*V!%)!!`#3"!pMEfe`E'9iEf*UC@0d,QJ!N"#Z#C!!13'
!9%9B9+i*N!!j!%-!!`#3"!PMEf*UC@0d,QJ!N"DYFc)D!B"849K8VA-b'J"%!!)
!N!36E@&MG'0`E@pNG@aPFbke,Q9iF!#3$+cq!28"J&4&@&5XrJ$e!%8!!`#3"!T
`H@9bFQpbFbjS!*!9VA-b(`'!9%9B9+ec-Km!4J!$!*!%#P"jG'K[EN0[FQ8!N"@
Z*RYp!B"cD'aLVLClI3"(!!-!N!3*F(PNC@*eCbjS!*!@VJQ3!$N"J&4&@&5Z#C!
!13")!!-!N!3,G(*KBf9LB@0V,QJ!N"5YFc)J!B"849K8VA-b)!"*!!-!N!3,F(P
dD'pZFR9Z,QJ!N"5Z#C!!13'!9%9B9+i*N!!j!%S!!`#3"!YcHA0YEf4eE'8ZD!#
3&+i*N!!j!B"849K8VJQ3!$N!5`!$!*!%#fPZG(*MD'9MDbjS!*!8VKP0'!'!9%9
B9+iC64J!6!!$!*!%#'PYF'pbG#jS!*!AVJQ3!$N"J&4&@&5Z#C!!13"0!!-!N!3
0BQadD@jYEf4eE'8ZD!#3%Ui*N!!j!B"849K8VJQ3!$N!6N!'!*!%#%YPFQjPE#j
S!*!AV4rb3!#!9%9B9+dImN!!6d!'!*!%%deKBfKTEQ9&H'0PF(4TEfjc,QJ!N!b
X)B$!!)"849K8V#'!`!"33!B!N!316Q&YC9*PCfPcG(*j,QJ!N"'Y(r*!!)"849K
8V4rb3!"43!B!N!323fpNC8CbB@GYC@jdFbjS!*!3V#'!`!#!9%9B9+`KJ-!!!!K
-!!F#G!!!!%B!!3#3#!)!N!81E@&MC'jbE@pNG@aP,Q-!N"S#!*!(0DZlr8!!!3!
hV#'!`!!"!&'X)B$!!!%!*UdImN!!!3!bV#'!`!!"!$LX)B$!!!%!1DdImN!!!3!
[V#'!`!!"!!UY2klb!!%!-+dImN!!!3!VV4rb3!!"!#HX)B$!!!%!6UdImN!!!3"
2V#'!`!!"!$DYQ6a!!!%!+U`KJ-!!!3!aV#'!`!!"!#LY8ec!!!%!8+dImN!!!3!
TVE291`!"!#bXBKT!!!%!,D`KJ-!!!3!ZV#'!`!!"!##Y2kqp!!%!"kdrV[3!!3!
HV6qZp!!"!!QY2kld!!%!0+`KJ-!!!3!PVDdDU3!"!$1XBKT!!!%!#+fce%N!!3!
KUX`2e`!"!#1YFc)C!!%!$kec-KN!!3!&VJQ3!$N!!3"0VJQ3!$N!!3!LVA-b'J!
"!"ZYFc)D!!%!3kec-KS!!3"#VJQ3!$N!!3!'VA-b4`!"!"bZ#C!!13!"!"+YFc)
E!!%!'Uec-K`!!3"-VJQ3!$N!!3!3VA-b(!!"!%ZZ'8dB!!%!&Uec-Kd!!3!4VA-
b(3!"!#5Z*8AF!!%!&kec-Kd!!3!BVA-b(3!"!"qYFc)G!!%!'Dec-Kd!!3""VA-
bD`!"!"fYFc)H!!%!#kec-Ki!!3!0VJQ3!$N!!3!1VA-b(J!"!%HZ#C!!13!"!%@
YFc)I!!%!5Di*N!!j!!%!%kec-Km!!3!-VJQ3!$N!!3!8VA-b(`!"!$UYFc)I!!%
!5Ui*N!!j!!%!5+ec-L!!!3!9VA-b)!!"!TB#Q!+D!T`!!!",!!%!N!J#!*!&$Qe
KBh4MF'e[C(9XC5jM!*!D!`#3"c@VZre!!!%!0k`KJ-!!!3"4V#'!`!!"!#DY(r*
!!!%!-U`KJ-!!!3!iV#'!`!!"!$QY(r*!!!%!,k`KJ-!!!3!+V6qZmJ!"!$#Y(r*
!!!%!+kdImN!!!3!RV#'!`!!"!$fV"-04!!%!6UdImN!!!3"2V#'!`!!"!$DYQ6a
!!!%!2+X%`dB!!3!UV#'!`!!"!$'X)B$!!!%!++e6A-!!!3"3V4rb3!!"!#QYXp8
l!!%!,+aL'N!!!3!YV#'!`!!"!#kX)B$!!!%!)+drVld!!3!(V6qZp!!"!"kY2kl
d!!%!#DdrV[3!!3!qU`6$+3!"!$5X)B$!!!%!*DfY'UN!!3!rU`6$)!!"!$1XBKT
!!!%!#+fce%N!!3!KUX`2e`!"!#1YFc)C!!%!$kec-KN!!3!&VJQ3!$N!!3"0VJQ
3!$N!!3!LVA-b'J!"!"ZYFc)D!!%!3kec-KS!!3"#VJQ3!$N!!3!'VA-b4`!"!"b
Z#C!!13!"!"+YFc)E!!%!'Uec-K`!!3"-VJQ3!$N!!3!3VA-b(!!"!%ZZ'8dB!!%
!&Uec-Kd!!3!4VA-b(3!"!#5Z*8AF!!%!&kec-Kd!!3!BVA-b(3!"!"qYFc)G!!%
!'Dec-Kd!!3""VA-bD`!"!"fYFc)H!!%!#kec-Ki!!3!0VJQ3!$N!!3!1VA-b(J!
"!%HZ#C!!13!"!%@YFc)I!!%!5Di*N!!j!!%!%kec-Km!!3!-VJQ3!$N!!3!8VA-
b(`!"!$UYFc)I!!%!5Ui*N!!j!!%!1kec-PX!!3")VA-b)!!"!"@YFc)J!!%",J%
`!6)"0!!!!"i!!3#3#!)!N!8*G'0`CfaeC5jM!*!I"!#3"c@VZre!!!%!0k`KJ-!
!!3"4V#'!`!!"!#DY(r*!!!%!-U`KJ-!!!3!jV4rb3!!"!#qX)B$!!!%!-+dImN!
!!3!VV4rb3!!"!#HX)B$!!!%!2DX%`e%!!3"1V4rb3!!"!%qX)B$!!!%!0UfC2%!
!!3!mU`6$4J!"!#UX)B$!!!%!-D`KJ-!!!3!SV90F`!!"!&#Y(r*!!!%!+Dfce6X
!!3!XV')D3!!"!#fX)B$!!!%!2UX%`bN!!3!dV#'!`!!"!#@YV4UT!!%!2kX%`b!
!!3!cV')D3!!"!%'YFc*V!!%!1kec-PX!!3%1!4!"%J%8!!!!!3!"!*!)!J%!N!3
6E@&MG'0`E@pNG@aPFbke,Q9iF!#3&83!N!G'!%Mp33!"!$HX)3&4FD!!N!BLN!!
"8C6!J-)!!3!jV#'!`J!"!8I!8)$#!!%!-+`KJ-)!!3!VV#'!`J!"!#HX)B$#!!%
!2DX%`e%!!3!fV#'!`3!"!$bV"-0'!!%!+U`KJ-)!!3!aV#'!`J!"!#LX)B$#!!%
!+D`KJ-)!!3!XV#'!`J!"!#fX)B$#!!%!2UX%`bN!!3!dV#'!`J!"!#@XDI6b!!%
!2kX%`b!!!3!cV#'!`J!"!%'Xrbq[!!%!1kY#c6)!!3"'!%J!5J"-!qF!!3!#!*!
)!J%!N!3+8(PdD'pZ3fpbC3#3(NB!N!G'!%J!5J"-!qF!!3!#!*!)!J#3"3a*ER4
PFQCKBf9-D@)!N"`"!*!(6J"3!&)!9!!!!!)!!J#3#!)"!*!%#A*eER4TE@8ZB`#
3(d!!N!G"VA-bD`!"!*!)!YkYQ!!!!4i!!"%@8%CXF`#3"!,HVY3!!")d!!!)6&"
-Fh3!N!S"(!!!!!*38f9Rrrm!N!NF!!!"!&"6C@F!!3!!GM)!!!%!!!!T-`!!+$-
!!!+b!!3!+!!+!F)#J!!S!!S"`J+!!*!1%'eKBh4MF'e[C(9XCA-ZEA9X!J!!!%e
08&*$9dP&!*!%68e38N0A588!N"LZUS!V!!!Dd!!!+q9S!*!B#J!#!*!,"!!##!#
3"-3!"0!!N%&TEQPdH(J!N!X#!!B!!!!+!!3!N!X`!!B"!2rr!*!)rrm"N!8!N!3
H!3%!N!LCQ3!!2rmrrcrr!3#3"%S!!3!*"Qe[EQ&ME`#3(!3!+!!+!F)#J!!S!!S
"`J+!!*!3!3#3"!)!N!88!!%!@!#Z!-m"d3#3"%S6!!!G0`!!!"S!!`!!QCN!N!4
rr`#3"(rr!*!%Irm!N!3+-!!%!!!!!`!(!3J!!3%kA*%!jNMN!!j[K'&cDb!!!!!
F!*!*[XUQ!,l,P!#qbk`!N!@r%e`!N!@r%e`!%#5!!*!Sc*!)!1C!d!$Q3'$GN!K
rrhrr!1C!K!#3"%#(!*!%"B3!!+%LrJ)!N!IQ30!!!cNb!*!6!3#qbf)![XY#!,m
(b!!!A*%!jNMN!!!!!f&cDb!!!!!F!*!*[XUQ!,l,P!#qbk`!N!@r%e`![iPF!,m
6'%e33d-"#!!"!MSkN3$Q513!$Qq%BA0V)!!!!"`!N!QqbUB![XZ8!,l,V!#3"Em
6A!#3"Em6A!!3*)!!N#M-N!J!jN$3!1C!B0f3#(rrIrm!jN#%!*!%3)F!N!3&K!!
!S5,q!J#3"qC!d!!$16)!N"-"!,l,BJ#qbd)![`I)!!"FN3$Q513!!!!$BA0V)!!
!!"`!N!QqbUB![XZ8!,l,V!#3"Em6A!#rL9`![a-B69"$3`'i!!)h1NeKBdp6)&0
eF("[FR3k6'PLFQ&bD@9c1P*eER4TE@8k8R9ZG'PYC5"38%-k+&0[GA*MCA-T1J!
!!"2[E!#3)!'MHpJ!N!A6%83!N!3"Sh[B!!)!!!(6ha!"V8(S!*!KjJ"c!2J!b!'
Y4r`!"!!i!G2J5!!!%83"dpp`,k$Gh3!2k#!!!2r"!$2#d!!6lf`!D`%r!'X"2`(
FF`J"h(48!GaBV!(FFd3"h&,X!GaJZ!!!!2m"I`#qrmIMIJ(6h`!"d`%!!!%B1MS
k3eG(990*)$%Z0Lid1QPZBfaeC'8k-!!6qC3!1D3)!!!dY!#3#Irrr`()p6J"b24
33J!#"2rGB'`"X@6*!FMdB!!#9E!"XAP3!D)Xd!()p(!!!P@`!"'lj!!e,`!!4!)
!!!%!!3!"!!%!!!!$!FMdX!#3"2rDi)3!!!!"!FMe!!!5qR`"Q)q`!E&Nc!()p-!
!%[Tm!"(+&!()pG)"b26!!!*9X2r8FF!!!+%L!FMdm!!$-8Mrf`1)!*!%!FMf%!!
6fI`!%pR`!FMf@J()p2!!%qCSrpe#1'Mrpd!"b28!!",h+!!4U&!"X@5S!2rrr`!
90c3"d3%!!!)N1NeKBdp6)&0eF("[FR3k5'9KC'9bFcT"6P0*)%KPB@4PFR-k!*!
LjN33!*!(!3!0HPJN!!J%!1C$N!!!%#33!1C&6!#3'4!J[!#3"HC&J!#3"3ekT!#
qk#"!RI&3!"!N%!#3"HC&KJ#3"4!NJ!!!S"`!N"AQ4*!!!*!*$ATB*)!)"!$Q4"!
!%#33!*!H!3!!!L3k6@&M6e-J8h9`F'pbG$T)C@&NCA*c1P"33b"6F'9MD@CTBcS
!N#,Q4"!!N!F"!!ek@#3!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AU
N!,lS)%#Gm9!!%#33!*!&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C
%%!!3*"!!N"i"!!!#2$T0B@028b"6GA"`Eh*d1NKPB@4PFR-k8hPcG'9Y)%9iG(*
KFb")C@&NCA*c1NeKBe4$8#")C@&NCA*c1J#3#ZC%%!#3"`%!$ATB*!!)"!$Q3j!
!!"!N%!$Q48`!N"N3),`!N!AQ4B!!N!80HU3![ZJJ3*ha8!!3*"!!N!AQ4BB!N!8
3*)!!!+!F!*!9jN53!!#3#3ek@#5!#!3!jN33!"!N%!#3(J%!!!)T1NeKBdp6)&0
eF("[FR3k5'9KC'9bFcT9EQPfCA*cB@`J5'9KC'9bFcS!N"hQ4"!!N!F"!!ek@#3
!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AUN!,lS)%#Gm9!!%#33!*!
&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C%%!!3*"!!N"i"!!!#*MT
0B@028b"6GA"`Eh*d1NaTBR*KFQPPFcT0B@028b"$EfeYEfik!*!JjN33!*!(!3!
0HPJN!!J%!1C$N!!!%#33!1C&6!#3'4!J[!#3"HC&J!#3"3ekT!#qk#"!RI&3!"!
N%!#3"HC&KJ#3"4!NJ!!!S"`!N"AQ4*!!!*!*$ATB*)!)"!$Q4"!!%#33!*!H!3!
!!Ldk6@&M6e-J8h9`F'pbG$T-D@*bBA*TCA-k8R9ZG'PYC6T5G@jdD@eP)&"33cS
!N"RQ4"!!N!F"!!ek@#3!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AU
N!,lS)%#Gm9!!%#33!*!&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C
%%!!3*"!!N#!8P!!'%%eKBdp6)&"33b"-D@jVCA)!N"!%%%eKBdp6)&"33b"-D@j
VCA)!N$!D39"36!#33'!!!!""F("X!*"!B!!!!%e06%)!N#!16'PL)%PYF'pbG#"
38%-!N"908%a'!*!J$NaTBL"*EA"[FR3J8&"$!*!969G$4!#33'!!!!"58e*$!*"
!B!!!!&4&@&3$,Q*SBmUV8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfp
Z)%KPE(!!N!8G"!(+Ui!!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ8&"
$!*!A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)&"33`#3&e4&@&3$,Q0M!*!F$%eA)%-
[3bXV)&"33`#3&e4&@&3$,Q0`!*!F$%eA)%-[3bXV)&"33`#3&e4&@&3%,Q0`F!#
3'`a09b"$,d-V+b"38%-!N"G849K8"#jPH(!!N$p849K8!LjS!*!G$%eA)%-[3bX
V)&"33`#3%a!!!!"849K8!Lj`!*!G$8eA)&"KFf0KE#"38%-!N"C849K8"#j`BA-
!N"X069FJ8'&cBf&X)&"33`#3&P4&@&3%,R"MD!#3'`a09b"$,d-V+b"38%-!N"1
!!!!!9%9B9!BZF'0S+bX!N"N-69FJ3bp$+bXJ8&"$!*!6J!!!!&4&@&3#,R)!N"d
'69FJ8Q9k!*!G9%9B9!)ZFfKMbUY3!!-`b!!8VG!!!!&q!FUV8!!8CF!!!!,@"P"
33d&cE@iJ5'9X!*!'(33"bUZ!!"4P`!'(PY3!N!4B3dp'!*!J%&K$6dC')%PYF'p
bG#"38%-!N"0NEf0e!*"!B!!!!(*cFQ-!N%"J!!!!FfKXBJ#3)!j348BJ5@e`Eh*
d)&"33`#3&A0dG@)!N#!18%9')%PYF'pbG#"38%-!N"N%,Q4[B`#31e!!!!!36@&
M6e-J0MK,)%aTEQYPFJ#3-"T"8&"-!*"!B!!!!%&`F'`!N%"J!!!!68e-3J#3)!j
-D@)J5@e`Eh*d)$Bi5`#3&8e36%B!N#!16'PL)%PYF'pbG#!f1%X!N"909d0%!*"
!B!!!!%p#5L!!N#!169"A)%PYF'pbG#!f1%X!N"958e*$!*"!B!!!!&4&@&3$,Q*
SBmUV8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfpZ)%KPE(!!N!8G"!(
+Ui!!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ0MK,!*!A9%9B9!3ZBbX
V!*!E$%eA)%-[3bXV)$Bi5`#3&e4&@&3$,Q0M!*!F$%eA)%-[3bXV)$Bi5`#3&e4
&@&3$,Q0`!*!F$%eA)%-[3bXV)$Bi5`#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b!
f1%X!N"G849K8"#jPH($+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abTdP%L
VJ!(+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"&4&@&3#,QJ!N"d-69FJ3bp$+bX
J0MK,!*!6%!!!!&4&@&3#,R!!N"d069FJ8'&cBf&X)$Bi5`#3&P4&@&3%,R"KF`#
3'`e09b"3BA0MB@`J0MK,!*!@9%9B9!3ZF'0S!*!E$%eA)%-[3bXV)$Bi5`#3%i!
!!!"849K8"Lj`BfJV+`#3'3a09b"$,d-V+b!f1%X!N"1!!!!!9%9B9!)ZFJ#3(3C
09b"5CAS!N"e849K8"#jcC@I+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abT
dP%LVJ!(+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"'4[Bh8!N%"J!!!!FR0bB`#
33'!!!!"cD'aL!*!J$P"&4L"*EA"[FR3J0MKV!*!9Fh4eBJ#3)!j348BJ5@e`Eh*
d)$BiD`#3'33ZC'pM!*!l8!!!!""AD@ic-L"i1$BJ6'PZDf9b!*!`#94&@&3#,Q-
!N"d-69FJ3bp$+bXJH$Jf!*!A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)(Ji0J#3&e4
&@&3$,Q0`!*!F$%eA)%-[3bXV)(Ji0J#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b"
i1$B!N"G849K8"#j`BfJ!N"X-69FJ3bp$+bXJH$Jf!*!6J!!!!&4&@&3',R"MD#X
V!*!C$%eA)%-[3bXV)(Ji0J#3%i!!!!"849K8!bjbB`#3(!K09b"AD@j53`#3(`3
ZE'PL!*!E$NaTBL"*EA"[FR3JH$Jf!*!C"#j[BQS!N"X16f*U)%PYF'pbG#"i1$B
!N"8*68-J6'PZDf9b!*!h#%e03dJ!N%4849K8!LjM!*!G#%e$)%-[3bXV!*!E9%9
B9!3ZBfac!*!E%8e$)%0XBA0c)%0[EA"TE'9b!*!1J!!!!&4&@&3%,Q4PCJ#32e4
&@&3%,Q4[B`#31a!!!!"849K8!LjS!*!p%!!!!&4&@&3%,R"MD!#3'`K03b"$,d-
V+`#3&i!!!!"849K8!bjdF`#33`B!!3%!N!B8!!3"!*!(!3#3$!S!!3%!!!%"!!%
!N!31!!F"!!%"!!%"!!!!!3#3"-B!"`#33Mq3"%&38%`!!!'!@)!!N%)rN!3!N!P
9!C!!!3)#H`#3"3)!!!!8!*!%!B!!N"%i!!N!N!F@EAGPFQYcAh"XG@GTEPpMEfj
QD@FZD!#3$!%!N!i-!!-!N!`"fJ!%!*!3!3#3r`#34&pIFh4KFR3!N(`"!!!!0J!
-!*!(!3#3*3%!N!8"!!!!$3!#!*!1&!!$!J!"!3!!!3%$!3#3#`S!!3%"!!!"!3!
"!!!!a!!'`J#3``%8!!8!!3!!-XJ!!$,)!!!bb!#3"!eYB@0dBh"YEf4eE'9c!*$
eZJ!%!!%4E@&MG'0`E@pNG@aPFbjcE')!N!j3HA4SFfKXBJ#3F3%rN!3!N!GA!+i
!kJ(4!3!!!!Y@!!"FN3!!!#i!!J!!!!)!!J#3+!)-!!)!8!!"!!%!!3!"!*$r!"3
R3dp%45FJ*d4"9%%R)#G35808*`#3lJS!"!#3#J%!!!!T-`!!+$-!!!+b!YkX@#H
U!!!!(!&k!!*`FQ9Q!"J!'R"@CA)!!!&'8e45)`!!!9)%X!!3!!!!"J#3"$U5!"d
!!!!8!*!%FFi!*!!!!%J!N!4E@J!T!!!!R!#3"(Pd!$J!!!#d!*!%$A-!5!!!!0)
!N!32PJ"9!!!,"J#3"&e+!&`!!"qH!*!%*k8!D3!!(kJ!N!3-a!"e!!!I`!#3"#H
U!)B!!"r1!*!%3hX!N3!!(q!!N!4&S`#G!!!JUJ#3"!hN!+`!!#$Q!*!%*ZJ!Z`!
!)2B!N!4kF3$#!!!Le!#3"'@X!0)!!#-1!*!%(YF!iJ!!)am!N!30V3$Z!!!M0`#
3"$#-!2m!!#0&!*!%@MF"#J!!*!d!N!3,L3%5!!!P*3#3"(I+!4i!!#AM!*!%F-F
"+`!!*K8!N!A)rrm!!#JP!*!3'i$rr`!!!*B!N!328(*[DQ9MG#"@CA*cD@pZ$&"
bEfTPBh3J6@PcB`C&C'PdEh)%4QpZG!j3FQpUC@0d)%9iG(*KF`p$GA0dEfdJ5f9
jGfpbC(--3@0MCA0c)&"KG'Kc"P4KFQGPG!a#G@PXC#"&H(4bBA-,0MK,)%0[C'9
(C@i30MK,)%4TFf&cFf9YBQaPFJSf1%XJ6'PZDf9b#cBi5b"3FQpUC@0d$N-[3bX
V)%0[EA"TE'9b$N-[3bXV)&GKFQjTEQGc"N0'66Bi5`p3BA0MB@`J3fpYF'PXCA)
28'&cBf&X)&GKFQjTEQGc#e"33b"$Ef4P4f9Z%&"33b"%DA0KFh0PE@*XCA)+8&"
$)%aTEQYPFJG38%-J8%9'#e"33b"3FQpUC@0d$&"33d&cE5"3B@jPE!a5CASJ3fp
YF'PXCA+qM`:

View file

@ -1,304 +0,0 @@
"""socket.py for mac - Emulate socket module with mactcp and macdnr
Currently only implements TCP sockets (AF_INET, SOCK_STREAM).
Esoteric things like socket options don't work,
but getpeername() and makefile() do work; everything used by ftplib works!
"""
# Jack Jansen, CWI, November 1994 (initial version)
# Guido van Rossum, CWI, March 1995 (bug fixes and lay-out)
import mactcp
import MACTCPconst
import macdnr
# Exported constants
_myerror = 'socket_wrapper.error'
error = (mactcp.error, macdnr.error, _myerror)
SOCK_DGRAM = 1
SOCK_STREAM = 2
AF_INET = 1
# Internal constants
_BUFSIZE = 15*1024 # Size of TCP/UDP input buffer
_myaddress = None
_myname = None
_myaddrstr = None
def _myipaddress():
global _myaddress
if _myaddress == None:
_myaddress = mactcp.IPAddr()
return _myaddress
def _ipaddress(str):
if type(str) == type(1):
return str # Already numeric
ptr = macdnr.StrToAddr(str)
ptr.wait()
return ptr.ip0
def gethostbyname(str):
id = _ipaddress(str)
return macdnr.AddrToStr(id)
def gethostbyaddr(str):
id = _ipaddress(str)
ptr = macdnr.AddrToName(id)
ptr.wait()
name = ptr.cname
if name[-1:] == '.': name = name[:-1]
names, addresses = [], [str]
return name, names, addresses
def gethostname():
global _myname
if _myname == None:
id = _myipaddress()
ptr = macdnr.AddrToName(id)
ptr.wait()
_myname = ptr.cname
return _myname
def _gethostaddress():
global _myaddrstr
if _myaddrstr == None:
id = _myipaddress()
_myaddrstr = macdnr.AddrToStr(id)
return _myaddrstr
def socket(family, type, *which):
if family <> AF_INET:
raise _myerror, 'Protocol family %d not supported' % type
if type == SOCK_DGRAM:
return _udpsocket()
elif type == SOCK_STREAM:
return _tcpsocket()
raise _myerror, 'Protocol type %d not supported' % type
def fromfd(*args):
raise _myerror, 'Operation not supported on a mac'
class _socket:
def unsupported(self, *args):
raise _myerror, 'Operation not supported on this socket'
accept = unsupported
bind = unsupported
close = unsupported
connect = unsupported
fileno = unsupported
getpeername = unsupported
getsockname = unsupported
getsockopt = unsupported
listen = unsupported
recv = unsupported
recvfrom = unsupported
send = unsupported
sendto = unsupported
setblocking = unsupported
setsockopt = unsupported
shutdown = unsupported
class _tcpsocket(_socket):
def __init__(self):
self.stream = mactcp.TCPCreate(_BUFSIZE)
##self.stream.asr = self.asr
self.databuf = ''
self.udatabuf = ''
self.port = 0
self.accepted = 0
self.listening = 0
def accept(self):
if not self.listening:
raise _myerror, 'Not listening'
self.listening = 0
self.stream.wait()
self.accepted = 1
return self, self.getsockname()
# bind has two ways of calling: s.bind(host, port) or s.bind((host, port));
# the latter is more proper but the former more common
def bind(self, a1, a2=None):
if a2 is None:
host, port = a1
else:
host, port = a1, a2
self.port = port
def close(self):
if self.accepted:
self.accepted = 0
return
self.stream.Abort()
# connect has the same problem as bind (see above)
def connect(self, a1, a2=None):
if a2 is None:
host, port = a1
else:
host, port = a1, a2
self.stream.ActiveOpen(self.port, _ipaddress(host), port)
def getsockname(self):
host, port = self.stream.GetSockName()
host = macdnr.AddrToStr(host)
return host, port
def getpeername(self):
st = self.stream.Status()
host = macdnr.AddrToStr(st.remoteHost)
return host, st.remotePort
def listen(self, backlog):
self.stream.PassiveOpen(self.port)
self.listening = 1
def makefile(self, rw = 'r', bs = 512):
return _socketfile(self, rw, bs)
def recv(self, bufsize, flags=0):
if flags:
raise _myerror, 'recv flags not yet supported on mac'
if not self.databuf:
try:
self.databuf, urg, mark = self.stream.Rcv(0)
except mactcp.error, arg:
if arg[0] != MACTCPconst.connectionClosing:
raise mactcp.error, arg
rv = self.databuf[:bufsize]
self.databuf = self.databuf[bufsize:]
return rv
def send(self, buf):
self.stream.Send(buf)
return len(buf)
def shutdown(self, how):
if how == 0:
return
self.stream.Close()
def bytes_readable(self):
st = self.stream.Status()
return st.amtUnreadData
def bytes_writeable(self):
st = self.stream.Status()
return st.sendWindow - st.sendUnacked;
class _udpsocket(_socket):
def __init__(self):
pass
class _socketfile:
def __init__(self, sock, rw, bs):
if rw[1:] == 'b': rw = rw[:1]
if rw not in ('r', 'w'): raise _myerror, "mode must be 'r' or 'w'"
self.sock = sock
self.rw = rw
self.bs = bs
self.buf = ''
def read(self, length = -1):
if length < 0:
length = 0x7fffffff
while len(self.buf) < length:
new = self.sock.recv(0x7fffffff)
if not new:
break
self.buf = self.buf + new
rv = self.buf[:length]
self.buf = self.buf[length:]
return rv
def readline(self):
import string
while not '\n' in self.buf:
new = self.sock.recv(0x7fffffff)
if not new:
break
self.buf = self.buf + new
if not '\n' in self.buf:
rv = self.buf
self.buf = ''
else:
i = string.index(self.buf, '\n')
rv = self.buf[:i+1]
self.buf = self.buf[i+1:]
return rv
def readlines(self):
list = []
line = self.readline()
while line:
list.append(line)
line = self.readline()
return list
def write(self, buf):
BS = self.bs
if len(buf) >= BS:
self.flush()
self.sock.send(buf)
elif len(buf) + len(self.buf) >= BS:
self.flush()
self.buf = buf
else:
self.buf = self.buf + buf
def writelines(self, list):
for line in list:
self.write(line)
def flush(self):
if self.buf and self.rw == 'w':
self.sock.send(self.buf)
self.buf = ''
def close(self):
self.flush()
##self.sock.close()
del self.sock
def __test_tcp():
s = socket(AF_INET, SOCK_STREAM)
s.connect('poseidon.cwi.nl', 13)
rv = s.recv(1000)
print 'Time/date:', rv
rv = s.recv(1000)
if rv:
print 'Unexpected extra data:', rv
s.close()
def __test_udp():
s = socket(AF_INET, SOCK_DGRAM)
print 'Sending data... (hello world)'
s.sendto(('poseidon.cwi.nl', 7), 'hello world')
rv, host = s.recvfrom(1000)
print 'Got from ', host, ':', rv

View file

@ -1,477 +0,0 @@
/*
* Glue routines for mactcp module.
* Jack Jansen, CWI, 1994.
*
* Adapted from mactcp socket library, which was in turn
* adapted from ncsa telnet code.
*
* Original authors: Tom Milligan, Charlie Reiman
*/
# include <Memory.h>
# include <Files.h>
# include <Errors.h>
#include "tcpglue.h"
#include <Devices.h>
static short driver = 0;
#ifndef __powerc
/*
* Hack fix for MacTCP 1.0.X bug
*
* This hack doesn't work on the PPC. But then, people with new machines
* shouldn't run ancient buggy software. -- Jack.
*/
pascal char *ReturnA5(void) = {0x2E8D};
#endif /* !__powerc */
OSErr xOpenDriver()
{
if (driver == 0)
{
ParamBlockRec pb;
OSErr io;
pb.ioParam.ioCompletion = 0L;
pb.ioParam.ioNamePtr = "\p.IPP";
pb.ioParam.ioPermssn = fsCurPerm;
io = PBOpen(&pb,false);
if (io != noErr)
return(io);
driver = pb.ioParam.ioRefNum;
}
return noErr;
}
/*
* create a TCP stream
*/
OSErr xTCPCreate(buflen,notify,udp, pb)
int buflen;
TCPNotifyUPP notify;
void *udp;
TCPiopb *pb;
{
pb->ioCRefNum = driver;
pb->csCode = TCPCreate;
pb->csParam.create.rcvBuff = (char *)NewPtr(buflen);
pb->csParam.create.rcvBuffLen = buflen;
pb->csParam.create.notifyProc = notify;
pb->csParam.create.userDataPtr = udp;
return (xPBControlSync(pb));
}
/*
* start listening for a TCP connection
*/
OSErr xTCPPassiveOpen(TCPiopb *pb, short port, TCPIOCompletionUPP completion,
void *udp)
{
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = TCPPassiveOpen;
pb->csParam.open.validityFlags = timeoutValue | timeoutAction;
pb->csParam.open.ulpTimeoutValue = 255 /* seconds */;
pb->csParam.open.ulpTimeoutAction = 0 /* 1:abort 0:report */;
pb->csParam.open.commandTimeoutValue = 0 /* infinity */;
pb->csParam.open.remoteHost = 0;
pb->csParam.open.remotePort = 0;
pb->csParam.open.localHost = 0;
pb->csParam.open.localPort = port;
pb->csParam.open.dontFrag = 0;
pb->csParam.open.timeToLive = 0;
pb->csParam.open.security = 0;
pb->csParam.open.optionCnt = 0;
pb->csParam.open.userDataPtr = udp;
return (xPBControl(pb,completion));
}
/*
* connect to a remote TCP
*/
OSErr xTCPActiveOpen(TCPiopb *pb, short port, long rhost, short rport,
TCPIOCompletionUPP completion)
{
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = TCPActiveOpen;
pb->csParam.open.validityFlags = timeoutValue | timeoutAction;
pb->csParam.open.ulpTimeoutValue = 60 /* seconds */;
pb->csParam.open.ulpTimeoutAction = 1 /* 1:abort 0:report */;
pb->csParam.open.commandTimeoutValue = 0;
pb->csParam.open.remoteHost = rhost;
pb->csParam.open.remotePort = rport;
pb->csParam.open.localHost = 0;
pb->csParam.open.localPort = port;
pb->csParam.open.dontFrag = 0;
pb->csParam.open.timeToLive = 0;
pb->csParam.open.security = 0;
pb->csParam.open.optionCnt = 0;
return (xPBControl(pb,completion));
}
OSErr xTCPNoCopyRcv(pb,rds,rdslen,timeout,completion)
TCPiopb *pb;
rdsEntry *rds;
int rdslen;
int timeout;
TCPIOCompletionUPP completion;
{
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = TCPNoCopyRcv;
pb->csParam.receive.commandTimeoutValue = timeout; /* seconds, 0 = blocking */
pb->csParam.receive.rdsPtr = (Ptr)rds;
pb->csParam.receive.rdsLength = rdslen;
return (xPBControl(pb,completion));
}
OSErr xTCPBufReturn(TCPiopb *pb,rdsEntry *rds,TCPIOCompletionUPP completion)
{
pb->ioCRefNum = driver;
pb->csCode = TCPRcvBfrReturn;
pb->csParam.receive.rdsPtr = (Ptr)rds;
return (xPBControl(pb,completion));
}
/*
* send data
*/
OSErr xTCPSend(TCPiopb *pb, wdsEntry *wds, Boolean push, Boolean urgent, TCPIOCompletionUPP completion)
{
if (driver == 0)
return invalidStreamPtr;
pb->ioCRefNum = driver;
pb->csCode = TCPSend;
pb->csParam.send.validityFlags = timeoutValue | timeoutAction;
pb->csParam.send.ulpTimeoutValue = 60 /* seconds */;
pb->csParam.send.ulpTimeoutAction = 0 /* 0:abort 1:report */;
pb->csParam.send.pushFlag = push;
pb->csParam.send.urgentFlag = urgent;
pb->csParam.send.wdsPtr = (Ptr)wds;
return (xPBControl(pb,completion));
}
/*
* close a connection
*/
OSErr xTCPClose(TCPiopb *pb,TCPIOCompletionUPP completion)
{
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = TCPClose;
pb->csParam.close.validityFlags = timeoutValue | timeoutAction;
pb->csParam.close.ulpTimeoutValue = 60 /* seconds */;
pb->csParam.close.ulpTimeoutAction = 1 /* 1:abort 0:report */;
return (xPBControl(pb,completion));
}
/*
* abort a connection
*/
OSErr xTCPAbort(TCPiopb *pb)
{
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = TCPAbort;
return (xPBControlSync(pb));
}
/*
* close down a TCP stream (aborting a connection, if necessary)
*/
OSErr xTCPRelease(pb)
TCPiopb *pb;
{
OSErr io;
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = TCPRelease;
io = xPBControlSync(pb);
if (io == noErr)
DisposPtr(pb->csParam.create.rcvBuff); /* there is no release pb */
return(io);
}
#if 0
int
xTCPBytesUnread(sp)
SocketPtr sp;
{
TCPiopb *pb;
OSErr io;
if (!(pb = sock_fetch_pb(sp)))
return -1; /* panic */
if (driver == 0)
return(-1);
pb->ioCRefNum = driver;
pb->csCode = TCPStatus;
io = xPBControlSync(pb);
if (io != noErr)
return(-1);
return(pb->csParam.status.amtUnreadData);
}
int
xTCPBytesWriteable(sp)
SocketPtr sp;
{
TCPiopb *pb;
OSErr io;
long amount;
if (!(pb = sock_fetch_pb(sp)))
return -1; /* panic */
if (driver == 0)
return(-1);
pb->ioCRefNum = driver;
pb->csCode = TCPStatus;
io = xPBControlSync(pb);
if (io != noErr)
return(-1);
amount = pb->csParam.status.sendWindow-pb->csParam.status.amtUnackedData;
if (amount < 0)
amount = 0;
return amount;
}
int xTCPWriteBytesLeft(SocketPtr sp)
{
TCPiopb *pb;
OSErr io;
if (!(pb = sock_fetch_pb(sp)))
return -1; /* panic */
if (driver == 0)
return(-1);
pb->ioCRefNum = driver;
pb->csCode = TCPStatus;
io = xPBControlSync(pb);
if (io != noErr)
return(-1);
return (pb->csParam.status.amtUnackedData);
}
#endif
OSErr xTCPStatus(TCPiopb *pb, TCPStatusPB **spb)
{
OSErr io;
if (driver == 0)
return(-1);
pb->ioCRefNum = driver;
pb->csCode = TCPStatus;
io = xPBControlSync(pb);
if (io == noErr)
*spb = &pb->csParam.status;
return(io);
}
/*
* create a UDP stream, hook it to a socket.
*/
OSErr xUDPCreate(UDPiopb *pb,int buflen,ip_port *port, UDPNotifyUPP asr, void *udp)
{
OSErr io;
pb->ioCRefNum = driver;
pb->csCode = UDPCreate;
pb->csParam.create.rcvBuff = (char *)NewPtr(buflen);
pb->csParam.create.rcvBuffLen = buflen;
pb->csParam.create.notifyProc = asr;
pb->csParam.create.userDataPtr = udp;
pb->csParam.create.localPort = *port;
if ( (io = xPBControlSync( (TCPiopb *)pb ) ) != noErr)
return io;
*port = pb->csParam.create.localPort;
return noErr;
}
/*
* ask for incoming data
*/
OSErr xUDPRead(UDPiopb *pb, int timeout, UDPIOCompletionUPP completion)
{
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = UDPRead;
pb->csParam.receive.timeOut = timeout;
pb->csParam.receive.secondTimeStamp = 0/* must be zero */;
return (xPBControl ( (TCPiopb *)pb, (TCPIOCompletionUPP)completion ));
}
OSErr xUDPBfrReturn(UDPiopb *pb, char *buff)
{
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = UDPBfrReturn;
pb->csParam.receive.rcvBuff = buff;
return ( xPBControl( (TCPiopb *)pb,(TCPIOCompletionUPP)-1 ) );
}
/*
* send data
*/
OSErr xUDPWrite(UDPiopb *pb,ip_addr host,ip_port port,miniwds *wds,
UDPIOCompletionUPP completion)
{
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = UDPWrite;
pb->csParam.send.remoteHost = host;
pb->csParam.send.remotePort = port;
pb->csParam.send.wdsPtr = (Ptr)wds;
pb->csParam.send.checkSum = true;
pb->csParam.send.sendLength = 0/* must be zero */;
return (xPBControl( (TCPiopb *)pb, (TCPIOCompletionUPP)completion));
}
/*
* close down a UDP stream (aborting a read, if necessary)
*/
OSErr xUDPRelease(UDPiopb *pb) {
OSErr io;
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = UDPRelease;
io = xPBControlSync( (TCPiopb *)pb );
if (io == noErr) {
DisposPtr(pb->csParam.create.rcvBuff);
}
return(io);
}
ip_addr xIPAddr(void)
{
struct GetAddrParamBlock pbr;
OSErr io;
pbr.ioCRefNum = driver;
pbr.csCode = ipctlGetAddr;
io = xPBControlSync( (TCPiopb *)&pbr );
if (io != noErr)
return(0);
return(pbr.ourAddress);
}
long xNetMask()
{
struct GetAddrParamBlock pbr;
OSErr io;
pbr.ioCRefNum = driver;
pbr.csCode = ipctlGetAddr;
io = xPBControlSync( (TCPiopb *)&pbr);
if (io != noErr)
return(0);
return(pbr.ourNetMask);
}
unsigned short xMaxMTU()
{
struct UDPiopb pbr;
OSErr io;
pbr.ioCRefNum = driver;
pbr.csCode = UDPMaxMTUSize;
pbr.csParam.mtu.remoteHost = xIPAddr();
io = xPBControlSync( (TCPiopb *)&pbr );
if (io != noErr)
return(0);
return(pbr.csParam.mtu.mtuSize);
}
OSErr xPBControlSync(TCPiopb *pb)
{
(pb)->ioCompletion = 0L;
return PBControl((ParmBlkPtr)(pb),false);
}
#pragma segment SOCK_RESIDENT
OSErr xTCPRcv(pb,buf,buflen,timeout,completion)
TCPiopb *pb;
Ptr buf;
int buflen;
int timeout;
TCPIOCompletionUPP completion;
{
if (driver == 0)
return(invalidStreamPtr);
pb->ioCRefNum = driver;
pb->csCode = TCPRcv;
pb->csParam.receive.commandTimeoutValue = timeout; /* seconds, 0 = blocking */
pb->csParam.receive.rcvBuff = buf;
pb->csParam.receive.rcvBuffLen = buflen;
return (xPBControl(pb,completion));
}
OSErr xPBControl(TCPiopb *pb,TCPIOCompletionUPP completion)
{
#ifndef __MWERKS__
pb->ioNamePtr = ReturnA5();
#endif
if (completion == 0L)
{
(pb)->ioCompletion = 0L;
return(PBControl((ParmBlkPtr)(pb),false)); /* sync */
}
else if (completion == (TCPIOCompletionUPP)-1L)
{
(pb)->ioCompletion = 0L;
return(PBControl((ParmBlkPtr)(pb),true)); /* async */
}
else
{
(pb)->ioCompletion = completion;
return(PBControl((ParmBlkPtr)(pb),true)); /* async */
}
}

View file

@ -1,68 +0,0 @@
/*
* Prototypes for mactcpglue routines and includes/structures needed
* by those.
*
* Jack Jansen, CWI, 1994.
*
* Adapted from mac socket library, which has in turn adapted from ncsa telnet.
* Original authors: Tom Milligan, Charlie Reiman
*/
#include <MacTCPCommonTypes.h>
#include <GetMyIPAddr.h>
#include <TCPPB.h>
#include <UDPPB.h>
#include <AddressXlation.h>
#ifndef __MWERKS__
#define TCPIOCompletionUPP TCPIOCompletionProc
#define TCPNotifyUPP TCPNotifyProc
#define UDPIOCompletionUPP UDPIOCompletionProc
#define UDPNotifyUPP UDPNotifyProc
#define NewTCPIOCompletionProc(x) (x)
#define NewTCPNotifyProc(x) (x)
#define NewUDPIOCompletionProc(x) (x)
#define NewUDPNotifyProc(x) (x)
#endif /* __MWERKS__ */
#if defined(powerc) || defined (__powerc)
#pragma options align=mac68k
#endif
typedef struct miniwds
{
unsigned short length;
char * ptr;
unsigned short terminus; /* must be zero'd for use */
} miniwds;
#if defined(powerc) || defined(__powerc)
#pragma options align=reset
#endif
OSErr xOpenDriver(void);
OSErr xPBControl(TCPiopb *pb, TCPIOCompletionUPP completion);
OSErr xPBControlSync(TCPiopb *pb);
OSErr xTCPCreate(int buflen, TCPNotifyUPP notify, void *udp, TCPiopb *pb);
OSErr xTCPPassiveOpen(TCPiopb *pb, short port, TCPIOCompletionUPP completion, void *udp);
OSErr xTCPActiveOpen(TCPiopb *pb, short port, long rhost, short rport, TCPIOCompletionUPP completion);
OSErr xTCPRcv(TCPiopb *pb, char *buf, int buflen, int timeout, TCPIOCompletionUPP completion);
OSErr xTCPNoCopyRcv(TCPiopb *,rdsEntry *,int,int,TCPIOCompletionUPP);
OSErr xTCPBufReturn(TCPiopb *pb,rdsEntry *rds,TCPIOCompletionUPP completion);
OSErr xTCPSend(TCPiopb *pb, wdsEntry *wds, Boolean push, Boolean urgent, TCPIOCompletionUPP completion);
OSErr xTCPClose(TCPiopb *pb,TCPIOCompletionUPP completion);
OSErr xTCPAbort(TCPiopb *pb);
OSErr xTCPRelease(TCPiopb *pb);
OSErr xUDPCreate(UDPiopb *pb,int buflen,ip_port *port, UDPNotifyUPP asr, void *udp);
OSErr xUDPRead(UDPiopb *pb,int timeout, UDPIOCompletionUPP completion);
OSErr xUDPBfrReturn(UDPiopb *pb, char *buff);
OSErr xUDPWrite(UDPiopb *pb,ip_addr host,ip_port port,miniwds *wds,
UDPIOCompletionUPP completion);
OSErr xUDPRelease(UDPiopb *pb);
ip_addr xIPAddr(void);
long xNetMask(void);
unsigned short xMaxMTU(void);

View file

@ -1,241 +0,0 @@
Drawingtype
initstdwin
ewpaste
ewcopy
ewundo
ewreplace
ewcloseall
ewsaveall
ewevent
ewwritefile
ewsetdimensions
ewreadfile
ewrevert
ewsaveprompt
ewsavecopy
ewsaveas
ewsave
ewclose
ewopen
ewnew
ewcreate
ewcount
ewfind
wparheight
wdrawpar
tesetbuf
tegetlen
tegettext
tegetnlines
tegetfoc2
tegetfoc1
tesetfocus
tenoview
tesetview
temovenew
temove
tegetbottom
tegetright
tegettop
tegetleft
teclicknew
tebackspace
tearrow
teevent
tereplace
tetextround
tewhereis
tewhichline
tewhichpoint
tesetcaret
teemptygap
tegrowgapby
temovegapto
tedrawnew
tedraw
techangefocus
tehidefocus
teshowfocus
tesetactive
tefree
tedestroy
tesetup
tecreate
tealloc
zrealloc
zmalloc
tedrawtext
tetextbreak
tetextwidth
wcprintf
wprintf
about_message
do_about
wargs_argv
wargs_argc
wargs
InitAEHandlers
wnocaret
wsetcaret
blinkcaret
rmcaret
wfetchcolor
_w_cursor
set_hand
set_applcursor
set_watch
set_arrow
wsetwincursor
wfetchcursor
std_type
wasktypelist
waskntypes
wperror
waskstr
waskync
wmessage
waskfile
dprintf
_w_fgcolor
_w_bgcolor
_w_font
_w_size
_w_usebgcolor
_w_usefgcolor
wsetbgcolor
wsetfgcolor
wgetbgcolor
wgetfgcolor
wnoclip
wcliprect
wxorpoly
wfillpoly
wdrawpoly
wxorelarc
wfillelarc
wdrawelarc
wxorcircle
wfillcircle
wdrawcircle
wshade
wpaint
winvert
w_erase
wdrawbox
wxorline
wdrawline
getwinrect
makerect
wdrawchar
wdrawtext
wcharwidth
wtextwidth
wbaseline
wlineheight
wsethilite
wsetunderline
wsetbolditalic
wsetitalic
wsetbold
wsetinverse
wsetplain
wsetstyle_
wsetsize
wsetfont
wlistfontnames
wsetwintextattr
wgetwintextattr
wsettextattr
wgettextattr
initwattr
wenddrawing
wbegindrawing
wupdate
_wupdate
scrollby
wscroll
wchange
_wm_down
active
_w_high_level_event_proc
_w_idle_proc
wgetactive
wsetactive
_wresetmouse
valid_border
inval_border
wgetevent
wpollevent
wungetevent
fullpath
getdirname
about_item
_wmenuhilite
setup_menus
_wdo_menu
rmlocalmenus
addlocalmenus
killmbar
initmbar
wmenusetdeflocal
wmenudetach
wmenuattach
wmenucheck
wmenuenable
wmenusetitem
wmenuadditem
wmenudelete
wmenucreate
PSTRING
wrotatecutbuffers
wgetcutbuffer
wsetcutbuffer
wresetselection
wgetselection
wsetselection
wsetclip
wgetclip
_wfreeclip
_wgrowicon
movescrollbars
hidescrollbars
showscrollbars
makescrollbars
dragscroll
autoscroll
do_scroll
_wfixorigin
wgetdocsize
wsetdocsize
wshow
wgetorigin
wsetorigin
wattr
screen
wgetdefscrollbars
wsetdefscrollbars
wgetdefwinsize
wsetdefwinsize
wgetdefwinpos
wsetdefwinpos
wsetmaxwinsize
wfleep
wgettitle
wsettitle
wsetwinpos
wgetwinpos
wsetwinsize
wgetwinsize
wclose
wopen
whichwin
wgetmouseconfig
wgetscrmm
wgetscrsize
wdone
winit
winitargs
strdup
checktimer
wsettimer
wtextbreak

View file

@ -1,182 +0,0 @@
(This file must be converted with BinHex 4.0)
:$h0dC(GTEQe[C(9XC5jYG3"069"53eG*43#3""11!!!Vj9k[Bfp[E!!!!!%!!!!
F!!!6)J!!%ci!!!"3!!!!"!!!!'J!!J!`!!)!(!G6Eh9bBf9chC!)!*!C!J!`!!)
!+!P-D@*bBA*TCA2GN!B!N"N#!!!!!J!S#8aTBR*KFQPPFpf3"J#3(3)!+!$irr!
!N!8"e*3!N!BbaJ!!!!%!P,DS!*!0!J!!c-`!-Xc-QC!%!$2-c*QCCQB!0-c-QCN
c-`!ec-bCQ3!!!$E-c'CQrrm!0mc-CQE-c!!ic-aQCJ!$!!&!"J#3"!a*ER4PFQC
KBf9-D@)!N"1X6k9!!B&cG(9LV%qP3!!#!!3!N!31Fh4NGfPZ)&"33bj-D@)!N"'
Y6P"G!B&08%a'V8j3A3!$!!-!N!31Fh4NGfPZE@pNG@aP,Q-!N"'YFc++!B&849K
8VA-bLJ!%!!3!N!33G'9iG'9NDA3J8&"$,NaTBJ#3$ke18)%"J8e36%DY6P#"!!8
!!`#3"!aKE'a[BQTPBh4c,QJ!N"1Z#C!!13'!9%9B9+i*N!!j!!B!!`#3"!KMEfj
QD@FZD!#3&kec-NF"J&4&@&5YFc*(!!G!!`#3"!GcG'4TEbjS!*!BV6qZp!#!9%9
B9+drV[3!#%!$!*!%"hPfB@ac,QJ!N"LYXp4*!)"849K8VE2853!*3!-!N!3)Fh4
bD@jR,QJ!N"HY2kld!)"849K8V6qZp!!+3!-!N!3(CA*bEQmZD!#3'+drV[)!J&4
&@&5Y2klb!!X!!`#3"!PYHA"bEh4[,QJ!N"DYFc)H!B"849K8VA-b(J!-!!-!N!3
*FQ9ZB@eP-LjS!*!@VJQ3!$N"J&4&@&5Z#C!!13!0!!-!N!3)Ef*UC@0d,QJ!N"H
Z#C!!13'!9%9B9+i*N!!j!!i!!`#3"!P[BQTTEA"X,QJ!N"DYFc)H!B"849K8VA-
b(J!2!!-!N!31B@0MCA0cEf*UC@0d,QJ!N"'YFc)C!B"849K8VA-b'3!3!!-!N!3
,D@jdEf*UC@0d,QJ!N"5YFc)F!B"849K8VA-b(!!4!!-!N!3-E'pZCfpLDQ9MG#j
S!*!6VA-b(3'!9%9B9+ec-Kd!%J!$!*!%$@CXEf&dEf*UC@0d,QJ!N"+YFc)E!B"
849K8VA-b'`!6!!-!N!30FQ&ZCf9[BQTPBh3ZD!#3%Uec-Km"J&4&@&5YFc)I!"3
!!`#3"!jcG(*TEQG[BQTPBh3ZD!#3%Dec-Km"J&4&@&5YFc)I!"8!!`#3"!edGA"
XC@pLDQ9MG#jS!*!5VA-b)!'!9%9B9+ec-L!!&J!$!*!%$'aTFh4[BQTPBh3ZD!#
3%kec-Kd"J&4&@&5YFc)G!"F!!`#3"!pYBA"`D@jREf*UC@0d,QJ!N"#YFc)G!B"
849K8VA-b(3!B!!-!N!31E@9dD'pNEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!
C!!-!N!31E@pNG@aPEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!D!!-!N!3-CR9
ZBfpLDQ9MG#jS!*!6VA-b(!'!9%9B9+ec-K`!'`!$!*!%$@0XBA0cEf*UC@0d,QJ
!N"+YFc)D!B"849K8VA-b'J!F!!-!N!3-CQPXC@pLDQ9MG#jS!*!6VJQ3!$N"J&4
&@&5Z#C!!13!G!!-!N!3+EAPYB@aXEf-ZD!#3&Dec-Ki"J&4&@&5YFc)H!"j!!`#
3"!KcG'4XD@)ZD!#3&kdrV[3!J&4&@&5Y2kld!"m!!`#3"!aYEf4cGA"`Eh*d,QJ
!N"1YFc)G!B"849K8VA-b(3!J3!-!N!3)Fh4NBA*R,QJ!N"HY2kqp!)"849K8V6q
[[3!K3!-!N!3*Ah0dC'&bCbjS!*!@UX`2e`#!9%9B9+V-$pF!)J!$!*!%"f0PGQ&
X,QJ!N"LYFc)D!B"849K8VA-b'J!M!!-!N!3+B@*cG(*KBh3ZD!#3&Dec-KN"J&4
&@&5YFc)C!#3!!`#3"!YcHA0YEf4eE'8ZD!#3&+i*N!!j!B"849K8VJQ3!$N!*3!
$!*!%#@eKBfGXG@8ZD!#3&UiP4G`"J&4&@&5Z*8AF!#C!"3#3"!G8HA"PFbjS!*!
BVDdDU3#!9%9B9+fY'UN!*d!&!*!%%d0[EQ4TG'P[EQ&X6@&MFQpc,QJ!N!bY(r*
!!)"849K8V4rb3!!S3!8!N!3(4QPXCA-ZD!#3'+`KJ-!!J&4&@&5X)B$!!#P!"3#
3"!Y0DAKPC%e[C'8ZD!#3&+e6A-!!J&4&@&5Y8ec!!#T!"3#3"!P28e9dD@ac,QJ
!N"DYXp8l!)"849K8VE291`!V3!8!N!3)6@9YEh*j,QJ!N"HX)B$!!)"849K8V#'
!`!!X3!8!N!3)4ACPER4c,QJ!N"HY(r*!!)"849K8V4rb3!!Y3!8!N!3,8A9TBfY
NFQ&h,QJ!N"5XBKT!!)"849K8V')D3!!Z3!8!N!328A9TBfYNFQ&h9'9iG#jS!*!
3V#'!`!#!9%9B9+`KJ-!!,d!&!*!%$P0dB@jNBA*N4QPXC5jS!*!4V#'!`!#!9%9
B9+`KJ-!!-%!&!*!%#84TB@a[Ch-ZD!#3&U`KJ-!!J&4&@&5X)B$!!$&!"3#3"!K
&FR*[FR-ZD!#3&kdImN!!J&4&@&5Y(r*!!$*!"3#3"!G0C@jeFbjS!*!BV#'!`!#
!9%9B9+`KJ-!!-d!&!*!%#N0[ER4bEfac,QJ!N"@X)B$!!)"849K8V#'!`!!d3!8
!N!3*9fPZC'phFbjS!*!@V')D3!#!9%9B9+aL'N!!08!&!*!%#P4PH(4&C'Pd,QJ
!N"@X)B$!!)"849K8V#'!`!!f!!)!N!381MSkFh4NGfPZ1NJkFh4NGfPZ,QJ!N!m
"J&4&@&3!N!8h!!3!N!3(Ad&54e-ZD!#3'+cr2r!"J&4&@&5Xrcr`!$J!"!#3"!T
cG'4hG'9iG#jS!*!9V2mrm3'!9%9B9+cr2r%!13!&!*!%#A*eER4TE@8ZB`#3&Ub
[%(8"J&4&@&5XVa"e!$S!!`#3""CYGf9bDh0IF'aeCfPZAf0[EQCTCbjS!*!*VA-
bD`'!9%9B9+ec-QX!1`!$!*!%$f0[EA"XCAK[BQTPBh3ZD!#3%+i*N!!j!B"849K
8VJQ3!$N!2!!$!*!%#@0[BQTPBh3ZD!#3&Uec-KS"J&4&@&5YFc)D!$d!!`#3"!T
`H@9bFQpbFbjS!*!9VA-b(`'!9%9B9+ec-Km!2J!$!*!%#P"jG'K[EN0[FQ8!N"@
Z*RYp!B"cD'aLVLClI3!r!!-!N!3*F(PNC@*eCbjS!*!@VJQ3!$N"J&4&@&5Z#C!
!13"!!!-!N!3,G(*KBf9LB@0V,QJ!N"5YFc)J!B"849K8VA-b)!""!!-!N!3,F(P
dD'pZFR9Z,QJ!N"5Z#C!!13'!9%9B9+i*N!!j!%)!!`#3"!YTER4bBfKPBfXZD!#
3&+iC64J"J&4&@&5Z'8dB!%-!!`#3"!KTEA"[FR3ZD!#3&ki*N!!j!B"849K8VJQ
3!$N!4!!$!*!%$@*XG'PZE@pNG@aP,QJ!N"+Z#C!!13'!9%9B9+i*N!!j!!!$b!!
'!M`!!!!r!!%!N!J#!*!&$R0dC(GTEQe[C(9XC5jM!*!D!`#3"bHY(r*!!!%!-k`
KJ-!!!3!`V#'!`!!"!!UY2klb!!%!-DdImN!!!3!XV4rb3!!"!#LX)B$!!!%!+k`
KJ-!!!3!bV#'!`!!"!#QY8ec!!!%!+Ufce6X!!3!YV')D3!!"!#kX)B$!!!%!,k`
KJ-!!!3!JV6q[[3!"!!HY2kld!!%!(UdrV[3!!3!*V6qZp!!"!$@X)B$!!!%!*Uf
Y'UN!!3!dV')D3!!"!!LYXp4*!!%!)DV-$pF!!3!fV2mrm3!"!#1YFc)C!!%!$ke
c-KN!!3!&VJQ3!$N!!3"%VJQ3!$N!!3!LVA-b'J!"!"ZYFc)D!!%!2+ec-KS!!3!
lVJQ3!$N!!3!'VA-b4`!"!"bZ#C!!13!"!"+YFc)E!!%!'Uec-K`!!3"$VJQ3!$N
!!3!3VA-b(!!"!%+Z'8dB!!%!&Uec-Kd!!3!4VA-b(3!"!#@Z*8AF!!%!&kec-Kd
!!3!BVA-b(3!"!"qYFc)G!!%!'Dec-Kd!!3!kVA-bD`!"!"fYFc)H!!%!#kec-Ki
!!3!0VJQ3!$N!!3!1VA-b(J!"!$qZ#C!!13!"!$fYFc)I!!%!3Di*N!!j!!%!%ke
c-Km!!3!-VJQ3!$N!!3!iV2mrm3!"!"5YFc)I!!%!*+i*N!!j!!%!3+ec-L!!!3!
9VA-b)!!"!$HXrcr`!!%!4J")!%S!6!2R!!%!!3#3#!)!N!83G'9iG'9NDA3J8&"
$,NaTBJ#3'!3!N!G'!%J!5J"-!qF!!3!"!*!)!J#3"3jcG'4hD@iJ8&"$,NaTBJ#
3'J)!N!G'!%J!5J"-!qF!!3!#!*!)!J%!N!3+8(PdD'pZ3fpbC3#3(Mi!N!G'!%J
!5J"-!qF!!3!#!*!)!J%!N!3-5@jdCA*QB@0P6'PL!*!F!3#3"di!8!"5!&3!!!!
#!!)!N!J#!3#3"!PbG@jdD@eP,Q-!N"mj!*!(1Uec-QX!!3#3#!,HVZ!!!!%H!!!
1@&"'E(-!N!3#hUii!!!2GJ!!!mK36(0d!*!+!4`!!!!#8&0PCrrr!*!*(!!!!3"
38f9R!!%!!"3l!!!"!!!!+6-!!#Jc!!!#XN4'E'F!!!M14(*'FJ!!#0T*ENCX!!!
)jNa%48B!!!Mb$h0dC(GTEQe[C(9XC5jYG3)!!!"069"53eG*43!!!$3!!%e08&*
$9dP&!!!!0!#!!*!5VUU!+`!!%ii!!#[P#Ej*3diM!!)*bQPME$J!!!RZD@0X0!!
!#IT#6N4-!!!+"P08-$%!!!S54P*&4J!!#KjcEQ3J!!!++RNB!*!+HAcrrb!!#cX
!N!4jIIrr)!!1e!#3"(RP!'d!!"8-!*!%HH%!R`!!&q)!N!4ji`$L!!!JA!#3"`)
!"J!!!!S!"!#3#c!!"J%!rrm!N!Mrr`'3"3#3""i"!3#3#*QC!!!rrcrr2rm"!*!
%5J!"!!N'E@pZB@0[!*!F"!!S!!S"`J+!!#J!#J(#!S!!N"!"!*!%!J#3"43!!3"
B!+i!c`(4!*!%5K-!!"df!!!!'J!$!!#CQ3#3"(rr!*!%Irm!N!4rr`#3"!S`!!3
!!!!%!!B"#!!"!6TFN3$Q513!$Qq%BA0V)!!!!"`!N!QqbUB![XZ8!,l,V!#3"Em
5J!#3"Em5J!!3*)!!N#M-N!J!jN$3!1C!B0f3#(rrIrm!jN#%!*!%3)F!N!3&K!!
!S5,q!J#3"qC!d!!$16)!N"-"!,l,BJ#qbd)![`I)!!"FN3$Q513!!!!$BA0V)!!
!!"`!N!QqbUB![XZ8!,l,V!#3"Em5J!#r&J`![a%!69"$3`%)!!%#1MU4!1C)j!!
1Ei4KFfXJ!!!!(!#3#El+TJ#qbj3![XZX!*!&[a+!!*!&[a+!!"!NJ!#3+-b3#!$
Q30!!jN"JhC!)Irprr`$Q3)3!N!4!K`#3"!@%!!#K)[i#!*!(jN$3!!-j-J#3%`%
![XYL!,l,3J#r"mJ!!&b4!1C)j!!!!!0KFfXJ!!!!(!#3#El+TJ#qbj3![XZX!*!
&[a+!!,m@$!#r%3"08%0$!3J!!3Sk1MTcG'4hD@ikK'&cDb!!!!!F!*!*[XUQ!,l
,P!#qbk`!N!@r%S!!N!@r%S!!%#5!!*!Sc*!)!1C!d!$Q3'$GN!Krrhrr!1C!K!#
3"%#(!*!%"B3!!+%LrJ)!N!IQ30!!!cNb!*!6!3#qbf)![XY#!,m(b!!!A*%!jNM
N!!!!!f&cDb!!!!!F!*!*[XUQ!,l,P!#qbk`!N!@r%S!![aB-!,m4!%e33d-"B!!
#0cT0B@028b"6GA"`Eh*d1NaTBR*KFQPPFcT5G@jdD@eP1P*eER4TE@8J8&"$1LK
6Eh9bBf9c+6VHd%)!!J6rh@"X!E9C+3(6hZ!!!P@`!E9U)!'Y53`"dpl`!!*9X!!
3Gb3!0"E!!%E&N!!!!3!"!!%!!3!!!!-"dpm`!*!%rpVJK!!!!!%"dpq!!"'eV!'
MHP!"Y9NX!G2I3!!4YD`!%)98!G2J8J(6hd!!!P@`rp4a`!!!S5)"dpp`!!-a52r
E!iJ!N!3"dq#3!!!8*b`!&#FJ!G2JfJ(6hh!!&$1Brpe#1'Mrpd!"dpq!!"'b@!!
3Bj!!!E9C#!$rrrm!%rMN!G`"i!!"'$Sk1N0A4e9655!a,MBZ0$TTEQ0XG@4P1M!
!%rQ8!$QN#!!!0,3!N!Rrrrm"b28i!FMd8%)!!J6rh@"X!E,EL3()p'!!!P@`!E,
[S!'L,!J"b24`!!*9X!!4Zq3!05m!!%3#!!!"!!%!!3!"!!!!!`()p,!!N!6rfZ#
%!!!!!3()p3!!%[Tm!CL2X!'bfi`"b26!!",kI!!4bK3"b2A5!FMd`!!#9E$re((
!!!#K)J()p2!!!c&)rpX$L!#3"!()pK!!%pRm!"2Cm!()pPS"b26`!"2QD2rG3MK
SrrG!!FMe!!!5pbJ!%DK3!E,ED!$rrrm!&6Fd!G%"!!!#*$T0B@028b"6GA"`Eh*
d1NKPB@4PFR-k38j655")C@&NCA*c1J#3)ZC%%!#3"`%!$ATB*!!)"!$Q3j!!!"!
N%!$Q48`!N"N3),`!N!AQ4B!!N!80HU3![ZJJ3*ha8!!3*"!!N!AQ4BB!N!83*)!
!!+!F!*!9jN53!!#3#3ek@#5!#!3!jN33!"!N%!#3(J%!!!)N1NeKBdp6)&0eF("
[FR3k5'9KC'9bFcT38%-J8h"PBfPQD@-k!*!LjN33!*!(!3!0HPJN!!J%!1C$N!!
!%#33!1C&6!#3'4!J[!#3"HC&J!#3"3ekT!#qk#"!RI&3!"!N%!#3"HC&KJ#3"4!
NJ!!!S"`!N"AQ4*!!!*!*$ATB*)!)"!$Q4"!!%#33!*!H!3!!!LNk6@&M6e-J8h9
`F'pbG$T)C@&NCA*c1P9ZDACPFR0KE#")C@&NCA*c1J#3(HC%%!#3"`%!$ATB*!!
)"!$Q3j!!!"!N%!$Q48`!N"N3),`!N!AQ4B!!N!80HU3![ZJJ3*ha8!!3*"!!N!A
Q4BB!N!83*)!!!+!F!*!9jN53!!#3#3ek@#5!#!3!jN33!"!N%!#3(J%!!!)Q1Ne
KBdp6)&0eF("[FR3k6'PLFQ&bD@9c1NeKBdp6)%0[E@e[EMS!N#$Q4"!!N!F"!!e
k@#3!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AUN!,lS)%#Gm9!!%#3
3!*!&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C%%!!3*"!!N"i"!!!
#)6T0B@028b"6GA"`Eh*d1NaTBR*KFQPPFcT5G@jdD@eP1J#3*!%"bC!!!3IqX!!
!!!%!$e!i*!!)"!%"b4!!%J$J!3(+c!#3'4(pM!#3"!%"b`!""rk`!!p3K!$DE@!
!"*Lm!")!i!#3"!%"b`B!N!85!9!!!+!F!*!8!3(+%!#3#3p31#5!#!3"!FQ3!!!
5!1!!N#!8P!!'%%eKBdp6)&"33b"-D@jVCA)!N"!%%%eKBdp6)&"33b"-D@jVCA)
!N$!D39"36!#33'!!!!""F("X!*"!B!!!!%e06%)!N#!16'PL)%PYF'pbG#"38%-
!N"908%a'!*!J$NaTBL"*EA"[FR3J8&"$!*!969G$4!#33'!!!!"58e*$!*"!B!!
!!&4&@&3$,Q*SBmUV8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfpZ)%K
PE(!!N!8G"!(+Ui!!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ8&"$!*!
A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)&"33`#3&e4&@&3$,Q0M!*!F$%eA)%-[3bX
V)&"33`#3&e4&@&3$,Q0`!*!F$%eA)%-[3bXV)&"33`#3&e4&@&3%,Q0`F!#3'`a
09b"$,d-V+b"38%-!N"G849K8"#jPH(!!N$p849K8!LjS!*!G$%eA)%-[3bXV)&"
33`#3%a!!!!"849K8!Lj`!*!G$8eA)&"KFf0KE#"38%-!N"C849K8"#j`BA-!N"X
069FJ8'&cBf&X)&"33`#3&P4&@&3%,R"MD!#3'`a09b"$,d-V+b"38%-!N"1!!!!
!9%9B9!BZF'0S+bX!N"N-69FJ3bp$+bXJ8&"$!*!6J!!!!&4&@&3#,R)!N"d'69F
J8Q9k!*!G9%9B9!)ZFfKMbUY3!!-`b!!8VG!!!!&q!FUV8!!8CF!!!!,@"P"33d&
cE@iJ5'9X!*!'(33"bUZ!!"4P`!'(PY3!N!4B3dp'!*!J%&K$6dC')%PYF'pbG#"
38%-!N"0NEf0e!*"!B!!!!(*cFQ-!N%"J!!!!FfKXBJ#3)!j348BJ5@e`Eh*d)&"
33`#3&A0dG@)!N#!18%9')%PYF'pbG#"38%-!N"N%,Q4[B`#31e!!!!!36@&M6e-
J0MK,)%aTEQYPFJ#3-"T"8&"-!*"!B!!!!%&`F'`!N%"J!!!!68e-3J#3)!j-D@)
J5@e`Eh*d)$Bi5`#3&8e36%B!N#!16'PL)%PYF'pbG#!f1%X!N"909d0%!*"!B!!
!!%p#5L!!N#!169"A)%PYF'pbG#!f1%X!N"958e*$!*"!B!!!!&4&@&3$,Q*SBmU
V8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfpZ)%KPE(!!N!8G"!(+Ui!
!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ0MK,!*!A9%9B9!3ZBbXV!*!
E$%eA)%-[3bXV)$Bi5`#3&e4&@&3$,Q0M!*!F$%eA)%-[3bXV)$Bi5`#3&e4&@&3
$,Q0`!*!F$%eA)%-[3bXV)$Bi5`#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b!f1%X
!N"G849K8"#jPH($+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abTdJjLVJ!(
+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"&4&@&3#,QJ!N"d-69FJ3bp$+bXJ0MK
,!*!6%!!!!&4&@&3#,R!!N"d069FJ8'&cBf&X)$Bi5`#3&P4&@&3%,R"KF`#3'`e
09b"3BA0MB@`J0MK,!*!@9%9B9!3ZF'0S!*!E$%eA)%-[3bXV)$Bi5`#3%i!!!!"
849K8"Lj`BfJV+`#3'3a09b"$,d-V+b!f1%X!N"1!!!!!9%9B9!)ZFJ#3(3C09b"
5CAS!N"e849K8"#jcC@I+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abTdJjL
VJ!(+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"'4[Bh8!N%"J!!!!FR0bB`#33'!
!!!"cD'aL!*!J$P"&4L"*EA"[FR3J0MKV!*!9Fh4eBJ#3)!j348BJ5@e`Eh*d)$B
iD`#3'33ZC'pM!*!l8!!!!""AD@ic-L"i1$BJ6'PZDf9b!*!`#94&@&3#,Q-!N"d
-69FJ3bp$+bXJH$Jf!*!A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)(Ji0J#3&e4&@&3
$,Q0`!*!F$%eA)%-[3bXV)(Ji0J#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b"i1$B
!N"G849K8"#j`BfJ!N"X-69FJ3bp$+bXJH$Jf!*!6J!!!!&4&@&3',R"MD#XV!*!
C$%eA)%-[3bXV)(Ji0J#3%i!!!!"849K8!bjbB`#3(!K09b"AD@j53`#3(`3ZE'P
L!*!E$NaTBL"*EA"[FR3JH$Jf!*!C"#j[BQS!N"X16f*U)%PYF'pbG#"i1$B!N"8
*68-J6'PZDf9b!*!h#%e03dJ!N%4849K8!LjM!*!G#%e$)%-[3bXV!*!E9%9B9!3
ZBfac!*!E%8e$)%0XBA0c)%0[EA"TE'9b!*!1J!!!!&4&@&3%,Q4PCJ#32e4&@&3
%,Q4[B`#31a!!!!"849K8!LjS!*!p%!!!!&4&@&3%,R"MD!#3'`K03b"$,d-V+`#
3&i!!!!"849K8!bjdF`#33`B!!3%!N!B8!!3"!*!(!3#3$!S!!3%!!!%"!!%!N!3
1!!F"!!%"!!%"!!!!!3#3"-B!"`#33Mq3"%&38%`!!!'!@)!!N%)rN!3!N!P9!C!
!!3)#H`#3"3)!!!!8!*!%!B!!N"%i!!N!N!F@EAGPFQYcAh"XG@GTEPpMEfjQD@F
ZD!#3$!%!N!i-!!-!N!`"fJ!%!*!3!3#3r`#34&pIFh4KFR3!N(`"!!!!0J!-!*!
(!3#3*3%!N!8"!!!!$3!#!*!1&!!$!!!"!3!!!3%$!3#3#`S!!3%"!!!"!3!"!!!
!a!!'`J#33@PZDA4cG'4hD@i!N(J"&!!&!!%!!$,)!!!bb!!!-XJ!N!3'Fh4NGfP
Z!*$mZJ!%!!%3Fh4NGfPZE@pNG@aP,R0XBJ#3$e"jG'KcD'aL!*"a!6q3"!#3"eF
!VJ$U!G%"!!!!#eB!!&b4!!!!,J!#!!!!!J!#!*!S!J`!!J"3!!%!!3!"!!%!N2m
!&#G$6d4&*b!R4%&835FJ*e"*3e3R!*$Z#J!%!*!+!3!!!#Nc!!!S-`!!!V)#hUc
8*kS!!!!F!AS!!R"bC@B!'!!DF&CPFJ!!!8C69&)M!!!"8J5`!"!!!!!'!*!%3Li
!(3!!!"3!N!3a%J!N!!!!5!#3"'SC!#N!!!#F!*!%9lJ!1!!!!,3!N!3JIJ")!!!
!dJ#3"(%@!&8!!!X'!*!%EjJ!A!!!(ji!N!3+1J"T!!!IU!#3"(4#!(8!!"r!!*!
%C[B!KJ!!(mi!N!3lkJ#4!!!Ii!#3"(c'!*d!!##U!*!%5P!!V!!!)1B!N!36#`#
l!!!JpJ#3"'+S!-)!!#,8!*!%$qd!dJ!!)`i!N!4-P!$L!!!M(`#3""ca!1i!!#-
h!*!%)S3!r`!!)d8!N!30XJ%+!!!N$3#3"#8#!4)!!#8P!*!%8&!"(J!!*H-!N!3
mf`%V!!!Q&3#3"FMrr`!!+#8!N"!EJ2rr!!!!PJ#3"!p3FQpUC@0d)&CPFR0TEfi
-8(*[DQ9MG#"0DA0M"N9NDA4[FJ4'Efjd$P"bEfTPBh3J4AKdFQ&c$d0eFh4[E5"
,CAPhEh*NF`a"Bf0PFh-J8'&dD(-'9'&bCf9d$%*eD@aN)%9iG(*KF`Xf1%XJ3fp
NC8GPEK!f1%XJ4'PcBA0cC@eLE'9b#MBi5b"-D@jVCA),0MK,)&"bEfTPBh313bp
$+bXJ3fpYF'PXCA)13bp$+bXJ9f&bEQPZCh-'3dC00MK,$e"KFf0KE#"$Efe`D@a
PFJp3BA0MB@`J9f&bEQPZCh-,8&"$)%0[C'9(C@i38&"$)%4TFf&cFf9YBQaPFJT
38%-J6'PZDf9b"e"33b"348B,8&"$)&"bEfTPBh3-8&"$3A0Y)&"KEQ9X$&*PHL"
$Efe`D@aPFVA(:

View file

@ -1,549 +0,0 @@
# Window-interface-independent part of twit
import sys
import types
import bdb
import types
import os
SIMPLE_TYPES=(
types.NoneType,
types.IntType,
types.LongType,
types.FloatType,
types.ComplexType,
types.StringType
)
# XXXX Mac-specific
ICON_NORMAL=500
ICON_RETURN=503
ICON_CALL=504
ICON_ZERO=505
ICON_DEAD=506
class DebuggerStuff(bdb.Bdb):
def __init__(self, parent):
bdb.Bdb.__init__(self)
self.parent = parent
self.exception_info = (None, None)
self.reason = 'Not running'
self.icon = ICON_NORMAL
self.reset()
def reset(self):
bdb.Bdb.reset(self)
self.forget()
def forget(self):
self.lineno = None
self.stack = []
self.curindex = 0
self.curframe = None
def run(self, cmd, locals, globals):
self.reason = 'Running'
bdb.Bdb.run(self, cmd, locals, globals)
print 'RETURN from run'
self.reason = 'Not running'
def setup(self, f, t):
self.forget()
self.stack, self.curindex = self.get_stack(f, t)
self.curframe = self.stack[self.curindex][0]
def interaction(self, frame, traceback):
self.setup(frame, traceback)
self.parent.interact()
self.exception_info = (None, None)
# def user_call(self, frame, argument_list):
# self.reason = 'Calling'
# self.icon = ICON_CALL
# self.interaction(frame, None)
def user_line(self, frame):
self.reason = 'Stopped'
self.icon = ICON_NORMAL
self.interaction(frame, None)
def user_return(self, frame, return_value):
self.reason = 'Returning'
self.icon = ICON_RETURN
self.interaction(frame, None)
def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
self.reason = 'Exception occurred'
self.icon = ICON_DEAD
self.parent.setstate('tb')
self.exception_info = (exc_type, exc_value)
self.interaction(frame, exc_traceback)
def getexception(self):
tp, value = self.exception_info
if tp <> None and type(tp) <> type(''):
tp = tp.__name__
if value <> None and type(value) <> type(''):
value = `value`
return tp, value
def getstacktrace(self):
names, locations = [], []
for frame, lineno in self.stack:
name = frame.f_code.co_name
if not name:
name = "<lambda>"
elif name == '?':
name = "<not a function>"
else:
name = name + '()'
names.append(name)
if lineno == -1:
lineno = getframelineno(frame)
modname = getframemodname(frame)
if not modname: modname = "<unknown>"
locations.append("%s:%d" % (modname, lineno))
return names, locations
def getframe(self, number):
if number < 0 or number >= len(self.stack):
return None
return self.stack[number][0]
def getframevars(self, number, show_complex=1, show_system=1):
frame = self.getframe(number)
if not frame:
return [], []
return getvarsfromdict(frame.f_locals, show_complex, show_system)
def getframevar(self, number, var):
frame = self.getframe(number)
return frame.f_locals[var]
def getframefilepos(self, frameno):
if frameno == None or frameno < 0 or frameno >= len(self.stack):
return None, None, None
frame, line = self.stack[frameno]
if line == -1:
line = getframelineno(frame)
modname = getframemodname(frame)
filename = frame.f_code.co_filename
return filename, modname, line
def getprogramstate(self):
return self.reason
class Application:
"""Base code for the application"""
def mi_init(self, sessiontype, arg):
self.dbg = DebuggerStuff(self)
self.run_dialog = self.new_stack_browser(self)
self.run_dialog.open()
self.module_dialog = None
self.initial_cmd = None
self.cur_string_name = None
if sessiontype == 'tb':
while arg.tb_next <> None:
arg = arg.tb_next
self.dbg.setup(arg.tb_frame, arg)
self.run_dialog.setup()
elif sessiontype == 'run':
self.initial_cmd = arg
def breaks_changed(self, filename):
self.run_dialog.breaks_changed(filename)
if self.module_dialog:
self.module_dialog.breaks_changed(filename)
def to_debugger(self):
cmd = self.initial_cmd
self.initial_cmd = None
self.setstate('run')
self.switch_to_app()
apply(self.dbg.run, cmd)
self.setstate('none')
self.switch_to_dbg()
self.run_dialog.update_views()
if self.module_dialog:
self.module_dialog.update_views()
def interact(self):
# Interact with user. First, display correct info
self.switch_to_dbg()
self.run_dialog.update_views()
if self.module_dialog:
self.module_dialog.update_views()
# Next, go into mainloop
self.one_mainloop()
# Finally (before we start the debuggee again) show state
self.switch_to_app()
self.run_dialog.show_it_running()
def quit_bdb(self):
self.dbg.set_quit()
def run(self):
cmd = self.AskString('Statement to execute:')
self.runstring(cmd)
def runfile(self, path):
dir, file = os.path.split(path)
try:
os.chdir(dir)
except os.error, arg:
self.Message("%s: %s"%(dir, arg))
return
ns = {'__name__':'__main__', '__file__':path}
cmd = "execfile('%s')"%file
self.runstring(cmd, ns, ns)
def runstring(self, cmd, globals={}, locals={}):
self.cur_string_name = '<string: "%s">'%cmd
try:
cmd = compile(cmd, self.cur_string_name, 'exec')
except SyntaxError, arg:
self.Message('Syntax error: %s'%`arg`)
return
self.initial_cmd = (cmd, globals, locals)
self.exit_mainloop()
def cont(self):
self.dbg.set_continue()
self.exit_mainloop()
def step(self, frame):
self.dbg.set_next(frame)
self.exit_mainloop()
def step_in(self):
self.dbg.set_step()
self.exit_mainloop()
def step_out(self, frame):
self.dbg.set_return(frame)
self.exit_mainloop()
def kill(self):
self.dbg.set_quit()
self.exit_mainloop()
def quit(self):
self.do_quit()
def browse(self, module):
if not self.module_dialog:
self.module_dialog = self.new_module_browser(self)
self.module_dialog.open(module)
else:
self.module_dialog.focus(module)
def browse_var(self, var):
b = self.new_var_browser(self, var)
class StackBrowser:
"""Base code for stack browser"""
def mi_open(self):
"""Setup initial data structures"""
self.cur_stackitem = None
self.cur_source = None
self.cur_modname = None
self.cur_line = None
self.show_complex = 1
self.show_system = 0
self.setup()
# create_items(self) should create self.modules, self.vars and self.source
def setup(self):
self.parent.SetWatch()
"""Fill the various widgets with values"""
name, value = self.parent.dbg.getexception()
self.setexception(name, value)
self.setprogramstate(self.parent.dbg.getprogramstate())
names, locations = self.parent.dbg.getstacktrace()
self.stack_setcontent(names, locations)
self.cur_stackitem = len(names)-1
self.stack_select(self.cur_stackitem)
self.setup_frame()
def setup_frame(self):
"""Setup frame-dependent widget data"""
self.parent.SetWatch()
self.cont_varnames, self.cont_varvalues = \
self.parent.dbg.getframevars(self.cur_stackitem,
self.show_complex, self.show_system)
self.setvars()
self.set_var_buttons()
msg = ""
if self.cur_stackitem == None:
self.cur_source = None
self.cur_modname = None
self.cur_line = None
msg = "No stackframe selected"
else:
self.cur_source, self.cur_modname, optnextline = \
self.parent.dbg.getframefilepos(self.cur_stackitem)
if optnextline >= 0:
self.cur_line = optnextline
if self.cur_source == '<string>':
self.cur_source = None
msg = "Executing from unknown <string>"
elif type(self.cur_source) == types.StringType and \
self.cur_source[:8] == '<string:':
msg = "Executing from "+self.cur_source
self.cur_source = None
self.setsource(msg)
if not self.cur_line:
self.source_setline(1, ICON_ZERO)
else:
self.source_setline(self.cur_line, self.parent.dbg.icon)
self.breaks_changed(self.cur_source)
self.parent.SetCursor()
# setsource(msg) should display cur_source+content, or msg if None
def show_it_running(self):
self.setprogramstate("Running")
def update_views(self):
self.setup()
def click_stack(self, number, *dummy):
if number == self.cur_stackitem: return
self.cur_stackitem = number
self.stack_select(self.cur_stackitem)
self.setup_frame()
def click_var(self, var, *dummy):
v = self.parent.dbg.getframevar(self.cur_stackitem, var)
self.parent.browse_var(v)
def click_source(self, lineno, inborder):
if not inborder:
self.source_select(lineno)
self.cur_line = lineno
if lineno == None or not self.cur_source or not inborder:
return
if self.parent.dbg.get_break(self.cur_source, lineno):
self.parent.dbg.clear_break(self.cur_source, lineno)
else:
self.parent.dbg.set_break(self.cur_source, lineno)
self.parent.breaks_changed(self.cur_source)
def breaks_changed(self, filename):
if filename == self.cur_source:
list = self.parent.dbg.get_file_breaks(filename)
self.source_setbreaks(list)
def click_quit(self):
self.parent.quit()
def click_run(self):
self.parent.run()
def click_continue(self):
self.parent.cont()
def click_step(self):
if self.cur_stackitem <> None:
frame = self.parent.dbg.getframe(self.cur_stackitem)
self.parent.step(frame)
else:
self.parent.step_in()
def click_step_in(self):
self.parent.step_in()
def click_step_out(self):
if self.cur_stackitem <> None:
frame = self.parent.dbg.getframe(self.cur_stackitem)
self.parent.step_out(frame)
else:
self.parent.step_in()
def click_kill(self):
self.parent.kill()
def click_browse(self):
self.parent.browse(self.cur_modname)
def click_edit(self):
lino = self.cur_line
if not lino:
lino = 1
if self.cur_source:
self.parent.edit(self.cur_source, lino)
class ModuleBrowser:
"""Base code for a module-browser"""
def mi_open(self, module):
"""Setup initial data structures"""
self.cur_module = module
self.cur_source = None
self.cur_line = None
self.cont_modules = []
self.value_windows = []
self.setup()
# create_items(self) should create self.modules, self.vars and self.source
def setup(self):
"""Fill the various widgets with values"""
self.parent.SetWatch()
modnames = getmodulenames()
if not self.cur_module in modnames:
self.cur_module = None
if modnames <> self.cont_modules:
self.cont_modules = modnames
self.setmodulenames()
if self.cur_module:
self.module_select(self.cont_modules.index(self.cur_module))
else:
self.module_select(None)
self.setup_module()
def setup_module(self):
"""Setup module-dependent widget data"""
self.parent.SetWatch()
if not self.cur_module:
self.cont_varnames = []
self.cont_varvalues = []
else:
self.cont_varnames, self.cont_varvalues = getmodulevars(self.cur_module)
self.setvars()
msg = ""
if not self.cur_module:
self.cur_source = None
msg = "No module selected"
else:
m = sys.modules[self.cur_module]
try:
self.cur_source = m.__file__
except AttributeError:
self.cur_source = None
msg = "Not a python module"
self.cur_lineno = 0
self.setsource(msg)
self.source_select(self.cur_line)
self.breaks_changed(self.cur_source)
self.parent.SetCursor()
# setsource(msg) should display cur_source+content, or msg if None
def update_views(self):
self.setup_module()
def click_module(self, module, *dummy):
if not module or module == self.cur_module: return
self.focus(module)
def focus(self, module):
self.cur_module = module
self.setup()
def click_var(self, var, *dummy):
if not var: return
m = sys.modules[self.cur_module]
dict = m.__dict__
self.parent.browse_var(dict[var])
def click_source(self, lineno, inborder):
if not inborder:
self.source_select(lineno)
self.cur_lineno = lineno
if lineno == None or not self.cur_source or not inborder:
return
if self.parent.dbg.get_break(self.cur_source, lineno):
self.parent.dbg.clear_break(self.cur_source, lineno)
else:
self.parent.dbg.set_break(self.cur_source, lineno)
self.parent.breaks_changed(self.cur_source)
def breaks_changed(self, filename):
if filename == self.cur_source:
list = self.parent.dbg.get_file_breaks(filename)
self.source_setbreaks(list)
def click_edit(self):
lino = self.cur_lineno
if not lino:
lino = 1
if self.cur_source:
self.parent.edit(self.cur_source, lino)
def getmodulenames():
"""Return a list of all current modules, sorted"""
list = sys.modules.keys()[:]
list.sort()
return list
def getmodulevars(name):
"""For given module return lists with names and values"""
m = sys.modules[name]
try:
dict = m.__dict__
except AttributeError:
dict = {}
return getvarsfromdict(dict)
def getvarsfromdict(dict, show_complex=1, show_system=1):
allnames = dict.keys()[:]
allnames.sort()
names = []
for n in allnames:
if not show_complex:
if not type(dict[n]) in SIMPLE_TYPES:
continue
if not show_system:
if n[:2] == '__' and n[-2:] == '__':
continue
names.append(n)
values = []
for n in names:
v = pretty(dict[n])
values.append(v)
return names, values
def pretty(var):
t = type(var)
if t == types.FunctionType: return '<function>'
if t == types.ClassType: return '<class>'
return `var`
def getframelineno(frame):
"""Given a frame return the line number"""
return getcodelineno(frame.f_code)
def getfunclineno(func):
"""Given a function return the line number"""
return getcodelineno(func.func_code)
def getcodelineno(cobj):
"""Given a code object return the line number"""
code = cobj.co_code
lineno = -1
if ord(code[0]) == 127: # SET_LINENO instruction
lineno = ord(code[1]) | (ord(code[2]) << 8)
return lineno
def getframemodname(frame):
"""Given a frame return the module name"""
globals = frame.f_globals
if globals.has_key('__name__'):
return globals['__name__']
return None

View file

@ -1,317 +0,0 @@
from FrameWork import *
import Win
import Qd
import Controls
import Ctl
import TE
import List
import os
import string
import macfs
SCROLLBAR=16
MARGIN=2
ICONSIZE=16
TEXTWIDTH=4096 # More-or-less random value
TEXTFONT=4
TEXTSIZE=9
# Resource numbers
PIC_CURRENT=500
PIC_BREAK=501
picture_cache={}
class MT_TextWidget:
def __init__(self, wid, r):
self.wid = wid
self.rect = r
left, top, right, bottom = r
self.terect = left+MARGIN+ICONSIZE, top+MARGIN, \
right-(MARGIN+SCROLLBAR), bottom-(MARGIN+SCROLLBAR)
dr = self.terect[0], self.terect[1], TEXTWIDTH, self.terect[3]
Qd.SetPort(wid)
Qd.TextFont(TEXTFONT)
Qd.TextSize(TEXTSIZE)
self.ted = TE.TENew(dr, self.terect)
self.ted.TEAutoView(1)
self.activate(1)
rect = right-SCROLLBAR, top, right, bottom-SCROLLBAR+1
self.bary = Ctl.NewControl(self.wid, rect, "", 1, 0, 0, 0, 16, 0)
rect = left, bottom-SCROLLBAR, right-SCROLLBAR+1, bottom
self.barx = Ctl.NewControl(self.wid, rect, "", 1, 0, 0, 0, 16, 0)
self.have_data = 0
self.line_index = []
def close(self):
del self.barx
del self.bary
del self.ted
def scrollbars(self):
pass
def setcontent(self, file):
self.line_index = []
if file == None:
data = ''
self.have_data = 0
else:
try:
fp = open(file, 'rb') # NOTE the binary
data = fp.read()
self.have_data = 1
except IOError, arg:
data = 'Cannot open file:\r'+`arg`
self.have_data = 0
if len(data) > 32767:
self.have_data = 0
data = 'File too big'
self.ted.TESetText(data)
if self.have_data:
cur = 0
while 1:
self.line_index.append(cur)
try:
cur = string.index(data, '\r', cur+1)
except ValueError:
break
self.line_index.append(len(data))
self.wid.InvalWindowRect(self.rect)
self.ted.TESetSelect(0,0)
self.ted.TECalText()
self.ted.TESelView()
self.setscrollbars()
def setscrollbars(self):
docleft, doctop, docright, docbot = self.ted.destRect
winleft, wintop, winright, winbot = self.ted.viewRect
docbot = self.ted.nLines*self.ted.lineHeight + doctop
self.setbar(self.barx, docleft, docright, winleft, winright)
self.setbar(self.bary, doctop, docbot, wintop, winbot)
def setbar(self, bar, minmin, maxmax, curmin, curmax):
if maxmax-minmin > 32767 or (curmin <= minmin and curmax >= maxmax):
bar.SetControlMinimum(0)
bar.SetControlMaximum(0)
bar.SetControlValue(0)
return
bar.SetControlMinimum(minmin)
bar.SetControlMaximum(maxmax-(curmax-curmin))
bar.SetControlValue(curmin)
def update(self, rgn):
Qd.EraseRect(self.terect)
Qd.FrameRect(self.rect)
self.ted.TEUpdate(self.terect)
def activate(self, onoff):
if onoff:
self.ted.TEActivate()
else:
self.ted.TEDeactivate()
def select(self, line):
if line == None or line <= 0 or not self.have_data:
self.ted.TESetSelect(0,0)
else:
line = line - 1
if line > len(self.line_index)-1: line = len(self.line_index)-1
if line == 1:
self.ted.TESetSelect(0, self.line_index[1])
else:
self.ted.TESetSelect(self.line_index[line]+1, self.line_index[line+1])
self.setscrollbars()
def click(self, where, modifiers):
# First check scrollbars
ctltype, control = Ctl.FindControl(where, self.wid)
if ctltype and control:
partcode = control.TrackControl(where)
if partcode:
self.controlhit(control, partcode)
return None, 0
off = self.ted.TEGetOffset(where)
inborder = where[0] < self.terect[0]
l, t, r, b = self.terect
if l <= where[0] <= r and t <= where[1] <= b or inborder:
return self.offsettoline(off), inborder
return None, 0 # In the grow box or something.
def offsettoline(self, offset):
for i in range(len(self.line_index)):
if offset < self.line_index[i]:
return i # Not i-1: 1-based line numbers in files
return None
def controlhit(self, control, partcode):
if partcode <> Controls.inThumb:
if control == self.barx:
if partcode == Controls.inUpButton:
delta = -10
if partcode == Controls.inDownButton:
delta = 10
if partcode == Controls.inPageUp:
delta = 10-(self.terect[2]-self.terect[0])
if partcode == Controls.inPageDown:
delta = (self.terect[2]-self.terect[0])-10
old = control.GetControlValue()
control.SetControlValue(old+delta)
if control == self.bary:
if partcode == Controls.inUpButton:
delta = -self.ted.lineHeight
if partcode == Controls.inDownButton:
delta = self.ted.lineHeight
if partcode == Controls.inPageUp:
delta = self.ted.lineHeight-(self.terect[3]-self.terect[1])
if partcode == Controls.inPageDown:
delta = (self.terect[3]-self.terect[1])-self.ted.lineHeight
old = control.GetControlValue()
control.SetControlValue(old+delta)
newx = self.barx.GetControlValue()
newy = self.bary.GetControlValue()
oldx = self.ted.viewRect[0]
oldy = self.ted.viewRect[1]
self.ted.TEPinScroll(oldx-newx, oldy-newy)
self.setscrollbars() # XXXX Bibbert, maar hoe anders?
class MT_IconTextWidget(MT_TextWidget):
def __init__(self, wid, r):
MT_TextWidget.__init__(self, wid, r)
self.breakpointlist = []
self.curline = None
self.iconrect = (self.rect[0]+1, self.rect[1]+1,
self.terect[0]-1, self.rect[3]-SCROLLBAR)
self.curlinerange = (self.terect[1]+self.ted.lineHeight,
self.terect[3]-2*self.ted.lineHeight)
self.piccurrent = PIC_CURRENT
def setbreaks(self, list):
self.breakpointlist = list[:]
Qd.SetPort(self.wid)
self.wid.InvalWindowRect(self.iconrect)
def setcurline(self, line, pic=PIC_CURRENT):
self.curline = line
self.piccurrent = pic
Qd.SetPort(self.wid)
self.showline(line)
def showline(self, line):
if line <= 0: line = 1
if line >= len(self.line_index): line = len(self.line_index)-1
if line < 0: return
off = self.line_index[line]
x, y = self.ted.TEGetPoint(off)
if self.curlinerange[0] <= y <= self.curlinerange[1]:
return # It is in view
middle = (self.curlinerange[0]+self.curlinerange[1])/2
self.ted.TEPinScroll(0, middle-y) # Of andersom?
self.setscrollbars()
def setscrollbars(self):
MT_TextWidget.setscrollbars(self)
self.wid.InvalWindowRect(self.iconrect)
def update(self, rgn):
MT_TextWidget.update(self, rgn)
self.drawallicons()
def drawallicons(self):
Qd.EraseRect(self.iconrect)
Qd.MoveTo(self.iconrect[2], self.iconrect[1])
Qd.LineTo(self.iconrect[2], self.iconrect[3])
topoffset = self.ted.TEGetOffset((self.terect[0], self.terect[1]))
botoffset = self.ted.TEGetOffset((self.terect[0], self.terect[3]))
topline = self.offsettoline(topoffset)
botline = self.offsettoline(botoffset)
if topline == None: topline = 1 # ???
if botline == None: botline = len(self.line_index)
for i in self.breakpointlist:
if topline <= i <= botline:
self.draw1icon(i, PIC_BREAK)
if self.curline <> None and topline <= self.curline <= botline:
self.draw1icon(self.curline, self.piccurrent)
def draw1icon(self, line, which):
offset = self.line_index[line]
botx, boty = self.ted.TEGetPoint(offset)
rect = self.rect[0]+2, boty-self.ted.lineHeight, \
self.rect[0]+ICONSIZE-2, boty
if not picture_cache.has_key(which):
picture_cache[which] = Qd.GetPicture(which)
self.drawicon(rect, picture_cache[which])
def drawicon(self, rect, which):
Qd.DrawPicture(which, rect)
class MT_IndexList:
def __init__(self, wid, rect, width):
# wid is the window (dialog) where our list is going to be in
# rect is it's item rectangle (as in dialog item)
self.rect = rect
rect2 = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-1
self.list = List.LNew(rect2, (0, 0, width, 0), (0,0), 0, wid,
0, 1, 0, 1)
self.wid = wid
self.width = width
def setcontent(self, *content):
self.list.LDelRow(0, 1)
self.list.LSetDrawingMode(0)
self.list.LAddRow(len(content[0]), 0)
for x in range(len(content)):
column = content[x]
for y in range(len(column)):
self.list.LSetCell(column[y], (x, y))
self.list.LSetDrawingMode(1)
self.wid.InvalWindowRect(self.rect)
def deselectall(self):
while 1:
ok, pt = self.list.LGetSelect(1, (0,0))
if not ok: return
self.list.LSetSelect(0, pt)
def select(self, num):
self.deselectall()
if num < 0:
return
for i in range(self.width):
self.list.LSetSelect(1, (i, num))
def click(self, where, modifiers):
is_double = self.list.LClick(where, modifiers)
ok, (x, y) = self.list.LGetSelect(1, (0, 0))
if ok:
return y, is_double
else:
return None, is_double
# draw a frame around the list, List Manager doesn't do that
def drawframe(self):
Qd.SetPort(self.wid)
Qd.FrameRect(self.rect)
def update(self, rgn):
self.drawframe()
self.list.LUpdate(rgn)
def activate(self, onoff):
self.list.LActivate(onoff)
class MT_AnyList(MT_IndexList):
def click(self, where, modifiers):
is_double = self.list.LClick(where, modifiers)
ok, (x, y) = self.list.LGetSelect(1, (0, 0))
if ok:
self.select(y)
field0 = self.list.LGetCell(1000,(0,y))
else:
field0 = None
return field0, is_double

View file

@ -1,267 +0,0 @@
import FrameWork
import MiniAEFrame
import EasyDialogs
import AE
import AppleEvents
import Res
import sys
import Qd
import Evt
import Events
import Dlg
import Win
import Menu
import TwitCore
import mactwit_mod
import mactwit_stack
import mactwit_browser
import mactwit_edit
import macfs
import string
# Resource-id (for checking existence)
ID_MODULES=500
ID_ABOUT=502
_arrow = Qd.qd.arrow
_watch = Qd.GetCursor(4).data
class Twit(FrameWork.Application, TwitCore.Application, MiniAEFrame.AEServer):
"""The twit main class - mac-dependent part"""
def __init__(self, sessiontype, arg=None):
# First init menus, etc.
self.app_menu_bar = Menu.GetMenuBar()
FrameWork.Application.__init__(self)
MiniAEFrame.AEServer.__init__(self)
AE.AESetInteractionAllowed(AppleEvents.kAEInteractWithAll)
self.installaehandler('aevt', 'odoc', self.ae_open_doc)
self.installaehandler('aevt', 'quit', self.do_quit)
self.installaehandler('pyth', 'EXEC', self.do_bbpyexec) # BBpy execute event
self.dbg_menu_bar = Menu.GetMenuBar()
self.setstate(sessiontype)
self._quitting = 0
self.real_quit = 0
self.window_aware = 1
# Next create our dialogs
self.mi_init(sessiontype, arg)
while 1:
if self.real_quit:
break
if self.initial_cmd:
self.to_debugger() # Will get to mainloop via debugger
else:
self.one_mainloop() # Else do it ourselves.
def switch_to_app(self):
if not self.window_aware:
return
self.dbg_menu_bar = Menu.GetMenuBar()
Menu.SetMenuBar(self.app_menu_bar)
Menu.DrawMenuBar()
def switch_to_dbg(self):
if not self.window_aware:
return
self.app_menu_bar = Menu.GetMenuBar()
Menu.SetMenuBar(self.dbg_menu_bar)
Menu.DrawMenuBar()
self.run_dialog.force_redraw()
if self.module_dialog:
self.module_dialog.force_redraw()
def makeusermenus(self):
self.filemenu = m = FrameWork.Menu(self.menubar, "Debug")
self._openitem = FrameWork.MenuItem(m, "Run File...", "O", self.do_open)
self._runitem = FrameWork.MenuItem(m, "Run String...", "R", self.do_run)
FrameWork.Separator(m)
self._awareitem = FrameWork.MenuItem(m, "Window-aware", "", self.do_aware)
self._awareitem.check(1)
FrameWork.Separator(m)
self._quititem = FrameWork.MenuItem(m, "Quit", "Q", self.do_quit)
self.controlmenu = m = FrameWork.Menu(self.menubar, "Control")
self._stepitem = FrameWork.MenuItem(m, "Step Next", "N", self.do_step)
self._stepinitem = FrameWork.MenuItem(m, "Step In", "S", self.do_stepin)
self._stepoutitem = FrameWork.MenuItem(m, "Step Out", "U", self.do_stepout)
self._continueitem = FrameWork.MenuItem(m, "Continue", "G", self.do_continue)
FrameWork.Separator(m)
self._killitem = FrameWork.MenuItem(m, "Kill", "K", self.do_kill)
def setstate(self, state):
self.state = state
if state == 'run':
self._stepitem.enable(1)
self._stepoutitem.enable(1)
self._stepinitem.enable(1)
self._continueitem.enable(1)
self._killitem.enable(1)
else:
self._stepitem.enable(0)
self._stepoutitem.enable(0)
self._stepinitem.enable(0)
self._continueitem.enable(0)
self._killitem.enable(0)
def asknewsession(self):
if self.state == 'none':
return 1
if EasyDialogs.AskYesNoCancel("Abort current debug session?") == 1:
self.quit_bdb()
return 1
return 0
def do_about(self, id, item, window, event):
import time
d = Dlg.GetNewDialog(ID_ABOUT, -1)
if not d:
return
w = d.GetDialogWindow()
port = w.GetWindowPort()
l, t, r, b = port.portRect
sl, st, sr, sb = Qd.qd.screenBits.bounds
x = ((sr-sl) - (r-l)) / 2
y = ((sb-st-16) - (b-t)) / 5
w.MoveWindow(x, y, 0)
w.ShowWindow()
d.DrawDialog()
tp, h, rect = d.GetDialogItem(2)
x0, y0, x1, y1 = rect
ybot = y0 + 32
rgn = Qd.NewRgn()
Qd.SetPort(d)
ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, 1)
if ok: return
(what, message, when, where, modifiers) = event
delta_t = 128
nexttime = when+delta_t
while ybot < y1:
# Do the animation, if it is time
if when > nexttime:
Qd.ScrollRect((x0, y0, x1, ybot), 0, 1, rgn)
y0 = y0 + 1
ybot = ybot + 1
# And update next time
delta_t = int(delta_t*0.6)-1
if delta_t < 0:
delta_t = 0
nexttime = when + delta_t
# Check for an event.
ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, 0)
if ok: return
(what, message, when, where, modifiers) = evt
while 1:
ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, -1)
if ok: return
def do_open(self, *args):
if not self.asknewsession():
return
fss, ok = macfs.StandardGetFile('TEXT')
if not ok: return
self.runfile(fss.as_pathname())
def ae_open_doc(self, object=None, **args):
if not object: return
if self.state <> 'none':
if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0:
if not self.asknewsession():
return
if type(object) == type([]):
object = object[0]
fss, changed = object.Resolve()
self.runfile(fss.as_pathname())
def do_bbpyexec(self, object=None, NAME=None, **args):
if type(object) <> type(''):
if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0:
EasyDialogs.Message('EXEC AppleEvent arg should be a string')
return
if self.state <> 'none':
if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0:
if not self.asknewsession():
return
stuff = string.splitfields(object, '\r')
stuff = string.joinfields(stuff, '\n')
self.runstring(stuff)
def do_run(self, *args):
if not self.asknewsession():
return
self.run()
def do_aware(self, *args):
self.window_aware = not self.window_aware
self._awareitem.check(self.window_aware)
def do_quit(self, *args):
self._quit() # Signal FrameWork.Application to stop
self.real_quit = 1
self.quit_bdb() # Tell debugger to quit.
def do_step(self, *args):
self.run_dialog.click_step()
def do_stepin(self, *args):
self.run_dialog.click_step_in()
def do_stepout(self, *args):
self.run_dialog.click_step_out()
def do_continue(self, *args):
self.run_dialog.click_continue()
def do_kill(self, *args):
self.run_dialog.click_kill()
def exit_mainloop(self):
self._quit() # Signal FrameWork.Application to stop
self.real_quit = 0
def one_mainloop(self):
self.quitting = 0
self.mainloop()
def SetCursor(self):
Qd.SetCursor(_arrow)
def SetWatch(self):
Qd.SetCursor(_watch)
def AskString(self, *args):
return apply(EasyDialogs.AskString, args)
def Message(self, *args):
return apply(EasyDialogs.Message, args)
def new_module_browser(self, parent):
return mactwit_mod.ModuleBrowser(parent)
def new_stack_browser(self, parent):
return mactwit_stack.StackBrowser(parent)
def new_var_browser(self, parent, var):
return mactwit_browser.VarBrowser(parent).open(var)
def edit(self, file, line):
return mactwit_edit.edit(file, line)
def Initialize():
try:
# if this doesn't raise an error, we are an applet containing the
# necessary resources or we have been initialized already
# so we don't have to bother opening the resource file
dummy = Res.GetResource('DLOG', ID_MODULES)
except Res.Error:
try:
Res.FSpOpenResFile("Twit.rsrc", 1)
except Res.Error, arg:
EasyDialogs.Message("Cannot open Twit.rsrc: "+arg[1])
sys.exit(1)

View file

@ -1,429 +0,0 @@
"""A simple Mac-only browse utility to peek at the inner data structures of Python."""
# Minor modifications by Jack to facilitate incorporation in twit.
# june 1996
# Written by Just van Rossum <just@knoware.nl>, please send comments/improvements.
# Loosely based on Jack Jansens's PICTbrowse.py, but depends on his fabulous FrameWork.py
# XXX Some parts are *very* poorly solved. Will fix. Guido has to check if all the
# XXX "python-peeking" is done correctly. I kindof reverse-engineered it ;-)
# disclaimer: although I happen to be the brother of Python's father, programming is
# not what I've been trained to do. So don't be surprised if you find anything that's not
# as nice as it could be...
# XXX to do:
# Arrow key support
# Copy & Paste?
# MAIN_TEXT item should not contain (type); should be below or something.
# MAIN_TEXT item should check if a string is binary or not: convert to '/000' style
# or convert newlines.
version = "1.0"
import FrameWork
import EasyDialogs
import Dlg
import Res
import Qd
import List
import sys
from Types import *
from QuickDraw import *
import string
import time
import os
# The initial object to start browsing with. Can be anything, but 'sys' makes kindof sense.
start_object = sys
# Resource definitions
ID_MAIN = 503
NUM_LISTS = 4 # the number of lists used. could be changed, but the dlg item numbers should be consistent
MAIN_TITLE = 3 # this is only the first text item, the other three ID's should be 5, 7 and 9
MAIN_LIST = 4 # this is only the first list, the other three ID's should be 6, 8 and 10
MAIN_TEXT = 11
MAIN_LEFT = 1
MAIN_RIGHT = 2
MAIN_RESET = 12
MAIN_CLOSE = 13
MAIN_LINE = 14
def Initialize():
# this bit ensures that this module will also work as an applet if the resources are
# in the resource fork of the applet
# stolen from Jack, so it should work(?!;-)
try:
# if this doesn't raise an error, we are an applet containing the necessary resources
# so we don't have to bother opening the resource file
dummy = Res.GetResource('DLOG', ID_MAIN)
except Res.Error:
savewd = os.getcwd()
ourparentdir = os.path.split(openresfile.func_code.co_filename)[0]
os.chdir(ourparentdir)
try:
Res.FSpOpenResFile("mactwit_browse.rsrc", 1)
except Res.Error, arg:
EasyDialogs.Message("Cannot open mactwit_browse.rsrc: "+arg[1])
sys.exit(1)
os.chdir(savewd)
def main():
Initialize()
PythonBrowse()
# this is all there is to it to make an application.
class PythonBrowse(FrameWork.Application):
def __init__(self):
FrameWork.Application.__init__(self)
VarBrowser(self).open(start_object)
self.mainloop()
def do_about(self, id, item, window, event):
EasyDialogs.Message(self.__class__.__name__ + " version " + version + "\rby Just van Rossum")
def quit(self, *args):
raise self
class MyList:
def __init__(self, wid, rect, itemnum):
# wid is the window (dialog) where our list is going to be in
# rect is it's item rectangle (as in dialog item)
# itemnum is the itemnumber in the dialog
self.rect = rect
rect2 = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-1 # Scroll bar space, that's 15 + 1, Jack!
self.list = List.LNew(rect2, (0, 0, 1, 0), (0,0), 0, wid,
0, 1, 0, 1)
self.wid = wid
self.active = 0
self.itemnum = itemnum
def setcontent(self, content, title = ""):
# first, gather some stuff
keylist = []
valuelist = []
thetype = type(content)
if thetype == DictType:
keylist = content.keys()
keylist.sort()
for key in keylist:
valuelist.append(content[key])
elif thetype == ListType:
keylist = valuelist = content
elif thetype == TupleType:
keylist = valuelist = []
for i in content:
keylist.append(i)
else:
# XXX help me! is all this correct? is there more I should consider???
# XXX is this a sensible way to do it in the first place????
# XXX I'm not familiar enough with Python's guts to be sure. GUIDOOOOO!!!
if hasattr(content, "__dict__"):
keylist = keylist + content.__dict__.keys()
if hasattr(content, "__methods__"):
keylist = keylist + content.__methods__
if hasattr(content, "__members__"):
keylist = keylist + content.__members__
if hasattr(content, "__class__"):
keylist.append("__class__")
if hasattr(content, "__bases__"):
keylist.append("__bases__")
if hasattr(content, "__name__"):
title = content.__name__
if "__name__" not in keylist:
keylist.append("__name__")
keylist.sort()
for key in keylist:
valuelist.append(getattr(content, key))
if content <> None:
title = title + "\r" + cleantype(content)
# now make that list!
tp, h, rect = self.wid.GetDialogItem(self.itemnum - 1)
Dlg.SetDialogItemText(h, title[:255])
self.list.LDelRow(0, 1)
self.list.LSetDrawingMode(0)
self.list.LAddRow(len(keylist), 0)
for i in range(len(keylist)):
self.list.LSetCell(str(keylist[i]), (0, i))
self.list.LSetDrawingMode(1)
self.list.LUpdate(self.wid.GetWindowPort().visRgn)
self.content = content
self.keylist = keylist
self.valuelist = valuelist
self.title = title
# draw a frame around the list, List Manager doesn't do that
def drawframe(self):
Qd.SetPort(self.wid)
Qd.FrameRect(self.rect)
rect2 = Qd.InsetRect(self.rect, -3, -3)
save = Qd.GetPenState()
Qd.PenSize(2, 2)
if self.active:
Qd.PenPat(Qd.qd.black)
else:
Qd.PenPat(Qd.qd.white)
# draw (or erase) an extra frame to indicate this is the acive list (or not)
Qd.FrameRect(rect2)
Qd.SetPenState(save)
class VarBrowser(FrameWork.DialogWindow):
def open(self, start_object, title = ""):
FrameWork.DialogWindow.open(self, ID_MAIN)
if title <> "":
windowtitle = self.wid.GetWTitle()
self.wid.SetWTitle(windowtitle + " >> " + title)
else:
if hasattr(start_object, "__name__"):
windowtitle = self.wid.GetWTitle()
self.wid.SetWTitle(windowtitle + " >> " + str(getattr(start_object, "__name__")) )
self.SetPort()
Qd.TextFont(3)
Qd.TextSize(9)
self.lists = []
self.listitems = []
for i in range(NUM_LISTS):
self.listitems.append(MAIN_LIST + 2 * i) # dlg item numbers... have to be consistent
for i in self.listitems:
tp, h, rect = self.wid.GetDialogItem(i)
list = MyList(self.wid, rect, i)
self.lists.append(list)
self.leftover = []
self.rightover = []
self.setup(start_object, title)
def close(self):
self.lists = []
self.listitems = []
self.do_postclose()
def setup(self, start_object, title = ""):
# here we set the starting point for our expedition
self.start = start_object
self.lists[0].setcontent(start_object, title)
for list in self.lists[1:]:
list.setcontent(None)
def do_listhit(self, event, item):
(what, message, when, where, modifiers) = event
Qd.SetPort(self.wid)
where = Qd.GlobalToLocal(where)
for list in self.lists:
list.active = 0
list = self.lists[self.listitems.index(item)]
list.active = 1
for l in self.lists:
l.drawframe()
point = (0,0)
ok, point = list.list.LGetSelect(1, point)
if ok:
oldsel = point[1]
else:
oldsel = -1
# This should be: list.list.LClick(where, modifiers)
# Since the selFlags field of the list is not accessible from Python I have to do it like this.
# The effect is that you can't select more items by using shift or command.
list.list.LClick(where, 0)
index = self.listitems.index(item) + 1
point = (0,0)
ok, point = list.list.LGetSelect(1, point)
if oldsel == point[1]:
return # selection didn't change, do nothing.
if not ok:
for i in range(index, len(self.listitems)):
self.lists[i].setcontent(None)
self.rightover = []
return
if point[1] >= len(list.keylist):
return # XXX is this still necessary? is ok really true?
key = str(list.keylist[point[1]])
value = list.valuelist[point[1]]
self.settextitem("")
thetype = type(value)
if thetype == ListType or \
thetype == TupleType or \
thetype == DictType or \
hasattr(value, "__dict__") or \
hasattr(value, "__methods__") or \
hasattr(value, "__members__"): # XXX or, or... again: did I miss something?
if index >= len(self.listitems):
# we've reached the right side of our dialog. move everything to the left
# (by pushing the rightbutton...)
self.do_rightbutton(1)
index = index - 1
newlist = self.lists[index]
newlist.setcontent(value, key)
else:
index = index - 1
self.settextitem( str(value) + "\r" + cleantype(value))
for i in range(index + 1, len(self.listitems)):
self.lists[i].setcontent(None)
self.rightover = []
# helper to set the big text item at the bottom of the dialog.
def settextitem(self, text):
tp, h, rect = self.wid.GetDialogItem(MAIN_TEXT)
Dlg.SetDialogItemText(h, text[:255])
def do_rawupdate(self, window, event):
Qd.SetPort(self.wid)
iType, iHandle, iRect = window.GetDialogItem(MAIN_LINE)
Qd.FrameRect(iRect)
for list in self.lists:
Qd.FrameRect(list.rect)
if list.active:
# see MyList.drawframe
rect2 = Qd.InsetRect(list.rect, -3, -3)
save = Qd.GetPenState()
Qd.PenSize(2, 2)
Qd.FrameRect(rect2)
Qd.SetPenState(save)
for list in self.lists:
list.list.LUpdate(self.wid.GetWindowPort().visRgn)
def do_activate(self, activate, event):
for list in self.lists:
list.list.LActivate(activate)
# scroll everything one 'unit' to the left
# XXX I don't like the way this works. Too many 'manual' assignments
def do_rightbutton(self, force = 0):
if not force and self.rightover == []:
return
self.scroll(-1)
point = (0, 0)
ok, point = self.lists[0].list.LGetSelect(1, point)
self.leftover.append((point, self.lists[0].content, self.lists[0].title, self.lists[0].active))
for i in range(len(self.lists)-1):
point = (0, 0)
ok, point = self.lists[i+1].list.LGetSelect(1, point)
self.lists[i].setcontent(self.lists[i+1].content, self.lists[i+1].title)
self.lists[i].list.LSetSelect(ok, point)
self.lists[i].list.LAutoScroll()
self.lists[i].active = self.lists[i+1].active
self.lists[i].drawframe()
if len(self.rightover) > 0:
point, content, title, active = self.rightover[-1]
self.lists[-1].setcontent(content, title)
self.lists[-1].list.LSetSelect(1, point)
self.lists[-1].list.LAutoScroll()
self.lists[-1].active = active
self.lists[-1].drawframe()
del self.rightover[-1]
else:
self.lists[-1].setcontent(None)
self.lists[-1].active = 0
for list in self.lists:
list.drawframe()
# scroll everything one 'unit' to the right
def do_leftbutton(self):
if self.leftover == []:
return
self.scroll(1)
if self.lists[-1].content <> None:
point = (0, 0)
ok, point = self.lists[-1].list.LGetSelect(1, point)
self.rightover.append((point, self.lists[-1].content, self.lists[-1].title, self.lists[-1].active ))
for i in range(len(self.lists)-1, 0, -1):
point = (0, 0)
ok, point = self.lists[i-1].list.LGetSelect(1, point)
self.lists[i].setcontent(self.lists[i-1].content, self.lists[i-1].title)
self.lists[i].list.LSetSelect(ok, point)
self.lists[i].list.LAutoScroll()
self.lists[i].active = self.lists[i-1].active
self.lists[i].drawframe()
if len(self.leftover) > 0:
point, content, title, active = self.leftover[-1]
self.lists[0].setcontent(content, title)
self.lists[0].list.LSetSelect(1, point)
self.lists[0].list.LAutoScroll()
self.lists[0].active = active
self.lists[0].drawframe()
del self.leftover[-1]
else:
self.lists[0].setcontent(None)
self.lists[0].active = 0
# create some visual feedback when 'scrolling' the lists to the left or to the right
def scroll(self, leftright): # leftright should be 1 or -1
# first, build a region containing all list rectangles
myregion = Qd.NewRgn()
mylastregion = Qd.NewRgn()
for list in self.lists:
AddRect2Rgn(list.rect, myregion)
AddRect2Rgn(list.rect, mylastregion)
# set the pen, but save it's state first
self.SetPort()
save = Qd.GetPenState()
Qd.PenPat(Qd.qd.gray)
Qd.PenMode(srcXor)
# how far do we have to scroll?
distance = self.lists[1].rect[0] - self.lists[0].rect[0]
step = 30
lasttime = time.clock() # for delay
# do it
for i in range(0, distance, step):
if i <> 0:
Qd.FrameRgn(mylastregion) # erase last region
Qd.OffsetRgn(mylastregion, step * leftright, 0)
# draw gray region
Qd.FrameRgn(myregion)
Qd.OffsetRgn(myregion, step * leftright, 0)
while time.clock() - lasttime < 0.05:
pass # delay
lasttime = time.clock()
# clean up after your dog
Qd.FrameRgn(mylastregion)
Qd.SetPenState(save)
def reset(self):
for list in self.lists:
point = (0,0)
ok, point = list.list.LGetSelect(1, point)
if ok:
sel = list.keylist[point[1]]
list.setcontent(list.content, list.title)
if ok:
list.list.LSetSelect(1, (0, list.keylist.index(sel)))
list.list.LAutoScroll()
def do_itemhit(self, item, event):
if item in self.listitems:
self.do_listhit(event, item)
elif item == MAIN_LEFT:
self.do_leftbutton()
elif item == MAIN_RIGHT:
self.do_rightbutton()
elif item == MAIN_CLOSE:
self.close()
elif item == MAIN_RESET:
self.reset()
# helper function that returns a short string containing the type of an arbitrary object
# eg: cleantype("wat is dit nu weer?") -> '(string)'
def cleantype(obj):
# type() typically returns something like: <type 'string'>
items = string.split(str(type(obj)), "'")
if len(items) == 3:
return '(' + items[1] + ')'
else:
# just in case, I don't know.
return str(type(obj))
# helper for VarBrowser.scroll
def AddRect2Rgn(theRect, theRgn):
rRgn = Qd.NewRgn()
Qd.RectRgn(rRgn, theRect)
Qd.UnionRgn(rRgn, theRgn, theRgn)
if __name__ == "__main__":
main()

View file

@ -1,24 +0,0 @@
"""Edit a file using the MetroWerks editor. Modify to suit your needs"""
import MacOS
import aetools
import Metrowerks_Shell_Suite
import Required_Suite
_talker = None
class MWShell(aetools.TalkTo,
Metrowerks_Shell_Suite.Metrowerks_Shell_Suite,
Required_Suite.Required_Suite):
pass
def edit(file, line):
global _talker
if _talker == None:
_talker = MWShell('CWIE', start=1)
try:
_talker.open(file)
_talker.Goto_Line(line)
except "(MacOS.Error, aetools.Error)":
pass

View file

@ -1,114 +0,0 @@
# A stab at a python debugger
import Res
import Qd
import Dlg
import Win
import FrameWork
import EasyDialogs
import sys
import TwitCore
from mac_widgets import MT_AnyList, MT_IconTextWidget
# Our dialogs
ID_MODULES=500
I_MODULES_TITLE=1
I_MODULES=2
I_VARS_TITLE=3
I_VARS=4
I_SOURCE_TITLE=5
I_SOURCE=6
I_RULER=7
I_EDIT=8
class ModuleBrowser(FrameWork.DialogWindow, TwitCore.ModuleBrowser):
"""The module-browser dialog - mac-dependent part"""
def open(self, module):
FrameWork.DialogWindow.open(self, ID_MODULES)
self.SetPort()
Qd.TextFont(3)
Qd.TextSize(9)
tp, h, rect = self.wid.GetDialogItem(I_MODULES)
self.modules = MT_AnyList(self.wid, rect, 1)
tp, h, rect = self.wid.GetDialogItem(I_VARS)
self.vars = MT_AnyList(self.wid, rect, 2)
tp, h, rect = self.wid.GetDialogItem(I_SOURCE)
self.source = MT_IconTextWidget(self.wid, rect)
self.mi_open(module)
def setsource(self, msg):
tp, h, rect = self.wid.GetDialogItem(I_SOURCE_TITLE)
if self.cur_source:
Dlg.SetDialogItemText(h, self.cur_source)
else:
Dlg.SetDialogItemText(h, msg)
self.source.setcontent(self.cur_source)
def source_setbreaks(self, list):
self.source.setbreaks(list)
def source_setline(self, lineno, icon):
self.source.setcurline(lineno, icon)
def source_select(self, lineno):
self.source.select(lineno)
def setmodulenames(self):
self.modules.setcontent(self.cont_modules)
def module_select(self, number):
self.modules.select(number)
def setvars(self):
self.vars.setcontent(self.cont_varnames, self.cont_varvalues)
def do_itemhit(self, item, event):
(what, message, when, where, modifiers) = event
Qd.SetPort(self.wid)
where = Qd.GlobalToLocal(where)
if item == I_MODULES:
new_module, double = self.modules.click(where, 0)
self.click_module(new_module)
elif item == I_VARS:
new_var, double = self.vars.click(where, 0)
if double:
self.click_var(new_var)
elif item == I_SOURCE:
lineno, inborder = self.source.click(where, 0)
if lineno <> None and lineno >= 0:
self.click_source(lineno, inborder)
elif item == I_EDIT:
self.click_edit()
def do_rawupdate(self, window, event):
Qd.SetPort(self.wid)
rgn = self.wid.GetWindowPort().visRgn
tp, h, rect = self.wid.GetDialogItem(I_RULER)
Qd.MoveTo(rect[0], rect[1])
Qd.LineTo(rect[2], rect[1])
self.modules.update(rgn)
self.vars.update(rgn)
self.source.update(rgn)
def force_redraw(self):
Qd.SetPort(self.wid)
self.wid.InvalWindowRgn(self.wid.GetWindowPort().visRgn)
def do_activate(self, activate, event):
self.modules.activate(activate)
self.vars.activate(activate)
self.source.activate(activate)
def close(self):
self.parent.module_dialog = None
self.source.close()
del self.modules
del self.vars
del self.source
self.do_postclose()
if __name__ == '__main__':
main()

View file

@ -1,159 +0,0 @@
# A stab at a python debugger
import Res
import Qd
import Dlg
import Win
import FrameWork
import EasyDialogs
import sys
import TwitCore
from mac_widgets import MT_AnyList, MT_IndexList, MT_IconTextWidget
# Our dialogs
ID_STACK=501
I_STACK_TITLE=1
I_STACK=2
I_VARS_TITLE=3
I_VARS=4
I_SOURCE_TITLE=5
I_SOURCE=6
I_EXC_TITLE=7
I_EXC=8
I_EXCVALUE_TITLE=9
I_EXCVALUE=10
I_BROWSE=11
I_RULER1=12
I_RULER2=13
I_STATE_TITLE=14
I_STATE=15
I_SHOW_COMPLEX=16
I_SHOW_SYSTEM=17
I_EDIT=18
class StackBrowser(FrameWork.DialogWindow, TwitCore.StackBrowser):
"""The stack-browser dialog - mac-dependent part"""
def open(self):
FrameWork.DialogWindow.open(self, ID_STACK)
self.SetPort()
Qd.TextFont(3)
Qd.TextSize(9)
tp, h, rect = self.wid.GetDialogItem(I_STACK)
self.stack = MT_IndexList(self.wid, rect, 2)
tp, h, rect = self.wid.GetDialogItem(I_VARS)
self.vars = MT_AnyList(self.wid, rect, 2)
tp, h, rect = self.wid.GetDialogItem(I_SOURCE)
self.source = MT_IconTextWidget(self.wid, rect)
self.mi_open()
def setsource(self, msg):
tp, h, rect = self.wid.GetDialogItem(I_SOURCE_TITLE)
if self.cur_source:
Dlg.SetDialogItemText(h, self.cur_source)
else:
Dlg.SetDialogItemText(h, msg)
self.source.setcontent(self.cur_source)
def source_setbreaks(self, list):
self.source.setbreaks(list)
def source_setline(self, lineno, icon):
self.source.setcurline(lineno, icon)
def source_select(self, lineno):
self.source.select(lineno)
def stack_setcontent(self, names, locations):
self.stack.setcontent(names, locations)
def stack_select(self, number):
self.stack.select(number)
def setvars(self):
self.vars.setcontent(self.cont_varnames, self.cont_varvalues)
def setexception(self, name, value):
if name == None:
self.wid.HideDialogItem(I_EXC)
self.wid.HideDialogItem(I_EXC_TITLE)
value = None
else:
self.wid.ShowDialogItem(I_EXC)
self.wid.ShowDialogItem(I_EXC_TITLE)
tp, h, rect = self.wid.GetDialogItem(I_EXC)
Dlg.SetDialogItemText(h, name)
if value == None:
self.wid.HideDialogItem(I_EXCVALUE)
self.wid.HideDialogItem(I_EXCVALUE_TITLE)
else:
self.wid.ShowDialogItem(I_EXCVALUE)
self.wid.ShowDialogItem(I_EXCVALUE_TITLE)
tp, h, rect = self.wid.GetDialogItem(I_EXCVALUE)
Dlg.SetDialogItemText(h, value)
def setprogramstate(self, msg):
tp, h, rect = self.wid.GetDialogItem(I_STATE)
Dlg.SetDialogItemText(h, msg)
def do_itemhit(self, item, event):
(what, message, when, where, modifiers) = event
Qd.SetPort(self.wid)
where = Qd.GlobalToLocal(where)
if item == I_STACK:
new_stackitem, double = self.stack.click(where, 0)
self.click_stack(new_stackitem)
elif item == I_VARS:
new_var, double = self.vars.click(where, 0)
if double:
self.click_var(new_var)
elif item == I_SOURCE:
lineno, inborder = self.source.click(where, 0)
if lineno <> None and lineno >= 0:
self.click_source(lineno, inborder)
elif item == I_BROWSE:
self.click_browse()
elif item == I_SHOW_COMPLEX:
self.show_complex = not self.show_complex
self.setup_frame()
elif item == I_SHOW_SYSTEM:
self.show_system = not self.show_system
self.setup_frame()
elif item == I_EDIT:
self.click_edit()
def set_var_buttons(self):
tp, h, rect = self.wid.GetDialogItem(I_SHOW_COMPLEX)
h.as_Control().SetControlValue(self.show_complex)
tp, h, rect = self.wid.GetDialogItem(I_SHOW_SYSTEM)
h.as_Control().SetControlValue(self.show_system)
def do_rawupdate(self, window, event):
Qd.SetPort(self.wid)
rgn = self.wid.GetWindowPort().visRgn
tp, h, rect = self.wid.GetDialogItem(I_RULER1)
Qd.MoveTo(rect[0], rect[1])
Qd.LineTo(rect[2], rect[1])
tp, h, rect = self.wid.GetDialogItem(I_RULER2)
Qd.MoveTo(rect[0], rect[1])
Qd.LineTo(rect[2], rect[1])
self.stack.update(rgn)
self.vars.update(rgn)
self.source.update(rgn)
def force_redraw(self):
Qd.SetPort(self.wid)
self.wid.InvalWindowRgn(self.wid.GetWindowPort().visRgn)
def do_activate(self, activate, event):
self.stack.activate(activate)
self.vars.activate(activate)
self.source.activate(activate)
def close(self):
self.source.close()
del self.stack
del self.vars
del self.source
self.do_postclose()

View file

@ -1,59 +0,0 @@
"""twit - The Window-Independent Tracer.
Interface:
twit.main() Enter debugger in inactive interactive state
twit.run(stmt, globals, locals) Enter debugger and start running stmt
twit.post_mortem(traceback) Enter debugger in post-mortem mode on traceback
twit.pm() Enter debugger in pm-mode on sys.last_traceback
main program: nothing but a bit of glue to put it all together.
Jack Jansen, CWI, August 1996."""
import os
import sys
# Add our directory to path, if needed
dirname = os.path.split(__file__)[0]
if not dirname in sys.path:
sys.path.append(dirname)
if os.name == 'mac':
import MacOS
MacOS.splash(502) # Try to show the splash screen
import mactwit_app; twit_app = mactwit_app
else:
try:
import _tkinter
have_tk = 1
except ImportError:
have_tk = 0
if have_tk:
import tktwit_app; twit_app = tktwit_app
else:
print 'Please implementent machine-dependent code and try again:-)'
sys.exit(1)
import sys
def main():
twit_app.Initialize()
if os.name == 'mac':
MacOS.splash()
twit_app.Twit('none', None)
def run(statement, globals=None, locals=None):
twit_app.Initialize()
twit_app.Twit('run', (statement, globals, locals))
def post_mortem(t):
Initialize()
twit_app.Twit('pm', t)
def pm():
post_mortem(sys.last_traceback)
if __name__ == '__main__':
main()

File diff suppressed because one or more lines are too long

View file

@ -1,13 +0,0 @@
# Test program
def foo(arg1, arg2):
bar(arg1+arg2)
bar(arg1-arg2)
foo(arg1+1, arg2-1)
def bar(arg):
rv = 10/arg
print rv
foo(0,10)