www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 8729] New: parse!bool does not work correctly

reply d-bugmail puremagic.com writes:
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



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
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8729


monarchdodra gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |monarchdodra gmail.com




 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
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8729






 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]
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: -------
Sep 26 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8729




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
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8729


monarchdodra gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED




 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
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8729





 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. 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
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8729




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


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
prev sibling parent d-bugmail puremagic.com writes:
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