'Read and return a single logical line from the current file (or
from an internal buffer if lines have previously been "unread"
with \'unreadline()\').  If the \'join_lines\' option is true, this
may involve reading multiple physical lines concatenated into a
single string.  Updates the current line number, so calling
\'warn()\' after \'readline()\' emits a warning about the physical
line(s) just read.  Returns None on end-of-file, since the empty
string can occur if \'rstrip_ws\' is true but \'strip_blanks\' is
not.'

def readline(self):

    if self.linebuf:
        line = self.linebuf[(-1)]
        del self.linebuf[(-1)]
        return line
    buildup_line = ''
    while True:
        line = self.file.readline()
        if (line == ''):
            line = None
        if (self.strip_comments and line):
            pos = line.find('#')
            if (pos == (-1)):
                pass
            elif ((pos == 0) or (line[(pos - 1)] != '\\')):
                eol = (((line[(-1)] == '\n') and '\n') or '')
                line = (line[0:pos] + eol)
                if (line.strip() == ''):
                    continue
            else:
                line = line.replace('\\#', '#')
        if (self.join_lines and buildup_line):
            if (line is None):
                self.warn('continuation    line    immediately    precedes    end-of-file')
                return buildup_line
            if self.collapse_join:
                line = line.lstrip()
            line = (buildup_line + line)
            if isinstance(self.current_line, list):
                self.current_line[1] = (self.current_line[1] + 1)
            else:
                self.current_line = [self.current_line, (self.current_line + 1)]
        else:
            if (line is None):
                return None
            if isinstance(self.current_line, list):
                self.current_line = (self.current_line[1] + 1)
            else:
                self.current_line = (self.current_line + 1)
        if (self.lstrip_ws and self.rstrip_ws):
            line = line.strip()
        elif self.lstrip_ws:
            line = line.lstrip()
        elif self.rstrip_ws:
            line = line.rstrip()
        if (((line == '') or (line == '\n')) and self.skip_blanks):
            continue
        if self.join_lines:
            if (line[(-1)] == '\\'):
                buildup_line = line[:(-1)]
                continue
            if (line[(-2):] == '\\\n'):
                buildup_line = (line[0:(-2)] + '\n')
                continue
        return line
