Indent src/pslint.py with tabs

This commit is contained in:
Tim Rühsen 2016-02-02 22:20:58 +01:00
parent 98aed19c3a
commit bd70c79c18
1 changed files with 114 additions and 114 deletions

View File

@ -31,155 +31,155 @@ warnings = 0
errors = 0 errors = 0
def warning(msg): def warning(msg):
global warnings, line, nline global warnings, line, nline
print('%d: warning: %s: \'%s\'' % (nline, msg, line)) print('%d: warning: %s: \'%s\'' % (nline, msg, line))
warnings += 1 warnings += 1
def error(msg): def error(msg):
global errors, line, nline global errors, line, nline
print('%d: error: %s: \'%s\'' % (nline, msg, line)) print('%d: error: %s: \'%s\'' % (nline, msg, line))
errors += 1 errors += 1
def lint_psl(infile): def lint_psl(infile):
"""Parses PSL file and extract strings and return code""" """Parses PSL file and extract strings and return code"""
global line, nline global line, nline
PSL_FLAG_EXCEPTION = (1<<0) PSL_FLAG_EXCEPTION = (1<<0)
PSL_FLAG_WILDCARD = (1<<1) PSL_FLAG_WILDCARD = (1<<1)
PSL_FLAG_ICANN = (1<<2) # entry of ICANN section PSL_FLAG_ICANN = (1<<2) # entry of ICANN section
PSL_FLAG_PRIVATE = (1<<3) # entry of PRIVATE section PSL_FLAG_PRIVATE = (1<<3) # entry of PRIVATE section
PSL_FLAG_PLAIN = (1<<4) #just used for PSL syntax checking PSL_FLAG_PLAIN = (1<<4) #just used for PSL syntax checking
psl = {} psl = {}
section = 0 section = 0
lines = [line.strip('\r\n') for line in infile] lines = [line.strip('\r\n') for line in infile]
for line in lines: for line in lines:
nline += 1 nline += 1
# check for leadind/trailing whitespace # check for leadind/trailing whitespace
stripped = line.strip() stripped = line.strip()
if stripped != line: if stripped != line:
warning('Leading/Trailing whitespace') warning('Leading/Trailing whitespace')
line = stripped line = stripped
# empty line # empty line
if not line: if not line:
continue continue
# check for section begin/end # check for section begin/end
if line[0:2] == "//": if line[0:2] == "//":
if section == 0: if section == 0:
if line == "// ===BEGIN ICANN DOMAINS===": if line == "// ===BEGIN ICANN DOMAINS===":
section = PSL_FLAG_ICANN section = PSL_FLAG_ICANN
elif line == "// ===BEGIN PRIVATE DOMAINS===": elif line == "// ===BEGIN PRIVATE DOMAINS===":
section = PSL_FLAG_PRIVATE section = PSL_FLAG_PRIVATE
elif line[3:8] == "===BEGIN": elif line[3:8] == "===BEGIN":
error('Unexpected begin of unknown section') error('Unexpected begin of unknown section')
elif line[3:6] == "===END": elif line[3:6] == "===END":
error('End of section without previous begin') error('End of section without previous begin')
elif section == PSL_FLAG_ICANN: elif section == PSL_FLAG_ICANN:
if line == "// ===END ICANN DOMAINS===": if line == "// ===END ICANN DOMAINS===":
section = 0 section = 0
elif line[3:8] == "===BEGIN": elif line[3:8] == "===BEGIN":
error('Unexpected begin of section: ') error('Unexpected begin of section: ')
elif line[3:6] == "===END": elif line[3:6] == "===END":
error('Unexpected end of section') error('Unexpected end of section')
elif section == PSL_FLAG_PRIVATE: elif section == PSL_FLAG_PRIVATE:
if line == "// ===END ICANN DOMAINS===": if line == "// ===END ICANN DOMAINS===":
section = 0 section = 0
elif line[3:8] == "===BEGIN": elif line[3:8] == "===BEGIN":
error('Unexpected begin of section') error('Unexpected begin of section')
elif line[3:6] == "===END": elif line[3:6] == "===END":
error('Unexpected end of section') error('Unexpected end of section')
continue # processing of comments ends here continue # processing of comments ends here
# No rule must be outside of a section # No rule must be outside of a section
if section == 0: if section == 0:
error('Rule outside of section') error('Rule outside of section')
# decode UTF-8 input into unicode, needed only for python 2.x # decode UTF-8 input into unicode, needed only for python 2.x
if sys.version_info[0] < 3: if sys.version_info[0] < 3:
line = line.decode('utf-8') line = line.decode('utf-8')
# each rule must be lowercase (or more exactly: not uppercase and not titlecase) # each rule must be lowercase (or more exactly: not uppercase and not titlecase)
if line != line.lower(): if line != line.lower():
error('Rule must be lowercase') error('Rule must be lowercase')
# strip leading wildcards # strip leading wildcards
flags = 0 flags = 0
# while line[0:2] == '*.': # while line[0:2] == '*.':
if line[0:2] == '*.': if line[0:2] == '*.':
flags = PSL_FLAG_WILDCARD | PSL_FLAG_PLAIN | section flags = PSL_FLAG_WILDCARD | PSL_FLAG_PLAIN | section
line = line[2:] line = line[2:]
if line[0] == '!': if line[0] == '!':
flags = PSL_FLAG_EXCEPTION | section flags = PSL_FLAG_EXCEPTION | section
line = line[1:] line = line[1:]
# wildcard and exception must not combine # wildcard and exception must not combine
if flags & PSL_FLAG_WILDCARD and flags & PSL_FLAG_EXCEPTION: if flags & PSL_FLAG_WILDCARD and flags & PSL_FLAG_EXCEPTION:
error('Combination of wildcard and exception') error('Combination of wildcard and exception')
labels = line.split('.') labels = line.split('.')
for label in labels: for label in labels:
if not label: if not label:
error('Leading/trailing or multiple dot') error('Leading/trailing or multiple dot')
continue continue
if label[0:4] == 'xn--': if label[0:4] == 'xn--':
error('Punycode found') error('Punycode found')
continue continue
if '--' in label: if '--' in label:
error('Double minus found') error('Double minus found')
continue continue
# allowed are a-z,0-9,- and unicode >= 128 (maybe that can be finetuned a bit !?) # allowed are a-z,0-9,- and unicode >= 128 (maybe that can be finetuned a bit !?)
for c in label: for c in label:
if not c.isalnum() and c != '-' and ord(c) < 128: if not c.isalnum() and c != '-' and ord(c) < 128:
error('Illegal character') error('Illegal character')
break break
if line in psl: if line in psl:
"""Found existing entry: """Found existing entry:
Combination of exception and plain rule is ambiguous Combination of exception and plain rule is ambiguous
!foo.bar !foo.bar
foo.bar foo.bar
Allowed: Allowed:
!foo.bar + *.foo.bar !foo.bar + *.foo.bar
foo.bar + *.foo.bar foo.bar + *.foo.bar
""" """
error('Found doublette/ambiguity (previous line was %d)' % psl[line]) error('Found doublette/ambiguity (previous line was %d)' % psl[line])
continue continue
psl[line] = nline psl[line] = nline
def usage(): def usage():
"""Prints the usage""" """Prints the usage"""
print('usage: %s PSLfile' % sys.argv[0]) print('usage: %s PSLfile' % sys.argv[0])
print('or %s - # To read PSL from STDIN' % sys.argv[0]) print('or %s - # To read PSL from STDIN' % sys.argv[0])
exit(1) exit(1)
def main(): def main():
"""Check syntax of a PSL file""" """Check syntax of a PSL file"""
if len(sys.argv) < 2: if len(sys.argv) < 2:
usage() usage()
if sys.argv[-1] == '-': if sys.argv[-1] == '-':
lint_psl(sys.stdin) lint_psl(sys.stdin)
else: else:
with open(sys.argv[-1], 'r') as infile: with open(sys.argv[-1], 'r') as infile:
lint_psl(infile) lint_psl(infile)
return errors != 0 return errors != 0
if __name__ == '__main__': if __name__ == '__main__':
sys.exit(main()) sys.exit(main())