PyBalsa?
Nhi Vanye
offer at sgi.com
Mon May 8 18:50:20 EDT 2000
$ from hschroeder at gmx.net -#89489 | sed "1,$s/^/> /"
>
>
>Nhi Vanye <offer at sgi.com> wrote:
>> I started working on a python binding to the UoW C-Client library, but....
>Could you *please* share your code. The Python community would really
>benefit from such a module for serious (and fast!) mail applications.
Yes it would benefit, but I never finished it, in fact I never really
got beyond a proof of concept.
>I tried it myself but I don't have any experience with Swig.
SWIG would be easy if it worked, but the C-Client headers aren't clean
enough. What I ended up doing was hand-crafting an interface between
C-Client and python. This had the advantage of being able to tidy up
the c-client API.
Okay, this is what i had when I abandoned it (bear in mind that this
was as much a case of learning python as anything else, now of course
I'd do it differently :-)
There's a python test harness (also useful as the API doc).
The module (megan.c, megan.h)
The C-Client interface (c-client-wrap.c). Basically provides a bunch of
stub functions needed to link against the c-client library.
That's all there is, the rest of the stuff is still sitting on my
whiteboard, I can send that if you feel it maybe of help (basically its
the python API I was working towards).
The Makefile is Irix and my installation specific, but just in case
anyone wants to check build flags....
[ morgaine 6.5.7f-MR ] cat Makefile
PYTHON = /usr/local/Python152
CCLIENT=/usr/local/c-client
OBJS = megan.o c-client-wrap.o
MODULE = Megan
DEBUG =-g
#
# Dont remove -all, Python willnot load the module otherwise.
#
dso: $(OBJS)
$(LD) $(DEBUG) -woff 15 -all -shared -no_unresolved -o $(MODULE).so -soname $(MODULE).so $(OBJS) -L$(PYTHON)/lib/python1.5/config -lpython1.5 -L$(CCLIENT)/lib -lc-client -lpthread -lm -lc
megan.o: megan.c
$(CC) $(DEBUG) -c megan.c -I$(CCLIENT)/include -I$(PYTHON)/include/python1.5
c-client-wrap.o: c-client-wrap.c
$(CC) $(DEBUG) -c c-client-wrap.c -I$(CCLIENT)/include
clean:
rm -f $(OBJS) $(MODULE).so
This is a shar file, as its not even worth tarring it up and putting it
on a web-site.
#!/bin/sh
# This is a shell archive (produced by GNU sharutils 4.2.1).
# To extract the files from this archive, save it to some FILE, remove
# everything before the `!/bin/sh' line above, then type `sh FILE'.
#
# Made on 2000-05-08 15:38 PDT by <offer at fey.engr.sgi.com>.
# Source directory was `/hosts_usr_people/morgaine/offer/src/personal/python/megan'.
#
# Existing files will *not* be overwritten unless `-c' is specified.
#
# This shar contains:
# length mode name
# ------ ---------- ------------------------------------------
# 542 -rwxr-xr-x test.py
# 2820 -rw-r--r-- c-client-wrap.c
# 9610 -rw-r--r-- megan.c
# 487 -rw-r--r-- megan.h
#
save_IFS="${IFS}"
IFS="${IFS}:"
gettext_dir=FAILED
locale_dir=FAILED
first_param="$1"
for dir in $PATH
do
if test "$gettext_dir" = FAILED && test -f $dir/gettext \
&& ($dir/gettext --version >/dev/null 2>&1)
then
set `$dir/gettext --version 2>&1`
if test "$3" = GNU
then
gettext_dir=$dir
fi
fi
if test "$locale_dir" = FAILED && test -f $dir/shar \
&& ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
then
locale_dir=`$dir/shar --print-text-domain-dir`
fi
done
IFS="$save_IFS"
if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
then
echo=echo
else
TEXTDOMAINDIR=$locale_dir
export TEXTDOMAINDIR
TEXTDOMAIN=sharutils
export TEXTDOMAIN
echo="$gettext_dir/gettext -s"
fi
if touch -am -t 200112312359.59 $$.touch >/dev/null 2>&1 && test ! -f 200112312359.59 -a -f $$.touch; then
shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"'
elif touch -am 123123592001.59 $$.touch >/dev/null 2>&1 && test ! -f 123123592001.59 -a ! -f 123123592001.5 -a -f $$.touch; then
shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"'
elif touch -am 1231235901 $$.touch >/dev/null 2>&1 && test ! -f 1231235901 -a -f $$.touch; then
shar_touch='touch -am $3$4$5$6$2 "$8"'
else
shar_touch=:
echo
$echo 'WARNING: not restoring timestamps. Consider getting and'
$echo "installing GNU \`touch', distributed in GNU File Utilities..."
echo
fi
rm -f 200112312359.59 123123592001.59 123123592001.5 1231235901 $$.touch
#
if mkdir _sh01664; then
$echo 'x -' 'creating lock directory'
else
$echo 'failed to create lock directory'
exit 1
fi
# ============= test.py ==============
if test -f 'test.py' && test "$first_param" != -c; then
$echo 'x -' SKIPPING 'test.py' '(file already exists)'
else
$echo 'x -' extracting 'test.py' '(text)'
sed 's/^X//' << 'SHAR_EOF' > 'test.py' &&
#! /usr/local/Python152/bin/python
X
print "importing Megan"
import Megan
X
print "c=Megan.MailBox()"
c=Megan.MailBox()
X
print
print 'c.open("jokes", "r")'
c.open("jokes", "r")
X
print
print "print c"
print c
X
print
print "d = c.message(1)"
d = c.message(1)
X
print
print "print d"
print d
X
print
print "e = d.envelope()"
e = d.envelope()
X
print
print "f = e.frm()"
f = e.frm()
X
print
print "print f"
print f
X
print
print "t = e.to()"
t = e.to()
X
print
print "print t"
print t
X
print
X
print 'print t[0][2],"@",t[0][3]'
print t[0][2],"@",t[0][3]
X
SHAR_EOF
(set 20 00 05 08 15 17 45 'test.py'; eval "$shar_touch") &&
chmod 0755 'test.py' ||
$echo 'restore of' 'test.py' 'failed'
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|| $echo 'test.py:' 'MD5 check failed'
3f2b0dfc481a9700876be415ffe8fd60 test.py
SHAR_EOF
else
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'test.py'`"
test 542 -eq "$shar_count" ||
$echo 'test.py:' 'original size' '542,' 'current size' "$shar_count!"
fi
fi
# ============= c-client-wrap.c ==============
if test -f 'c-client-wrap.c' && test "$first_param" != -c; then
$echo 'x -' SKIPPING 'c-client-wrap.c' '(file already exists)'
else
$echo 'x -' extracting 'c-client-wrap.c' '(text)'
sed 's/^X//' << 'SHAR_EOF' > 'c-client-wrap.c' &&
X
#include <stdio.h>
X
#include <mail.h>
X
#define NEED_UNIX
#define NEED_MBX
X
X
#ifdef DEBUG
#define TRACE() \
X { fprintf(stderr,"File: %s ; Line: %d\n",__FILE__,__LINE__); }
#else
#define TRACE()
#endif
X
void
init_cclient_mail_handlers()
{
#ifdef NEED_MBOX
X TRACE();
X mail_link (&mboxdriver); /* link in the mbox driver */
#endif
#ifdef NEED_IMAP
X TRACE();
X mail_link (&imapdriver); /* link in the imap driver */
#endif
#ifdef NEED_NNTP
X TRACE();
X mail_link (&nntpdriver); /* link in the nntp driver */
#endif
#ifdef NEED_POP3
X TRACE();
X mail_link (&pop3driver); /* link in the pop3 driver */
#endif
#ifdef NEED_MH
X TRACE();
X mail_link (&mhdriver); /* link in the mh driver */
#endif
#ifdef NEED_MX
X TRACE();
X mail_link (&mxdriver); /* link in the mx driver */
#endif
#ifdef NEED_MBX
X TRACE();
X mail_link (&mbxdriver); /* link in the mbx driver */
#endif
#ifdef NEED_TENEX
X TRACE();
X mail_link (&tenexdriver); /* link in the tenex driver */
#endif
#ifdef NEED_MTX
X TRACE();
X mail_link (&mtxdriver); /* link in the mtx driver */
#endif
#ifdef NEED_MMDF
X TRACE();
X mail_link (&mmdfdriver); /* link in the mmdf driver */
#endif
#ifdef NEED_UNIX
X TRACE();
X mail_link (&unixdriver); /* link in the unix driver */
#endif
#ifdef NEED_NEWS
X TRACE();
X mail_link (&newsdriver); /* link in the news driver */
#endif
#ifdef NEED_LINK
X TRACE();
X mail_link (&philedriver); /* link in the phile driver */
#endif
X
X TRACE();
X mail_link (&dummydriver); /* link in the dummy driver */
X
X auth_link (&auth_log); /* link in the log authenticator */
X
X
}
X
void mm_searched (MAILSTREAM *stream,unsigned long number)
{
}
X
X
void mm_exists (MAILSTREAM *stream,unsigned long number)
{
}
X
X
void mm_expunged (MAILSTREAM *stream,unsigned long number)
{
}
X
X
void mm_flags (MAILSTREAM *stream,unsigned long number)
{
}
X
X
void mm_notify (MAILSTREAM *stream,char *string,long errflg)
{
X mm_log (string,errflg);
}
X
X
void mm_list (MAILSTREAM *stream,int delimiter,char *mailbox,long attributes)
{
}
X
X
void mm_lsub (MAILSTREAM *stream,int delimiter,char *mailbox,long attributes)
{
}
X
X
void mm_status (MAILSTREAM *stream,char *mailbox,MAILSTATUS *status)
{
}
X
X
void mm_log (char *string,long errflg)
{
X switch ((short) errflg) {
X case NIL:
X break;
X case PARSE:
X break;
X case WARN:
X break;
X case ERROR:
X printf ("?%s\n",string);
X break;
X }
}
X
X
void mm_dlog (char *string)
{
X fprintf (stderr, "%s\n",string);
}
X
X
void mm_login (NETMBX *mb,char *user,char *pwd,long trial)
{
X
}
X
X
void mm_critical (MAILSTREAM *stream)
{
}
X
X
void mm_nocritical (MAILSTREAM *stream)
{
}
X
X
long mm_diskerror (MAILSTREAM *stream,long errcode,long serious)
{
X
}
X
X
void mm_fatal (char *string)
{
X fprintf (stderr,"?%s\n",string);
}
X
X
SHAR_EOF
(set 19 99 07 07 13 15 46 'c-client-wrap.c'; eval "$shar_touch") &&
chmod 0644 'c-client-wrap.c' ||
$echo 'restore of' 'c-client-wrap.c' 'failed'
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|| $echo 'c-client-wrap.c:' 'MD5 check failed'
6bc6d9c235736b9b6247df092557f13b c-client-wrap.c
SHAR_EOF
else
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'c-client-wrap.c'`"
test 2820 -eq "$shar_count" ||
$echo 'c-client-wrap.c:' 'original size' '2820,' 'current size' "$shar_count!"
fi
fi
# ============= megan.c ==============
if test -f 'megan.c' && test "$first_param" != -c; then
$echo 'x -' SKIPPING 'megan.c' '(file already exists)'
else
$echo 'x -' extracting 'megan.c' '(text)'
sed 's/^X//' << 'SHAR_EOF' > 'megan.c' &&
/*
X * $Id$
X *
X * Copyright (c) 1999 Richard Offer. All rights reserved.
X *
X */
X
#include <stdio.h>
X
X
#include <Python.h>
X
#include <mail.h>
#include "megan.h"
X
static PyObject *MeganErrorObj;
X
staticforward PyTypeObject MeganMailBox;
staticforward PyTypeObject MeganMessage;
staticforward PyTypeObject MeganEnvelope;
X
#define is_mMB(v) ((v)->ob_type == &MeganMailBox)
X
static meganMessage * new_msg();
static meganEnvelope * new_env();
X
X
X
/*
X * # #
X * ## ## ###### ##### # # #### ##### ####
X * # # # # # # # # # # # # #
X * # # # ##### # ###### # # # # ####
X * # # # # # # # # # # #
X * # # # # # # # # # # # #
X * # # ###### # # # #### ##### ####
X *
X */
X
X
static PyObject *
mmb_open(meganMailBox *self, PyObject *args)
{
X
X char *mbox, *mode;
X int _mode = OP_READONLY ;
X
X if ( self->mail_stream ) {
X PyErr_SetString(MeganErrorObj,"MailBox object already opened.");
X return NULL;
X }
X
X if ( ! PyArg_ParseTuple(args,"ss", &mbox, &mode) )
X return NULL;
X
X if ( mode && ! strcmp(mode, "r"))
X _mode = OP_READONLY;
X
X self->mail_stream = mail_open(self->mail_stream, mbox, _mode | OP_DEBUG );
X
X if ( self->mail_stream == NULL ) {
X PyErr_SetString(MeganErrorObj,"Cannot open Mailbox.");
X return NULL;
X }
X
X return Py_None;
X
}
X
static PyObject *
mmb_close(meganMailBox *self, PyObject *args)
{
X if ( self->mail_stream == NULL ) {
X PyErr_SetString(MeganErrorObj,"MailBox object not open.");
X return NULL;
X }
X
X if ( ! PyArg_ParseTuple(args, "") ) {
X PyErr_SetString(MeganErrorObj,"Close() does not take any arguments.");
X return NULL;
X }
X
X mail_close(self->mail_stream);
X
X Py_INCREF(Py_None);
X
X return Py_None;
}
X
X
static PyObject *
mmb_count(meganMailBox *self, PyObject *args)
{
X
X if ( ! PyArg_ParseTuple(args, "") ) {
X PyErr_SetString(MeganErrorObj,"Count() does not take any arguments.");
X return NULL;
X }
X
X return Py_BuildValue("i", self->mail_stream->nmsgs);
}
X
X
static PyObject *
mmb_msg(meganMailBox *self, PyObject *args)
{
X
X int n;
X meganMessage *msg;
X
X if ( ! PyArg_ParseTuple(args,"i", &n) )
X return NULL;
X
X if ( self->mail_stream == NULL ) {
X PyErr_SetString(MeganErrorObj,"Mailbox not open.");
X return NULL;
X }
X
X msg = new_msg();
X
X msg->envelope = mail_fetch_structure(
X self->mail_stream, (unsigned long) n,
X &msg->body, 0);
X
X return (PyObject *) msg;
X
}
X
static PyObject *
msg_env(meganMessage *self, PyObject *args)
{
X
X int n;
X meganEnvelope *env;
X
X if ( ! PyArg_ParseTuple(args,"") )
X return NULL;
X
X if ( self->envelope == NULL ) {
X PyErr_SetString(MeganErrorObj,"no ENVELOPE");
X return NULL;
X }
X
X env = new_env(self->envelope);
X
X
X Py_INCREF(env);
X return (PyObject *) env;
X
}
X
static PyObject *
env_from(meganEnvelope *self, PyObject *args)
{
X
X int n;
X PyObject *from = PyTuple_New(5);
X
X if ( ! PyArg_ParseTuple(args,"") )
X return NULL;
X
X if ( self->envelope->from == NULL ) {
X PyErr_SetString(MeganErrorObj,"no FROM");
X return NULL;
X }
X
X if ( PyTuple_SetItem (from, 0,
X PyString_FromString(self->envelope->from->personal ?
X self->envelope->from->personal : "" )) ) {
X return NULL;
X }
X
X if ( PyTuple_SetItem (from, 1,
X PyString_FromString(self->envelope->from->adl ?
X self->envelope->from->adl : "" )) ) {
X return NULL;
X }
X
X if ( PyTuple_SetItem (from, 2,
X PyString_FromString(self->envelope->from->mailbox ?
X self->envelope->from->mailbox : "" )) ) {
X return NULL;
X }
X
X if ( PyTuple_SetItem (from, 3,
X PyString_FromString(self->envelope->from->host ?
X self->envelope->from->host : "" )) ) {
X return NULL;
X }
X
X if ( PyTuple_SetItem (from, 4,
X PyString_FromString(self->envelope->from->error ?
X self->envelope->from->error : "" )) ) {
X return NULL;
X }
X
X Py_INCREF(from);
X return (PyObject *) from;
X
}
X
static PyObject *
env_to(meganEnvelope *self, PyObject *args)
{
X
X int n;
X PyObject *t, *l;
X ADDRESS *addr = NULL;
X
X if ( ! PyArg_ParseTuple(args,"") )
X return NULL;
X
X if ( self->envelope->from == NULL ) {
X PyErr_SetString(MeganErrorObj,"no TO");
X return NULL;
X }
X
X l = PyList_New(0);
X
X addr = self->envelope->to;
X
X while ( addr ) {
X t = PyTuple_New(5);
X
X if ( PyTuple_SetItem(t, 0,
X PyString_FromString(addr->personal ? addr->personal : "")) ) {
X return NULL;
X }
X
X if ( PyTuple_SetItem(t, 1,
X PyString_FromString(addr->adl ? addr->adl : "")) ) {
X return NULL;
X }
X
X if ( PyTuple_SetItem(t, 2,
X PyString_FromString(addr->mailbox ? addr->mailbox : "")) ) {
X return NULL;
X }
X
X if ( PyTuple_SetItem(t, 3,
X PyString_FromString(addr->host ? addr->host : "" )) ) {
X return NULL;
X }
X
X if ( PyTuple_SetItem (t, 4,
X PyString_FromString(addr->error ? addr->error : "" )) ) {
X return NULL;
X }
X
X PyList_Append(l, t);
X
X addr = addr->next;
X
X }
X
X Py_INCREF(l);
X return (PyObject *) l;
X
}
X
static struct PyMethodDef mmb_methods[] = {
X { "open", mmb_open, 1 },
X { "close", mmb_close, 1 },
X { "count", mmb_count, 1 },
X { "message",mmb_msg, 1 },
X { NULL, NULL, NULL },
};
X
static struct PyMethodDef mmsg_methods[] = {
X { "envelope",msg_env, 1 },
#ifdef not_yet
X { "body",msg_env, 1 },
#endif
X { NULL, NULL, NULL },
};
X
static struct PyMethodDef env_methods[] = {
X { "frm", env_from, 1 },
X { "to", env_to, 1 },
X { NULL, NULL, NULL },
};
X
X
/*
X * #######
X * # # ##### # ###### #### #####
X * # # # # # # # # #
X * # # ##### # ##### # #
X * # # # # # # # #
X * # # # # # # # # # #
X * ####### ##### #### ###### #### #
X *
*/
X
static meganMailBox *
new_mmb()
{
X
X meganMailBox *mmb;
X
X mmb = PyObject_NEW(meganMailBox, &MeganMailBox);
X
X if ( mmb == NULL )
X return NULL;
X
X
X mmb->mail_stream = NULL;
X
X return mmb;
}
X
X
static void
delete_mmb(meganMailBox *self)
{
X
X PyMem_DEL(self);
}
X
static PyObject *
getattr_mmb(meganMailBox *self, char *name)
{
X
X if ( ! strcmp(name, "__methods__")) {
X
X return Py_BuildValue("[ssss]", "open", "close", "count", "message");
X }
X else
X return Py_FindMethod(mmb_methods, (PyObject *) self, name);
X
}
X
static int
print_mmb(meganMailBox *self, FILE *fp, int flags)
{
X
X if ( self->mail_stream == NULL )
X fprintf(fp,"MailBox not opened\n");
X
X else
X fprintf(fp,"MailBox '%s' has %d messages\n",
X self->mail_stream->mailbox,
X self->mail_stream->nmsgs);
X
X return 0;
}
X
X
X
X
X
static meganMessage *
new_msg()
{
X
X meganMessage *mmsg;
X
X mmsg = PyObject_NEW(meganMessage, &MeganMessage);
X
X if ( mmsg == NULL )
X return NULL;
X
X return mmsg;
}
X
static meganEnvelope *
new_env(ENVELOPE *envelope)
{
X
X meganEnvelope *env;
X
X env = PyObject_NEW(meganEnvelope, &MeganEnvelope);
X
X if ( env == NULL )
X return NULL;
X
X env->envelope = envelope;
X
X return env;
}
X
static void
delete_msg(meganMessage *self)
{
X
X PyMem_DEL(self);
}
X
static PyObject *
getattr_msg(meganMessage *self, char *name)
{
X
X if ( ! strcmp(name, "__methods__")) {
X
X return Py_BuildValue("[s]", "envelope");
X }
X else
X return Py_FindMethod(mmsg_methods, (PyObject *) self, name);
X
}
X
static void
delete_env(meganMessage *self)
{
X
X PyMem_DEL(self);
}
X
static PyObject *
getattr_env(meganMessage *self, char *name)
{
X
X if ( ! strcmp(name, "__methods__")) {
X
X return Py_BuildValue("[ss]", "frm", "to");
X }
X else
X return Py_FindMethod(env_methods, (PyObject *) self, name);
X
}
X
X
X
static PyTypeObject MeganMailBox = {
X PyObject_HEAD_INIT(&PyType_Type)
X 0,
X "MailBox",
X sizeof(meganMailBox),
X 0,
X
/* Standard Methods */
X (destructor) delete_mmb,
X (printfunc) NULL,
X (getattrfunc) getattr_mmb,
X (setattrfunc) NULL, /* TODO */
X (cmpfunc) NULL, /* TODO */
X (reprfunc) NULL, /* TODO */
X
/* type categories */
X NULL,
X NULL,
X NULL,
X
/* more methods */
X NULL,
X NULL,
X NULL,
X
};
X
X
static PyTypeObject MeganMessage = {
X PyObject_HEAD_INIT(&PyType_Type)
X 0,
X "Message",
X sizeof(meganMessage),
X 0,
X
/* Standard Methods */
X (destructor) delete_msg,
X (printfunc) NULL,
X (getattrfunc) getattr_msg,
X (setattrfunc) NULL, /* TODO */
X (cmpfunc) NULL, /* TODO */
X (reprfunc) NULL, /* TODO */
X
/* type categories */
X NULL,
X NULL,
X NULL,
X
/* more methods */
X NULL,
X NULL,
X NULL,
X
};
X
static PyTypeObject MeganEnvelope = {
X PyObject_HEAD_INIT(&PyType_Type)
X 0,
X "Envelope",
X sizeof(meganEnvelope),
X 0,
X
/* Standard Methods */
X (destructor) delete_env,
X (printfunc) NULL,
X (getattrfunc) getattr_env,
X (setattrfunc) NULL, /* TODO */
X (cmpfunc) NULL, /* TODO */
X (reprfunc) NULL, /* TODO */
X
/* type categories */
X NULL,
X NULL,
X NULL,
X
/* more methods */
X NULL,
X NULL,
X NULL,
X
};
X
X
X
/*
X * ######
X * # # # # ##### # # #### # #
X * # # # # # # # # # ## #
X * ###### # # ###### # # # # #
X * # # # # # # # # # #
X * # # # # # # # # ##
X * # # # # # #### # #
X *
X */
X
X
X
static PyObject *
mmbtype_new(PyObject *self, PyObject *args)
{
X
X if ( ! PyArg_ParseTuple(args, ""))
X return NULL;
X
X return (PyObject *) new_mmb();
}
X
X
X
static struct PyMethodDef mmbtype_methods[] = {
X
X { "MailBox", mmbtype_new, 1 },
X { NULL, NULL },
X
};
X
void
initMegan()
{
X
X PyObject *m, *d;
X
X m = Py_InitModule("Megan", mmbtype_methods);
X
X d = PyModule_GetDict(m);
X
X MeganErrorObj = Py_BuildValue("s", "megan.error");
X
X PyDict_SetItemString(d, "error", MeganErrorObj );
X
X if ( PyErr_Occurred() ) {
X Py_FatalError("can't init megan module.");
X }
X
X /* set up all the mail handlers */
X init_cclient_mail_handlers();
X
}
SHAR_EOF
(set 19 99 07 20 21 43 04 'megan.c'; eval "$shar_touch") &&
chmod 0644 'megan.c' ||
$echo 'restore of' 'megan.c' 'failed'
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|| $echo 'megan.c:' 'MD5 check failed'
12c8c09a88f03d537d6a0bb64ddcb4f0 megan.c
SHAR_EOF
else
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'megan.c'`"
test 9610 -eq "$shar_count" ||
$echo 'megan.c:' 'original size' '9610,' 'current size' "$shar_count!"
fi
fi
# ============= megan.h ==============
if test -f 'megan.h' && test "$first_param" != -c; then
$echo 'x -' SKIPPING 'megan.h' '(file already exists)'
else
$echo 'x -' extracting 'megan.h' '(text)'
sed 's/^X//' << 'SHAR_EOF' > 'megan.h' &&
X
X
typedef struct _meganMailBox {
X
X PyObject_HEAD
X
X MAILSTREAM *mail_stream;
X
} meganMailBox;
X
typedef struct _meganMessage {
X
X PyObject_HEAD
X
X ENVELOPE *envelope;
X BODY *body;
X
X /* will be a full python object eventually */
X int flags;
X
} meganMessage;
X
typedef struct _meganEnvelope {
X
X PyObject_HEAD
X
X ENVELOPE *envelope;
X
} meganEnvelope;
X
typedef struct _meganBody {
X
X PyObject_HEAD
X
} meganBody;
X
/* c-client-wrap functions */
X
void init_cclient_mail_handlers(void);
SHAR_EOF
(set 19 99 07 09 13 42 16 'megan.h'; eval "$shar_touch") &&
chmod 0644 'megan.h' ||
$echo 'restore of' 'megan.h' 'failed'
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|| $echo 'megan.h:' 'MD5 check failed'
10a834a4e037c64f572e9e15451dc112 megan.h
SHAR_EOF
else
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'megan.h'`"
test 487 -eq "$shar_count" ||
$echo 'megan.h:' 'original size' '487,' 'current size' "$shar_count!"
fi
fi
rm -fr _sh01664
exit 0
>Regards
> Henning
richard.
--
Richard Offer Widget FAQ --> http://reality.sgi.com/widgetFAQ
MTS-Core Design (Motif)
___________________________________________http://reality.sgi.com/offer
More information about the Python-list
mailing list