I will use lng instead of long long:)
goto's are needed in the fromstr to make a faster and easier to read parser.
The nil value should be indeed lng_nil, i had changed that but did not
checked it in.
After debugging more, I saw that tostr is called twice and yes, I have
changed it to 0 in the process.. I didn't knew that tostr is called
twice for the same value, but now I know. I was surprised by that, but
now from your email I understand that you already know that and
apparently this is the correct behavior:)
I fixed it by indeed copying val to some temp variable.
Thank you very much.
lefteris
On Sun, Feb 1, 2009 at 1:55 PM, Sjoerd Mullender
There are several issues.
- Use lng instead of long long for the typedef. The Visual Studio compiler doesn't know long long. - You're using a lot of goto's... - The nil value for dtduration should be lng_nil, not int_nil.
But the real reason that it fails is that for some reason dtduration_tostr is called twice with the same argument, and the *second* time it is called, the value of *val == 0. That is because the *first* time it was called, you set it to 0 in the process of figuring out what string to produce. So the solution is probably to make a copy of *val into a local variable and change that instead of *val.
On 2009-02-01 13:03, Lefteris wrote:
The following behavior is strange to me, but I am not sure if it is a bug or I have done something wrong.
dayTimeDuration (dtduration) is defined in mil as:
.ATOM dtduration = lng; .FROMSTR = dtduration_fromstr; .TOSTR = dtduration_tostr; .END;
and in c as : typedef long long dtduration;
also .tostr has the following sign. int dtduration_tostr(str *buf, int *len, dtduration *val)
you can find all this in MonetDB4/src/modules/plain/monettime.mx
Now, if I do either: dtduration("P12DT1H").print() [dtduration]("P12DT1H").print()
I get the correct value printed. But if I create a BAT (void,str): var a0006 := new (void,str).seqbase (0@0); a0006.append("P12DT1H");
and do: [dtduration](a0006).print(); It gives back "PT0S", which means 0 duration, and thus the value of *val in dtduration_tostr is 0 (I checked that).
So, could that be some bug with correct dealing of long values in the multiplex creation (btw. where is that happening?) Or am I missing some special case that I should take into consideration with long values?
Thank you,
lefteris
P.S. yearMonthDuration which is defined as int works like a charm.
------------------------------------------------------------------------------ This SF.net email is sponsored by: SourcForge Community SourceForge wants to tell your story. http://p.sf.net/sfu/sf-spreadtheword _______________________________________________ Monetdb-developers mailing list Monetdb-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/monetdb-developers
-- Sjoerd Mullender