PageRenderTime 52ms CodeModel.GetById 37ms app.highlight 11ms RepoModel.GetById 1ms app.codeStats 1ms

/Mac/Modules/cf/cfscan.py

http://unladen-swallow.googlecode.com/
Python | 141 lines | 105 code | 15 blank | 21 comment | 12 complexity | 8e557273918ab4cf8b2d726fd752dbbd MD5 | raw file
  1# Scan an Apple header file, generating a Python file of generator calls.
  2
  3import sys
  4from bgenlocations import TOOLBOXDIR, BGENDIR
  5sys.path.append(BGENDIR)
  6from scantools import Scanner_OSX
  7
  8LONG = "CoreFoundation"
  9SHORT = "cf"
 10OBJECTS = ("CFTypeRef",
 11                "CFArrayRef", "CFMutableArrayRef",
 12                "CFDataRef", "CFMutableDataRef",
 13                "CFDictionaryRef", "CFMutableDictionaryRef",
 14                "CFStringRef", "CFMutableStringRef",
 15                "CFURLRef",
 16##              "CFPropertyListRef",
 17                )
 18# ADD object typenames here
 19
 20def main():
 21    input = [
 22            "CFBase.h",
 23            "CFArray.h",
 24##              "CFBag.h",
 25##              "CFBundle.h",
 26##              "CFCharacterSet.h",
 27            "CFData.h",
 28##              "CFDate.h",
 29            "CFDictionary.h",
 30##              "CFNumber.h",
 31##              "CFPlugIn.h",
 32            "CFPreferences.h",
 33            "CFPropertyList.h",
 34##              "CFSet.h",
 35            "CFString.h",
 36##              "CFStringEncodingExt.h",
 37##              "CFTimeZone.h",
 38            "CFURL.h",
 39            ]
 40    output = SHORT + "gen.py"
 41    defsoutput = TOOLBOXDIR + LONG + ".py"
 42    scanner = MyScanner(input, output, defsoutput)
 43    scanner.scan()
 44    scanner.gentypetest(SHORT+"typetest.py")
 45    scanner.close()
 46    print "=== Testing definitions output code ==="
 47    execfile(defsoutput, {}, {})
 48    print "=== Done scanning and generating, now importing the generated code... ==="
 49    exec "import " + SHORT + "support"
 50    print "=== Done.  It's up to you to compile it now! ==="
 51
 52class MyScanner(Scanner_OSX):
 53
 54    def destination(self, type, name, arglist):
 55        classname = "Function"
 56        listname = "functions"
 57        if arglist and name[:13] != 'CFPreferences':
 58            t, n, m = arglist[0]
 59            if t in OBJECTS and m == "InMode":
 60                classname = "Method"
 61                listname = t + "_methods"
 62            # Special case for the silly first AllocatorRef argument
 63            if t == 'CFAllocatorRef' and m == 'InMode' and len(arglist) > 1:
 64                t, n, m = arglist[1]
 65                if t in OBJECTS and m == "InMode":
 66                    classname = "MethodSkipArg1"
 67                    listname = t + "_methods"
 68        return classname, listname
 69
 70    def writeinitialdefs(self):
 71        self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
 72
 73    def makeblacklistnames(self):
 74        return [
 75                # Memory allocator functions
 76                "CFAllocatorGetDefault",
 77                "CFAllocatorSetDefault",
 78                "CFAllocatorAllocate",
 79                "CFAllocatorReallocate",
 80                "CFAllocatorDeallocate",
 81                "CFGetAllocator",
 82                # Array functions we skip for now.
 83                "CFArrayGetValueAtIndex",
 84                # Data pointer functions. Skip for now.
 85                "CFDataGetBytePtr",
 86                "CFDataGetMutableBytePtr",
 87                "CFDataGetBytes",   # XXXX Should support this one
 88                # String functions
 89                "CFStringGetPascalString", # Use the C-string methods.
 90                "CFStringGetPascalStringPtr", # TBD automatically
 91                "CFStringGetCStringPtr",
 92                "CFStringGetCharactersPtr",
 93                "CFStringGetCString",
 94                "CFStringGetCharacters",
 95                "CFURLCreateStringWithFileSystemPath", # Gone in later releases
 96                "CFStringCreateMutableWithExternalCharactersNoCopy", # Not a clue...
 97                "CFStringSetExternalCharactersNoCopy",
 98                "CFStringGetCharacterAtIndex", # No format for single unichars yet.
 99                "kCFStringEncodingInvalidId", # incompatible constant declaration
100                "CFPropertyListCreateFromXMLData", # Manually generated
101                ]
102
103    def makegreylist(self):
104        return []
105
106    def makeblacklisttypes(self):
107        return [
108                "CFComparatorFunction", # Callback function pointer
109                "CFAllocatorContext", # Not interested in providing our own allocator
110                "void_ptr_ptr",  # Tricky. This is the initializer for arrays...
111                "void_ptr", # Ditto for various array lookup methods
112                "CFArrayApplierFunction", # Callback function pointer
113                "CFDictionaryApplierFunction", # Callback function pointer
114                "va_list", # For printf-to-a-cfstring. Use Python.
115                "const_CFStringEncoding_ptr", # To be done, I guess
116                ]
117
118    def makerepairinstructions(self):
119        return [
120                # Buffers in CF seem to be passed as UInt8 * normally.
121                ([("UInt8_ptr", "*", "InMode"), ("CFIndex", "*", "InMode")],
122                 [("UcharInBuffer", "*", "*")]),
123
124                ([("UniChar_ptr", "*", "InMode"), ("CFIndex", "*", "InMode")],
125                 [("UnicodeInBuffer", "*", "*")]),
126
127                # Some functions return a const char *. Don't worry, we won't modify it.
128                ([("const_char_ptr", "*", "ReturnMode")],
129                 [("return_stringptr", "*", "*")]),
130
131                # base URLs are optional (pass None for NULL)
132                ([("CFURLRef", "baseURL", "InMode")],
133                 [("OptionalCFURLRef", "*", "*")]),
134
135                # We handle CFPropertyListRef objects as plain CFTypeRef
136                ([("CFPropertyListRef", "*", "*")],
137                 [("CFTypeRef", "*", "*")]),
138                ]
139
140if __name__ == "__main__":
141    main()