'Accepts a string of code or a list of code lines'

def indent_code(self, code):

    if isinstance(code, string_types):
        code_lines = self.indent_code(code.splitlines(True))
        return ''.join(code_lines)
    free = (self._settings['source_format'] == 'free')
    code = [line.lstrip('     DCTB ') for line in code]
    inc_keyword = ('do    ', 'if(', 'if    ', 'do\n', 'else')
    dec_keyword = ('end    do', 'enddo', 'end    if', 'endif', 'else')
    increase = [int(any(map(line.startswith, inc_keyword))) for line in code]
    decrease = [int(any(map(line.startswith, dec_keyword))) for line in code]
    continuation = [int(any(map(line.endswith, ['&', '&\n']))) for line in code]
    level = 0
    cont_padding = 0
    tabwidth = 3
    new_code = []
    for (i, line) in enumerate(code):
        if ((line == '') or (line == '\n')):
            new_code.append(line)
            continue
        level -= decrease[i]
        if free:
            padding = ('    ' * ((level * tabwidth) + cont_padding))
        else:
            padding = (('    ' * level) * tabwidth)
        line = ('%s%s' % (padding, line))
        if (not free):
            line = self._pad_leading_columns([line])[0]
        new_code.append(line)
        if continuation[i]:
            cont_padding = (2 * tabwidth)
        else:
            cont_padding = 0
        level += increase[i]
    if (not free):
        return self._wrap_fortran(new_code)
    return new_code
