From: Lucas De Marchi Date: Tue, 28 Oct 2014 03:47:50 +0000 (-0200) Subject: libkmod-index: keep index and comments in .c X-Git-Tag: v19~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c4cbdf8e175acdd0d907ae9e250fd2fe7acf9a00;p=thirdparty%2Fkmod.git libkmod-index: keep index and comments in .c Just like other source files, keep the index and comments in the source file rather than the header. This also removes INDEX_PRIORITY_MIN that was never being used. --- diff --git a/libkmod/libkmod-index.c b/libkmod/libkmod-index.c index 6eddf3c3..7fb378c9 100644 --- a/libkmod/libkmod-index.c +++ b/libkmod/libkmod-index.c @@ -34,35 +34,109 @@ #include "libkmod-internal.h" #include "libkmod-index.h" -/* index.c: module index file shared functions for modprobe and depmod */ +/* libkmod-index.c: module index file implementation + * + * Integers are stored as 32 bit unsigned in "network" order, i.e. MSB first. + * All files start with a magic number. + * + * Magic spells "BOOTFAST". Second one used on newer versioned binary files. + * #define INDEX_MAGIC_OLD 0xB007FA57 + * + * We use a version string to keep track of changes to the binary format + * This is stored in the form: INDEX_MAJOR (hi) INDEX_MINOR (lo) just in + * case we ever decide to have minor changes that are not incompatible. + */ +#define INDEX_MAGIC 0xB007F457 +#define INDEX_VERSION_MAJOR 0x0002 +#define INDEX_VERSION_MINOR 0x0001 +#define INDEX_VERSION ((INDEX_VERSION_MAJOR<<16)|INDEX_VERSION_MINOR) +/* The index file maps keys to values. Both keys and values are ASCII strings. + * Each key can have multiple values. Values are sorted by an integer priority. + * + * The reader also implements a wildcard search (including range expressions) + * where the keys in the index are treated as patterns. + * This feature is required for module aliases. + */ #define INDEX_CHILDMAX 128 /* Disk format: - - uint32_t magic = INDEX_MAGIC; - uint32_t version = INDEX_VERSION; - uint32_t root_offset; - - (node_offset & INDEX_NODE_MASK) specifies the file offset of nodes: - - char[] prefix; // nul terminated - - char first; - char last; - uint32_t children[last - first + 1]; - - uint32_t value_count; - struct { - uint32_t priority; - char[] value; // nul terminated - } values[value_count]; - - (node_offset & INDEX_NODE_FLAGS) indicates which fields are present. - Empty prefixes are omitted, leaf nodes omit the three child-related fields. - - This could be optimised further by adding a sparse child format - (indicated using a new flag). + * + * uint32_t magic = INDEX_MAGIC; + * uint32_t version = INDEX_VERSION; + * uint32_t root_offset; + * + * (node_offset & INDEX_NODE_MASK) specifies the file offset of nodes: + * + * char[] prefix; // nul terminated + * + * char first; + * char last; + * uint32_t children[last - first + 1]; + * + * uint32_t value_count; + * struct { + * uint32_t priority; + * char[] value; // nul terminated + * } values[value_count]; + * + * (node_offset & INDEX_NODE_FLAGS) indicates which fields are present. + * Empty prefixes are omitted, leaf nodes omit the three child-related fields. + * + * This could be optimised further by adding a sparse child format + * (indicated using a new flag). + * + * + * Implementation is based on a radix tree, or "trie". + * Each arc from parent to child is labelled with a character. + * Each path from the root represents a string. + * + * == Example strings == + * + * ask + * ate + * on + * once + * one + * + * == Key == + * + Normal node + * * Marked node, representing a key and it's values. + * + * + + * |-a-+-s-+-k-* + * | | + * | `-t-+-e-* + * | + * `-o-+-n-*-c-+-e-* + * | + * `-e-* + * + * Naive implementations tend to be very space inefficient; child pointers + * are stored in arrays indexed by character, but most child pointers are null. + * + * Our implementation uses a scheme described by Wikipedia as a Patrica trie, + * + * "easiest to understand as a space-optimized trie where + * each node with only one child is merged with its child" + * + * + + * |-a-+-sk-* + * | | + * | `-te-* + * | + * `-on-*-ce-* + * | + * `-e-* + * + * We still use arrays of child pointers indexed by a single character; + * the remaining characters of the label are stored as a "prefix" in the child. + * + * The paper describing the original Patrica trie works on individiual bits - + * each node has a maximum of two children, which increases space efficiency. + * However for this application it is simpler to use the ASCII character set. + * Since the index file is read-only, it can be compressed by omitting null + * child pointers at the start and end of arrays. */ /* Format of node offsets within index file */ diff --git a/libkmod/libkmod-index.h b/libkmod/libkmod-index.h index 826a6998..9b550287 100644 --- a/libkmod/libkmod-index.h +++ b/libkmod/libkmod-index.h @@ -22,85 +22,6 @@ #include -/* Integers are stored as 32 bit unsigned in "network" order, i.e. MSB first. - All files start with a magic number. - - Magic spells "BOOTFAST". Second one used on newer versioned binary files. - */ -/* #define INDEX_MAGIC_OLD 0xB007FA57 */ -#define INDEX_MAGIC 0xB007F457 - -/* We use a version string to keep track of changes to the binary format - * This is stored in the form: INDEX_MAJOR (hi) INDEX_MINOR (lo) just in - * case we ever decide to have minor changes that are not incompatible. - */ - -#define INDEX_VERSION_MAJOR 0x0002 -#define INDEX_VERSION_MINOR 0x0001 -#define INDEX_VERSION ((INDEX_VERSION_MAJOR<<16)|INDEX_VERSION_MINOR) - -/* The index file maps keys to values. Both keys and values are ASCII strings. - Each key can have multiple values. Values are sorted by an integer priority. - - The reader also implements a wildcard search (including range expressions) - where the keys in the index are treated as patterns. - This feature is required for module aliases. -*/ - -/* Implementation is based on a radix tree, or "trie". - Each arc from parent to child is labelled with a character. - Each path from the root represents a string. - - == Example strings == - - ask - ate - on - once - one - - == Key == - + Normal node - * Marked node, representing a key and it's values. - - + - |-a-+-s-+-k-* - | | - | `-t-+-e-* - | - `-o-+-n-*-c-+-e-* - | - `-e-* - - Naive implementations tend to be very space inefficient; child pointers - are stored in arrays indexed by character, but most child pointers are null. - - Our implementation uses a scheme described by Wikipedia as a Patrica trie, - - "easiest to understand as a space-optimized trie where - each node with only one child is merged with its child" - - + - |-a-+-sk-* - | | - | `-te-* - | - `-on-*-ce-* - | - `-e-* - - We still use arrays of child pointers indexed by a single character; - the remaining characters of the label are stored as a "prefix" in the child. - - The paper describing the original Patrica trie works on individiual bits - - each node has a maximum of two children, which increases space efficiency. - However for this application it is simpler to use the ASCII character set. - Since the index file is read-only, it can be compressed by omitting null - child pointers at the start and end of arrays. -*/ - -#define INDEX_PRIORITY_MIN UINT32_MAX - struct index_value { struct index_value *next; unsigned int priority;