This may be a bug in FreeBSD, because it will work correctly if I pass a size
of length +2 to strftime
in OpenBSD.
On Wed, 9 Jan 2008 22:06:42 -0600
Duncan Patton a Campbell <[EMAIL PROTECTED]> wrote:
> There appears to be a bug in strftime such that the last digit is chopped off
> the seconds.
>
> I built a gprolog instance with a time function primitive (to get around
> 27bit ints in gprolog/386)
> so:
>
> Bool c_adstm(char *timeS0, long secs, char **newtm)
> {
>
> struct tm Tm;
> char *sZnewtm;
> size_t Xlen0 = 0;
> time_t tm;
> Tm.tm_isdst = -1;
> Xlen0 = strlen(timeS0);
> sZnewtm = *newtm = (char*)Malloc(Xlen0+1);
> if(strptime(timeS0,"%Y%m%d%H%M%S",&Tm)==NULL) return FALSE;
> tm = mktime(&Tm) ;
> fprintf(stdout,"B: %ld\n",tm);
> tm = tm + secs;
> fprintf(stdout,"C: %ld\n",tm);
> if(localtime_r(&tm,&Tm)==NULL) return FALSE;
> // if(strftime(sZnewtm,Xlen0,"%Y%m%d%H%M%S",&Tm)==0) return FALSE;
> strftime(sZnewtm,Xlen0,"%Y%m%d%H%M%S",&Tm) ;
> fprintf(stdout,"E\n");
> return TRUE;
> }
>
> When I run this on OpenBSD I get
> | ?- c_adstm("20080101010101",30,X),atom_codes(XA,X).
> B: 1199174461
> C: 1199174491
> E
>
> X = [50,48,48,56,48,49,48,49,48,49,48,49,51]
> XA = '2008010101013'
>
> yes
> | ?-
>
> But on FreeBSD I get the correct (expected) output:
> | ?- c_adstm("20080101010101",30,X),atom_codes(XA,X).
> B: 1199170861
> C: 1199170891
> E
>
> X = [50,48,48,56,48,49,48,49,48,49,48,49,51,49]
> XA = '20080101010131'
>
> yes
> | ?-
>
> I have entered a bug with sendbug/1, but it told me some (unspecified) fields
> were blank so I'm not sure if it went in.
>
> Also, could anyone tell me where the source for the strftime & strptime
> functions is located?
>
> Thanks,
> Dhu