# Scan an Apple header file, generating a Python file of generator calls.

import sys
from bgenlocations import TOOLBOXDIR, BGENDIR
sys.path.append(BGENDIR)

from scantools import Scanner

def main():
    input = "QuickDraw.h"
    output = "qdgen.py"
    defsoutput = TOOLBOXDIR + "QuickDraw.py"
    scanner = MyScanner(input, output, defsoutput)
    scanner.scan()
    scanner.close()

    # Grmpf. Universal Headers have Text-stuff in a different include file...
    input = "QuickDrawText.h"
    output = "@qdgentext.py"
    defsoutput = "@QuickDrawText.py"
    have_extra = 0
    try:
        scanner = MyScanner(input, output, defsoutput)
        scanner.scan()
        scanner.close()
        have_extra = 1
    except IOError:
        pass
    if have_extra:
        print "=== Copying QuickDrawText stuff into main files... ==="
        ifp = open("@qdgentext.py")
        ofp = open("qdgen.py", "a")
        ofp.write(ifp.read())
        ifp.close()
        ofp.close()
        ifp = open("@QuickDrawText.py")
        ofp = open(TOOLBOXDIR + "QuickDraw.py", "a")
        ofp.write(ifp.read())
        ifp.close()
        ofp.close()

    print "=== Testing definitions output code ==="
    execfile(defsoutput, {}, {})
    print "=== Done scanning and generating, now importing the generated code... ==="
    import qdsupport
    print "=== Done.  It's up to you to compile it now! ==="

class MyScanner(Scanner):

    def destination(self, type, name, arglist):
        classname = "Function"
        listname = "functions"
        if arglist:
            t, n, m = arglist[0]
            if t in ('GrafPtr', 'CGrafPtr') and m == 'InMode':
                classname = "Method"
                listname = "gr_methods"
            elif t == 'BitMapPtr' and m == 'InMode':
                classname = "Method"
                listname = "bm_methods"
##                      elif t == "PolyHandle" and m == "InMode":
##                              classname = "Method"
##                              listname = "p_methods"
##                      elif t == "RgnHandle" and m == "InMode":
##                              classname = "Method"
##                              listname = "r_methods"
        return classname, listname


    def writeinitialdefs(self):
        self.defsfile.write("""
def FOUR_CHAR_CODE(x): return x
normal                                          = 0
bold                                            = 1
italic                                          = 2
underline                                       = 4
outline                                         = 8
shadow                                          = 0x10
condense                                        = 0x20
extend                                          = 0x40
""")

    def makeblacklistnames(self):
        return [
                'InitGraf',
                'StuffHex',
                'StdLine',
                'StdComment',
                'StdGetPic',
                'OpenPort',
                'InitPort',
                'ClosePort',
                'OpenCPort',
                'InitCPort',
                'CloseCPort',
                'BitMapToRegionGlue',
                'StdOpcode',    # XXXX Missing from library...
                # The following are for non-macos use:
                'LockPortBits',
                'UnlockPortBits',
                'UpdatePort',
                'GetPortNativeWindow',
                'GetNativeWindowPort',
                'NativeRegionToMacRegion',
                'MacRegionToNativeRegion',
                'GetPortHWND',
                'GetHWNDPort',
                'GetPICTFromDIB',

                'HandleToRgn', # Funny signature

                # Need Cm, which we don't want to drag in just yet
                'OpenCursorComponent',
                'CloseCursorComponent',
                'SetCursorComponent',
                'CursorComponentChanged',
                'CursorComponentSetData',
                ]

    def makeblacklisttypes(self):
        return [
                "QDRegionBitsRef", # Should do this, but too lazy now.
                'CIconHandle', # Obsolete
                'CQDProcs',
                'CQDProcsPtr',
                'CSpecArray',
                'ColorComplementProcPtr',
                'ColorComplementUPP',
                'ColorSearchProcPtr',
                'ColorSearchUPP',
                'ConstPatternParam',
                'DeviceLoopDrawingProcPtr',
                'DeviceLoopFlags',
                'GrafVerb',
                'OpenCPicParams_ptr',
                'Ptr',
                'QDProcs',
                'ReqListRec',
                'void_ptr',
                'CustomXFerProcPtr',
                ]

    def makerepairinstructions(self):
        return [
                ([('void_ptr', 'textBuf', 'InMode'),
                  ('short', 'firstByte', 'InMode'),
                  ('short', 'byteCount', 'InMode')],
                 [('TextThingie', '*', '*'), ('*', '*', '*'), ('*', '*', '*')]),

                # GetPen and SetPt use a point-pointer as output-only:
                ('GetPen', [('Point', '*', 'OutMode')], [('*', '*', 'OutMode')]),
                ('SetPt', [('Point', '*', 'OutMode')], [('*', '*', 'OutMode')]),

                # All others use it as input/output:
                ([('Point', '*', 'OutMode')],
                 [('*', '*', 'InOutMode')]),

                 # InsetRect, OffsetRect
                 ([('Rect', 'r', 'OutMode'),
                        ('short', 'dh', 'InMode'),
                        ('short', 'dv', 'InMode')],
                  [('Rect', 'r', 'InOutMode'),
                        ('short', 'dh', 'InMode'),
                        ('short', 'dv', 'InMode')]),

                 # MapRect
                 ([('Rect', 'r', 'OutMode'),
                        ('Rect_ptr', 'srcRect', 'InMode'),
                        ('Rect_ptr', 'dstRect', 'InMode')],
                  [('Rect', 'r', 'InOutMode'),
                        ('Rect_ptr', 'srcRect', 'InMode'),
                        ('Rect_ptr', 'dstRect', 'InMode')]),

                 # CopyBits and friends
                 ([('RgnHandle', 'maskRgn', 'InMode')],
                  [('OptRgnHandle', 'maskRgn', 'InMode')]),

                 ('QDFlushPortBuffer',
                  [('RgnHandle', '*', 'InMode')],
                  [('OptRgnHandle', '*', 'InMode')]),

                 # Accessors with reference argument also returned.
                 ([('Rect_ptr', 'GetPortBounds', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('RGBColor_ptr', 'GetPortForeColor', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('RGBColor_ptr', 'GetPortBackColor', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('RGBColor_ptr', 'GetPortOpColor', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('RGBColor_ptr', 'GetPortHiliteColor', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Point_ptr', 'GetPortPenSize', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Point_ptr', 'GetPortPenLocation', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Rect_ptr', 'GetPixBounds', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('BitMap_ptr', 'GetQDGlobalsScreenBits', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Cursor_ptr', 'GetQDGlobalsArrow', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Rect_ptr', 'GetRegionBounds', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Pattern_ptr', '*', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Point_ptr', 'QDLocalToGlobalPoint', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Rect_ptr', 'QDLocalToGlobalRect', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Point_ptr', 'QDGlobalToLocalPoint', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                 ([('Rect_ptr', 'QDGlobalToLocalRect', 'ReturnMode')],
                  [('void', '*', 'ReturnMode')]),

                ]

if __name__ == "__main__":
    main()
