Skip to content
Snippets Groups Projects
correct_indent.py 6.89 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env python3
    
    def detectMNH_expand(f):
    
        # Adds MNH EXPAND comment before and after $mnh_expand$
        fin = open(f, 'r')
        fout = open(f+'_EXPAND', 'w')
    
        for i in contentbyline:
            if "!$mnh_expand" in i:
                fout.writelines("! $MNH EXPAND$ !\n")
    
                fout.writelines(i)
    
            elif "!$mnh_end_expand" in i:
                fout.writelines(i)
                fout.writelines("! $MNH END EXPAND$ !\n")
    
        # Count number of space blank before a first character of a line
        count = 0
    
    
    
    def check_indent(n, indent_score, worktext):
        # Correct the indentation with respect to the indent_score
        nblank = count_blank(worktext)
        rawtext = worktext[nblank:]
        correcttext = ' '*((indent_score)*2) + rawtext
    
        # Return the first non-blank character of a string
    
        # Return the 7 first non-blank character of a string
        nb_blank = 0
    
            if i == " ":
                nb_blank = nb_blank+1
            else:
                return string[nb_blank:nb_blank+7]
    
    
    
    def correct_indent(f):
        import sys
    # Correct the indentation between MNH EXPAND comment
    # Does not change the indentation outside MNH EXPAND > ... < MNH END EXPAND
    # Does not indent comment lines
    # Handles IF in two lines (e.g IF(... &
    
    # TODO : handles more than two lines of & with IF
    # TODO : do not correct indentation for & within an regular line
    # To improve : the indentation correction is weird (strict) if the indentation before
    # the MNH EXPAND comments is not respected (over-indentation)
    
        fin = open(f, 'r')
        fout = open(f+'_CORRECT_INDENT', 'w')
    
    
        ncurrline = 0
        indent_score = 0
        expand_score = 0
        passNextLine = {'Pass': False, 'Reason': ""}
    
            i7 = first7char(i)
            if passNextLine['Pass']:  # Second line with & for if or #if(n)def
                textwrite = i
                passNextLine['Pass'] = False
    
                if passNextLine['Reason'] == "IF":
                    indent_score = indent_score+1
                elif passNextLine['Reason'] == "#ifdef":
    
                    textwrite = check_indent(ncurrline, indent_score, i)
    
                    textwrite = check_indent(ncurrline, indent_score, i)
    
                    # ONLY IF present in between #ifdef is handled
                    # If more test is needed (present in the fortran code), duplicate test here
                    if "IF" in i7 and "THEN" in i:
                        indent_score = indent_score+1
                else:
    
                    sys.exit("Reason for passing the line not defined")
    
            elif "! $MNH EXPAND$ !" in i:
                expand_score = expand_score + 1
                textwrite = ""
            elif "! $MNH END EXPAND$ !" in i:
                expand_score = expand_score - 1
                textwrite = ""
            # Ignore comment lines
            elif firstchar(i) == "!":
    
            # Correct indentation only in between $MNH EXPAND$ and $MNH END EXPAND$
            elif expand_score >= 1:
                if indent_score > 0 and ("DO J" not in i and "ENDDO" not in i and "END DO" not in i and "END IF" not in i and "ENDIF" not in i and "THEN" not in i and "ELSE" not in i and "#if" not in i and "#else" not in i and "#endif" not in i):
    
                    textwrite = check_indent(ncurrline, indent_score, i)
    
                # #ifdef handling = pass to next lines with no indent
    
                elif "#if" in i7:  # ifdef or ifndef
                    textwrite = i
                    passNextLine['Pass'], passNextLine['Reason'] = (True, "#ifdef")
    
                    textwrite = i
                    passNextLine['Pass'], passNextLine['Reason'] = (True, "#else")
    
                    textwrite = i
                elif "ELSE" in i7:  # ELSE or ELSEIF
                    indent_score = indent_score-1
                    textwrite = check_indent(ncurrline, indent_score, i)
                    indent_score = indent_score+1
                elif "IF" in i7 and "&" in i:  # IF on two lines #TODO on > 2 lines
                    textwrite = i
                    passNextLine['Pass'], passNextLine['Reason'] = (True, "IF")
                # exclude IF in one line (without THEN)
                elif "IF" in i7 and "THEN" in i:
                    textwrite = check_indent(ncurrline, indent_score, i)
    
                    indent_score = indent_score+1
                elif "DO J" in i7:
    
                    textwrite = check_indent(ncurrline, indent_score, i)
    
                    indent_score = indent_score+1
                elif ("ENDDO" in i7) or ("END DO" in i7):
                    indent_score = indent_score-1
    
                    textwrite = check_indent(ncurrline, indent_score, i)
    
                elif ("END IF" in i7) or ("ENDIF" in i7):
                    indent_score = indent_score-1
    
                    textwrite = check_indent(ncurrline, indent_score, i)
    
                    textwrite = i
            else:  # not EXPAND lines nor within mnh_expand
                if "ELSE" in i7:  # ELSE or ELSEIF
                    pass  # no increase in indent
                elif "IF" in i7 and "&" in i:  # IF on two lines #TODO on > 2 lines
                    passNextLine['Pass'], passNextLine['Reason'] = (True, "IF")
                # exclude IF in one line (without THEN)
                elif "IF" in i7 and "THEN" in i:
                    indent_score = indent_score+1
    
                elif "DO J" in i7:
                    indent_score = indent_score+1
                elif ("ENDDO" in i7) or ("END DO" in i7):
                    indent_score = indent_score-1
                elif ("END IF" in i7) or ("ENDIF" in i7):
                    indent_score = indent_score-1
    
                textwrite = i
            ncurrline = ncurrline+1
    
    if __name__ == "__main__":
        import argparse
        import sys
    
        parser = argparse.ArgumentParser(
            description='Detecte les balises !$mnh_expand et !$mnh_end_expand et ajoute un commentaire avant et après pour corriger l\'indentation par la suite avec correct_indentation.py')
    
        parser.add_argument('file1', metavar='file1',
                            type=str, help="file to check")
        parser.add_argument('action', metavar='action', type=str,
                            help="action (indent or detect")
    
        args = parser.parse_args()
        if "indent" in args.action:
            sys.exit(correct_indent(args.file1))
        elif "detect" in args.action:
            sys.exit(detectMNH_expand(args.file1))
        else:
            sys.exit("Error : action should be indent or detect. Nothing has been done")