Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/flipper_format/flipper_format.h')
-rw-r--r--lib/flipper_format/flipper_format.h471
1 files changed, 471 insertions, 0 deletions
diff --git a/lib/flipper_format/flipper_format.h b/lib/flipper_format/flipper_format.h
new file mode 100644
index 00000000..c23e02fc
--- /dev/null
+++ b/lib/flipper_format/flipper_format.h
@@ -0,0 +1,471 @@
+/**
+ * @file flipper_format.h
+ * Flipper File Format helper library.
+ *
+ * Flipper File Format is a fairly simple format for storing data in a file.
+ *
+ * Flipper file structure:
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~
+ * # Commentary
+ * Field name: field value
+ * ~~~~~~~~~~~~~~~~~~~~~
+ *
+ * Lines starting with the # character are ignored (considered as comments). The separator between the name of the value and the value itself is the string ": ".
+ *
+ * Currently supported types:
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~
+ * String: text
+ * Int32: 1 2 -3 4
+ * Uint32: 1 2 3 4
+ * Float: 1.0 1234.654
+ * Hex: A4 B3 C2 D1 12 FF
+ * ~~~~~~~~~~~~~~~~~~~~~
+ *
+ * End of line is LF when writing, but CR is supported when reading.
+ *
+ * The library is designed in such a way that comments and field values are completely ignored when searching for keys, that is, they do not consume memory.
+ *
+ * File example:
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~
+ * Filetype: Flipper Test File
+ * Version: 1
+ * # Just test file
+ * String: String value
+ * UINT: 1234
+ * Hex: 00 01 FF A3
+ * ~~~~~~~~~~~~~~~~~~~~~
+ *
+ * Writing:
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~
+ * FlipperFormat format = flipper_format_file_alloc(storage);
+ *
+ * do {
+ * const uint32_t version = 1;
+ * const char* string_value = "String value";
+ * const uint32_t uint32_value = 1234;
+ * const uint16_t array_size = 4;
+ * const uint8_t* array[array_size] = {0x00, 0x01, 0xFF, 0xA3};
+ *
+ * if(!flipper_format_file_open_new(format, "/ext/flipper_format_test")) break;
+ * if(!flipper_format_write_header_cstr(format, "Flipper Test File", version)) break;
+ * if(!flipper_format_write_comment_cstr(format, "Just test file")) break;
+ * if(!flipper_format_write_string_cstr(format, "String", string_value)) break;
+ * if(!flipper_format_write_uint32(format, "UINT", &uint32_value, 1)) break;
+ * if(!flipper_format_write_hex(format, "Hex Array", array, array_size)) break;
+ *
+ * // signal that the file was written successfully
+ * } while(0);
+ *
+ * flipper_format_free(file);
+ * ~~~~~~~~~~~~~~~~~~~~~
+ *
+ * Reading:
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~
+ * FlipperFormat file = flipper_format_file_alloc(storage);
+ *
+ * do {
+ * uint32_t version = 1;
+ * string_t file_type;
+ * string_t string_value;
+ * uint32_t uint32_value = 1;
+ * uint16_t array_size = 4;
+ * uint8_t* array[array_size] = {0};
+ * string_init(file_type);
+ * string_init(string_value);
+ *
+ * if(!flipper_format_file_open_existing(file, "/ext/flipper_format_test")) break;
+ * if(!flipper_format_read_header(file, file_type, &version)) break;
+ * if(!flipper_format_read_string(file, "String", string_value)) break;
+ * if(!flipper_format_read_uint32(file, "UINT", &uint32_value, 1)) break;
+ * if(!flipper_format_read_hex(file, "Hex Array", array, array_size)) break;
+ *
+ * // signal that the file was read successfully
+ * } while(0);
+ *
+ * flipper_format_free(file);
+ * ~~~~~~~~~~~~~~~~~~~~~
+ *
+ */
+
+#pragma once
+#include <stdint.h>
+#include <mlib/m-string.h>
+#include <storage/storage.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct FlipperFormat FlipperFormat;
+
+/**
+ * Allocate FlipperFormat as string.
+ * @return FlipperFormat* pointer to a FlipperFormat instance
+ */
+FlipperFormat* flipper_format_string_alloc();
+
+/**
+ * Allocate FlipperFormat as file.
+ * @return FlipperFormat* pointer to a FlipperFormat instance
+ */
+FlipperFormat* flipper_format_file_alloc(Storage* storage);
+
+/**
+ * Open existing file.
+ * Use only if FlipperFormat allocated as a file.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param path File path
+ * @return True on success
+ */
+bool flipper_format_file_open_existing(FlipperFormat* flipper_format, const char* path);
+
+/**
+ * Open existing file for writing and add values to the end of file.
+ * Use only if FlipperFormat allocated as a file.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param path File path
+ * @return True on success
+ */
+bool flipper_format_file_open_append(FlipperFormat* flipper_format, const char* path);
+
+/**
+ * Open file. Creates a new file, or deletes the contents of the file if it already exists.
+ * Use only if FlipperFormat allocated as a file.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param path File path
+ * @return True on success
+ */
+bool flipper_format_file_open_always(FlipperFormat* flipper_format, const char* path);
+
+/**
+ * Open file. Creates a new file, fails if file already exists.
+ * Use only if FlipperFormat allocated as a file.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param path File path
+ * @return True on success
+ */
+bool flipper_format_file_open_new(FlipperFormat* flipper_format, const char* path);
+
+/**
+ * Closes the file, use only if FlipperFormat allocated as a file.
+ * @param flipper_format
+ * @return true
+ * @return false
+ */
+bool flipper_format_file_close(FlipperFormat* flipper_format);
+
+/**
+ * Free FlipperFormat.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ */
+void flipper_format_free(FlipperFormat* flipper_format);
+
+/**
+ * Set FlipperFormat mode.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param strict_mode True obligates not to skip valid fields. False by default.
+ */
+void flipper_format_set_strict_mode(FlipperFormat* flipper_format, bool strict_mode);
+
+/**
+ * Rewind the RW pointer.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @return True on success
+ */
+bool flipper_format_rewind(FlipperFormat* flipper_format);
+
+/**
+ * Read the header (file type and version).
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param filetype File type string
+ * @param version Version Value
+ * @return True on success
+ */
+bool flipper_format_read_header(
+ FlipperFormat* flipper_format,
+ string_t filetype,
+ uint32_t* version);
+
+/**
+ * Write the header (file type and version).
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param filetype File type string
+ * @param version Version Value
+ * @return True on success
+ */
+bool flipper_format_write_header(
+ FlipperFormat* flipper_format,
+ string_t filetype,
+ const uint32_t version);
+
+/**
+ * Write the header (file type and version). Plain C string version.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param filetype File type string
+ * @param version Version Value
+ * @return True on success
+ */
+bool flipper_format_write_header_cstr(
+ FlipperFormat* flipper_format,
+ const char* filetype,
+ const uint32_t version);
+
+/**
+ * Get the count of values by key
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key
+ * @param count
+ * @return bool
+ */
+bool flipper_format_get_value_count(
+ FlipperFormat* flipper_format,
+ const char* key,
+ uint32_t* count);
+
+/**
+ * Read a string by key
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @return True on success
+ */
+bool flipper_format_read_string(FlipperFormat* flipper_format, const char* key, string_t data);
+
+/**
+ * Write key and string
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @return True on success
+ */
+bool flipper_format_write_string(FlipperFormat* flipper_format, const char* key, string_t data);
+
+/**
+ * Write key and string. Plain C string version.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @return True on success
+ */
+bool flipper_format_write_string_cstr(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const char* data);
+
+/**
+ * Read array of uint32 by key
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @param data_size Values count
+ * @return True on success
+ */
+bool flipper_format_read_uint32(
+ FlipperFormat* flipper_format,
+ const char* key,
+ uint32_t* data,
+ const uint16_t data_size);
+
+/**
+ * Write key and array of uint32
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @param data_size Values count
+ * @return True on success
+ */
+bool flipper_format_write_uint32(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const uint32_t* data,
+ const uint16_t data_size);
+
+/**
+ * Read array of int32 by key
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @param data_size Values count
+ * @return True on success
+ */
+bool flipper_format_read_int32(
+ FlipperFormat* flipper_format,
+ const char* key,
+ int32_t* data,
+ const uint16_t data_size);
+
+/**
+ * Write key and array of int32
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @param data_size Values count
+ * @return True on success
+ */
+bool flipper_format_write_int32(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const int32_t* data,
+ const uint16_t data_size);
+
+/**
+ * Read array of float by key
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @param data_size Values count
+ * @return True on success
+ */
+bool flipper_format_read_float(
+ FlipperFormat* flipper_format,
+ const char* key,
+ float* data,
+ const uint16_t data_size);
+
+/**
+ * Write key and array of float
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @param data_size Values count
+ * @return True on success
+ */
+bool flipper_format_write_float(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const float* data,
+ const uint16_t data_size);
+
+/**
+ * Read array of hex-formatted bytes by key
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @param data_size Values count
+ * @return True on success
+ */
+bool flipper_format_read_hex(
+ FlipperFormat* flipper_format,
+ const char* key,
+ uint8_t* data,
+ const uint16_t data_size);
+
+/**
+ * Write key and array of hex-formatted bytes
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @param data_size Values count
+ * @return True on success
+ */
+bool flipper_format_write_hex(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const uint8_t* data,
+ const uint16_t data_size);
+
+/**
+ * Write comment
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param data Comment text
+ * @return True on success
+ */
+bool flipper_format_write_comment(FlipperFormat* flipper_format, string_t data);
+
+/**
+ * Write comment. Plain C string version.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param data Comment text
+ * @return True on success
+ */
+bool flipper_format_write_comment_cstr(FlipperFormat* flipper_format, const char* data);
+
+/**
+ * Removes the first matching key and its value. Sets the RW pointer to a position of deleted data.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @return True on success
+ */
+bool flipper_format_delete_key(FlipperFormat* flipper_format, const char* key);
+
+/**
+ * Updates the value of the first matching key to a string value. Sets the RW pointer to a position at the end of inserted data.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @return True on success
+ */
+bool flipper_format_update_string(FlipperFormat* flipper_format, const char* key, string_t data);
+
+/**
+ * Updates the value of the first matching key to a string value. Plain C version. Sets the RW pointer to a position at the end of inserted data.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @return True on success
+ */
+bool flipper_format_update_string_cstr(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const char* data);
+
+/**
+ * Updates the value of the first matching key to a uint32 array value. Sets the RW pointer to a position at the end of inserted data.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @return True on success
+ */
+bool flipper_format_update_uint32(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const uint32_t* data,
+ const uint16_t data_size);
+
+/**
+ * Updates the value of the first matching key to a int32 array value. Sets the RW pointer to a position at the end of inserted data.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @return True on success
+ */
+bool flipper_format_update_int32(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const int32_t* data,
+ const uint16_t data_size);
+
+/**
+ * Updates the value of the first matching key to a float array value. Sets the RW pointer to a position at the end of inserted data.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @return True on success
+ */
+bool flipper_format_update_float(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const float* data,
+ const uint16_t data_size);
+
+/**
+ * Updates the value of the first matching key to an array of hex-formatted bytes. Sets the RW pointer to a position at the end of inserted data.
+ * @param flipper_format Pointer to a FlipperFormat instance
+ * @param key Key
+ * @param data Value
+ * @return True on success
+ */
+bool flipper_format_update_hex(
+ FlipperFormat* flipper_format,
+ const char* key,
+ const uint8_t* data,
+ const uint16_t data_size);
+
+#ifdef __cplusplus
+}
+#endif \ No newline at end of file