mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
New utility function: ptrlen_get_word().
This is similar to strtok, only it operates on a ptrlen. Therefore it can be properly stateless, or rather, it stores its state by overwriting the input ptrlen to point to a tail of its previous value. Also in this commit I add a clarifying comment about when ptrlen_{starts,ends}with will write through its 'tail' pointer.
This commit is contained in:
parent
190761a272
commit
7ae5c35419
6
misc.h
6
misc.h
@ -168,8 +168,14 @@ static inline ptrlen ptrlen_from_strbuf(strbuf *sb)
|
|||||||
bool ptrlen_eq_string(ptrlen pl, const char *str);
|
bool ptrlen_eq_string(ptrlen pl, const char *str);
|
||||||
bool ptrlen_eq_ptrlen(ptrlen pl1, ptrlen pl2);
|
bool ptrlen_eq_ptrlen(ptrlen pl1, ptrlen pl2);
|
||||||
int ptrlen_strcmp(ptrlen pl1, ptrlen pl2);
|
int ptrlen_strcmp(ptrlen pl1, ptrlen pl2);
|
||||||
|
/* ptrlen_startswith and ptrlen_endswith write through their 'tail'
|
||||||
|
* argument if and only if it is non-NULL and they return true. Hence
|
||||||
|
* you can write ptrlen_startswith(thing, prefix, &thing), writing
|
||||||
|
* back to the same ptrlen it read from, to remove a prefix if present
|
||||||
|
* and say whether it did so. */
|
||||||
bool ptrlen_startswith(ptrlen whole, ptrlen prefix, ptrlen *tail);
|
bool ptrlen_startswith(ptrlen whole, ptrlen prefix, ptrlen *tail);
|
||||||
bool ptrlen_endswith(ptrlen whole, ptrlen suffix, ptrlen *tail);
|
bool ptrlen_endswith(ptrlen whole, ptrlen suffix, ptrlen *tail);
|
||||||
|
ptrlen ptrlen_get_word(ptrlen *input, const char *separators);
|
||||||
char *mkstr(ptrlen pl);
|
char *mkstr(ptrlen pl);
|
||||||
int string_length_for_printf(size_t);
|
int string_length_for_printf(size_t);
|
||||||
/* Derive two printf arguments from a ptrlen, suitable for "%.*s" */
|
/* Derive two printf arguments from a ptrlen, suitable for "%.*s" */
|
||||||
|
20
utils.c
20
utils.c
@ -938,6 +938,26 @@ bool ptrlen_endswith(ptrlen whole, ptrlen suffix, ptrlen *tail)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ptrlen ptrlen_get_word(ptrlen *input, const char *separators)
|
||||||
|
{
|
||||||
|
const char *p = input->ptr, *end = p + input->len;
|
||||||
|
ptrlen toret;
|
||||||
|
|
||||||
|
while (p < end && strchr(separators, *p))
|
||||||
|
p++;
|
||||||
|
toret.ptr = p;
|
||||||
|
while (p < end && !strchr(separators, *p))
|
||||||
|
p++;
|
||||||
|
toret.len = p - (const char *)toret.ptr;
|
||||||
|
|
||||||
|
size_t to_consume = p - (const char *)input->ptr;
|
||||||
|
assert(to_consume <= input->len);
|
||||||
|
input->ptr = (const char *)input->ptr + to_consume;
|
||||||
|
input->len -= to_consume;
|
||||||
|
|
||||||
|
return toret;
|
||||||
|
}
|
||||||
|
|
||||||
char *mkstr(ptrlen pl)
|
char *mkstr(ptrlen pl)
|
||||||
{
|
{
|
||||||
char *p = snewn(pl.len + 1, char);
|
char *p = snewn(pl.len + 1, char);
|
||||||
|
Loading…
Reference in New Issue
Block a user