OSDN Git Service

Added function that converts Unix time to exFAT time. Unfortunately Earth rotation...
authorresver <resver@60bc1c72-a15a-11de-b98f-4500b42dc123>
Fri, 2 Oct 2009 16:40:45 +0000 (16:40 +0000)
committerresver <resver@60bc1c72-a15a-11de-b98f-4500b42dc123>
Fri, 2 Oct 2009 16:40:45 +0000 (16:40 +0000)
git-svn-id: http://exfat.googlecode.com/svn/trunk@22 60bc1c72-a15a-11de-b98f-4500b42dc123

libexfat/exfat.h
libexfat/utils.c

index b34ff8a..5077cb8 100644 (file)
@@ -82,6 +82,7 @@ int exfat_mount(struct exfat* ef, const char* spec);
 void exfat_unmount(struct exfat* ef);
 void exfat_stat(const struct exfat_node* node, struct stat *stbuf);
 time_t exfat_exfat2unix(le16_t date, le16_t time);
+void exfat_unix2exfat(time_t unix_time, le16_t* date, le16_t* time);
 void exfat_get_name(const struct exfat_node* node, char* buffer, size_t n);
 
 int utf16_to_utf8(char* output, const le16_t* input, size_t outsize,
index f079f86..d526f4f 100644 (file)
@@ -182,6 +182,45 @@ time_t exfat_exfat2unix(le16_t date, le16_t time)
        return unix_time;
 }
 
+void exfat_unix2exfat(time_t unix_time, le16_t* date, le16_t* time)
+{
+       union exfat_date edate;
+       union exfat_time etime;
+       time_t shift = EPOCH_DIFF_SEC + timezone;
+       int days;
+       int i;
+
+       /* time before exFAT epoch cannot be represented */
+       if (unix_time < shift)
+               unix_time = shift;
+
+       unix_time -= shift;
+
+       days = unix_time / SEC_IN_DAY;
+       edate.year = (4 * days) / (4 * 365 + 1);
+       days -= edate.year * 365 + LEAP_YEARS(edate.year);
+       for (i = 1; i <= 12; i++)
+       {
+               int leap_day = (IS_LEAP_YEAR(edate.year) && i == 2);
+               int leap_sub = (IS_LEAP_YEAR(edate.year) && i >= 3);
+
+               if (i == 12 || days - leap_sub < days_in_year[i + 1] + leap_day)
+               {
+                       edate.month = i;
+                       days -= days_in_year[i] + leap_sub;
+                       break;
+               }
+       }
+       edate.day = days + 1;
+
+       etime.hour = (unix_time % SEC_IN_DAY) / SEC_IN_HOUR;
+       etime.min = (unix_time % SEC_IN_HOUR) / SEC_IN_MIN;
+       etime.twosec = (unix_time % SEC_IN_MIN) / 2;
+
+       *date = cpu_to_le16(edate.raw);
+       *time = cpu_to_le16(etime.raw);
+}
+
 void exfat_get_name(const struct exfat_node* node, char* buffer, size_t n)
 {
        if (utf16_to_utf8(buffer, node->name, n, EXFAT_NAME_MAX) != 0)