| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | # This script generates a Python interface for an Apple Macintosh Manager. | 
					
						
							|  |  |  | # It uses the "bgen" package to generate C code. | 
					
						
							|  |  |  | # The function specifications are generated by scanning the mamager's header file, | 
					
						
							|  |  |  | # using the "scantools" package (customized for this particular manager). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Declarations that change for each manager | 
					
						
							|  |  |  | MACHEADERFILE = 'Lists.h'		# The Apple header file | 
					
						
							|  |  |  | MODNAME = 'List'				# The name of the module | 
					
						
							|  |  |  | OBJECTNAME = 'List'			# The basic name of the objects used here | 
					
						
							|  |  |  | KIND = 'Handle'				# Usually 'Ptr' or 'Handle' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # The following is *usually* unchanged but may still require tuning | 
					
						
							|  |  |  | MODPREFIX = MODNAME			# The prefix for module-wide routines | 
					
						
							| 
									
										
										
										
											1998-02-20 16:02:09 +00:00
										 |  |  | OBJECTTYPE = "ListHandle"		# The C type used to represent them | 
					
						
							| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | OBJECTPREFIX = MODPREFIX + 'Obj'	# The prefix for object methods | 
					
						
							|  |  |  | INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner | 
					
						
							|  |  |  | OUTPUTFILE = MODNAME + "module.c"	# The file generated by this program | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from macsupport import * | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Create the type objects | 
					
						
							| 
									
										
										
										
											1998-02-20 16:02:09 +00:00
										 |  |  | ListHandle = OpaqueByValueType("ListHandle", "ListObj") | 
					
						
							| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | Cell = Point | 
					
						
							|  |  |  | VarOutBufferShortsize = VarHeapOutputBufferType('char', 'short', 's')	# (buf, &len) | 
					
						
							|  |  |  | InBufferShortsize = VarInputBufferType('char', 'short', 's')		# (buf, len) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-04-10 14:48:19 +00:00
										 |  |  | RgnHandle = OpaqueByValueType("RgnHandle", "ResObj") | 
					
						
							| 
									
										
										
										
											1999-12-23 14:32:06 +00:00
										 |  |  | Handle = OpaqueByValueType("Handle", "ResObj") | 
					
						
							| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | includestuff = includestuff + """
 | 
					
						
							|  |  |  | #include <%s>""" % MACHEADERFILE + """ | 
					
						
							| 
									
										
										
										
											1999-12-23 14:32:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define as_List(x) ((ListHandle)x) | 
					
						
							|  |  |  | #define as_Resource(lh) ((Handle)lh) | 
					
						
							| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ListMethodGenerator(MethodGenerator): | 
					
						
							|  |  |  | 	"""Similar to MethodGenerator, but has self as last argument""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def parseArgumentList(self, args): | 
					
						
							|  |  |  | 		args, a0 = args[:-1], args[-1] | 
					
						
							|  |  |  | 		t0, n0, m0 = a0 | 
					
						
							|  |  |  | 		if m0 != InMode: | 
					
						
							|  |  |  | 			raise ValueError, "method's 'self' must be 'InMode'" | 
					
						
							|  |  |  | 		self.itself = Variable(t0, "_self->ob_itself", SelfMode) | 
					
						
							|  |  |  | 		FunctionGenerator.parseArgumentList(self, args) | 
					
						
							|  |  |  | 		self.argumentList.append(self.itself) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-26 16:03:16 +00:00
										 |  |  | getattrHookCode = """{
 | 
					
						
							|  |  |  | 	/* XXXX Should we HLock() here?? */ | 
					
						
							|  |  |  | 	if ( strcmp(name, "listFlags") == 0 ) | 
					
						
							|  |  |  | 		return Py_BuildValue("l", (long)(*self->ob_itself)->listFlags & 0xff); | 
					
						
							|  |  |  | 	if ( strcmp(name, "selFlags") == 0 ) | 
					
						
							|  |  |  | 		return Py_BuildValue("l", (long)(*self->ob_itself)->selFlags & 0xff); | 
					
						
							|  |  |  | }"""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | setattrCode = """
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | ListObj_setattr(self, name, value) | 
					
						
							|  |  |  | 	ListObject *self; | 
					
						
							|  |  |  | 	char *name; | 
					
						
							|  |  |  | 	PyObject *value; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	long intval; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	if ( value == NULL || !PyInt_Check(value) ) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	intval = PyInt_AsLong(value); | 
					
						
							|  |  |  | 	if (strcmp(name, "listFlags") == 0 ) { | 
					
						
							|  |  |  | 		/* XXXX Should we HLock the handle here?? */ | 
					
						
							|  |  |  | 		(*self->ob_itself)->listFlags = intval; | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (strcmp(name, "selFlags") == 0 ) { | 
					
						
							|  |  |  | 		(*self->ob_itself)->selFlags = intval; | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MyObjectDefinition(GlobalObjectDefinition): | 
					
						
							| 
									
										
										
										
											2000-01-13 16:23:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	def outputStructMembers(self): | 
					
						
							|  |  |  | 		ObjectDefinition.outputStructMembers(self) | 
					
						
							|  |  |  | 		Output("int ob_must_be_disposed;") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | 	def outputCheckNewArg(self): | 
					
						
							|  |  |  | 		Output("""if (itself == NULL) {
 | 
					
						
							|  |  |  | 					PyErr_SetString(List_Error,"Cannot create null List"); | 
					
						
							|  |  |  | 					return NULL; | 
					
						
							|  |  |  | 				}""")
 | 
					
						
							| 
									
										
										
										
											2000-01-13 16:23:39 +00:00
										 |  |  | 				 | 
					
						
							|  |  |  | 	def outputInitStructMembers(self): | 
					
						
							|  |  |  | 		ObjectDefinition.outputInitStructMembers(self) | 
					
						
							|  |  |  | 		Output("it->ob_must_be_disposed = 1;") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | 	def outputFreeIt(self, itselfname): | 
					
						
							| 
									
										
										
										
											2000-01-13 16:23:39 +00:00
										 |  |  | 		Output("if (self->ob_must_be_disposed && %s) LDispose(%s);", itselfname, itselfname) | 
					
						
							| 
									
										
										
										
											1996-07-26 16:03:16 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 	def outputGetattrHook(self): | 
					
						
							|  |  |  | 		Output(getattrHookCode) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def outputSetattr(self): | 
					
						
							|  |  |  | 		Output(setattrCode) | 
					
						
							| 
									
										
										
										
											1999-12-23 14:32:06 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | # From here on it's basically all boiler plate... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Create the generator groups and link them | 
					
						
							|  |  |  | module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) | 
					
						
							|  |  |  | object = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE) | 
					
						
							|  |  |  | module.addobject(object) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Create the generator classes used to populate the lists | 
					
						
							|  |  |  | Function = FunctionGenerator | 
					
						
							|  |  |  | Method = ListMethodGenerator | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Create and populate the lists | 
					
						
							|  |  |  | functions = [] | 
					
						
							|  |  |  | methods = [] | 
					
						
							|  |  |  | execfile(INPUTFILE) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-12-23 14:32:06 +00:00
										 |  |  | # Function to convert any handle to a list and vv. | 
					
						
							| 
									
										
										
										
											2000-01-13 16:23:39 +00:00
										 |  |  | ##f = Function(ListHandle, 'as_List', (Handle, 'h', InMode)) | 
					
						
							|  |  |  | as_List_body = """
 | 
					
						
							|  |  |  | Handle h; | 
					
						
							|  |  |  | ListObject *l; | 
					
						
							|  |  |  | if (!PyArg_ParseTuple(_args, "O&", ResObj_Convert, &h)) | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | l = (ListObject *)ListObj_New(as_List(h)); | 
					
						
							|  |  |  | l->ob_must_be_disposed = 0; | 
					
						
							|  |  |  | return Py_BuildValue("O", l); | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | f = ManualGenerator("as_List", as_List_body) | 
					
						
							|  |  |  | f.docstring = lambda: "(Resource)->List.\nReturns List object (which is not auto-freed!)" | 
					
						
							| 
									
										
										
										
											1999-12-23 14:32:06 +00:00
										 |  |  | functions.append(f) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | f = Method(Handle, 'as_Resource', (ListHandle, 'lh', InMode)) | 
					
						
							|  |  |  | methods.append(f) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-14 11:46:24 +00:00
										 |  |  | # add the populated lists to the generator groups | 
					
						
							|  |  |  | # (in a different wordl the scan program would generate this) | 
					
						
							|  |  |  | for f in functions: module.add(f) | 
					
						
							|  |  |  | for f in methods: object.add(f) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # generate output (open the output file as late as possible) | 
					
						
							|  |  |  | SetOutputFileName(OUTPUTFILE) | 
					
						
							|  |  |  | module.generate() | 
					
						
							|  |  |  | 
 |