Module str
String Manipulation.
 When building up strings use a strbuf, which is a sequence of chars; can add characters
 and strings, formatted strings (like str_fmt) and also insert and remove substrings.
 The actual string is always *S but use strbuf_tostring to properly clean up and
 dispose of the sequence.
str_split creates a refcounted array of strings, splitting using a delimiter. str_concat works the other way, joining an array of strings with a separator.
 There are searching operations which return a boolean or integer index,
 loosely based on C++’s std::string methods.
smaps (‘simple maps’) are arrays of strings where the odd indices are keys and the even indices are values. str_lookup does a linear search, which is simple and sufficient for small maps. A convenient way to build these maps is to start with smap_new and use either smap_add to simply add, or smap_put to update/add, key/value pairs.
See test-str.c
String buffers
| strbuf_new (void) | new string buffer. | 
| strbuf_tostring (sp) | convert a string buffer to a string. | 
| strbuf_add (sp, ch) | append a character to a string buffer. | 
| strbuf_adds (sp, ss) | append a string to a string buffer. | 
| strbuf_addf (sp, fmt, ...) | append formatted results to a string buffer. | 
| strbuf_addr (sp, s, i1, i2) | append a range of chars from a string. | 
| strbuf_addsp (ss, s) | append a string surronded by spaces. | 
| strbuf_insert_at (sp, pos, src, sz) | insert a string into a string buffer at pos. | 
| strbuf_erase (sp, pos, len) | erase lenchars frompos. | 
| strbuf_replace (sp, pos, len, s) | replace lenchars fromposwith the strings. | 
Extra string functions
| str_vfmt (fmt, ap) | safe verson of vsprintfwhich returns a refcounted string. | 
| str_fmt (fmt, ...) | safe verson of sprintfwhich returns a refcounted string. | 
| str_sub (s, i1, i2) | extract a substring. | 
| str_trim (s) | trim a string in-place | 
Finding things in strings
| str_end (s) | get pointer to last char of string. | 
| str_eq (a, b) | are these strings equal? | 
| str_starts_with (s, prefix) | does the string start with this prefix? | 
| str_ends_with (s, postfix) | does the string end with this postfix? | 
| str_is_blank (s) | does a string only consist of blank characters? | 
| str_findstr (s, sub) | find substring subin the string. | 
| str_contains (s, sub, after) | contains substring? | 
| str_findch (s, ch) | find character chin the string. | 
| str_find_first_of (s, ps) | find first character that is in the string ps | 
| str_find_first_not_of (s, ps) | find first character that is not in the string ps | 
Splitting and Concatention
| str_split_n (s, delim, nsplit) | split a string upto nsplittimes using delimiters. | 
| str_split (s, delim) | split a string using delimiters. | 
| str_concat (ss, delim) | concatenate an array of strings. | 
| str_strings (first, ...) | Allocating a simple array of strings. | 
| str_index (strings, s) | index of sin string arraystrings. | 
| str_eq_any (s, ...) | 1-based index of sin an arbitrary number of string arguments. | 
smap Functions
| FOR_SMAP | Iterate over a simple map | 
| str_lookup_ptr (substs, name) | Look up a string in a smap returning pointer to entry. | 
| str_lookup (substs, name) | Look up a string key in a smap returning associated value. | 
| str_gets (substs, name) | Like str_lookup but assuming value is a string. | 
| smap_new (ref) | New simple map builder. | 
| smap_add (smap, name, data) | Add a key/value pair. | 
| smap_put (smap, name, data) | Update/insert a key/value pair. | 
| smap_get (smap, name) | Get the value associated with name. | 
| smap_close (smap) | close the sequence, returning a simple map. | 
| smap_len (smap) | number of entries. | 
| smap_put_ref (name, data) | add referenced key/value pair. | 
| smap_put_ref (name, data) | update/insert a referenced key/value pair. | 
String buffers
- strbuf_new (void)
- 
    new string buffer.
 Currently, string buffers are just sequences of chars.
    Parameters:- void
 Returns:- 
           char * *
    
 
- strbuf_tostring (sp)
- 
    convert a string buffer to a string.
    Parameters:- sp char**
 Returns:- 
           char*
    
 
- strbuf_add (sp, ch)
- 
    append a character to a string buffer.
    Parameters:- sp char**
- ch char
 
- strbuf_adds (sp, ss)
- 
    append a string to a string buffer.
    Parameters:- sp char * *
- ss str_t
 
- strbuf_addf (sp, fmt, ...)
- 
    append formatted results to a string buffer.
 Note that the result must be less than BUFSZ(default 256)Parameters:- sp char * *
- fmt str_t
- ...
 
- strbuf_addr (sp, s, i1, i2)
- 
    append a range of chars from a string.
    Parameters:- sp char * *
- s str_t
- i1 int
- i2 int
 
- strbuf_addsp (ss, s)
- 
    append a string surronded by spaces.
 useful when building up a string of tokens separated by spaces.
    Parameters:- ss char * *
- s str_t
 
- strbuf_insert_at (sp, pos, src, sz)
- 
    insert a string into a string buffer at pos. May specify the number of characters to be copiedsz; if this is -1 then use the ordinary length of the string.Parameters:- sp char * *
- pos int
- src str_t
- sz int
 Returns:- 
           char *
    
 
- strbuf_erase (sp, pos, len)
- 
    erase lenchars frompos.Parameters:- sp char * *
- pos int
- len int
 Returns:- 
           char *
    
 
- strbuf_replace (sp, pos, len, s)
- 
    replace lenchars fromposwith the strings.Parameters:- sp char * *
- pos int
- len int
- s str_t
 Returns:- 
           char *
    
 
Extra string functions
- str_vfmt (fmt, ap)
- 
    safe verson of vsprintfwhich returns a refcounted string.Parameters:- fmt str_t
- ap va_list
 Returns:- 
           char *
    
 
- str_fmt (fmt, ...)
- 
    safe verson of sprintfwhich returns a refcounted string.Parameters:- fmt str_t
- ...
 Returns:- 
           char *
    
 
- str_sub (s, i1, i2)
- 
    extract a substring.
 Note that i2and ‘i1’ are indices which may be negative, so (0,-1) is a string copy and (1,-2) copies from 2nd to second-last character.Parameters:- s str_t
- i1 int
- i2 int
 Returns:- 
           char *
    
 Usage:- str_sub("hello",2,3) -> "l" 
- str_sub("hello",2,-1) -> "llo" 
 
- str_trim (s)
- 
    trim a string in-place
    Parameters:- s char *
 
Finding things in strings
- str_end (s)
- 
    get pointer to last char of string.
    Parameters:- s str_t
 Returns:- 
           str_t
    
 
- str_eq (a, b)
- 
    are these strings equal?
    Parameters:- a str_t
- b str_t
 
- str_starts_with (s, prefix)
- 
    does the string start with this prefix?
    Parameters:- s str_t
- prefix str_t
 Returns:- 
           bool
    
 
- str_ends_with (s, postfix)
- 
    does the string end with this postfix?
    Parameters:- s str_t
- postfix str_t
 Returns:- 
           bool
    
 
- str_is_blank (s)
- 
    does a string only consist of blank characters?
    Parameters:- s str_t
 Returns:- 
           bool
    
 
- str_findstr (s, sub)
- 
    find substring subin the string.Parameters:- s str_t
- sub str_t
 Returns:- 
           int
    
 
- str_contains (s, sub, after)
- 
    contains substring?
 also optionally return index past match.
    Parameters:- s str_t
- sub str_t
- after int *
 Returns:- 
           bool
    
 
- str_findch (s, ch)
- 
    find character chin the string.Parameters:- s str_t
- ch char
 Returns:- 
           int
    
 
- str_find_first_of (s, ps)
- 
    find first character that is in the string psParameters:- s str_t
- ps str_t
 Returns:- 
           int
    
 
- str_find_first_not_of (s, ps)
- 
    find first character that is not in the string psParameters:- s str_t
- ps str_t
 Returns:- 
           int
    
 
Splitting and Concatention
- str_split_n (s, delim, nsplit)
- 
    split a string upto nsplittimes using delimiters. Returns a ref array of ref strings.Parameters:- s str_t
- delim str_t
- nsplit int
 Returns:- 
           char * *
    
 
- str_split (s, delim)
- 
    split a string using delimiters.
 Returns a ref array of ref strings.
    Parameters:- s str_t
- delim str_t
 Returns:- 
           char * *
    
 
- str_concat (ss, delim)
- 
    concatenate an array of strings.
 Assumes that the array is refcounted
    Parameters:- ss char * *
- delim str_t
 Returns:- 
           char *
    
 
- str_strings (first, ...)
- 
    Allocating a simple array of strings.
 End the string arguments with a final NULL. Note that this array is not a ref container; the string addresses are just copied over.Parameters:- first char *
- ...
 Returns:- 
           char * *
    
 
- str_index (strings, s)
- 
    index of sin string arraystrings. -1 if not found. The string array must be NULL terminated.Parameters:- strings const char * *
- s const char *
 Returns:- 
           int
    
 
- str_eq_any (s, ...)
- 
    1-based index of sin an arbitrary number of string arguments. If we don’t match, then return 0! str_eq_any is a convenient replacement for a chain of string comparions. Also useful to parse enum values.Parameters:- s string the string to match
- ... the strings to match against
 Returns:- 
           int
    
 Usage:str_eq_any("foo","baz","foo","bar") == 2; 
smap Functions
- FOR_SMAP
- 
    Iterate over a simple map
    - k variable for key
- v variable for value
 
- str_lookup_ptr (substs, name)
- 
    Look up a string in a smap returning pointer to entry.
    Parameters:- substs char * *
- name const char *
 Returns:- 
           void * *
    
 
- str_lookup (substs, name)
- 
    Look up a string key in a smap returning associated value.
    Parameters:- substs char * *
- name const char *
 Returns:- 
           void *
    
 
- str_gets (substs, name)
- 
    Like str_lookup but assuming value is a string.
    Parameters:- substs char * *
- name const char *
 Returns:- 
           char *
    
 
- smap_new (ref)
- 
    New simple map builder.
    Parameters:- ref bool
 Returns:- 
           char * * *
    
 
- smap_add (smap, name, data)
- 
    Add a key/value pair.
    Parameters:- smap char * * *
- name const char *
- data const void *
 
- smap_put (smap, name, data)
- 
    Update/insert a key/value pair.
    Parameters:- smap char * * *
- name const char *
- data const void *
 
- smap_get (smap, name)
- 
    Get the value associated with name.Parameters:- smap char * * *
- name const char *
 Returns:- 
           void *
    
 
- smap_close (smap)
- 
    close the sequence, returning a simple map.
    Parameters:- smap char * * *
 Returns:- 
           char * *
    
 
- smap_len (smap)
- 
    number of entries.
    Parameters:- smap char * * *
 Returns:- 
           int
    
 
- smap_put_ref (name, data)
- 
    add referenced key/value pair.
    Parameters:- name str_t
- data str_t
 
- smap_put_ref (name, data)
- 
    update/insert a referenced key/value pair.
    Parameters:- name str_t
- data str_t