1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

split_words()

This commit is contained in:
Alasdair Kergon 2004-02-13 14:43:35 +00:00
parent cc2b3c68cc
commit c1c0685e34
2 changed files with 45 additions and 0 deletions

View File

@ -8,6 +8,8 @@
#include "lvm-types.h"
#include "lvm-string.h"
#include <ctype.h>
/*
* On error, up to glibc 2.0.6, snprintf returned -1 if buffer was too small;
* From glibc 2.1 it returns number of chars (excl. trailing null) that would
@ -46,3 +48,44 @@ int emit_to_buffer(char **buffer, size_t *size, const char *fmt, ...)
*size -= n;
return 1;
}
/*
* consume characters while they match the predicate function.
*/
static char *_consume(char *buffer, int (*fn) (int))
{
while (*buffer && fn(*buffer))
buffer++;
return buffer;
}
static int _isword(int c)
{
return !isspace(c);
}
/*
* Split buffer into NULL-separated words in argv.
* Returns number of words.
*/
int split_words(char *buffer, unsigned max, char **argv)
{
unsigned arg;
for (arg = 0; arg < max; arg++) {
buffer = _consume(buffer, isspace);
if (!*buffer)
break;
argv[arg] = buffer;
buffer = _consume(buffer, _isword);
if (*buffer) {
*buffer = '\0';
buffer++;
}
}
return arg;
}

View File

@ -21,4 +21,6 @@ int lvm_snprintf(char *buf, size_t bufsize, const char *format, ...);
int emit_to_buffer(char **buffer, size_t *size, const char *fmt, ...);
int split_words(char *buffer, unsigned max, char **argv);
#endif