Starting the newer version ; currently, preprocessor directives are managed
This commit is contained in:
parent
28f6dfa2aa
commit
98095ca4ed
27
authors.py
Executable file
27
authors.py
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
from report import perr
|
||||||
|
import re
|
||||||
|
|
||||||
|
def checkFile(path, opt):
|
||||||
|
num = 0
|
||||||
|
with open(path, "r") as fp:
|
||||||
|
content = fp.read()
|
||||||
|
|
||||||
|
if len(content) < 1 or content[len(content)-1] != '\n':
|
||||||
|
perr(path, "No empty line at the end of file", -1)
|
||||||
|
|
||||||
|
if 'authors-prefix' in opt:
|
||||||
|
prefix = opt['authors-prefix'].replace("*", "\*")
|
||||||
|
else:
|
||||||
|
prefix = "\*"
|
||||||
|
|
||||||
|
lines = content.split('\n')
|
||||||
|
for line in lines:
|
||||||
|
num += 1
|
||||||
|
if len(line) <= 0 and num != len(lines):
|
||||||
|
perr(path, "Empty line", num)
|
||||||
|
if re.match("^(.{" + "{0}".format(len(prefix.replace("\\", ""))) + "} [a-z][a-z-]{,5}_[a-z0-9])?$", line) is None:
|
||||||
|
perr(path, "Bad author format", num)
|
||||||
|
elif re.match("^(" + prefix + " [a-z][a-z-]{,5}_[a-z0-9])?$", line) is None:
|
||||||
|
perr(path, "Bad line prefix (expected: {0})".format(prefix.replace("\\", "")), num)
|
123
c.py
Executable file
123
c.py
Executable file
@ -0,0 +1,123 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import re
|
||||||
|
from report import perr
|
||||||
|
from common import checkTrailingWhitespace
|
||||||
|
from common import check80cols
|
||||||
|
|
||||||
|
def validateString(path, content, start, lign):
|
||||||
|
current = start + 1
|
||||||
|
contentSize = len(content)
|
||||||
|
while current < contentSize and (content[current] != '"' or content[current - 1] == '\\'):
|
||||||
|
if content[current] == '\n':
|
||||||
|
perr(path, "Wrap in string", lign)
|
||||||
|
|
||||||
|
current += 1
|
||||||
|
|
||||||
|
return (current - start)
|
||||||
|
|
||||||
|
|
||||||
|
def validatePreprocDirective(path, content, start, start_lign, states):
|
||||||
|
lign = start_lign
|
||||||
|
current = start
|
||||||
|
contentSize = len(content)
|
||||||
|
cOnLine = 1
|
||||||
|
eolAlign = -1 #Alignement de la fin de ligne
|
||||||
|
state = 0
|
||||||
|
directive = "" #The name of the directive
|
||||||
|
content = "" #The rest of the line
|
||||||
|
ident = 0;
|
||||||
|
while current < contentSize and (content[current] != '\n' or content[current - 1] == '\\'):
|
||||||
|
current += 1
|
||||||
|
if content[current] == '\n' and content[current - 1] == '\\':
|
||||||
|
print "new line"
|
||||||
|
lign += 1
|
||||||
|
cOnLine = 0
|
||||||
|
if content[current - 1] == '\t':
|
||||||
|
cOnLine += 7
|
||||||
|
else:
|
||||||
|
cOnLine += 1
|
||||||
|
|
||||||
|
#Check indentation
|
||||||
|
if state == 0:
|
||||||
|
if content[current] != ' ' and content[current] != '\t':
|
||||||
|
state += 1
|
||||||
|
ident = current - start - 1
|
||||||
|
|
||||||
|
#Wrap
|
||||||
|
if content[current] == '\\':
|
||||||
|
print '\\'
|
||||||
|
if eolAlign <= 0:
|
||||||
|
eolAlign = cOnLine
|
||||||
|
elif cOnLine != eolAlign:
|
||||||
|
perr(path, "Bad endline", lign)
|
||||||
|
print '\\'
|
||||||
|
|
||||||
|
#Spaces state
|
||||||
|
if state == 2 or state == 4:
|
||||||
|
if content[current] != ' ' and content[current] != '\t':
|
||||||
|
state += 1
|
||||||
|
|
||||||
|
#Searching the directive name
|
||||||
|
if state == 1:
|
||||||
|
if content[current] != ' ' and content[current] != '\t':
|
||||||
|
directive += content[current]
|
||||||
|
else:
|
||||||
|
state += 1
|
||||||
|
|
||||||
|
if directive.find("endif") == 0:
|
||||||
|
states['preproc-ident'] -= 1
|
||||||
|
|
||||||
|
if ident != states['preproc-ident']:
|
||||||
|
perr(path, "Bad preprocessor indentation (expected: {0}, real: {1})".format(states['preproc-ident'], (ident)), lign)
|
||||||
|
|
||||||
|
if directive.find("if") == 0:
|
||||||
|
states['preproc-ident'] += 1
|
||||||
|
|
||||||
|
eaten = { 'chars': current - start - 1, 'lines': lign, 'col': cOnLine }
|
||||||
|
return eaten
|
||||||
|
|
||||||
|
def checkFile(path, opt):
|
||||||
|
numLign = 1
|
||||||
|
with open(path, "r") as fp:
|
||||||
|
content = fp.read()
|
||||||
|
current = 0;
|
||||||
|
cOnLine = 0
|
||||||
|
last_nblank = 0
|
||||||
|
contentSize = len(content)
|
||||||
|
states = {
|
||||||
|
'preproc-ident': 0 #Niveau d'identation dans le preprocesseur
|
||||||
|
}
|
||||||
|
|
||||||
|
while current < contentSize:
|
||||||
|
if content[current] == '\n':
|
||||||
|
numLign += 1
|
||||||
|
last_nblank = 0
|
||||||
|
cOnLine = -1
|
||||||
|
|
||||||
|
#Preprocessor line
|
||||||
|
if last_nblank == cOnLine and content[current] == '#':
|
||||||
|
if cOnLine != 0:
|
||||||
|
perr(path, "Preprocessor directive mark not on the first column", numLign)
|
||||||
|
eaten = validatePreprocDirective(path, content, current, numLign, states)
|
||||||
|
current += eaten['chars']
|
||||||
|
cOnLine += eaten['col']
|
||||||
|
numLign = eaten['lines']
|
||||||
|
|
||||||
|
#String
|
||||||
|
elif content[current] == '"':
|
||||||
|
eatenChar = validateString(path, content, current, numLign)
|
||||||
|
current += eatenChar
|
||||||
|
cOnLine += eatenChar
|
||||||
|
|
||||||
|
|
||||||
|
if last_nblank == cOnLine and content[current] == ' ' or content[current] == '\t':
|
||||||
|
last_nblank += 1
|
||||||
|
current += 1
|
||||||
|
cOnLine += 1
|
||||||
|
|
||||||
|
print("Ce fichier contient {0} lignes".format(numLign + 1))
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
checkFile(sys.argv[1], dict())
|
24
common.py
Normal file
24
common.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import re
|
||||||
|
from report import perr
|
||||||
|
|
||||||
|
def checkTrailingWhitespace(path, line, num):
|
||||||
|
if len(line) > 1 and (line[len(line)-1] == ' ' or line[len(line)-1] == '\t'):
|
||||||
|
perr(path, "Trailing whitespace", num)
|
||||||
|
|
||||||
|
def check80cols(path, line, num):
|
||||||
|
if len(line) > 79:
|
||||||
|
printError(path, "80 columns exceeded", num)
|
||||||
|
|
||||||
|
|
||||||
|
def checkFile(path, opt):
|
||||||
|
num = 0
|
||||||
|
with open(path, "r") as fp:
|
||||||
|
lines = fp.read().split('\n')
|
||||||
|
for line in lines:
|
||||||
|
num += 1
|
||||||
|
line = line.replace(" ", " ")
|
||||||
|
|
||||||
|
checkTrailingWhitespace(path, line, num)
|
||||||
|
check80cols(path, line, num)
|
@ -4,13 +4,6 @@ import sys
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
||||||
def onSignal(signal, frame):
|
|
||||||
print("Bye!")
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
signal.signal(signal.SIGINT, onSignal)
|
|
||||||
|
|
||||||
|
|
||||||
if len(sys.argv) < 2:
|
if len(sys.argv) < 2:
|
||||||
print("Usage:\t{0} FILE...".format(sys.argv[0]))
|
print("Usage:\t{0} FILE...".format(sys.argv[0]))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@ -66,14 +59,6 @@ def checkDir(path):
|
|||||||
printError(path + '/' + basename, "Hidden file")
|
printError(path + '/' + basename, "Hidden file")
|
||||||
checkFile(path + '/' + f)
|
checkFile(path + '/' + f)
|
||||||
|
|
||||||
def check80cols(path, line, num):
|
|
||||||
if len(line) > 79:
|
|
||||||
printError(path, "80 columns exceeded", num)
|
|
||||||
|
|
||||||
def checkTrailingWhitespace(path, line, num):
|
|
||||||
if len(line) > 1 and (line[len(line)-1] == ' ' or line[len(line)-1] == '\t'):
|
|
||||||
printError(path, "Trailing whitespace", num)
|
|
||||||
|
|
||||||
def checkCComment(path, line, num):
|
def checkCComment(path, line, num):
|
||||||
txt = line.strip()
|
txt = line.strip()
|
||||||
if re.match("\*/", txt) is not None:
|
if re.match("\*/", txt) is not None:
|
||||||
@ -164,43 +149,6 @@ def checkCFile(path):
|
|||||||
else:
|
else:
|
||||||
typeBlock = checkCLang(path, line, num)
|
typeBlock = checkCLang(path, line, num)
|
||||||
|
|
||||||
def checkSHFile(path):
|
|
||||||
num = 0
|
|
||||||
with open(path, "r") as fp:
|
|
||||||
lines = fp.read().split('\n')
|
|
||||||
for line in lines:
|
|
||||||
num += 1
|
|
||||||
line = line.replace(" ", " ")
|
|
||||||
|
|
||||||
check80cols(path, line, num)
|
|
||||||
checkTrailingWhitespace(path, line, num)
|
|
||||||
|
|
||||||
def checkOtherFile(path):
|
|
||||||
num = 0
|
|
||||||
with open(path, "r") as fp:
|
|
||||||
lines = fp.read().split('\n')
|
|
||||||
for line in lines:
|
|
||||||
num += 1
|
|
||||||
line = line.replace(" ", " ")
|
|
||||||
|
|
||||||
checkTrailingWhitespace(path, line, num)
|
|
||||||
|
|
||||||
def checkAuthors(path):
|
|
||||||
num = 0
|
|
||||||
with open(path, "r") as fp:
|
|
||||||
fullContent = fp.read()
|
|
||||||
|
|
||||||
if fullContent < 1 or fullContent[len(fullContent)-1] != '\n':
|
|
||||||
printError(path, "No empty line at the end of file")
|
|
||||||
|
|
||||||
lines = fullContent.split('\n')
|
|
||||||
for line in lines:
|
|
||||||
num += 1
|
|
||||||
checkTrailingWhitespace(path, line, num)
|
|
||||||
if re.match("^(\* [a-z][a-z-]{,5}_[a-z0-9])?$", line) is None:
|
|
||||||
printError(path, "Bad author format", num)
|
|
||||||
|
|
||||||
|
|
||||||
#Define some constants
|
#Define some constants
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user