diff --git a/Mac/Modules/ah/_AHmodule.c b/Mac/Modules/ah/_AHmodule.c new file mode 100644 index 00000000000..7543e54f3a5 --- /dev/null +++ b/Mac/Modules/ah/_AHmodule.c @@ -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 +#else +#include +#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 ========================= */ + diff --git a/Mac/Modules/ah/ahscan.py b/Mac/Modules/ah/ahscan.py new file mode 100644 index 00000000000..cced19f6272 --- /dev/null +++ b/Mac/Modules/ah/ahscan.py @@ -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() diff --git a/Mac/Modules/ah/ahsupport.py b/Mac/Modules/ah/ahsupport.py new file mode 100644 index 00000000000..b07c779dd47 --- /dev/null +++ b/Mac/Modules/ah/ahsupport.py @@ -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 +#else +#include +#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() +