Skip to content

Commit d0cfdd9

Browse files
authored
Merge pull request #195 from iraf-community/issue194
Fix parsing integers with defined length
2 parents bd1d553 + 04d77c4 commit d0cfdd9

File tree

2 files changed

+19
-33
lines changed

2 files changed

+19
-33
lines changed

pyraf/scanf.py

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,6 @@
4040

4141
DEBUG = False
4242

43-
def sint(s):
44-
if s.startswith("0o"):
45-
return int(s[2:], 8)
46-
elif s.startswith("0x"):
47-
return int(s[2:], 16)
48-
else:
49-
return int(s)
50-
5143
# As you can probably see it is relatively easy to add more format types.
5244
# Make sure you add a second entry for each new item that adds the extra
5345
# few characters needed to handle the field ommision.
@@ -68,32 +60,26 @@ def sint(s):
6860
(r"%\[([^\]]+)\]", r"([%s]+)", lambda x:x),
6961
(r"%\*\[([^\]]+)\]", r"(?:[%s]+)", None),
7062

71-
(r"%l?[dil]", r"([+-]?(?:0o[0-7]+|0x[\da-fA-F]+|\d+))", sint),
72-
(r"%\*l?[dil]", r"(?:[+-]?0o[0-7]+|0x[\da-fA-F]+|\d+)", None),
73-
74-
(r"%(\d+)l?[dil]", r"([+-]?(?:0o[0-7]+|0x[\da-fA-F]+|\d+)", sint),
75-
(r"%\*(\d+)l?[dil]", r"(?:[+-]?(?:0o[0-7]+|0x[\da-fA-F]+|\d+)", None),
76-
77-
(r"%l?u", r"(\d+)", int),
78-
(r"%\*l?u", r"(?:\d+)", None),
63+
(r"%l?d", r"([+-]?\d+)", int),
64+
(r"%\*l?d", r"(?:[+-]?\d+)", None),
7965

80-
(r"%(\d+)l?u", r"(\d{1,%s})", int),
81-
(r"%\*(\d+)l?u", r"(?:\d{1,%s})", None),
66+
(r"%(\d+)l?d", r"([+-]?\d{1,%s})", int),
67+
(r"%\*(\d+)l?d", r"(?:[+-]?\d{1,%s})", None),
8268

83-
(r"%[fgeE]", r"([-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?)", float),
84-
(r"%\*[fgeE]", r"(?:[-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?)", None),
69+
(r"%[fge]", r"([-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?)", float),
70+
(r"%\*[fge]", r"(?:[-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?)", None),
8571

86-
(r"%(\d+)[fgeE]", r"([-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?)", float),
87-
(r"%\*(\d+)[fgeE]", r"(?:[-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?)", None),
72+
(r"%(\d+)[fge]", r"([-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?)", float),
73+
(r"%\*(\d+)[fge]", r"(?:[-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?)", None),
8874

89-
(r"%l?[xX]", r"((?:0[xX])?[\dA-Za-f]+)", lambda x: int(x, 16)),
90-
(r"%\*l?[xX]", r"(?:(?:0[xX])?[\dA-Za-f]+)", None),
75+
(r"%l?x", r"([\dA-Za-f]+)", lambda x: int(x, 16)),
76+
(r"%\*l?x", r"[\dA-Za-f]+)", None),
9177

92-
(r"%(\d+)l?[xX]", r"((?:0[xX])?[\dA-Za-f]{1,%s})", lambda x: int(x, 16)),
93-
(r"%\*(\d+)l?[xX]", r"(?:(?:0[xX])?[\dA-Za-f]{1,%s})", None),
78+
(r"%(\d+)l?x", r"([\dA-Za-f]{1,%s})", lambda x: int(x, 16)),
79+
(r"%\*(\d+)l?x", r"[\dA-Za-f]{1,%s})", None),
9480

95-
(r"%l?o", r"([0-7]*)", lambda x:int(x, 8)),
96-
(r"%\*l?o", r"(?:[0-7]*)", None),
81+
(r"%l?o", r"([0-7]+)", lambda x:int(x, 8)),
82+
(r"%\*l?o", r"(?:[0-7]+)", None),
9783

9884
(r"%(\d+)l?o", r"([0-7]{1,%s})", lambda x: int(x, 8)),
9985
(r"%\*(\d+)l?o", r"(?:[0-7]{1,%s})", None),
@@ -161,11 +147,10 @@ def scanf(format, s=None, collapseWhitespace=True):
161147
%c Fixed width character string.
162148
%s String of non-whitespace characters with leading
163149
whitespace skipped.
164-
%d, %i, %l Signed integer (leading 0 => octal, 0x => hex).
150+
%d Signed integer
165151
%o Octal integer.
166-
%u Unsigned integer.
167152
%x Hexadecimal integer.
168-
%f, %g, %e Python float
153+
%f, %g, %e Float
169154
%[] Character scan set
170155
171156
scanf.scanf returns a tuple of found values or None if the format

pyraf/tests/test_cli.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,12 @@ def test_division(arg, expected, ecl_flag):
6060

6161
@pytest.mark.parametrize('arg,fmt,expected', [
6262
("seven 6 4.0 -7", "%s %d %g %d", ('seven', 6, 4.0, -7)), # aliveness
63-
("0 0xf2 0o23 095", "%d %d %d %d", (0, 0xf2, 0o23, 95)),
63+
("0 095", "%d %d", (0, 95)),
64+
("1234", "%2d%2d", (12,34)),
6465
("seven", "%d", None),
6566
("seven", "%c%3c%99c", ('s', 'eve', 'n')),
6667
("seven", "%[sev]", ('seve', )),
67-
("0xabc90", "%x", (0xabc90, )),
68+
("abc90 177", "%x %o", (0xabc90, 0o177)),
6869
])
6970
def test_scanf(arg, fmt, expected):
7071
"""A basic unit test that sscanf was built/imported correctly and

0 commit comments

Comments
 (0)