#! /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"