From 70d19001c0e1929e74c6c63b9b1caee9a9693a76 Mon Sep 17 00:00:00 2001
From: Stuart Gathman <stuart@gathman.org>
Date: Thu, 12 Apr 2012 23:32:50 +0000
Subject: [PATCH] Replace redundant callback array with macros.  If this
 doesn't break anything, macros can be eliminated with code changes.

---
 miltermodule.c | 77 ++++++++++++++++++++++++++++----------------------
 1 file changed, 44 insertions(+), 33 deletions(-)

diff --git a/miltermodule.c b/miltermodule.c
index 6459735..fd140c6 100644
--- a/miltermodule.c
+++ b/miltermodule.c
@@ -35,6 +35,9 @@ $ python setup.py help
      libraries=["milter","smutil","resolv"]
 
  * $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
  * Print callback name for non-int return error.
  *
@@ -277,43 +280,51 @@ $ python setup.py help
 #endif
 #endif
 
-/* Yes, these are static.  If you need multiple different callbacks, */
-/* it's cleaner to use multiple filters, or convert to OO method calls. */
-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;
+enum callbacks {
+	CONNECT,HELO,ENVFROM,ENVRCPT,HEADER,EOH,BODY,EOM,ABORT,CLOSE,
 #ifdef SMFIS_ALL_OPTS
-static PyObject *unknown_callback = NULL;
-static PyObject *data_callback    = NULL;
-static PyObject *negotiate_callback = NULL;
+	UNKNOWN,DATA,NEGOTIATE,
 #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 {
-  PyObject **cbp;
+  PyObject *cb;
   const char *name;
-} callback_names[] = {
-      { &connect_callback,"connect" },
-      { &helo_callback,"helo" },
-      { &envfrom_callback,"envfrom" },
-      { &envrcpt_callback,"envrcpt" },
-      { &header_callback,"header" },
-      { &eoh_callback,"eoh" },
-      { &body_callback,"body" },
-      { &eom_callback,"eom" },
-      { &abort_callback,"abort" },
-      { &close_callback,"close" },
+} callback[NUMCALLBACKS+1] = {
+      { NULL ,"connect" },
+      { NULL ,"helo" },
+      { NULL ,"envfrom" },
+      { NULL ,"envrcpt" },
+      { NULL ,"header" },
+      { NULL ,"eoh" },
+      { NULL ,"body" },
+      { NULL ,"eom" },
+      { NULL ,"abort" },
+      { NULL ,"close" },
 #ifdef SMFIS_ALL_OPTS
-      { &unknown_callback,"unknown" },
-      { &data_callback,"data" },
-      { &negotiate_callback,"negotiate" },
+      { NULL ,"unknown" },
+      { NULL ,"data" },
+      { NULL ,"negotiate" },
 #endif
-      { NULL, NULL }
+      { NULL , NULL }
     };
 
 staticforward struct smfiDesc description; /* forward declaration */
@@ -670,8 +681,8 @@ _generic_wrapper(milter_ContextObject *self, PyObject *cb, PyObject *arglist) {
     const char *cbname = "milter";
     char buf[40];
     Py_DECREF(result);
-    for (p = callback_names; p->cbp; ++p) {
-      if (cb == *p->cbp) {
+    for (p = callback; p->name; ++p) {
+      if (cb == p->cb) {
         cbname = p->name;
 	break;
       }
-- 
GitLab