def adapter_type_visitor(the_type, modifier = None):
    '''switch types for the python SwinGame adapter (links to DLL)'''
    name = None if the_type is None else the_type.name.lower()
    if name not in _adapter_type_switcher[modifier]:
        logger.error('CREATE   : Error changing adapter type %s - %s', modifier, the_type)
    
    return _adapter_type_switcher[modifier][name]
Esempio n. 2
0
def std_type_visitor(the_dict,
                     the_type,
                     modifier=None,
                     dict_name='_type_switcher'):
    '''
    switch types for the SwinGame library.
    
    Params:
     - the_dict:    The dictionary with the type changes with modifier keys
     - the_type:    The type being checked
     - modifier:    The modifier for the type
     - dict_name:   The name of the dictionary for error reporting
    '''
    key = the_type.name.lower() if the_type != None else None

    if modifier == 'result': modifier = 'return'

    if key not in the_dict[modifier]:
        logger.error('HELPER    : Error changing model type %s - %s', modifier,
                     the_type)
        logger.error('          : Add \'%s[%s]\': \'%s\': \'????\',',
                     dict_name, modifier, the_type.name.lower())

        global _hasError, _dieOnError
        _hasError = True

        if _dieOnError:
            assert False
        else:
            the_dict[modifier][key] = "UNKNOWN"

    return the_dict[modifier][key]
Esempio n. 3
0
def map_data_value(the_dict, key, the_type, result):
    '''
    Returns the code needed to map the swingame (Pascal) data in result to
    the type used by language X
    
    Params:
     - the_dict:    The dictionary with the type changes with modifier keys
     - key:         The key to search for in the_dict
     - the_type:    The type being checked
     - modifier:    The modifier for the type
    '''
    if the_type.name.lower() in the_dict[key]:
        # print the_type.name.lower(), ' -> ', the_dict[key][the_type.name.lower()]
        return the_dict[key][the_type.name.lower()] % result

    #If this is a
    if the_type.pointer_wrapper and key == 'return_val':
        logger.error(
            'HELPER   : Error pointer wrapper without return data mapping - %s',
            the_type)

        global _hasError, _dieOnError
        _hasError = True

        if _dieOnError:
            assert False
        else:
            the_dict[key][the_type.name.lower()] = "UNKNOWN"

    return result
Esempio n. 4
0
def map_data_value(the_dict, key, the_type, result):
    '''
    Returns the code needed to map the swingame (Pascal) data in result to
    the type used by language X
    
    Params:
     - the_dict:    The dictionary with the type changes with modifier keys
     - key:         The key to search for in the_dict
     - the_type:    The type being checked
     - modifier:    The modifier for the type
    '''
    if the_type.name.lower() in the_dict[key]:
        # print the_type.name.lower(), ' -> ', the_dict[key][the_type.name.lower()]
        return the_dict[key][the_type.name.lower()] % result
        
    #If this is a 
    if the_type.pointer_wrapper and key == 'return_val':
        logger.error('HELPER   : Error pointer wrapper without return data mapping - %s', the_type)
        
        global _hasError, _dieOnError
        _hasError = True
        
        if _dieOnError: 
            assert False
        else:
            the_dict[key][the_type.name.lower()] = "UNKNOWN"
        
        
    return result
Esempio n. 5
0
def create_property_for_field(in_class, field):
    '''Creates a property to access the '''

    if field.data_type.wraps_array:
        logger.error(
            'HELPER    : Error structure with array fields must be set to via_pointer'
        )

        global _hasError, _dieOnError
        _hasError = True

        if _dieOnError:
            assert False

    prop = SGProperty(field.name)
    prop.in_class = in_class
    prop.data_type = field.data_type

    getter = SGMethod('get' + field.pascalName)
    getter.return_type = field.data_type
    getter.in_class = in_class
    getter.field_name = field.name
    getter.is_getter = True

    setter = SGMethod('set' + field.pascalName)
    setter.params.append(SGParameter('value'))
    setter.params[0].data_type = field.data_type
    setter.in_class = in_class
    setter.field_name = field.name
    setter.is_setter = True

    prop.set_getter(getter)
    prop.set_setter(setter)

    return prop
Esempio n. 6
0
def std_type_visitor(the_dict, the_type, modifier = None, dict_name = '_type_switcher'):
    '''
    switch types for the SwinGame library.
    
    Params:
     - the_dict:    The dictionary with the type changes with modifier keys
     - the_type:    The type being checked
     - modifier:    The modifier for the type
     - dict_name:   The name of the dictionary for error reporting
    '''
    key = the_type.name.lower() if the_type != None else None
    
    if modifier == 'result': modifier = 'return'
    
    if key not in the_dict[modifier]:
        logger.error('HELPER    : Error changing model type %s - %s', modifier, the_type)
        logger.error('          : Add \'%s[%s]\': \'%s\': \'????\',', dict_name, modifier, the_type.name.lower())
        
        global _hasError, _dieOnError
        _hasError = True
        
        if _dieOnError: 
            assert False
        else:
            the_dict[modifier][key] = "UNKNOWN"
        
    return the_dict[modifier][key]
Esempio n. 7
0
def create_property_for_field(in_class, field):
    '''Creates a property to access the '''
    
    if field.data_type.wraps_array:
        logger.error('HELPER    : Error structure with array fields must be set to via_pointer')
        
        global _hasError, _dieOnError
        _hasError = True
        
        if _dieOnError: 
            assert False
    
    prop = SGProperty(field.name)
    prop.in_class = in_class
    prop.data_type = field.data_type
    
    getter = SGMethod('get' + field.pascalName)
    getter.return_type = field.data_type
    getter.in_class = in_class
    getter.field_name = field.name
    getter.is_getter = True
    
    setter = SGMethod('set' + field.pascalName)
    setter.params.append(SGParameter('value'))
    setter.params[0].data_type = field.data_type
    setter.in_class = in_class
    setter.field_name = field.name
    setter.is_setter = True
    
    prop.set_getter(getter)
    prop.set_setter(setter)
    
    return prop
def type_visitor(the_type, modifier = None):
    '''switch types for the c SwinGame library'''
    name = None if the_type is None else the_type.name.lower()
    if name not in _type_switcher[modifier]:
        logger.error('CREATE  : Error changing model type %s - %s', modifier, the_type)
        assert False
    
    return _type_switcher[modifier][name]
def adapter_param_visitor(the_param, last):
    name = the_param.name.lower()
    if name not in _adapter_type_switcher[the_param.modifier]:
        logger.error('CREATE   : Error visiting adapter parameter %s - %s', the_param.modifier, the_param.data_type.name)
        return 'XXX'
        #assert False
    
    return '%s%s' % (
        _adapter_type_switcher[the_param.modifier][name] % the_param.name,
        ', ' if not last else '')
Esempio n. 10
0
def _do_create_type_code(member):
    '''Create the c code for the type member'''

    assert member.is_class or member.is_struct or member.is_enum or member.is_type

    member_data = member.lang_data['c']

    if member.is_class or member.is_type or (member.is_struct
                                             and member.wraps_array):
        if member.is_pointer_wrapper:  # convert to resource pointer
            the_type = member.data_type
            member_data.signature = 'typedef %s;\n' % c_code_for_adapter_type(
                the_type, member.lower_name, 'ptr-decl')
        elif member.is_data_wrapper:  # alias of another type
            assert len(member.fields) == 1
            the_type = member.fields['data'].data_type
            member_data.signature = 'typedef %s;\n' % c_code_for_adapter_type(
                the_type, member.lower_name)
        elif member.wraps_array:
            assert len(member.fields) == 1
            the_type = member.fields['data'].data_type
            member_data.signature = 'typedef %s;\n' % c_code_for_adapter_type(
                the_type, member.lower_name)
        elif member.data_type.is_procedure:
            assert member.data_type.method != None
            #typedef float(*pt2Func)(float, float);
            m = member.data_type.method
            member_data.signature = 'typedef %s;\n' % c_code_for_adapter_type(
                member.data_type, m.lower_name)
        else:
            logger.error('CREATE C  : Unknown class type for %s', member.uname)
            assert False

    elif member.is_struct:
        if member.same_as:
            member_data.signature = 'typedef %s %s;\n' % (
                member.same_as.lower_name, member.lower_name)
        else:
            #typedef struct %s_struct { } struct;
            member_data.signature = 'typedef struct _%s { \n' % member.lower_name

            #write the fields
            for field in member.field_list:
                member_data.signature += '    %s;\n' % c_code_for_adapter_type(
                    field.data_type, field.lower_name)

            member_data.signature += '} %s;\n' % member.lower_name

    elif member.is_enum:
        #enum id { list }
        member_data.signature = 'typedef enum { \n    '
        member_data.signature += ',\n    '.join(
            [wrapper_helper.upper_name(v) for v in member.values])
        member_data.signature += '\n} %s;\n' % member.lower_name
def write_type_for(member, other):
    '''Write out a type (class, struct, enum, typedef)'''
    assert member.is_class or member.is_struct or member.is_enum or member.is_type
    writer = other['writer']
    # CLASS, TYPE, STRUCT(ARRAY)
    if member.is_class or member.is_type or (member.is_struct and member.wraps_array):
        #convert to resource pointer
        if member.is_pointer_wrapper:
            # assert len(member.fields) == 1
            the_type = member.data_type
            writer.writeln('typedef %s;\n' % adapter_type_visitor(the_type, None) % member.name)
        elif member.is_data_wrapper:
            assert len(member.fields) == 1
            the_type = member.fields['data'].data_type
            writer.writeln('typedef %s;\n' % adapter_type_visitor(the_type) % member.name)
        elif member.wraps_array:
            assert len(member.fields) == 1
            the_type = member.fields['data'].data_type
            writer.writeln('typedef %s;\n' % adapter_type_visitor(the_type) % member.name)
        else:
            logger.error('CREATE PYTHON  : Unknown class type for %s', member.uname)
            assert False
    # PURE STRUCT
    elif member.is_struct:
        #class Point2D(Structure): # record/struct;
        #    _fields_ = [('x', c_float), (), ... ]
        writer.writeln('class %s(Structure):' % member.name)
        writer.writeln("    '''%s\n    '''" % '\n   '.join(member.doc.splitlines()))
        writer.writeln('    _fields_ = [')
        for field in member.field_list:
            writer.writeln('        %s,' % adapter_type_visitor(field.data_type) % field.name)
        writer.writeln('    ]\n')
    # PURE ENUM
    elif member.is_enum:
        #enum id { list } 
        # basic -> (...) = map(c_int, range(length(...))
        # class object FontAlignment.Left etc
        #other['writer'].write(str(member) + str(dir(member)))
        writer.writeln('class %s(object): # enum' % member.name)
        writer.writeln("    '''%s\n    '''" % '\n   '.join(member.doc.splitlines()))
        for i, v in enumerate(member.values):
            if '=' in v:
                v = v.replace(' = ', ' = c_int(') + ')' # use provided indicies
            else:
                v = v + ' = c_int(%d)' % i # need to add indicies
            writer.writeln('    %s' % v)
        writer.writeln('')
Esempio n. 12
0
def _do_create_type_code(member):
    '''Create the c code for the type member'''
    
    assert member.is_class or member.is_struct or member.is_enum or member.is_type
    
    member_data = member.lang_data['c']

    if member.is_class or member.is_type or (member.is_struct and member.wraps_array):
        if member.is_pointer_wrapper: # convert to resource pointer
            the_type = member.data_type
            member_data.signature = 'typedef %s;\n' % c_code_for_adapter_type(the_type, member.lower_name, 'ptr-decl')
        elif member.is_data_wrapper: # alias of another type
            assert len(member.fields) == 1
            the_type = member.fields['data'].data_type
            member_data.signature = 'typedef %s;\n' % c_code_for_adapter_type(the_type, member.lower_name)
        elif member.wraps_array:
            assert len(member.fields) == 1
            the_type = member.fields['data'].data_type
            member_data.signature = 'typedef %s;\n' % c_code_for_adapter_type(the_type, member.lower_name)
        elif member.data_type.is_procedure:
            assert member.data_type.method != None
            #typedef float(*pt2Func)(float, float);
            m = member.data_type.method
            member_data.signature = 'typedef %s;\n' % c_code_for_adapter_type(member.data_type, m.lower_name)
        else:
            logger.error('CREATE C  : Unknown class type for %s', member.uname)
            assert False
        
    elif member.is_struct:
        if member.same_as:
            member_data.signature = 'typedef %s %s;\n' % (member.same_as.lower_name, member.lower_name)
        else:
            #typedef struct %s_struct { } struct;
            member_data.signature = 'typedef struct _%s { \n' % member.lower_name
            
            #write the fields
            for field in member.field_list:
                member_data.signature += '    %s;\n' % c_code_for_adapter_type(field.data_type, field.lower_name)
            
            member_data.signature += '} %s;\n' % member.lower_name
        
    elif member.is_enum:
        #enum id { list }
        member_data.signature = 'typedef enum { \n    '
        member_data.signature += ',\n    '.join([wrapper_helper.upper_name(v) for v in member.values])
        member_data.signature += '\n} %s;\n' % member.lower_name
Esempio n. 13
0
def _do_create_pas_library_code(method):

    method_alias = method.alias('pas')

    data = method_alias.to_keyed_dict(pas_library_param_visitor,
                                      lang_key='pas')

    if method_alias.was_function:
        # Method returned a array of some kind... get the result params and change the 'return_type' in data
        result_param = method_alias.params[-1]
        if not result_param.maps_result:  #in case of returning var length array
            result_param = method_alias.params[-2]

        if not result_param.maps_result or result_param.data_type.name.lower(
        ) not in [
                'string', 'triangle', 'linesarray', 'matrix2d', 'point2darray',
                'longintarray', 'stringarray', 'bitmaparray', 'trianglearray',
                'fingerarray'
        ]:
            logger.error('CREATE LIB: Unknown parameter return type in %s.',
                         method_alias.name)
            assert False

        lines = pas_lib.function_as_procedure_txt
        #? is this needed: data['return_type'] = result_param.data_type.name
    elif method_alias.return_type == None:
        lines = pas_lib.procedure_txt
    else:
        lines = pas_lib.function_txt

    if len(method_alias.local_vars) > 0:
        var_dec = '\n  var\n'
        temp_process_result = ''
        temp_process_params = ''

        for local_var in method_alias.local_vars:
            # Add declaration of variable
            var_dec += '    %s: %s;\n' % (local_var.name, local_var.data_type)

            # Add variable processing code...
            type_name = local_var.data_type.name.lower()

            if type_name == 'string':
                # Copy strings out - they are passed through using Pascal implicit casting from PChar to String
                temp_process_result += '\n      StrCopy(%s, PChar(%s));' % (
                    local_var.local_for.name, local_var.name)
            #? elif type_name == 'color':
            #     temp_process_result += '\n      %s := %s;' % (local_var.name[:-5], local_var.name)

            # elif type_name in _array_copy_fixed_data: #needed for mapped result parameters
            #     if local_var.modifier in [None, 'var', 'const'] and not local_var.maps_result:
            #         temp_process_params += '\n      %sCopyFromPtr(%s, %s);' % (_array_copy_fixed_data[type_name], local_var.name, local_var.name[:-5])
            #     if local_var.modifier in [None, 'var', 'out'] or local_var.maps_result:
            #         temp_process_result += '\n      %sCopyToPtr(%s, %s);' % (_array_copy_fixed_data[type_name], local_var.name[:-5], local_var.name)
            elif type_name in _array_copy_data:
                if local_var.modifier in [None, 'var', 'const'
                                          ] and not local_var.maps_result:
                    temp_process_params += '\n      %sCopyFromPtr(%s, %s_len, %s);' % (
                        _array_copy_data[type_name], local_var.name[:-5],
                        local_var.name[:-5], local_var.name)
                if local_var.modifier in [None, 'var', 'out'
                                          ] or local_var.maps_result:
                    temp_process_result += '\n      %sCopyToPtr(%s, %s_len, %s);' % (
                        _array_copy_data[type_name], local_var.name,
                        local_var.name[:-5], local_var.name[:-5])
            else:
                logger.error('CREATE LIB: Unknow local variable type in %s',
                             method_alias.name)
                assert False
        data['vars'] = var_dec[:-1]
        data['process_result'] = temp_process_result
        data['process_params'] = temp_process_params
    else:
        data['vars'] = ''
        data['process_result'] = ''
        data['process_params'] = ''

    _names.append(method_alias.name)

    method_alias.code = (''.join(lines) + '\n') % data
Esempio n. 14
0
def _do_create_pas_library_code(method):
    
    method_alias = method.alias('pas')
    
    data = method_alias.to_keyed_dict(pas_library_param_visitor, lang_key='pas')
    
    if method_alias.was_function:
        # Method returned a array of some kind... get the result params and change the 'return_type' in data
        result_param = method_alias.params[-1]
        if not result_param.maps_result: #in case of returning var length array
            result_param = method_alias.params[-2]
        
        if not result_param.maps_result or result_param.data_type.name.lower() not in ['string', 'triangle', 'linesarray', 'matrix2d', 'point2darray', 'longintarray','stringarray','bitmaparray','trianglearray','fingerarray']:
            logger.error('CREATE LIB: Unknown parameter return type in %s.', method_alias.name)
            assert False
        
        lines = pas_lib.function_as_procedure_txt
        #? is this needed: data['return_type'] = result_param.data_type.name
    elif method_alias.return_type == None: 
        lines = pas_lib.procedure_txt
    else: 
        lines = pas_lib.function_txt
    
    if len(method_alias.local_vars) > 0:
        var_dec = '\n  var\n'
        temp_process_result = ''
        temp_process_params = ''
        
        for local_var in method_alias.local_vars:
            # Add declaration of variable
            var_dec += '    %s: %s;\n' % (local_var.name, local_var.data_type)
            
            # Add variable processing code...
            type_name = local_var.data_type.name.lower()
            
            if type_name == 'string':
                # Copy strings out - they are passed through using Pascal implicit casting from PChar to String
                temp_process_result += '\n      StrCopy(%s, PChar(%s));' % (local_var.local_for.name, local_var.name)
            #? elif type_name == 'color':
            #     temp_process_result += '\n      %s := %s;' % (local_var.name[:-5], local_var.name)
            
            # elif type_name in _array_copy_fixed_data: #needed for mapped result parameters
            #     if local_var.modifier in [None, 'var', 'const'] and not local_var.maps_result:
            #         temp_process_params += '\n      %sCopyFromPtr(%s, %s);' % (_array_copy_fixed_data[type_name], local_var.name, local_var.name[:-5])
            #     if local_var.modifier in [None, 'var', 'out'] or local_var.maps_result:
            #         temp_process_result += '\n      %sCopyToPtr(%s, %s);' % (_array_copy_fixed_data[type_name], local_var.name[:-5], local_var.name)
            elif type_name in _array_copy_data:
                if local_var.modifier in [None, 'var', 'const'] and not local_var.maps_result:
                    temp_process_params += '\n      %sCopyFromPtr(%s, %s_len, %s);' % (_array_copy_data[type_name], local_var.name[:-5], local_var.name[:-5],local_var.name)
                if local_var.modifier in [None, 'var', 'out'] or local_var.maps_result:
                    temp_process_result += '\n      %sCopyToPtr(%s, %s_len, %s);' % (_array_copy_data[type_name],local_var.name, local_var.name[:-5], local_var.name[:-5])
            else:
                logger.error('CREATE LIB: Unknow local variable type in %s', method_alias.name)
                assert False
        data['vars'] = var_dec[:-1]
        data['process_result'] = temp_process_result
        data['process_params'] = temp_process_params
    else:
        data['vars'] = ''
        data['process_result'] = ''
        data['process_params'] = ''
    
    _names.append(method_alias.name)
    
    method_alias.code = (''.join(lines) + '\n') % data