ยปCore Development>Code coverage>Mac/Modules/cf/cfscan.py

Python code coverage for Mac/Modules/cf/cfscan.py

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