def split_code_into_blocks()

in cbmc_viewer/markup_code.py [0:0]


def split_code_into_blocks(code):
    """Split code into blocks of code, comments, and string literals."""

    def is_noncode_start(code, idx=0):
        """String starts something other than source code (eg, a comment)."""

        return (is_quote(code, idx) or
                is_multiline_comment_start(code, idx) or
                is_singleline_comment_start(code, idx))

    def find_predicate(code, predicate, idx=0):
        """First position in a string satisfying a predicate."""

        while idx < len(code) and not predicate(code, idx):
            idx += 1
        return idx

    blocks = []

    while code:
        idx = find_predicate(code, is_noncode_start)
        block, code, idx = code[:idx], code[idx:], 0
        if block:
            blocks.append(block)

        if not code:
            break

        if is_quote(code):
            idx = find_predicate(code, is_quote, 1)
        elif is_multiline_comment_start(code):
            idx = find_predicate(code, is_multiline_comment_end, 2)
        elif is_singleline_comment_start(code):
            idx = find_predicate(code, is_singleline_comment_end, 2)
        block, code, idx = code[:idx+1], code[idx+1:], 0
        if block:
            blocks.append(block)

    return blocks