/* 10/08/88 : Jacques Gelinas Conversion de dates */ #include #include #include #include #include #include #include #include "tool.h" #define cnvu(j,m,a) (((a)<<9) + (m<<5) +j) /* Retourne la date courante dans un unsigned */ export short unsigned date_currentu(void) { long curt = time(NULL); struct tm *d = localtime (&curt); return ((short unsigned) cnvu(d->tm_mday,d->tm_mon+1,d->tm_year-80)); } /* convertit un chaine ascii en data unsigned selon le format DOS La chaine est du type jj[/mm[/aa[aa]]] */ export short unsigned date_a2u (const char *date) { long curt = time(NULL); struct tm *d = localtime (&curt); short unsigned res; unsigned a,m,j; j = d->tm_mday; m = d->tm_mon+1; a = d->tm_year-80; if (isdigit(*date)){ j = atoi (date); date = str_skipdig(date); if (*date == '/'){ date++; m = atoi (date); date = str_skipdig(date); if (*date == '/'){ a = atoi (date+1); if (a > 1900){ a -= 1980; }else{ a -= 80; } } } } /* printf ("j = %d m = %d a = %d\n",j,m,a);*/ res = (short unsigned) cnvu (j,m,a); return (res); } /* Construit un date/heure complŠte … partir d'une date et d'un temps. la date et le temps sont en format DOS. Retourne en format naturel UNIX (secondes ‚coul‚ depuis 1970). C'est le mˆme format que file_date() retourne. */ export unsigned long date_td2l(short unsigned date, short unsigned timet) { struct tm d; d.tm_hour = timet>>11; d.tm_min = (timet>>5) & 0x3f; d.tm_sec = (timet&0x1f)*2; d.tm_mday = date & 0x1f; d.tm_mon = ((date>>5) & 0xf) - 1; d.tm_year = (date>>9) + 80; /* printf ("%d/%d/%d %d:%d:%d\n",d.tm_mday,d.tm_mon,d.tm_year,d.tm_hour ,d.tm_min,d.tm_sec); */ return tool_mktime (&d); } /* Construit un date/heure complŠte … partir d'une date et d'un temps. la date et le temps sont en format DOS. Le r‚sultat est aussi en format DOS. C'est le mˆme format que file_dosdate() retourne. */ export unsigned long date_td2l_dos(short unsigned date, short unsigned time) { return ((unsigned long)date<<16)+time; } /* Transforme une date en format DOS vers format UNIX. Le format DOS est une structure de bit. Le format UNIX est un d‚compte de seconde depuis 1970. */ export unsigned long date_unix2dos (unsigned long date) { struct tm *ptm = localtime ((time_t*)&date); return ((ptm->tm_year-80)<<25) + ((ptm->tm_mon+1)<<21) + (ptm->tm_mday<<16) + (ptm->tm_hour<<11) + (ptm->tm_min<<5) + (ptm->tm_sec/2); } /* Convertit une date format UNIX en ascii. Retourne le nombre de bytes plac‚s dans str. */ export int date_td2a ( long datetime, char *str, int format) /* 0=jj/mm/aa, 1 = aa/mm/jj, 2 = mm/jj/aa */ { struct tm *d = localtime (&datetime); int nb = 0; if (format == 0){ nb = sprintf (str,"%02d/%02d/%02d ",d->tm_mday,d->tm_mon,d->tm_year); }else if (format == 1){ nb = sprintf (str,"%02d/%02d/%02d ",d->tm_year,d->tm_mon,d->tm_mday); }else if (format == 2){ nb = sprintf (str,"%02d/%02d/%02d " ,d->tm_mon,d->tm_mday,d->tm_year); }else{ assert (0); } str += nb; nb += sprintf (str,"%02d:%02d:%02d",d->tm_hour,d->tm_min,d->tm_sec); return nb; } #ifdef TEST static void tst (char *f) { long date = file_date (f); unsigned long ddate = file_dosdate(f); long rdate = date_td2l(ddate>>16,ddate&0xffff); struct tm *d = localtime (&date); printf ("%s %d %d %d %d %d %d\n",f ,d->tm_mday,d->tm_mon,d->tm_year ,d->tm_hour,d->tm_min,d->tm_sec); d = localtime (&rdate); printf ("%s %d %d %d %d %d %d\n",f ,d->tm_mday,d->tm_mon,d->tm_year ,d->tm_hour,d->tm_min,d->tm_sec); printf ("\n"); } int main (int, char *argv[]) { short unsigned da = date_currentu(); char buf[20]; time_t tt,curt; struct tm *d; int len = date_u2a (da,buf); printf ("date[%d] = :%s:\n",len,buf); tt = date_td2l(da,time_currentu()); printf ("En seconde -> %d\n",tt); d = localtime (&tt); printf ("%d %d %d %d %d %d\n",d->tm_mday,d->tm_mon,d->tm_year ,d->tm_hour,d->tm_min,d->tm_sec); curt = time(NULL); d = localtime (&curt); printf ("%d %d %d %d %d %d\n",d->tm_mday,d->tm_mon,d->tm_year ,d->tm_hour,d->tm_min,d->tm_sec); tst ("path.c"); tst ("path1.c"); tst ("path2.c"); tst ("path3.c"); tst ("date.c"); } #endif