This file is indexed.

/usr/share/pyshared/Pyste/MultipleCodeUnit.py is in python-pyste 1.54.0-4ubuntu3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# Copyright Bruno da Silva de Oliveira 2003. Use, modification and 
# distribution is subject to the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at 
# http://www.boost.org/LICENSE_1_0.txt)

from SingleCodeUnit import SingleCodeUnit
import os
import utils
from SmartFile import SmartFile


#==============================================================================
# MultipleCodeUnit
#==============================================================================
class MultipleCodeUnit(object):
    '''
    Represents a bunch of cpp files, where each cpp file represents a header
    to be exported by pyste. Another cpp, named <module>.cpp is created too.
    '''

    def __init__(self, modulename, outdir):
        self.modulename = modulename
        self.outdir = outdir
        self.codeunits = {}  # maps from a (filename, function) to a SingleCodeUnit
        self.functions = []
        self._current = None
        self.all = SingleCodeUnit(None, None)

    
    def _FunctionName(self, interface_file):
        name = os.path.splitext(interface_file)[0]
        return 'Export_%s' % utils.makeid(name)
    

    def _FileName(self, interface_file):
        filename = os.path.basename(interface_file)
        filename = '_%s.cpp' % os.path.splitext(filename)[0] 
        return os.path.join(self.outdir, filename)

    
    def SetCurrent(self, interface_file, export_name):
        'Changes the current code unit'
        if export_name is None:
            self._current = None
        elif export_name is '__all__':
            self._current = self.all
        else:
            filename = self._FileName(interface_file)
            function = self._FunctionName(interface_file)
            try:
                codeunit = self.codeunits[filename]
            except KeyError:
                codeunit = SingleCodeUnit(None, filename)
                codeunit.module_definition = 'void %s()' % function
                self.codeunits[filename] = codeunit
                if function not in self.functions:
                    self.functions.append(function)
            self._current = codeunit


    def Current(self):
        return self._current

    current = property(Current, SetCurrent)
        
            
    def Write(self, section, code):
        if self._current is not None:
            self.current.Write(section, code)


    def Section(self, section):
        if self._current is not None: 
            return self.current.Section(section)


    def _CreateOutputDir(self):
        try:
            os.mkdir(self.outdir)
        except OSError: pass # already created

        
    def Save(self):
        # create the directory where all the files will go
        self._CreateOutputDir();
        # order all code units by filename, and merge them all
        codeunits = {} # filename => list of codeunits

        # While ordering all code units by file name, the first code
        # unit in the list of code units is used as the main unit
        # which dumps all the include, declaration and
        # declaration-outside sections at the top of the file.
        for filename, codeunit in self.codeunits.items(): 
            if filename not in codeunits:
                # this codeunit is the main codeunit.
                codeunits[filename] = [codeunit]
                codeunit.Merge(self.all)
            else:
                main_unit = codeunits[filename][0]
                for section in ('include', 'declaration', 'declaration-outside'):
                    main_unit.code[section] = main_unit.code[section] + codeunit.code[section]
                    codeunit.code[section] = ''
                codeunits[filename].append(codeunit)

        # Now write all the codeunits appending them correctly.
        for file_units in codeunits.values():
            append = False
            for codeunit in file_units:
                codeunit.Save(append)
                if not append:
                    append = True
                    

    def GenerateMain(self, interfaces):                    
        # generate the main cpp
        filename = os.path.join(self.outdir, '_main.cpp')
        fout = SmartFile(filename, 'w')
        fout.write(utils.left_equals('Include'))
        fout.write('#include <boost/python/module.hpp>\n\n')
        fout.write(utils.left_equals('Exports'))
        functions = [self._FunctionName(x) for x in interfaces]
        for function in functions:
            fout.write('void %s();\n' % function)
        fout.write('\n')
        fout.write(utils.left_equals('Module'))
        fout.write('BOOST_PYTHON_MODULE(%s)\n' % self.modulename)
        fout.write('{\n')
        indent = ' ' * 4
        for function in functions:
            fout.write(indent)
            fout.write('%s();\n' % function)
        fout.write('}\n')