kerncraft/pycparser_utils.py
def clean_code(code, comments=True, macros=False, pragmas=False):
    """
    Naive comment and macro striping from source code

    :param comments: If True, all comments are stripped from code
    :param macros: If True, all macros are stripped from code
    :param pragmas: If True, all pragmas are stripped from code

    :return: cleaned code. Line numbers are preserved with blank lines,
    and multiline comments and macros are supported. BUT comment-like
    strings are (wrongfully) treated as comments.
    """
    if macros or pragmas:
        lines = code.split('\n')
        in_macro = False
        in_pragma = False
        for i in range(len(lines)):
            l = lines[i].strip()

            if macros and (l.startswith('#') and not l.startswith('#pragma') or in_macro):
                lines[i] = ''
                in_macro = l.endswith('\\')
            if pragmas and (l.startswith('#pragma') or in_pragma):
                lines[i] = ''
                in_pragma = l.endswith('\\')
        code = '\n'.join(lines)

    if comments:
        idx = 0
        comment_start = None
        while idx < len(code) - 1:
            if comment_start is None and code[idx:idx + 2] == '//':
                end_idx = code.find('\n', idx)
                code = code[:idx] + code[end_idx:]
                idx -= end_idx - idx
            elif comment_start is None and code[idx:idx + 2] == '/*':
                comment_start = idx
            elif comment_start is not None and code[idx:idx + 2] == '*/':
                code = (code[:comment_start] +
                        '\n' * code[comment_start:idx].count('\n') +
                        code[idx + 2:])
                idx -= idx - comment_start
                comment_start = None
            idx += 1

    return code
def clean_code(code, comments=True, macros=False, pragmas=False):
    if macros or pragmas:
        lines = code.split('\n')
        in_macro = False
        in_pragma = False
        for i in range(len(lines)):
            l = lines[i].strip()

            if macros and (l.startswith('#') and not l.startswith('#pragma') or in_macro):
                lines[i] = ''
                in_macro = l.endswith('\\')
            if pragmas and (l.startswith('#pragma') or in_pragma):
                lines[i] = ''
                in_pragma = l.endswith('\\')
        code = '\n'.join(lines)

    if comments:
        idx = 0
        comment_start = None
        while idx < len(code) - 1:
            if comment_start is None and code[idx:idx + 2] == '//':
                end_idx = code.find('\n', idx)
                code = code[:idx] + code[end_idx:]
                idx -= end_idx - idx
            elif comment_start is None and code[idx:idx + 2] == '/*':
                comment_start = idx
            elif comment_start is not None and code[idx:idx + 2] == '*/':
                code = (code[:comment_start] +
                        '\n' * code[comment_start:idx].count('\n') +
                        code[idx + 2:])
                idx -= idx - comment_start
                comment_start = None
            idx += 1

    return code
def clean_code ( code , comments = True , macros = False , pragmas = False ) : if macros or pragmas : lines = code . split ( '\n' ) in_macro = False in_pragma = False for i in range ( len ( lines ) ) : l = lines [ i ] . strip ( ) if macros and ( l . startswith ( '#' ) and not l . startswith ( '#pragma' ) or in_macro ) : lines [ i ] = '' in_macro = l . endswith ( '\\' ) if pragmas and ( l . startswith ( '#pragma' ) or in_pragma ) : lines [ i ] = '' in_pragma = l . endswith ( '\\' ) code = '\n' . join ( lines ) if comments : idx = 0 comment_start = None while idx < len ( code ) - 1 : if comment_start is None and code [ idx : idx + 2 ] == '//' : end_idx = code . find ( '\n' , idx ) code = code [ : idx ] + code [ end_idx : ] idx -= end_idx - idx elif comment_start is None and code [ idx : idx + 2 ] == '/*' : comment_start = idx elif comment_start is not None and code [ idx : idx + 2 ] == '*/' : code = ( code [ : comment_start ] + '\n' * code [ comment_start : idx ] . count ( '\n' ) + code [ idx + 2 : ] ) idx -= idx - comment_start comment_start = None idx += 1 return code
Naive comment and macro striping from source code

    :param comments: If True, all comments are stripped from code
    :param macros: If True, all macros are stripped from code
    :param pragmas: If True, all pragmas are stripped from code

    :return: cleaned code. Line numbers are preserved with blank lines,
    and multiline comments and macros are supported. BUT comment-like
    strings are (wrongfully) treated as comments.
Naive comment and macro striping from source code