summaryrefslogtreecommitdiffstats
path: root/Mac/Modules/file/filesupport.py
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Modules/file/filesupport.py')
-rw-r--r--Mac/Modules/file/filesupport.py156
1 files changed, 156 insertions, 0 deletions
diff --git a/Mac/Modules/file/filesupport.py b/Mac/Modules/file/filesupport.py
new file mode 100644
index 0000000..a009c3d
--- /dev/null
+++ b/Mac/Modules/file/filesupport.py
@@ -0,0 +1,156 @@
+# 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 = 'Files.h' # The Apple header file
+MODNAME = '_File' # The name of the module
+
+# The following is *usually* unchanged but may still require tuning
+MODPREFIX = 'File' # 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
+#ConstStrFileNameParam = ConstStr255Param
+#StrFileName = Str255
+#FolderClass = OSTypeType("FolderClass")
+# FolderDesc
+#FolderDescFlags = Type("FolderDescFlags", "l")
+#FolderLocation = OSTypeType("FolderLocation")
+# FolderRouting
+#FolderType = OSTypeType("FolderType")
+#RoutingFlags = Type("RoutingFlags", "l")
+
+class UniCharCountBuffer(InputOnlyType):
+ pass
+
+#CatPositionRec
+ConstStr63Param = OpaqueArrayType("Str63", "PyMac_BuildStr255", "PyMac_GetStr255")
+FInfo = OpaqueByValueStructType("FInfo", "PyMac_BuildFInfo", "PyMac_GetFInfo")
+FInfo_ptr = OpaqueType("FInfo", "PyMac_BuildFInfo", "PyMac_GetFInfo")
+FNMessage = Type("FNMessage", "l")
+FSAllocationFlags = Type("FSAllocationFlags", "H")
+#FSCatalogInfo
+FSCatalogInfoBitmap = Type("FSCatalogInfoBitmap", "l")
+#FSForkInfo
+#FSIterator
+FSIteratorFlags = Type("FSIteratorFlags", "l")
+#FSVolumeInfo
+FSVolumeRefNum = Type("FSVolumeRefNum", "h")
+HFSUniStr255 = OpaqueType("HFSUniStr255", "PyMac_BuildHFSUniStr255", "PyMac_GetHFSUniStr255")
+SInt64 = Type("SInt64", "L")
+UInt64 = Type("UInt64", "L")
+#UInt8_ptr
+#UniCharCount
+#char_ptr
+#void_ptr
+
+
+includestuff = includestuff + """
+#ifdef WITHOUT_FRAMEWORKS
+#include <Files.h>
+#else
+#include <Carbon/Carbon.h>
+#endif
+
+/*
+** Parse/generate objsect
+*/
+static PyObject *
+PyMac_BuildHFSUniStr255(HFSUniStr255 *itself)
+{
+
+ return Py_BuildValue("u#", itself->unicode, itself->length);
+}
+
+#if 0
+static int
+PyMac_GetHFSUniStr255(PyObject *v, HFSUniStr255 *itself)
+{
+ return PyArg_ParseTuple(v, "O&O&O&O&O&",
+ PyMac_GetFixed, &itself->ascent,
+ PyMac_GetFixed, &itself->descent,
+ PyMac_GetFixed, &itself->leading,
+ PyMac_GetFixed, &itself->widMax,
+ ResObj_Convert, &itself->wTabHandle);
+}
+#endif
+
+/*
+** Parse/generate objsect
+*/
+static PyObject *
+PyMac_BuildFInfo(FInfo *itself)
+{
+
+ return Py_BuildValue("O&O&HO&h",
+ PyMac_BuildOSType, itself->fdType,
+ PyMac_BuildOSType, itself->fdCreator,
+ itself->fdFlags,
+ PyMac_BuildPoint, &itself->fdLocation,
+ itself->fdFldr);
+}
+
+static int
+PyMac_GetFInfo(PyObject *v, FInfo *itself)
+{
+ return PyArg_ParseTuple(v, "O&O&HO&h",
+ PyMac_GetOSType, &itself->fdType,
+ PyMac_GetOSType, &itself->fdCreator,
+ &itself->fdFlags,
+ PyMac_GetPoint, &itself->fdLocation,
+ &itself->fdFldr);
+}
+
+"""
+
+execfile(string.lower(MODPREFIX) + 'typetest.py')
+
+# 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)
+
+# Manual generators:
+FSRefMakePath_body = """
+OSStatus _err;
+FSRef ref;
+#define MAXPATHNAME 1024
+UInt8 path[MAXPATHNAME];
+UInt32 maxPathSize = MAXPATHNAME;
+
+if (!PyArg_ParseTuple(_args, "O&",
+ PyMac_GetFSRef, &ref))
+ return NULL;
+_err = FSRefMakePath(&ref,
+ path,
+ maxPathSize);
+if (_err != noErr) return PyMac_Error(_err);
+_res = Py_BuildValue("s", path);
+return _res;
+"""
+f = ManualGenerator("FSRefMakePath", FSRefMakePath_body)
+f.docstring = lambda: "(FSRef) -> string"
+functions.append(f)
+
+# 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()
+