PageRenderTime 60ms CodeModel.GetById 56ms app.highlight 2ms RepoModel.GetById 1ms app.codeStats 0ms

/Mac/Modules/launch/launchsupport.py

http://unladen-swallow.googlecode.com/
Python | 101 lines | 88 code | 6 blank | 7 comment | 0 complexity | ee60568d25db756e864db7abaefe458c MD5 | raw file
  1# This script generates a Python interface for an Apple Macintosh Manager.
  2# It uses the "bgen" package to generate C code.
  3# The function specifications are generated by scanning the mamager's header file,
  4# using the "scantools" package (customized for this particular manager).
  5
  6import string
  7
  8# Declarations that change for each manager
  9MODNAME = '_Launch'                             # The name of the module
 10OBJECTNAME = 'UNUSED'                   # The basic name of the objects used here
 11KIND = 'Record'                         # Usually 'Ptr' or 'Handle'
 12
 13# The following is *usually* unchanged but may still require tuning
 14MODPREFIX = 'Launch'                    # The prefix for module-wide routines
 15OBJECTTYPE = OBJECTNAME + KIND          # The C type used to represent them
 16OBJECTPREFIX = MODPREFIX + 'Obj'        # The prefix for object methods
 17INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
 18OUTPUTFILE = MODNAME + "module.c"       # The file generated by this program
 19
 20from macsupport import *
 21
 22# Create the type objects
 23LSAcceptanceFlags = Type("LSAcceptanceFlags", "l")
 24LSInitializeFlags = Type("LSInitializeFlags", "l")
 25LSRequestedInfo = Type("LSRequestedInfo", "l")
 26LSRolesMask = Type("LSRolesMask", "l")
 27UniCharCount = Type("UniCharCount", "l")
 28OptCFStringRef = OpaqueByValueType("CFStringRef", "OptCFStringRefObj")
 29LSItemInfoRecord = OpaqueType("LSItemInfoRecord", "LSItemInfoRecord")
 30
 31includestuff = includestuff + """
 32#if PY_VERSION_HEX < 0x02040000
 33PyObject *PyMac_GetOSErrException(void);
 34#endif
 35
 36#include <ApplicationServices/ApplicationServices.h>
 37
 38/*
 39** Optional CFStringRef. None will pass NULL
 40*/
 41static int
 42OptCFStringRefObj_Convert(PyObject *v, CFStringRef *spec)
 43{
 44        if (v == Py_None) {
 45                *spec = NULL;
 46                return 1;
 47        }
 48        return CFStringRefObj_Convert(v, spec);
 49}
 50
 51PyObject *
 52OptCFStringRefObj_New(CFStringRef it)
 53{
 54        if (it == NULL) {
 55                Py_INCREF(Py_None);
 56                return Py_None;
 57        }
 58        return CFStringRefObj_New(it);
 59}
 60
 61/*
 62** Convert LSItemInfoRecord to Python.
 63*/
 64PyObject *
 65LSItemInfoRecord_New(LSItemInfoRecord *it)
 66{
 67        return Py_BuildValue("{s:is:O&s:O&s:O&s:O&s:i}",
 68                "flags", it->flags,
 69                "filetype", PyMac_BuildOSType, it->filetype,
 70                "creator", PyMac_BuildOSType, it->creator,
 71                "extension", OptCFStringRefObj_New, it->extension,
 72                "iconFileName", OptCFStringRefObj_New, it->iconFileName,
 73                "kindID", it->kindID);
 74}
 75"""
 76
 77# From here on it's basically all boiler plate...
 78execfile(string.lower(MODPREFIX) + 'typetest.py')
 79
 80# Create the generator groups and link them
 81module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
 82##object = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE)
 83##module.addobject(object)
 84
 85# Create the generator classes used to populate the lists
 86Function = OSErrFunctionGenerator
 87##Method = OSErrMethodGenerator
 88
 89# Create and populate the lists
 90functions = []
 91##methods = []
 92execfile(INPUTFILE)
 93
 94# add the populated lists to the generator groups
 95# (in a different wordl the scan program would generate this)
 96for f in functions: module.add(f)
 97##for f in methods: object.add(f)
 98
 99# generate output (open the output file as late as possible)
100SetOutputFileName(OUTPUTFILE)
101module.generate()