blob: 119beb07883804788862cdd6ed626d94fc866f1d [file] [log] [blame] [raw]
#ifndef H_FIOBJ_STR_H
/*
Copyright: Boaz Segev, 2017-2018
License: MIT
*/
#define H_FIOBJ_STR_H
#include <fiobject.h>
#ifdef __cplusplus
extern "C" {
#endif
#define FIOBJ_IS_STRING(obj) FIOBJ_TYPE_IS((obj), FIOBJ_T_STRING)
/* *****************************************************************************
API: Creating a String Object
***************************************************************************** */
/** Creates a String object. Remember to use `fiobj_free`. */
FIOBJ fiobj_str_new(const char *str, size_t len);
/**
* Creates a String object with pre-allocation for Strings up to `capa` long.
*
* If `capa` is zero, a whole memory page will be allocated.
*
* Remember to use `fiobj_free`.
*/
FIOBJ fiobj_str_buf(size_t capa);
/** Creates a copy from an existing String. Remember to use `fiobj_free`. */
static inline __attribute__((unused)) FIOBJ fiobj_str_copy(FIOBJ src) {
fio_str_info_s s = fiobj_obj2cstr(src);
return fiobj_str_new(s.data, s.len);
}
/**
* Creates a String object. Remember to use `fiobj_free`.
*
* It's possible to wrap a previosly allocated memory block in a FIOBJ String
* object, as long as it was allocated using `fio_malloc`.
*
* The ownership of the memory indicated by `str` will "move" to the object and
* will be freed (using `fio_free`) once the object's reference count drops to
* zero.
*
* Note: The original memory MUST be allocated using `fio_malloc` (NOT the
* system's `malloc`) and it will be freed using `fio_free`.
*/
FIOBJ fiobj_str_move(char *str, size_t len, size_t capacity);
/**
* Returns a thread-static temporary string. Avoid calling `fiobj_dup` or
* `fiobj_free`.
*/
FIOBJ fiobj_str_tmp(void);
/* *****************************************************************************
API: Editing a String
***************************************************************************** */
/**
* Prevents the String object from being changed.
*
* When a String is used as a key for a Hash, it is automatically frozen to
* prevent the Hash from becoming broken.
*/
void fiobj_str_freeze(FIOBJ str);
/**
* Confirms the String allows for the requested capacity (counting used space as
* well as free space).
*
* Returns updated capacity.
*/
size_t fiobj_str_capa_assert(FIOBJ str, size_t size);
/** Returns a String's capacity, if any. This should include the NUL byte. */
size_t fiobj_str_capa(FIOBJ str);
/** Resizes a String object, allocating more memory if required. */
void fiobj_str_resize(FIOBJ str, size_t size);
/**
* Performs a best attempt at minimizing memory consumption.
*
* Actual effects depend on the underlying memory allocator and it's
* implementation. Not all allocators will free any memory.
*/
void fiobj_str_compact(FIOBJ str);
/** Alias for `fiobj_str_compact`. */
#define fiobj_str_minimize(str) fiobj_str_compact((str))
/** Empties a String's data. */
void fiobj_str_clear(FIOBJ str);
/**
* Writes data at the end of the string, resizing the string as required.
* Returns the new length of the String
*/
size_t fiobj_str_write(FIOBJ dest, const char *data, size_t len);
/**
* Writes a number at the end of the String using normal base 10 notation.
*
* Returns the new length of the String
*/
size_t fiobj_str_write_i(FIOBJ dest, int64_t num);
/**
* Writes data at the end of the string using a printf like interface, resizing
* the string as required. Returns the new length of the String
*/
__attribute__((format(printf, 2, 3))) size_t
fiobj_str_printf(FIOBJ dest, const char *format, ...);
/**
* Writes data at the end of the string using a vprintf like interface, resizing
* the string as required.
*
* Returns the new length of the String
*/
__attribute__((format(printf, 2, 0))) size_t
fiobj_str_vprintf(FIOBJ dest, const char *format, va_list argv);
/**
* Writes data at the end of the string, resizing the string as required.
*
* Remember to call `fiobj_free` to free the source (when done with it).
*
* Returns the new length of the String.
*/
size_t fiobj_str_concat(FIOBJ dest, FIOBJ source);
#define fiobj_str_join(dest, src) fiobj_str_concat((dest), (src))
/**
* Dumps the `filename` file's contents at the end of the String.
*
* If `limit == 0`, than the data will be read until EOF.
*
* If the file can't be located, opened or read, or if `start_at` is out of
* bounds (i.e., beyond the EOF position), FIOBJ_INVALID is returned.
*
* If `start_at` is negative, it will be computed from the end of the file.
*
* Remember to use `fiobj_free`.
*
* NOTE: Requires a UNIX system, otherwise always returns FIOBJ_INVALID.
*/
size_t fiobj_str_readfile(FIOBJ dest, const char *filename, intptr_t start_at,
intptr_t limit);
/* *****************************************************************************
API: String Values
***************************************************************************** */
/**
* Calculates a String's SipHash value for possible use as a HashMap key.
*/
uint64_t fiobj_str_hash(FIOBJ o);
#if DEBUG
void fiobj_test_string(void);
#endif
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif