Initial commit
This commit is contained in:
94
lstring.h
Normal file
94
lstring.h
Normal file
@@ -0,0 +1,94 @@
|
||||
// LCZ libraries v0.1b
|
||||
|
||||
#ifndef _LCZ_STRING_H_
|
||||
#define _LCZ_STRING_H_
|
||||
|
||||
#ifndef _LCZ_TYPES_H_
|
||||
#include "types.h"
|
||||
#endif
|
||||
|
||||
|
||||
/* String: constant length string.
|
||||
* DString: dynamic length string.
|
||||
* RString: raw c-style string. Not an actual type.
|
||||
*
|
||||
* USAGE INTERFACE:
|
||||
* Length does not include '\0', but most strings should still be zero-terminated.
|
||||
*
|
||||
* DString is purposefully made to have the same memory layout as String,
|
||||
* so you can use DString everywhere you can use String (but not vice-versa) by converting it with TO_STRING(dstr).
|
||||
*
|
||||
* Advanced: Actually String is not constant length. It's just unknown how much space has been allocated for it.
|
||||
* Make sure you have enough space before modifying the lenght.
|
||||
* DStrings change their size automatically if you use the functions in this library.
|
||||
*
|
||||
* IMPLEMENTER INTERFACE
|
||||
* The "text" pointer should always be valid, unless you are building the String objects yourself.
|
||||
* "capacity" and "length" do not include the zero terminator of the string. Make sure you malloc 1 more byte to fit it.
|
||||
*
|
||||
|
||||
|
||||
* String and DString are small containers, so they are not expensive to copy around.
|
||||
* (It's PROBABLY more expensive to dereference a pointer than to copy a String container. Did not profile though.)
|
||||
*/
|
||||
|
||||
/* @TODO: Add allocator function to parameters?
|
||||
* @TODO: Use String type instead of passing text + length everywhere?
|
||||
*
|
||||
* @Note: I considered adding a SString (Static string, immutable), but it would be so inconvenient to use
|
||||
* that I decided to leave it out (it's just like the "const" keyword)
|
||||
*/
|
||||
|
||||
struct String
|
||||
{
|
||||
char *text;
|
||||
u64 length;
|
||||
};
|
||||
|
||||
struct DString
|
||||
{
|
||||
char *text;
|
||||
u64 length;
|
||||
u64 capacity;
|
||||
};
|
||||
|
||||
typedef struct String String;
|
||||
typedef struct DString DString;
|
||||
|
||||
|
||||
#define TO_STRING(dstr) (*((String*)&dstr))
|
||||
|
||||
// String building / constructors
|
||||
String string_take(char *src);
|
||||
DString dstring_take(char *src);
|
||||
String string_copy(const char *src, u64 length);
|
||||
DString dstring_copy(const char *src, u64 length);
|
||||
DString dstring_new(u64 capacity);
|
||||
// n = number of strings, ... = , const char *src1, u64 length1, ...
|
||||
String string_concat(u32 n, ...);
|
||||
// n = number of strings, ... = , const char *src1, u64 length1, ...
|
||||
DString dstring_concat(u32 n, ...);
|
||||
|
||||
// Compute string length, excluding zero-terminator
|
||||
u64 rstring_length(const char *src);
|
||||
|
||||
// Comparison
|
||||
int rstring_compare(const char *left, const char *right);
|
||||
bool string_equal(String left, String right);
|
||||
bool string_find(String str, u64 start_index, String to_find, u64 *found_index);
|
||||
|
||||
// String specific operations
|
||||
// Warning: You have to make sure the space pointed by str is big enough to fit to_append.
|
||||
void string_append(String *str, const char *to_append, u64 count);
|
||||
String string_substring(String *str, u64 start, u64 end);
|
||||
String string_trim(String *str);
|
||||
|
||||
// DString specific operations
|
||||
void dstring_reserve(DString *dstr, u64 new_length);
|
||||
void dstring_append(DString *dstr, const char *to_append, u64 count);
|
||||
void dstring_insert(DString *dstr, u64 index, const char *to_insert, u64 count);
|
||||
void dstring_erase(DString *dstr, u64 index, u64 count);
|
||||
void dstring_replace(DString *dstr, u64 index, u64 rem_count, const char *to_insert, u64 ins_count);
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user