Files
littlefs/scripts/dbgerr.py
Christopher Haster 55ea13b994 scripts: Reverted del to resolve shadowed builtins
I don't know how I completely missed that this doesn't actually work!

Using del _does_ work in Python's repl, but it makes sense the repl may
differ from actual function execution in this case.

The problem is Python still thinks the relevant builtin is a local
variables after deletion, raising an UnboundLocalError instead of
performing a global lookup. In theory this would work if the variable
could be made global, but since global/nonlocal statements are lifted,
Python complains with "SyntaxError: name 'list' is parameter and
global".

And that's A-Ok! Intentionally shadowing language builtins already puts
this code deep into ugly hacks territory.
2025-05-15 14:10:42 -05:00

111 lines
3.6 KiB
Python
Executable File

#!/usr/bin/env python3
# prevent local imports
if __name__ == "__main__":
__import__('sys').path.pop(0)
ERRS = [
('OK', 0, "No error" ),
('UNKNOWN', -1, "Unknown error" ),
('INVAL', -22, "Invalid parameter" ),
('NOTSUP', -95, "Operation not supported" ),
('IO', -5, "Error during device operation" ),
('CORRUPT', -84, "Corrupted" ),
('NOENT', -2, "No directory entry" ),
('EXIST', -17, "Entry already exists" ),
('NOTDIR', -20, "Entry is not a dir" ),
('ISDIR', -21, "Entry is a dir" ),
('NOTEMPTY', -39, "Dir is not empty" ),
('FBIG', -27, "File too large" ),
('NOSPC', -28, "No space left on device" ),
('NOMEM', -12, "No more memory available" ),
('NOATTR', -61, "No data/attr available" ),
('NAMETOOLONG', -36, "File name too long" ),
('RANGE', -34, "Result out of range" ),
]
def main(errs, *,
list=False):
import builtins
list_, list = list, builtins.list
lines = []
# list all known error codes
if list_:
for n, e, h in ERRS:
lines.append(('LFS_ERR_'+n, str(e), h))
# find these errors
else:
def find_err(err):
# find by LFS_ERR_+name
for n, e, h in ERRS:
if 'LFS_ERR_'+n == err.upper():
return n, e, h
# find by ERR_+name
for n, e, h in ERRS:
if 'ERR_'+n == err.upper():
return n, e, h
# find by name
for n, e, h in ERRS:
if n == err.upper():
return n, e, h
# find by E+name
for n, e, h in ERRS:
if 'E'+n == err.upper():
return n, e, h
try:
# find by err code
for n, e, h in ERRS:
if e == int(err, 0):
return n, e, h
# find by negated err code
for n, e, h in ERRS:
if e == -int(err, 0):
return n, e, h
except ValueError:
pass
# not found
raise KeyError(err)
for err in errs:
try:
n, e, h = find_err(err)
lines.append(('LFS_ERR_'+n, str(e), h))
except KeyError:
lines.append(('?', err, 'Unknown err code'))
# first find widths
w = [0, 0]
for l in lines:
w[0] = max(w[0], len(l[0]))
w[1] = max(w[1], len(l[1]))
# then print results
for l in lines:
print('%-*s %-*s %s' % (
w[0], l[0],
w[1], l[1],
l[2]))
if __name__ == "__main__":
import argparse
import sys
parser = argparse.ArgumentParser(
description="Decode littlefs error codes.",
allow_abbrev=False)
parser.add_argument(
'errs',
nargs='*',
help="Error codes or error names to decode.")
parser.add_argument(
'-l', '--list',
action='store_true',
help="List all known error codes.")
sys.exit(main(**{k: v
for k, v in vars(parser.parse_intermixed_args()).items()
if v is not None}))