extend fileheader with some flags and endianess mark
This commit is contained in:
parent
c908cf4807
commit
c66b71deb2
3 changed files with 103 additions and 21 deletions
|
|
@ -26,7 +26,11 @@
|
||||||
|
|
||||||
LUMIERA_ERROR_DECLARE (FILEHEADER_NOWRITE);
|
LUMIERA_ERROR_DECLARE (FILEHEADER_NOWRITE);
|
||||||
LUMIERA_ERROR_DECLARE (FILEHEADER_HEADER);
|
LUMIERA_ERROR_DECLARE (FILEHEADER_HEADER);
|
||||||
|
LUMIERA_ERROR_DECLARE (FILEHEADER_FLAGS);
|
||||||
|
LUMIERA_ERROR_DECLARE (FILEHEADER_FLAGSPACE);
|
||||||
|
LUMIERA_ERROR_DECLARE (FILEHEADER_ENDIANESS);
|
||||||
|
|
||||||
|
#define LUMIERA_FILEHEADER_ENDIANMAGIC 0x0123456789ABCDEFULL
|
||||||
|
|
||||||
typedef struct lumiera_fileheader_struct lumiera_fileheader;
|
typedef struct lumiera_fileheader_struct lumiera_fileheader;
|
||||||
typedef lumiera_fileheader* LumieraFileheader;
|
typedef lumiera_fileheader* LumieraFileheader;
|
||||||
|
|
@ -34,12 +38,6 @@ typedef lumiera_fileheader* LumieraFileheader;
|
||||||
typedef struct lumiera_fileheader_raw_struct lumiera_fileheader_raw;
|
typedef struct lumiera_fileheader_raw_struct lumiera_fileheader_raw;
|
||||||
typedef lumiera_fileheader_raw* LumieraFileheaderRaw;
|
typedef lumiera_fileheader_raw* LumieraFileheaderRaw;
|
||||||
|
|
||||||
typedef struct lumiera_fileheaderext_struct lumiera_fileheaderext;
|
|
||||||
typedef lumiera_fileheaderext* LumieraFileheaderext;
|
|
||||||
|
|
||||||
typedef struct lumiera_fileheaderext_raw_struct lumiera_fileheaderext_raw;
|
|
||||||
typedef lumiera_fileheaderext_raw* LumieraFileheaderextRaw;
|
|
||||||
|
|
||||||
|
|
||||||
#include "backend/file.h"
|
#include "backend/file.h"
|
||||||
|
|
||||||
|
|
@ -79,13 +77,35 @@ struct LUMIERA_PACKED lumiera_fileheader_raw_struct
|
||||||
/** always '\n' */
|
/** always '\n' */
|
||||||
char newline1;
|
char newline1;
|
||||||
/** freeform string, comment or so on, initialized to spaces */
|
/** freeform string, comment or so on, initialized to spaces */
|
||||||
char meta[22];
|
char meta[15];
|
||||||
/** always '\n' */
|
/** always '\n' */
|
||||||
char newline2;
|
char newline2;
|
||||||
|
|
||||||
|
/** initialized to spaces, flags are single chars, unsorted */
|
||||||
|
char flags[6];
|
||||||
|
/** always '\n' */
|
||||||
|
char newline3;
|
||||||
/** always '\0' */
|
/** always '\0' */
|
||||||
char null;
|
char null;
|
||||||
|
|
||||||
|
/* natively written 0x0123456789ABCDEFULL by the host created this */
|
||||||
|
uint64_t endianess_mark;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fileheader flags are chars to make this easily inspectable, these add another human readable line to the header
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** file is clean */
|
||||||
|
#define LUMIERA_FILEHEADER_FLAG_CLEAN "c"
|
||||||
|
|
||||||
|
/** check for host order endianess */
|
||||||
|
#define LUMIERA_FILEHEADER_FLAG_ENDIANESS "e"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A fileheader object encapsulates the underlying mmap object which keeps the
|
* A fileheader object encapsulates the underlying mmap object which keeps the
|
||||||
* raw header data in memory and and the dereferenced thereof.
|
* raw header data in memory and and the dereferenced thereof.
|
||||||
|
|
@ -106,10 +126,11 @@ struct lumiera_fileheader_struct
|
||||||
* @param version version number for the header (should be incremented after changes)
|
* @param version version number for the header (should be incremented after changes)
|
||||||
* the value '0' is reserved for experimental versions.
|
* the value '0' is reserved for experimental versions.
|
||||||
* @param size The actual size of all header data, including following format specific data.
|
* @param size The actual size of all header data, including following format specific data.
|
||||||
|
* @param flags initial flags which should be set (dont include CLEAN here, should be set on close)
|
||||||
* @return A lumiera_fileheader object by value, .header and .map are set to NULL on error.
|
* @return A lumiera_fileheader object by value, .header and .map are set to NULL on error.
|
||||||
*/
|
*/
|
||||||
lumiera_fileheader
|
lumiera_fileheader
|
||||||
lumiera_fileheader_create (LumieraFile file, char* fourcc, int version, size_t size);
|
lumiera_fileheader_create (LumieraFile file, char* fourcc, int version, size_t size, const char* flags);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -118,20 +139,23 @@ lumiera_fileheader_create (LumieraFile file, char* fourcc, int version, size_t s
|
||||||
* and must be closed after use. The File should be locked for operations on the fileheader.
|
* and must be closed after use. The File should be locked for operations on the fileheader.
|
||||||
* @param file The file on which to open the header.
|
* @param file The file on which to open the header.
|
||||||
* @param fourcc pointer to a string of length 4 with the expected identifier for the file
|
* @param fourcc pointer to a string of length 4 with the expected identifier for the file
|
||||||
* @param size The actual size of all header data, including following format specific data.
|
* @param size The actual size of all header data, including following format specific data
|
||||||
|
* @param flags_expected expect this flags being set
|
||||||
|
* @param flags_remov remove this flags when opening
|
||||||
* @return A lumiera_fileheader object by value, .header and .map are set to NULL on error.
|
* @return A lumiera_fileheader object by value, .header and .map are set to NULL on error.
|
||||||
*/
|
*/
|
||||||
lumiera_fileheader
|
lumiera_fileheader
|
||||||
lumiera_fileheader_open (LumieraFile file, char* fourcc, size_t size);
|
lumiera_fileheader_open (LumieraFile file, char* fourcc, size_t size, const char* flags_expected, const char* flags_remove);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes a previously created or opened fileheader.
|
* Closes a previously created or opened fileheader.
|
||||||
* @param self the fileheader to close.
|
* @param self the fileheader to close.
|
||||||
* no errors, no nothing returned
|
* @param flags_add set this flags if not already set
|
||||||
|
* no errors, no nothing returned (yet)
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
lumiera_fileheader_close (LumieraFileheader self);
|
lumiera_fileheader_close (LumieraFileheader self, const char* flags_add);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -143,8 +167,25 @@ int
|
||||||
lumiera_fileheader_version (LumieraFileheader self);
|
lumiera_fileheader_version (LumieraFileheader self);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if all flags given from some sets are either set or not.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lumiera_fileheader_flags_validate (LumieraFileheader self, const char* expected, const char* unexpected);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets flags if not already set
|
||||||
|
*/
|
||||||
|
LumieraFileheader
|
||||||
|
lumiera_fileheader_flags_set (LumieraFileheader self, const char* flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear flags if present
|
||||||
|
*/
|
||||||
|
LumieraFileheader
|
||||||
|
lumiera_fileheader_flags_clear (LumieraFileheader self, const char* flags);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ TESTING "fileheader access" ./test-fileheader
|
||||||
TEST "fileheader, basic creation" create_basic <<END
|
TEST "fileheader, basic creation" create_basic <<END
|
||||||
err: ECHO: .*: fileheader: TEST 0
|
err: ECHO: .*: fileheader: TEST 0
|
||||||
err: ECHO: .*: .* $
|
err: ECHO: .*: .* $
|
||||||
|
err: ECHO: .*: main: e
|
||||||
err: ECHO: .*: :
|
err: ECHO: .*: :
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
@ -20,6 +21,15 @@ END
|
||||||
TEST "fileheader, reopen" acquire_basic <<END
|
TEST "fileheader, reopen" acquire_basic <<END
|
||||||
err: ECHO: .*: fileheader: TEST 0
|
err: ECHO: .*: fileheader: TEST 0
|
||||||
err: ECHO: .*: .* $
|
err: ECHO: .*: .* $
|
||||||
|
err: ECHO: .*: main: e
|
||||||
|
err: ECHO: .*: :
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
TEST "fileheader, reopen" acquire_basic_readonly <<END
|
||||||
|
err: ECHO: .*: fileheader: TEST 0
|
||||||
|
err: ECHO: .*: .* $
|
||||||
|
err: ECHO: .*: main: e
|
||||||
err: ECHO: .*: :
|
err: ECHO: .*: :
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,13 +37,13 @@ TEST (create_basic)
|
||||||
|
|
||||||
LUMIERA_FILE_WRLOCK_SECTION (NOBUG_ON, file)
|
LUMIERA_FILE_WRLOCK_SECTION (NOBUG_ON, file)
|
||||||
{
|
{
|
||||||
lumiera_fileheader header = lumiera_fileheader_create (file, "TEST", 0, sizeof (lumiera_fileheader_raw));
|
lumiera_fileheader header = lumiera_fileheader_create (file, "TEST", 0, sizeof (lumiera_fileheader_raw), LUMIERA_FILEHEADER_FLAG_ENDIANESS);
|
||||||
|
|
||||||
CHECK (lumiera_error_peek() == NULL);
|
CHECK (lumiera_error_peek() == NULL);
|
||||||
|
|
||||||
ECHO ("fileheader: %s:", (char*)header.header);
|
ECHO ("fileheader: %s:", (char*)header.header);
|
||||||
|
|
||||||
lumiera_fileheader_close (&header);
|
lumiera_fileheader_close (&header, LUMIERA_FILEHEADER_FLAG_CLEAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
lumiera_file_delete (file);
|
lumiera_file_delete (file);
|
||||||
|
|
@ -60,11 +60,11 @@ TEST (create_nowrite)
|
||||||
|
|
||||||
LUMIERA_FILE_RDLOCK_SECTION (NOBUG_ON, file)
|
LUMIERA_FILE_RDLOCK_SECTION (NOBUG_ON, file)
|
||||||
{
|
{
|
||||||
lumiera_fileheader header = lumiera_fileheader_create (file, "TEST", 0, sizeof (lumiera_fileheader));
|
lumiera_fileheader header = lumiera_fileheader_create (file, "TEST", 0, sizeof (lumiera_fileheader), NULL);
|
||||||
|
|
||||||
CHECK(lumiera_error() == LUMIERA_ERROR_FILEHEADER_NOWRITE);
|
CHECK(lumiera_error() == LUMIERA_ERROR_FILEHEADER_NOWRITE);
|
||||||
|
|
||||||
lumiera_fileheader_close (&header);
|
lumiera_fileheader_close (&header, LUMIERA_FILEHEADER_FLAG_CLEAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
lumiera_file_delete (file);
|
lumiera_file_delete (file);
|
||||||
|
|
@ -80,12 +80,14 @@ TEST (acquire_wrongheader)
|
||||||
|
|
||||||
LUMIERA_FILE_RDLOCK_SECTION (NOBUG_ON, file)
|
LUMIERA_FILE_RDLOCK_SECTION (NOBUG_ON, file)
|
||||||
{
|
{
|
||||||
lumiera_fileheader header = lumiera_fileheader_open (file, "BADH", sizeof (lumiera_fileheader));
|
lumiera_fileheader header = lumiera_fileheader_open (file, "BADH",
|
||||||
|
sizeof (lumiera_fileheader),
|
||||||
|
LUMIERA_FILEHEADER_FLAG_CLEAN, LUMIERA_FILEHEADER_FLAG_CLEAN);
|
||||||
|
|
||||||
CHECK(!header.header);
|
CHECK(!header.header);
|
||||||
CHECK(lumiera_error() == LUMIERA_ERROR_FILEHEADER_HEADER);
|
CHECK(lumiera_error() == LUMIERA_ERROR_FILEHEADER_HEADER);
|
||||||
|
|
||||||
lumiera_fileheader_close (&header);
|
lumiera_fileheader_close (&header, LUMIERA_FILEHEADER_FLAG_CLEAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
lumiera_file_delete (file);
|
lumiera_file_delete (file);
|
||||||
|
|
@ -97,11 +99,13 @@ TEST (acquire_wrongheader)
|
||||||
TEST (acquire_basic)
|
TEST (acquire_basic)
|
||||||
{
|
{
|
||||||
lumiera_backend_init ();
|
lumiera_backend_init ();
|
||||||
LumieraFile file = lumiera_file_new (",tmp-fileheader", LUMIERA_FILE_READONLY);
|
LumieraFile file = lumiera_file_new (",tmp-fileheader", LUMIERA_FILE_READWRITE);
|
||||||
|
|
||||||
LUMIERA_FILE_RDLOCK_SECTION (NOBUG_ON, file)
|
LUMIERA_FILE_RDLOCK_SECTION (NOBUG_ON, file)
|
||||||
{
|
{
|
||||||
lumiera_fileheader header = lumiera_fileheader_open (file, "TEST", sizeof (lumiera_fileheader));
|
lumiera_fileheader header = lumiera_fileheader_open (file, "TEST",
|
||||||
|
sizeof (lumiera_fileheader),
|
||||||
|
LUMIERA_FILEHEADER_FLAG_CLEAN, LUMIERA_FILEHEADER_FLAG_CLEAN);
|
||||||
|
|
||||||
CHECK(header.header);
|
CHECK(header.header);
|
||||||
CHECK(!lumiera_error());
|
CHECK(!lumiera_error());
|
||||||
|
|
@ -110,7 +114,34 @@ TEST (acquire_basic)
|
||||||
|
|
||||||
ECHO ("fileheader: %s:", (char*)header.header);
|
ECHO ("fileheader: %s:", (char*)header.header);
|
||||||
|
|
||||||
lumiera_fileheader_close (&header);
|
lumiera_fileheader_close (&header, LUMIERA_FILEHEADER_FLAG_CLEAN);
|
||||||
|
}
|
||||||
|
|
||||||
|
lumiera_file_delete (file);
|
||||||
|
lumiera_backend_destroy ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST (acquire_basic_readonly)
|
||||||
|
{
|
||||||
|
lumiera_backend_init ();
|
||||||
|
LumieraFile file = lumiera_file_new (",tmp-fileheader", LUMIERA_FILE_READONLY);
|
||||||
|
|
||||||
|
LUMIERA_FILE_RDLOCK_SECTION (NOBUG_ON, file)
|
||||||
|
{
|
||||||
|
lumiera_fileheader header = lumiera_fileheader_open (file, "TEST",
|
||||||
|
sizeof (lumiera_fileheader),
|
||||||
|
LUMIERA_FILEHEADER_FLAG_CLEAN, NULL);
|
||||||
|
|
||||||
|
CHECK(header.header);
|
||||||
|
CHECK(!lumiera_error());
|
||||||
|
|
||||||
|
CHECK (lumiera_fileheader_version (&header) == 0);
|
||||||
|
|
||||||
|
ECHO ("fileheader: %s:", (char*)header.header);
|
||||||
|
|
||||||
|
lumiera_fileheader_close (&header, LUMIERA_FILEHEADER_FLAG_CLEAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
lumiera_file_delete (file);
|
lumiera_file_delete (file);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue