Replace redundant callback array with macros. If this doesn't break anything,

macros can be eliminated with code changes.
This commit is contained in:
Stuart Gathman
2012-04-12 23:32:50 +00:00
parent 0d001dd8e9
commit 70d19001c0
+43 -32
View File
@@ -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,41 +280,49 @@ $ 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 }
}; };
@@ -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;
} }