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);
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;
+}