digitalmars.D.bugs - [Issue 8729] New: parse!bool does not work correctly
- d-bugmail puremagic.com (77/77) Sep 26 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8729
- d-bugmail puremagic.com (27/102) Sep 26 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8729
- d-bugmail puremagic.com (26/107) Sep 26 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8729
- d-bugmail puremagic.com (27/27) Sep 26 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8729
- d-bugmail puremagic.com (11/86) Sep 27 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8729
- d-bugmail puremagic.com (11/13) Sep 27 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8729
- d-bugmail puremagic.com (11/11) Oct 04 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8729
- d-bugmail puremagic.com (9/9) Oct 04 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8729
http://d.puremagic.com/issues/show_bug.cgi?id=8729 Summary: parse!bool does not work correctly Product: D Version: unspecified Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: Phobos AssignedTo: nobody puremagic.com ReportedBy: jmdavisProg gmx.com --- Comment #0 from Jonathan M Davis <jmdavisProg gmx.com> 2012-09-26 10:29:46 PDT --- This code import std.conv; import std.stdio; void main() { auto str = "123 456.7 false"; auto i = parse!int(str); auto d = parse!double(str); auto b = parse!bool(str); assert(i == 123); assert(d == 456.7); assert(b == false); } results in this exception when you run it std.conv.ConvException std/conv.d(2654): Can't parse string: bool should be case-insensive 'true' or 'false' ---------------- ./q(bool std.conv.parse!(bool, immutable(char)[]).parse(ref immutable(char)[])+0x183) [0x43867b] ./q(_Dmain+0x42) [0x430ec2] ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(main+0xd1) [0x43ab45] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7fd238fc1725] ---------------- If you change it to import std.conv; import std.stdio; void main() { auto str = "false 123 456.7"; auto b = parse!bool(str); auto i = parse!int(str); auto d = parse!double(str); assert(i == 123); assert(d == 456.7); assert(b == false); } you get std.conv.ConvException std/conv.d(1771): Unexpected ' ' when converting from type string to type int ---------------- ./q(int std.conv.parse!(int, immutable(char)[]).parse(ref immutable(char)[])+0x1b8) [0x431984] ./q(_Dmain+0x33) [0x430eb3] ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(main+0xd1) [0x43ab45] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7f1286cc0725] ---------------- Just parsing out bool when it's first and then parsing _nothing_ else works, but it seems like parsing it under any other circumstances fails (from what I can tell anyway). -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 26 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8729 monarchdodra gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |monarchdodra gmail.com --- Comment #1 from monarchdodra gmail.com 2012-09-26 13:48:08 PDT --- (In reply to comment #0)This code import std.conv; import std.stdio; void main() { auto str = "123 456.7 false"; auto i = parse!int(str); auto d = parse!double(str); auto b = parse!bool(str); assert(i == 123); assert(d == 456.7); assert(b == false); } results in this exception when you run it std.conv.ConvException std/conv.d(2654): Can't parse string: bool should be case-insensive 'true' or 'false' ---------------- ./q(bool std.conv.parse!(bool, immutable(char)[]).parse(ref immutable(char)[])+0x183) [0x43867b] ./q(_Dmain+0x42) [0x430ec2] ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(main+0xd1) [0x43ab45] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7fd238fc1725] ---------------- If you change it to import std.conv; import std.stdio; void main() { auto str = "false 123 456.7"; auto b = parse!bool(str); auto i = parse!int(str); auto d = parse!double(str); assert(i == 123); assert(d == 456.7); assert(b == false); } you get std.conv.ConvException std/conv.d(1771): Unexpected ' ' when converting from type string to type int ---------------- ./q(int std.conv.parse!(int, immutable(char)[]).parse(ref immutable(char)[])+0x1b8) [0x431984] ./q(_Dmain+0x33) [0x430eb3] ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(main+0xd1) [0x43ab45] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7f1286cc0725] ---------------- Just parsing out bool when it's first and then parsing _nothing_ else works, but it seems like parsing it under any other circumstances fails (from what I can tell anyway).Sounds like the implementation is looking for a literal "true" or "false", and is forgetting to skip leading ws. This works: import std.conv; import std.stdio; void main() { auto str = "123 456.7 false"; auto i = parse!int(str); auto d = parse!double(str); str = str[1..$]; //manually skip ws. auto b = parse!bool(str); assert(i == 123); assert(d == 456.7); assert(b == false); } I can look into it for next week, unless somebody else solves it by then. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 26 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8729 --- Comment #2 from monarchdodra gmail.com 2012-09-26 13:52:15 PDT --- (In reply to comment #1)(In reply to comment #0)Bigtime! // string to bool conversions Target parse(Target, Source)(ref Source s) if (isSomeString!Source && !is(Source == enum) && is(Unqual!Target == bool)) { if (s.length >= 4 && icmp(s[0 .. 4], "true")==0) { s = s[4 .. $]; return true; } if (s.length >= 5 && icmp(s[0 .. 5], "false")==0) { s = s[5 .. $]; return false; } parseError("bool should be case-insensive 'true' or 'false'"); assert(0); } I got this. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------This code import std.conv; import std.stdio; void main() { auto str = "123 456.7 false"; auto i = parse!int(str); auto d = parse!double(str); auto b = parse!bool(str); assert(i == 123); assert(d == 456.7); assert(b == false); } results in this exception when you run it std.conv.ConvException std/conv.d(2654): Can't parse string: bool should be case-insensive 'true' or 'false' ---------------- ./q(bool std.conv.parse!(bool, immutable(char)[]).parse(ref immutable(char)[])+0x183) [0x43867b] ./q(_Dmain+0x42) [0x430ec2] ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(main+0xd1) [0x43ab45] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7fd238fc1725] ---------------- If you change it to import std.conv; import std.stdio; void main() { auto str = "false 123 456.7"; auto b = parse!bool(str); auto i = parse!int(str); auto d = parse!double(str); assert(i == 123); assert(d == 456.7); assert(b == false); } you get std.conv.ConvException std/conv.d(1771): Unexpected ' ' when converting from type string to type int ---------------- ./q(int std.conv.parse!(int, immutable(char)[]).parse(ref immutable(char)[])+0x1b8) [0x431984] ./q(_Dmain+0x33) [0x430eb3] ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(main+0xd1) [0x43ab45] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7f1286cc0725] ---------------- Just parsing out bool when it's first and then parsing _nothing_ else works, but it seems like parsing it under any other circumstances fails (from what I can tell anyway).Sounds like the implementation is looking for a literal "true" or "false", and is forgetting to skip leading ws. [SNIP]
Sep 26 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8729 --- Comment #3 from monarchdodra gmail.com 2012-09-26 14:36:53 PDT --- FYI, parse!int also has the same problem. Only floating point types seem to behave correctly: import std.conv; import std.stdio; void main() { auto str = "456.7 123"; auto d = parse!double(str); auto i = parse!int(str); assert(d == 456.7); assert(i == 123); } On the split side, to! seems to parse things it should actually be rejecting: import std.conv; import std.stdio; void main() { auto str = "456.7 123"; auto d = to!double(" 456.7"); //Passes, but shouldn't auto i = to!int(" 123"); //Correctly throws } Just logging here the bugs I find, still on this. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 26 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8729 monarchdodra gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED --- Comment #4 from monarchdodra gmail.com 2012-09-27 13:40:52 PDT --- (In reply to comment #0)This code import std.conv; import std.stdio; void main() { auto str = "123 456.7 false"; auto i = parse!int(str); auto d = parse!double(str); auto b = parse!bool(str); assert(i == 123); assert(d == 456.7); assert(b == false); } results in this exception when you run it std.conv.ConvException std/conv.d(2654): Can't parse string: bool should be case-insensive 'true' or 'false' ---------------- ./q(bool std.conv.parse!(bool, immutable(char)[]).parse(ref immutable(char)[])+0x183) [0x43867b] ./q(_Dmain+0x42) [0x430ec2] ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(main+0xd1) [0x43ab45] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7fd238fc1725] ---------------- If you change it to import std.conv; import std.stdio; void main() { auto str = "false 123 456.7"; auto b = parse!bool(str); auto i = parse!int(str); auto d = parse!double(str); assert(i == 123); assert(d == 456.7); assert(b == false); } you get std.conv.ConvException std/conv.d(1771): Unexpected ' ' when converting from type string to type int ---------------- ./q(int std.conv.parse!(int, immutable(char)[]).parse(ref immutable(char)[])+0x1b8) [0x431984] ./q(_Dmain+0x33) [0x430eb3] ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287] ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x43abba] ./q(main+0xd1) [0x43ab45] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7f1286cc0725] ---------------- Just parsing out bool when it's first and then parsing _nothing_ else works, but it seems like parsing it under any other circumstances fails (from what I can tell anyway).https://github.com/D-Programming-Language/phobos/pull/817 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 27 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8729 --- Comment #5 from Kenji Hara <k.hara.pg gmail.com> 2012-09-27 18:29:09 PDT --- (In reply to comment #3)FYI, parse!int also has the same problem. Only floating point types seem to behave correctly:NO, this is just a bug in `T parse!T(input) if (isFloatingPoint!T)`. The parse function family should not skip leading white spaces implicitly. I think it is simple, no special cases, and flexible design. See also my github comment to the pull#817: https://github.com/D-Programming-Language/phobos/pull/817#issuecomment-8960280 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 27 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8729 --- Comment #6 from github-bugzilla puremagic.com 2012-10-04 09:33:06 PDT --- Commits pushed to master at https://github.com/D-Programming-Language/phobos https://github.com/D-Programming-Language/phobos/commit/dce93b188140157732898da3d03fcfe90d32e555 fix issue 8729 do not skip leading ws https://github.com/D-Programming-Language/phobos/commit/25c4328aef80230596c90bebb6848f5e2f228261 Merge pull request #833 from monarchdodra/bug8729 fix issue 8729 do not skip leading ws in parse (again) -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 04 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8729 Jonathan M Davis <jmdavisProg gmx.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|ASSIGNED |RESOLVED Resolution| |FIXED -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 04 2012