Ignore:
Timestamp:
Jul 19, 2013 10:32:43 AM (11 years ago)
Author:
nanang
Message:

JNI projects: handle nested struct/union for SWIG

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/jni/pjsip-apps/src/jni/jni/swig_gen.py

    r4568 r4570  
    262262                return '' 
    263263 
     264 
     265        # Move out inner struct/union 
     266        def _process_nested_struct_union(self, code): 
     267                if not (code.startswith('struct') or \ 
     268                        code.startswith('typedef struct') or \ 
     269                        code.startswith('typedef union')): 
     270                        return code 
     271                         
     272                # max nested level is 5 
     273                name = ['','','','',''] 
     274                type = ['','','','',''] 
     275                content = ['','','','',''] 
     276                level = 0 
     277                s = '' 
     278                for line in code.splitlines(): 
     279                        line_s = line.lstrip() 
     280                        if (not line_s) or (line_s == '{'): continue 
     281 
     282                        last_level = level 
     283                        level = (len(line) - len(line_s)) / 2 
     284 
     285                        if level < last_level: 
     286                                if not line_s.startswith('}'): 
     287                                        print "bad tabulation!" 
     288 
     289                                # closing bracket, get var name 
     290                                varname = '' 
     291                                vartail = '' 
     292                                m = re.match(r'\}\s*(\w+)(.*);', line_s) 
     293                                if m: 
     294                                        varname = m.group(1) 
     295                                        vartail = m.group(2) 
     296                                        if level > 0: 
     297                                                name[level] = '$name' + str(level-1) + '$_' + varname 
     298                                # print inner struct/union in outer 
     299                                ss = type[level] + ' ' + name[level] + '\n' 
     300                                ss += '{\n' + content[level] + '};\n' 
     301                                if level > 0: 
     302                                        s += "%inline %{\n" + ss + '%}\n' 
     303                                        s += "%apply NESTED_INNER { " + name[level] + " " + varname + " };\n" 
     304                                else: 
     305                                        s += ss 
     306                                content[level] = '' 
     307                                # print inner struct member var at global scope 
     308                                if level > 0: 
     309                                        content[level-1] += ' '*level*2 + type[level] + ' ' + name[level] + ' ' + varname + vartail + ';\n' 
     310                                        s = s.replace('$name' + str(level) + '$', '$name' + str(level-1) + '$_' + varname) 
     311                                else: 
     312                                        s = s.replace('$name' + str(level) + '$', name[level]) 
     313 
     314                        elif level >= last_level: 
     315                                if line_s.startswith('typedef'): line_s = line_s[8:] 
     316                                if (line_s.startswith('union') or line_s.startswith('struct')) and not line_s.endswith(';'): 
     317                                        ll = line_s.split() 
     318                                        type[level] = ll[0] 
     319                                        name[level] = ll[1] if len(ll) > 1 else '' 
     320                                else: 
     321                                        content[level-1] += line + '\n' 
     322                return s 
     323                 
     324 
    264325        # Generate code from the specified node. 
    265326        def _print_node(self, node): 
     
    281342                        ss = self._process_opaque_struct(name, ss) 
    282343                        ss = self._process_pjsua_callback(name, ss) 
     344                        ss = self._process_nested_struct_union(ss) 
    283345                        s += ss 
    284346                return s 
Note: See TracChangeset for help on using the changeset viewer.