mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	Interface to Apple Help Manager.
This commit is contained in:
		
							parent
							
								
									f34a8bced2
								
							
						
					
					
						commit
						d59f8d0691
					
				
					 3 changed files with 255 additions and 0 deletions
				
			
		
							
								
								
									
										153
									
								
								Mac/Modules/ah/_AHmodule.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								Mac/Modules/ah/_AHmodule.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,153 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* =========================== Module _AH =========================== */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Python.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					#include "pywintoolbox.h"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include "macglue.h"
 | 
				
			||||||
 | 
					#include "pymactoolbox.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef WITHOUT_FRAMEWORKS
 | 
				
			||||||
 | 
					#include <AppleHelp.h>
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <Carbon/Carbon.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static PyObject *Ah_Error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static PyObject *Ah_AHSearch(PyObject *_self, PyObject *_args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						PyObject *_res = NULL;
 | 
				
			||||||
 | 
						OSStatus _err;
 | 
				
			||||||
 | 
						CFStringRef bookname;
 | 
				
			||||||
 | 
						CFStringRef query;
 | 
				
			||||||
 | 
						if (!PyArg_ParseTuple(_args, "O&O&",
 | 
				
			||||||
 | 
						                      CFStringRefObj_Convert, &bookname,
 | 
				
			||||||
 | 
						                      CFStringRefObj_Convert, &query))
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						_err = AHSearch(bookname,
 | 
				
			||||||
 | 
						                query);
 | 
				
			||||||
 | 
						if (_err != noErr) return PyMac_Error(_err);
 | 
				
			||||||
 | 
						Py_INCREF(Py_None);
 | 
				
			||||||
 | 
						_res = Py_None;
 | 
				
			||||||
 | 
						return _res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static PyObject *Ah_AHGotoMainTOC(PyObject *_self, PyObject *_args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						PyObject *_res = NULL;
 | 
				
			||||||
 | 
						OSStatus _err;
 | 
				
			||||||
 | 
						AHTOCType toctype;
 | 
				
			||||||
 | 
						if (!PyArg_ParseTuple(_args, "s",
 | 
				
			||||||
 | 
						                      &toctype))
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						_err = AHGotoMainTOC(toctype);
 | 
				
			||||||
 | 
						if (_err != noErr) return PyMac_Error(_err);
 | 
				
			||||||
 | 
						Py_INCREF(Py_None);
 | 
				
			||||||
 | 
						_res = Py_None;
 | 
				
			||||||
 | 
						return _res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static PyObject *Ah_AHGotoPage(PyObject *_self, PyObject *_args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						PyObject *_res = NULL;
 | 
				
			||||||
 | 
						OSStatus _err;
 | 
				
			||||||
 | 
						CFStringRef bookname;
 | 
				
			||||||
 | 
						CFStringRef path;
 | 
				
			||||||
 | 
						CFStringRef anchor;
 | 
				
			||||||
 | 
						if (!PyArg_ParseTuple(_args, "O&O&O&",
 | 
				
			||||||
 | 
						                      CFStringRefObj_Convert, &bookname,
 | 
				
			||||||
 | 
						                      CFStringRefObj_Convert, &path,
 | 
				
			||||||
 | 
						                      CFStringRefObj_Convert, &anchor))
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						_err = AHGotoPage(bookname,
 | 
				
			||||||
 | 
						                  path,
 | 
				
			||||||
 | 
						                  anchor);
 | 
				
			||||||
 | 
						if (_err != noErr) return PyMac_Error(_err);
 | 
				
			||||||
 | 
						Py_INCREF(Py_None);
 | 
				
			||||||
 | 
						_res = Py_None;
 | 
				
			||||||
 | 
						return _res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static PyObject *Ah_AHLookupAnchor(PyObject *_self, PyObject *_args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						PyObject *_res = NULL;
 | 
				
			||||||
 | 
						OSStatus _err;
 | 
				
			||||||
 | 
						CFStringRef bookname;
 | 
				
			||||||
 | 
						CFStringRef anchor;
 | 
				
			||||||
 | 
						if (!PyArg_ParseTuple(_args, "O&O&",
 | 
				
			||||||
 | 
						                      CFStringRefObj_Convert, &bookname,
 | 
				
			||||||
 | 
						                      CFStringRefObj_Convert, &anchor))
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						_err = AHLookupAnchor(bookname,
 | 
				
			||||||
 | 
						                      anchor);
 | 
				
			||||||
 | 
						if (_err != noErr) return PyMac_Error(_err);
 | 
				
			||||||
 | 
						Py_INCREF(Py_None);
 | 
				
			||||||
 | 
						_res = Py_None;
 | 
				
			||||||
 | 
						return _res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static PyObject *Ah_AHRegisterHelpBook(PyObject *_self, PyObject *_args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						PyObject *_res = NULL;
 | 
				
			||||||
 | 
						OSStatus _err;
 | 
				
			||||||
 | 
						FSRef appBundleRef;
 | 
				
			||||||
 | 
						if (!PyArg_ParseTuple(_args, "O&",
 | 
				
			||||||
 | 
						                      PyMac_GetFSRef, &appBundleRef))
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						_err = AHRegisterHelpBook(&appBundleRef);
 | 
				
			||||||
 | 
						if (_err != noErr) return PyMac_Error(_err);
 | 
				
			||||||
 | 
						Py_INCREF(Py_None);
 | 
				
			||||||
 | 
						_res = Py_None;
 | 
				
			||||||
 | 
						return _res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static PyMethodDef Ah_methods[] = {
 | 
				
			||||||
 | 
						{"AHSearch", (PyCFunction)Ah_AHSearch, 1,
 | 
				
			||||||
 | 
						 PyDoc_STR("(CFStringRef bookname, CFStringRef query) -> None")},
 | 
				
			||||||
 | 
						{"AHGotoMainTOC", (PyCFunction)Ah_AHGotoMainTOC, 1,
 | 
				
			||||||
 | 
						 PyDoc_STR("(AHTOCType toctype) -> None")},
 | 
				
			||||||
 | 
						{"AHGotoPage", (PyCFunction)Ah_AHGotoPage, 1,
 | 
				
			||||||
 | 
						 PyDoc_STR("(CFStringRef bookname, CFStringRef path, CFStringRef anchor) -> None")},
 | 
				
			||||||
 | 
						{"AHLookupAnchor", (PyCFunction)Ah_AHLookupAnchor, 1,
 | 
				
			||||||
 | 
						 PyDoc_STR("(CFStringRef bookname, CFStringRef anchor) -> None")},
 | 
				
			||||||
 | 
						{"AHRegisterHelpBook", (PyCFunction)Ah_AHRegisterHelpBook, 1,
 | 
				
			||||||
 | 
						 PyDoc_STR("(FSRef appBundleRef) -> None")},
 | 
				
			||||||
 | 
						{NULL, NULL, 0}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void init_AH(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						PyObject *m;
 | 
				
			||||||
 | 
						PyObject *d;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m = Py_InitModule("_AH", Ah_methods);
 | 
				
			||||||
 | 
						d = PyModule_GetDict(m);
 | 
				
			||||||
 | 
						Ah_Error = PyMac_GetOSErrException();
 | 
				
			||||||
 | 
						if (Ah_Error == NULL ||
 | 
				
			||||||
 | 
						    PyDict_SetItemString(d, "Error", Ah_Error) != 0)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ========================= End module _AH ========================= */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										52
									
								
								Mac/Modules/ah/ahscan.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								Mac/Modules/ah/ahscan.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,52 @@
 | 
				
			||||||
 | 
					# Scan an Apple header file, generating a Python file of generator calls.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					from bgenlocations import TOOLBOXDIR, BGENDIR
 | 
				
			||||||
 | 
					sys.path.append(BGENDIR)
 | 
				
			||||||
 | 
					from scantools import Scanner_OSX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LONG = "AppleHelp"
 | 
				
			||||||
 | 
					SHORT = "ah"
 | 
				
			||||||
 | 
					OBJECT = "NOTUSED"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def main():
 | 
				
			||||||
 | 
						input = LONG + ".h"
 | 
				
			||||||
 | 
						output = SHORT + "gen.py"
 | 
				
			||||||
 | 
						defsoutput = TOOLBOXDIR + LONG + ".py"
 | 
				
			||||||
 | 
						scanner = MyScanner(input, output, defsoutput)
 | 
				
			||||||
 | 
						scanner.scan()
 | 
				
			||||||
 | 
						scanner.close()
 | 
				
			||||||
 | 
						print "=== Testing definitions output code ==="
 | 
				
			||||||
 | 
						execfile(defsoutput, {}, {})
 | 
				
			||||||
 | 
						print "=== Done scanning and generating, now importing the generated code... ==="
 | 
				
			||||||
 | 
						exec "import " + SHORT + "support"
 | 
				
			||||||
 | 
						print "=== Done.  It's up to you to compile it now! ==="
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MyScanner(Scanner_OSX):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def destination(self, type, name, arglist):
 | 
				
			||||||
 | 
							classname = "Function"
 | 
				
			||||||
 | 
							listname = "functions"
 | 
				
			||||||
 | 
							if arglist:
 | 
				
			||||||
 | 
								t, n, m = arglist[0]
 | 
				
			||||||
 | 
								# This is non-functional today
 | 
				
			||||||
 | 
								if t == OBJECT and m == "InMode":
 | 
				
			||||||
 | 
									classname = "Method"
 | 
				
			||||||
 | 
									listname = "methods"
 | 
				
			||||||
 | 
							return classname, listname
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def makeblacklistnames(self):
 | 
				
			||||||
 | 
							return [
 | 
				
			||||||
 | 
								]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def makeblacklisttypes(self):
 | 
				
			||||||
 | 
							return [
 | 
				
			||||||
 | 
								]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def makerepairinstructions(self):
 | 
				
			||||||
 | 
							return [
 | 
				
			||||||
 | 
								]
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
						main()
 | 
				
			||||||
							
								
								
									
										50
									
								
								Mac/Modules/ah/ahsupport.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								Mac/Modules/ah/ahsupport.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					# 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 = 'AppleHelp.h'		# The Apple header file
 | 
				
			||||||
 | 
					MODNAME = '_AH'				# The name of the module
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The following is *usually* unchanged but may still require tuning
 | 
				
			||||||
 | 
					MODPREFIX = 'Ah'			# The prefix for module-wide routines
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					AHTOCType = Type("AHTOCType", "s")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includestuff = includestuff + """
 | 
				
			||||||
 | 
					#ifdef WITHOUT_FRAMEWORKS
 | 
				
			||||||
 | 
					#include <AppleHelp.h>
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <Carbon/Carbon.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# From here on it's basically all boiler plate...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create the generator groups and link them
 | 
				
			||||||
 | 
					module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create the generator classes used to populate the lists
 | 
				
			||||||
 | 
					Function = OSErrFunctionGenerator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create and populate the lists
 | 
				
			||||||
 | 
					functions = []
 | 
				
			||||||
 | 
					execfile(INPUTFILE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# generate output (open the output file as late as possible)
 | 
				
			||||||
 | 
					SetOutputFileName(OUTPUTFILE)
 | 
				
			||||||
 | 
					module.generate()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue