(self, fp, fpname)
Parse a sectioned setup file.

        The sections in setup file contains a title line at the top,
        indicated by a name in square brackets (`[]'), plus key/value
        options lines, indicated by `name: value' format lines.
        Continuations are represented by an embedded newline then
        leading whitespace.  Blank lines, lines beginning with a '#',
        and just about everything else are ignored.
Parse a sectioned setup file.
Parse a sectioned setup file .
def _read(self, fp, fpname):
        """Parse a sectioned setup file.

        The sections in setup file contains a title line at the top,
        indicated by a name in square brackets (`[]'), plus key/value
        options lines, indicated by `name: value' format lines.
        Continuations are represented by an embedded newline then
        leading whitespace.  Blank lines, lines beginning with a '#',
        and just about everything else are ignored.
        """
        cursect = None                        # None, or a dictionary
        optname = None
        lineno = 0
        e = None                              # None, or an exception
        while True:
            line = fp.readline()
            if not line:
                break
            lineno = lineno + 1
            # comment or blank line?
            if line.strip() == '' or line[0] in '#;':
                continue
            if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR":
                # no leading whitespace
                continue
            # continuation line?
            if line[0].isspace() and cursect is not None and optname:
                value = line.strip()
                if value:
                    cursect[optname].append(value)
            # a section header or option header?
            else:
                # is it a section header?
                mo = self.SECTCRE.match(line)
                if mo:
                    sectname = mo.group('header')
                    if sectname in self._sections:
                        cursect = self._sections[sectname]
                    elif sectname == DEFAULTSECT:
                        cursect = self._defaults
                    else:
                        cursect = self._dict()
                        cursect['__name__'] = sectname
                        self._sections[sectname] = cursect
                    # So sections can't start with a continuation line
                    optname = None
                # no section header in the file?
                elif cursect is None:
                    raise MissingSectionHeaderError(fpname, lineno, line)
                # an option line?
                else:
                    mo = self._optcre.match(line)
                    if mo:
                        optname, vi, optval = mo.group('option', 'vi', 'value')
                        optname = self.optionxform(optname.rstrip())
                        # This check is fine because the OPTCRE cannot
                        # match if it would set optval to None
                        if optval is not None:
                            if vi in ('=', ':') and ';' in optval:
                                # ';' is a comment delimiter only if it follows
                                # a spacing character
                                pos = optval.find(';')
                                if pos != -1 and optval[pos-1].isspace():
                                    optval = optval[:pos]
                            optval = optval.strip()
                            # allow empty values
                            if optval == '""':
                                optval = ''
                            cursect[optname] = [optval]
                        else:
                            # valueless option handling
                            cursect[optname] = optval
                    else:
                        # a non-fatal parsing error occurred.  set up the
                        # exception but keep going. the exception will be
                        # raised at the end of the file and will contain a
                        # list of all bogus lines
                        if not e:
                            e = ParsingError(fpname)
                        e.append(lineno, repr(line))
        # if any parsing errors occurred, raise an exception
        if e:
            raise e

        # join the multi-line values collected while reading
        all_sections = [self._defaults]
        all_sections.extend(self._sections.values())
        for options in all_sections:
            for name, val in options.items():
                if isinstance(val, list):
                    options[name] = '\n'.join(val)
def _read ( self , fp , fpname ) : cursect = None # None, or a dictionary optname = None lineno = 0 e = None # None, or an exception while True : line = fp . readline ( ) if not line : break lineno = lineno + 1 # comment or blank line? if line . strip ( ) == '' or line [ 0 ] in '#;' : continue if line . split ( None , 1 ) [ 0 ] . lower ( ) == 'rem' and line [ 0 ] in "rR" : # no leading whitespace continue # continuation line? if line [ 0 ] . isspace ( ) and cursect is not None and optname : value = line . strip ( ) if value : cursect [ optname ] . append ( value ) # a section header or option header? else : # is it a section header? mo = self . SECTCRE . match ( line ) if mo : sectname = mo . group ( 'header' ) if sectname in self . _sections : cursect = self . _sections [ sectname ] elif sectname == DEFAULTSECT : cursect = self . _defaults else : cursect = self . _dict ( ) cursect [ '__name__' ] = sectname self . _sections [ sectname ] = cursect # So sections can't start with a continuation line optname = None # no section header in the file? elif cursect is None : raise MissingSectionHeaderError ( fpname , lineno , line ) # an option line? else : mo = self . _optcre . match ( line ) if mo : optname , vi , optval = mo . group ( 'option' , 'vi' , 'value' ) optname = self . optionxform ( optname . rstrip ( ) ) # This check is fine because the OPTCRE cannot # match if it would set optval to None if optval is not None : if vi in ( '=' , ':' ) and ';' in optval : # ';' is a comment delimiter only if it follows # a spacing character pos = optval . find ( ';' ) if pos != - 1 and optval [ pos - 1 ] . isspace ( ) : optval = optval [ : pos ] optval = optval . strip ( ) # allow empty values if optval == '""' : optval = '' cursect [ optname ] = [ optval ] else : # valueless option handling cursect [ optname ] = optval else : # a non-fatal parsing error occurred.  set up the # exception but keep going. the exception will be # raised at the end of the file and will contain a # list of all bogus lines if not e : e = ParsingError ( fpname ) e . append ( lineno , repr ( line ) ) # if any parsing errors occurred, raise an exception if e : raise e # join the multi-line values collected while reading all_sections = [ self . _defaults ] all_sections . extend ( self . _sections . values ( ) ) for options in all_sections : for name , val in options . items ( ) : if isinstance ( val , list ) : options [ name ] = '\n' . join ( val )