Home | History | Annotate | Download | only in cf
      1 # Scan an Apple header file, generating a Python file of generator calls.
      2 
      3 import sys
      4 from bgenlocations import TOOLBOXDIR, BGENDIR
      5 sys.path.append(BGENDIR)
      6 from scantools import Scanner_OSX
      7 
      8 LONG = "CoreFoundation"
      9 SHORT = "cf"
     10 OBJECTS = ("CFTypeRef",
     11                 "CFArrayRef", "CFMutableArrayRef",
     12                 "CFDataRef", "CFMutableDataRef",
     13                 "CFDictionaryRef", "CFMutableDictionaryRef",
     14                 "CFStringRef", "CFMutableStringRef",
     15                 "CFURLRef",
     16 ##              "CFPropertyListRef",
     17                 )
     18 # ADD object typenames here
     19 
     20 def 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 
     52 class 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 
    140 if __name__ == "__main__":
    141     main()
    142