OSDN Git Service

Added checksum calculation functions.
authorresver <resver@60bc1c72-a15a-11de-b98f-4500b42dc123>
Sat, 31 Oct 2009 08:36:23 +0000 (08:36 +0000)
committerresver <resver@60bc1c72-a15a-11de-b98f-4500b42dc123>
Sat, 31 Oct 2009 08:36:23 +0000 (08:36 +0000)
git-svn-id: http://exfat.googlecode.com/svn/trunk@37 60bc1c72-a15a-11de-b98f-4500b42dc123

libexfat/exfat.h
libexfat/utils.c

index 4a257e6..74d8c5d 100644 (file)
@@ -89,6 +89,8 @@ 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);
+uint16_t exfat_start_checksum(const struct exfat_file* entry);
+uint16_t exfat_add_checksum(const void* entry, uint16_t sum);
 
 int utf16_to_utf8(char* output, const le16_t* input, size_t outsize,
                size_t insize);
index 214025a..283898f 100644 (file)
@@ -160,3 +160,23 @@ 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)
                exfat_bug("failed to convert name to UTF-8");
 }
+
+uint16_t exfat_start_checksum(const struct exfat_file* entry)
+{
+       uint16_t sum = 0;
+       int i;
+
+       for (i = 0; i < sizeof(struct exfat_entry); i++)
+               if (i != 2 && i != 3) /* skip checksum field itself */
+                       sum = ((sum << 15) | (sum >> 1)) + ((const uint8_t*) entry)[i];
+       return sum;
+}
+
+uint16_t exfat_add_checksum(const void* entry, uint16_t sum)
+{
+       int i;
+
+       for (i = 0; i < sizeof(struct exfat_entry); i++)
+               sum = ((sum << 15) | (sum >> 1)) + ((const uint8_t*) entry)[i];
+       return sum;
+}