Bontiv-Sourceer source code viewer
Root | Help
./norme-checker/norme++.py
#! /usr/bin/python

from argparse import ArgumentParser, FileType
import io
import re
import curses

def cleanline (line):
    posr = 0
    write = True
    maxi = len(line)
    ret = ""
    while posr < maxi:
        if line[posr] == '\\' and not write:
            posr += 1
        elif line[posr] == '"':
            write = not write
            ret += line[posr]
        elif write and line[posr] and line[posr]:
            ret += line[posr]
        posr += 1
    if write:
        return ret
    else:
        return line

def global_test(i, line):
    if re.search("  ", line) != None:
        if re.search("[^a-z \t]\t*  ", line) != None:
            print i,line,"\tdouble espace"
    if re.search(" $", line) != None:
        print i, line, "\t espace en fin de ligne"
    if line.find(" ;") != -1:
        if not re.match("[ \t]+;", line):
            print i,line,"\tespace pointvirgule"
    if line.find('+') != -1 and (line.find(' + ') == -1 and line.find(' += ') == -1 and line.find('++') == -1):
        print i,line,"\tplus colle"
    if re.search("([0-9]-[^>])|([^,=][ \t]*-[0-9])([^(]-[0-9])", line) != None:
        print i,line,"\tmoins colle"
#    if re.search('\*[0-9]', line) != None:
#        print i,line,"\tmultiplication colle"
#    if re.search("[^ \t]\*", line):
#        print i,line,"\tIl doit y avoir un espace avant *"
    if line.find('/') != -1 and (line.find(' / ') == -1 and line.find(' /= ') == -1):
        print i,line,"\tdivision colle"
    if line.find('%') != -1 and (line.find(' % ') == -1 and line.find(' %= ') == -1):
        print i,line,"\tmodulo colle"
    if line.find('( ') != -1:
        print i,line,"\tparenthese espace "
    if line.find(' )') != -1:
        print i,line,"\tespace parenthese"
    if line.find('=') != -1 and re.search(" [!=/*+%<>&-]?=[ \n]", line) == None:
        print i,line,"\tegal colle"
#    if line.find('return') != -1 and line.find('return (') == -1 and line.find('return;') == -1:
#        print i,line,"return sans parenthese"
    if line.find(' for(') != -1:
        print i,line,"for sans espace"
    if line.find(' while') != -1 and line.find('while (') == -1:
        print i,line,"while sans espace"
    if line.find('sizeof') != -1 and line.find('sizeof ') == -1:
        print i,line,"sizeof sans espace"
    if line.find(' if(') != -1:
        print i,line,"if sans espace"
    if line.find('{') != -1 and re.match("[ \t]*{\n", line) == None:
        print i,line,"\tAccolade doit etre sur une ligne a part"
    if line.find('}') != -1 and re.match("[ \t]*}(([ \t]+[se]_[a-zA-Z0-9]+;)|;)?\n", line) == None:
        print i,line,"\tAccolade doit etre sur une ligne a part"
    if re.search("#[ \t]*if[ \t]+0[ \t]*\n", line) != None:
        print i,line,"\tCode desactive."
#    if re.search("[a-zA-Z0-9_]+[ \t]+[*a-zA-Z0-9_]+[\t ]+\(", line) != None:
#        print i,line,"\tEspace en trop devant la parenthese"
    if line.find('union') != -1 and line.find('union ') == -1:
        print i,line,"union sans espace"
    if re.search("[a-zA-Z0-9_]+[ \t]+[*a-zA-Z0-9_]+[ \t]+=.*\(", line) != None:
        if line.find('for ') != -1:
            print i, line, "\tVariable initialisation error"
    if re.search("[a-zA-Z0-9_]+[ \t]+[a-zA-Z0-9_]+\(\)", line) != None:
        print i, line, "\tUnsafe function prototype"

    match = re.search("([A-Za-z_]+)\(", line)
    if (match != None):
        print i, line, "\tParenthese colle a la fonction", match.group(1)

def comment_test (i, line):
    if line != "*/\n" and line.find('**') != 0:
        print i,line,"Erreur de commentaire"

def check(args):
    for file in args.files:
        print file
        i = 0
        global nbline
        accolade = 0
        nbline = 0
        comment = False
        declaration = 0
        line = file.readline()
        while line != '':
            i += 1

            # 80 cols
            if len(line) > 80:
                print i, line, "\tplus de 80 colonnes"

            # Clean strings
            line = cleanline(line)
            line = re.sub('\'.*\'','\'\'', line)
            line = re.sub('//.*', '\n', line)
            line = re.sub('/\*.*\*/', '', line)
            line = re.sub('(#[ ]*include).*', '\1', line)

            #Test declarations
            if len(line) == 1:
                declaration = 0
            if declaration and accolade == 1 and re.match("[ \t]*[a-zA-Z0-9_-]+[ \t]+[\*a-zA-Z0-9_-]+( = [^;]+)?", line) == None and re.match("[ \t]*[}{];?", line) == None:
                if declaration > 1:
                    print i, line, "\tUne ligne est necessaire entre les declarations et le code", declaration, accolade
                declaration = 0
            if declaration:
                declaration = declaration + 1
            if accolade == 0 and line.count('{'):
                declaration = 1

            # Block operation
            accolade += line.count('{')
            accolade -= line.count('}')
            if accolade > 0 and len(line) != 1:
                nbline += 1
            elif len(line) != 1:
                nbline = 0
            if nbline > 51:
                print i, line, "trop de lignes dans la fonction"

            if re.match('/\*', line) != None:
                comment = True
            else:
                if comment:
                    comment_test(i, line)
                else:
                    global_test(i, line)

            if re.search('\*/', line) != None:
                comment = False
            line = file.readline()

parser = ArgumentParser(description='Check the norme in c')
parser.add_argument('files', nargs='+', type=FileType('r+'))
try:
    args = parser.parse_args()
    check(args)
except IOError:
    print "file doesn't exist"
Presented with Bontiv-Sourceer