Replace redundant callback array with macros. If this doesn't break anything,
macros can be eliminated with code changes.
This commit is contained in:
+44
-33
@@ -35,6 +35,9 @@ $ python setup.py help
|
|||||||
libraries=["milter","smutil","resolv"]
|
libraries=["milter","smutil","resolv"]
|
||||||
|
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.30 2012/04/12 23:08:06 customdesigned
|
||||||
|
* Support RFC2553 on BSD
|
||||||
|
*
|
||||||
* Revision 1.29 2011/06/09 15:45:27 customdesigned
|
* Revision 1.29 2011/06/09 15:45:27 customdesigned
|
||||||
* Print callback name for non-int return error.
|
* Print callback name for non-int return error.
|
||||||
*
|
*
|
||||||
@@ -277,43 +280,51 @@ $ python setup.py help
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Yes, these are static. If you need multiple different callbacks, */
|
enum callbacks {
|
||||||
/* it's cleaner to use multiple filters, or convert to OO method calls. */
|
CONNECT,HELO,ENVFROM,ENVRCPT,HEADER,EOH,BODY,EOM,ABORT,CLOSE,
|
||||||
static PyObject *connect_callback = NULL;
|
|
||||||
static PyObject *helo_callback = NULL;
|
|
||||||
static PyObject *envfrom_callback = NULL;
|
|
||||||
static PyObject *envrcpt_callback = NULL;
|
|
||||||
static PyObject *header_callback = NULL;
|
|
||||||
static PyObject *eoh_callback = NULL;
|
|
||||||
static PyObject *body_callback = NULL;
|
|
||||||
static PyObject *eom_callback = NULL;
|
|
||||||
static PyObject *abort_callback = NULL;
|
|
||||||
static PyObject *close_callback = NULL;
|
|
||||||
#ifdef SMFIS_ALL_OPTS
|
#ifdef SMFIS_ALL_OPTS
|
||||||
static PyObject *unknown_callback = NULL;
|
UNKNOWN,DATA,NEGOTIATE,
|
||||||
static PyObject *data_callback = NULL;
|
|
||||||
static PyObject *negotiate_callback = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
NUMCALLBACKS
|
||||||
|
};
|
||||||
|
|
||||||
|
#define connect_callback callback[CONNECT].cb
|
||||||
|
#define helo_callback callback[HELO].cb
|
||||||
|
#define envfrom_callback callback[ENVFROM].cb
|
||||||
|
#define envrcpt_callback callback[ENVRCPT].cb
|
||||||
|
#define header_callback callback[HEADER].cb
|
||||||
|
#define eoh_callback callback[EOH].cb
|
||||||
|
#define body_callback callback[BODY].cb
|
||||||
|
#define eom_callback callback[EOM].cb
|
||||||
|
#define abort_callback callback[ABORT].cb
|
||||||
|
#define close_callback callback[CLOSE].cb
|
||||||
|
#define unknown_callback callback[UNKNOWN].cb
|
||||||
|
#define data_callback callback[DATA].cb
|
||||||
|
#define negotiate_callback callback[NEGOTIATE].cb
|
||||||
|
|
||||||
|
/* Yes, these are static. If you need multiple different callbacks,
|
||||||
|
it's cleaner to use multiple filters, or convert to OO method calls. */
|
||||||
|
|
||||||
static struct MilterCallback {
|
static struct MilterCallback {
|
||||||
PyObject **cbp;
|
PyObject *cb;
|
||||||
const char *name;
|
const char *name;
|
||||||
} callback_names[] = {
|
} callback[NUMCALLBACKS+1] = {
|
||||||
{ &connect_callback,"connect" },
|
{ NULL ,"connect" },
|
||||||
{ &helo_callback,"helo" },
|
{ NULL ,"helo" },
|
||||||
{ &envfrom_callback,"envfrom" },
|
{ NULL ,"envfrom" },
|
||||||
{ &envrcpt_callback,"envrcpt" },
|
{ NULL ,"envrcpt" },
|
||||||
{ &header_callback,"header" },
|
{ NULL ,"header" },
|
||||||
{ &eoh_callback,"eoh" },
|
{ NULL ,"eoh" },
|
||||||
{ &body_callback,"body" },
|
{ NULL ,"body" },
|
||||||
{ &eom_callback,"eom" },
|
{ NULL ,"eom" },
|
||||||
{ &abort_callback,"abort" },
|
{ NULL ,"abort" },
|
||||||
{ &close_callback,"close" },
|
{ NULL ,"close" },
|
||||||
#ifdef SMFIS_ALL_OPTS
|
#ifdef SMFIS_ALL_OPTS
|
||||||
{ &unknown_callback,"unknown" },
|
{ NULL ,"unknown" },
|
||||||
{ &data_callback,"data" },
|
{ NULL ,"data" },
|
||||||
{ &negotiate_callback,"negotiate" },
|
{ NULL ,"negotiate" },
|
||||||
#endif
|
#endif
|
||||||
{ NULL, NULL }
|
{ NULL , NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
staticforward struct smfiDesc description; /* forward declaration */
|
staticforward struct smfiDesc description; /* forward declaration */
|
||||||
@@ -670,8 +681,8 @@ _generic_wrapper(milter_ContextObject *self, PyObject *cb, PyObject *arglist) {
|
|||||||
const char *cbname = "milter";
|
const char *cbname = "milter";
|
||||||
char buf[40];
|
char buf[40];
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
for (p = callback_names; p->cbp; ++p) {
|
for (p = callback; p->name; ++p) {
|
||||||
if (cb == *p->cbp) {
|
if (cb == p->cb) {
|
||||||
cbname = p->name;
|
cbname = p->name;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user