Bug 3371 – regexp behavior in console and win32 are different
Status
RESOLVED
Resolution
INVALID
Severity
normal
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2009-10-07T05:06:00Z
Last change time
2015-06-09T01:26:48Z
Assigned to
nobody
Creator
ldmc
Comments
Comment #0 by ldmc — 2009-10-07T05:06:50Z
my win32 program has been driving me nuts until I realized that the following code:
/* --- console code --- */
import std.regexp;
import std.stdio;
void main() {
auto r=search("abcdef","c");
writefln(r[0]);
}
/* --- end of console code --- */
outputs "c" on the console. but the following win32 equivalent:
/* --- windows code --- */
import core.runtime;
import std.regexp;
import std.c.windows.windows;
extern(Windows) void WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {
void exceptionHandler(Throwable e) {
throw e;
}
try {
Runtime.initialize(&exceptionHandler);
auto r=search("abcdef","c");
MessageBoxA(cast(HANDLE)0,cast(char*)r[0],"Alert",0);
Runtime.terminate(&exceptionHandler);
}
catch(Object o) {
MessageBoxA(cast(HANDLE)0,cast(LPSTR)o.toString(),"Alert",0);
}
}
/* --- end of windows code --- */
results in "cdef"! also, the compiled win32 program - without the exception handling code - causes windows to crash.
Comment #1 by jarrett.billingsley — 2009-10-07T06:16:54Z
Uh, no. Windows uses 0-terminated strings, D does not. All you're seeing when you output the result of the search with the message box is Windows stupidly reading until it hits a nul character (which, thankfully, D inserts at the end of string literals, or else you'd probably be getting a segfault here). You should be using toStringz to convert any D strings to C strings.