Added WeakLink...Generator classes (should have done that ages ago). These check the c-function pointer for being NULL before calling it and raise UnimplementedError if it is.

This allows system libs to be weak-linked, thereby allowing us to generate functions that are only available on some OS versions without getting a NULL dereference if the function isn't available.
diff --git a/Tools/bgen/bgen/bgenGenerator.py b/Tools/bgen/bgen/bgenGenerator.py
index 94905be..47fed8e 100644
--- a/Tools/bgen/bgen/bgenGenerator.py
+++ b/Tools/bgen/bgen/bgenGenerator.py
@@ -164,6 +164,7 @@
 	
 	def functionbody(self):
 		self.declarations()
+		self.precheck()
 		self.getargs()
 		self.callit()
 		self.checkit()
@@ -194,6 +195,9 @@
 				continue
 			if arg.mode in (InMode, InOutMode):
 				arg.getargsCheck()
+	
+	def precheck(self):
+		pass
 
 	def callit(self):
 		args = ""
diff --git a/Tools/bgen/bgen/macsupport.py b/Tools/bgen/bgen/macsupport.py
index 50b2eaa..d8677b0 100644
--- a/Tools/bgen/bgen/macsupport.py
+++ b/Tools/bgen/bgen/macsupport.py
@@ -118,6 +118,14 @@
 includestuff = """
 #include "macglue.h"
 #include "pymactoolbox.h"
+
+/* Macro to test whether a weak-loaded CFM function exists */
+#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\\
+    	PyErr_SetString(PyExc_NotImplementedError, \\
+    	"Not available in this shared library/OS version"); \\
+    	return NULL; \\
+    }} while(0)
+
 """
 
 # Stuff added just before the module's init function
@@ -145,6 +153,16 @@
 class OSErrFunctionGenerator(OSErrMixIn, FunctionGenerator): pass
 class OSErrMethodGenerator(OSErrMixIn, MethodGenerator): pass
 
+class WeakLinkMixIn:
+	"Mix-in to test the function actually exists (!= NULL) before calling"
+	
+	def precheck(self):
+		Output('PyMac_PRECHECK(%s);', self.name)
+
+class WeakLinkFunctionGenerator(WeakLinkMixIn, FunctionGenerator): pass
+class WeakLinkMethodGenerator(WeakLinkMixIn, MethodGenerator): pass
+class OSErrWeakLinkFunctionGenerator(OSErrMixIn, WeakLinkMixIn, FunctionGenerator): pass
+class OSErrWeakLinkMethodGenerator(OSErrMixIn, WeakLinkMixIn, MethodGenerator): pass
 
 class MacModule(Module):
 	"Subclass which gets the exception initializer from macglue.c"