summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/file_flp.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/src/file_flp.c b/src/file_flp.c
index 22e63190..bfa0a68c 100644
--- a/src/file_flp.c
+++ b/src/file_flp.c
@@ -29,6 +29,7 @@
#include <stdio.h>
#include "types.h"
#include "filegen.h"
+#include "common.h"
static void register_header_check_flp(file_stat_t *file_stat);
static int header_check_flp(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new);
@@ -43,25 +44,36 @@ const file_hint_t file_hint_flp= {
.register_header_check=&register_header_check_flp
};
-/* File format is similar to a midi file.
- * It begins by a header chunk and is followed by a single track chunk */
-static const unsigned char flp_header[8]= {'F', 'L', 'h', 'd', 0x06, 0x00, 0x00, 0x00};
+struct flp_header
+{
+ char magic[4];
+ uint32_t len; /* = 6 */
+ uint16_t format;
+ uint16_t tracks;
+ int16_t time_division;
+ char magic2[4];
+ uint32_t len2;
+} __attribute__ ((__packed__));
-static void register_header_check_flp(file_stat_t *file_stat)
+static int header_check_flp(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new)
{
- register_header_check(0, flp_header,sizeof(flp_header), &header_check_flp, file_stat);
+ const struct flp_header *hdr=(const struct flp_header *)buffer;
+ if(strncmp(hdr->magic2, "FLdt", 4)!=0)
+ return 0;
+ if(le32(hdr->len2)==0)
+ return 0;
+ reset_file_recovery(file_recovery_new);
+ file_recovery_new->extension=file_hint_flp.extension;
+ file_recovery_new->calculated_file_size=le32(hdr->len2) + 0x16;
+ file_recovery_new->data_check=&data_check_size;
+ file_recovery_new->file_check=&file_check_size;
+ return 1;
}
-static int header_check_flp(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new)
+/* File format is similar to a midi file.
+ * It begins by a header chunk and is followed by a single track chunk */
+static void register_header_check_flp(file_stat_t *file_stat)
{
- if(memcmp(buffer, flp_header, sizeof(flp_header))==0)
- {
- reset_file_recovery(file_recovery_new);
- file_recovery_new->extension=file_hint_flp.extension;
- file_recovery_new->calculated_file_size=(uint64_t)buffer[0x12]+(((uint64_t)buffer[0x13])<<8)+(((uint64_t)buffer[0x14])<<16)+(((uint64_t)buffer[0x15])<<24) + 0x16;
- file_recovery_new->data_check=&data_check_size;
- file_recovery_new->file_check=&file_check_size;
- return 1;
- }
- return 0;
+ static const unsigned char flp_header[8]= {'F', 'L', 'h', 'd', 0x06, 0x00, 0x00, 0x00};
+ register_header_check(0, flp_header,sizeof(flp_header), &header_check_flp, file_stat);
}