31 int ( *handler ) (
char *,
size_t,
void * ),
35 char *arg_start, *arg;
38 arg_start = *arg_start_p;
39 *arg_start_p = &ptr[1];
40 arg_len = ptr - arg_start;
45 arg = xmalloc ( arg_len + 1 );
51 while ( s < arg_len ) {
53 arg[d++] = arg_start[s];
60 memcpy ( arg, arg_start, arg_len );
63 debug ( 15,
"%p %p %i: <%s>", arg_start, ptr, arg_len, arg );
67 if ( ( rc = handler ( arg, arg_len, additional_arg ) ) ) {
77 int ( *handler ) (
char *,
size_t,
void * ),
82 char *arg_start, *ptr, *instr;
84 instr = strdup ( _instr );
89 ptr = strpbrk ( ptr,
" \t\"\'" );
91 debug ( 10,
"ptr == %p", ptr );
98 debug ( 10,
"*ptr == \"%c\" (%i)", *ptr, *ptr );
101 switch ( * ( ptr++ ) ) {
106 if ( ( rc =
_str_splitargs ( &ptr[-1], &arg_start, quotes, handler, arg ) ) )
117 while ( ( ptr = strchr ( ptr,
'"' ) ) != NULL ) {
122 while ( *p ==
'\\' ) {
127 critical (
"Dangerous internal error" );
132 if ( ( ptr - p ) % 2 )
138 error (
"Unterminated quote <\"> in string: <%s>", instr );
150 ptr = strchr ( ptr,
'\'' );
154 error (
"Unterminated quote <'> in string: <%s>", instr );
165 int rc =
_str_splitargs ( strchr ( arg_start, 0 ), &arg_start, quotes, handler, arg );
static int _str_splitargs(char *ptr, char **arg_start_p, int quotes, int(*handler)(char *, size_t, void *), char *additional_arg)