#ifndef STR_UTILS_H_INCLUDE #define STR_UTILS_H_INCLUDE #include "tripcrunch.h" /** \brief Struct for char replacements. */ typedef struct char_replace_struct { /** Source character. */ char src; /** Destination string. */ const char *dst; /** Size of replace string. */ size_t dstlen; } char_replace_t; /** \brief Creates a string buffer with a safe size. * * In practice, takes into account the worst possible space any string * manipulations within this program might require, given the input buffer * size. * * This might be rather large. * * @param len Length of unexploded string. * @return Newly allocated safe buffer. */ extern char* create_safe_cstr_buffer(size_t len); /** \brief Get the size of the current search space. * * @return Current search space size. */ extern int get_search_space_size(void); /** \brief Duplicate a memory segment with a given length. * * @param src Memory segment to duplicate. * @param len Length of the segment. */ extern void* memdup(const void *src, size_t len); /** \brief Compare two strings as per their enumeration order. * * Longer string is always enumerationally greater. * * @param lhs Left-hand size operand. * @param lhslen Length of left-hand-side operand. * @param rhs Right-hand size operand. * @param rhslen Length of right-hand-side operand. * @return -1 if lhs < rhs, 1 if lhs > rhs, 0 if equal. */ extern int str_enumcmp(const char *lhs, size_t lhslen, const char *rhs, size_t rhslen); /** \brief Initialize string enumeration. * * Prepare the string enumeration for str_enumerate calls. * * @param sspace Search space to use. * @return Zero on success, nonzero on failure. */ extern int str_enumerate_init(const char *sspace); /** \brief Free search space if it was reserved. */ extern void str_enumerate_free(void); /** \brief Enumerate string forward in search space by n permutations. * * Takes as an input a string and jumps n permutations 'forward' in it. * * Will free() the old string if it's regenerated. The length pointer will * also be replaced in this case. * * @param old string. * @param jump Jump this many characters forward. * @param len Length of the string, potentially replaced. * @return New string. */ extern char *str_enumerate_n(char *old, int jump, size_t *len); /** \brief Enumerate string forward in search space by n permutations. * * Takes as an input a string and jumps n permutations 'forward' in it. * * Will free() the old string if it's regenerated. The length pointer will * also be replaced in this case. * * This version has restrictions when compared to * str_enumerate_1(char*, size_t), and str_enumerate_n(char*, int, size_t). * Namely, the old string may not be null and the jump value may not be * larger than the search space used. * * @param old string. * @param jump Jump this many characters forward. * @param len Length of the string, potentially replaced. * @return New string. */ extern char *str_enumerate_fn(char *old, int jump, size_t *len); /** \brief Enumerate string forward in search space by one permutation. * * This is analogous to calling str_enumerate_n with a jump value of one, * but faster. * * @param old string. * @param len Length of the string, potentially replaced. * @return New string. */ extern char *str_enumerate_1(char *old, size_t *len); /** \brief String multi-replace. * * Performs a replace of certain singular characters into other strings. * * Faster than performing several replaces in sequence, but less versatile. * * Will free the source string if it's modified. * * @param src Input string. * @param slen Input string size pointer. * @param replacements Replacement structs. * @param rnum Replacement table size. * @return Modified or the original string. */ extern char* str_multireplace(char *src, size_t *slen, const char_replace_t *replacements, size_t rnum); /** \brief Fast string multi-replace. * * Works like str_multireplace(char*, size_t*, const char_replace_t*, size_t), * but requires a destination character buffer to write the result into. * * The destination buffer must be large enough to accomodate the worst-case * replacement. * * @param dst Destination buffer. * @param src Input string. * @param slen Input string length. * @param replacements Replacement structs. * @param rnum Replacement table size. * @return Length of destination string. */ extern size_t str_multireplace_fast(char *dst, const char *src, size_t slen, const char_replace_t *replacements, size_t rnum); /** \brief Perform a string replace. * * Will search the string for instances of a certain string, will return the * same string if not found or a modified string if found. * * Needle and replacement are not checked for sanity. * * Will free the source string if it's modified. * * @param src Input string. * @param needle Needle to search. * @param replacement Replacement to use. * @return Modified or the original string. */ extern char* str_replace(char *src, const char *needle, const char *replacement); /** \brief Perform a htmlspecialchars replace on a source string. * * Will free the source string if it's modified. * * @param src Source string. * @param slen Input string size pointer. * @return String with htmlspecialchars done on it. */ extern char* htmlspecialchars(char *src, size_t *slen); /** \brief Perform a fast htmlspecialchars replace on a source string. * * Works like htmlspecialchars(char*, size_t*), but requires a destination * character buffer to write the result into. * * The destination buffer must be large enough to accomodate the worst-case * replacement. * * @param dst Destination buffer. * @param src Source string. * @param slen Input string length. * @return Length of destination string. */ extern size_t htmlspecialchars_fast(char *dst, const char *src, size_t slen); #endif