extend fileheader with some flags and endianess mark

This commit is contained in:
Christian Thaeter 2010-03-10 22:03:03 +01:00
parent c908cf4807
commit c66b71deb2
3 changed files with 103 additions and 21 deletions

View file

@ -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
/* /*

View file

@ -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

View file

@ -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);