plugin argparse update to add userdata to callback

fix a couple of gotchas if you aren't using NULL terminated strings

Change-Id: If5d2a60c0c3e1653e26df50bfda7d3191989bca9
This commit is contained in:
William Wilgus 2024-07-26 00:56:13 -04:00
parent e8d7a8baaf
commit e94f778f1c
3 changed files with 24 additions and 10 deletions

View file

@ -44,6 +44,11 @@ int string_parse(const char **parameter, char* buf, size_t buf_sz)
char stopchars[] = "\'\""; char stopchars[] = "\'\"";
int skipped = 0; int skipped = 0;
int found = 0; int found = 0;
if (!parameter || !*parameter)
{
*buf = '\0';
return 0;
}
const char* start = *parameter; const char* start = *parameter;
if (strchr(stopchars, *start)) if (strchr(stopchars, *start))
@ -95,6 +100,8 @@ int bool_parse(const char **parameter, bool *choice)
/* determine true false using the first character the rest are skipped/ignored */ /* determine true false using the first character the rest are skipped/ignored */
int found = 0; int found = 0;
const char tf_val[]="fn0ty1";/* false chars on left f/t should be balanced fffttt */ const char tf_val[]="fn0ty1";/* false chars on left f/t should be balanced fffttt */
if (!parameter || !*parameter)
return 0;
const char* start = *parameter; const char* start = *parameter;
@ -133,6 +140,8 @@ int longnum_parse(const char **parameter, long *number, long *decimal)
int neg = 0; int neg = 0;
int digits = 0; int digits = 0;
//logf ("n: %s\n", *parameter); //logf ("n: %s\n", *parameter);
if (!parameter || !*parameter)
return 0;
const char* start = *parameter; const char* start = *parameter;
if (*start == '-') if (*start == '-')
@ -209,7 +218,8 @@ int num_parse(const char **parameter, int *number, int *decimal)
* Note: WS at beginning is stripped, **parameter starts at the first NON WS char * Note: WS at beginning is stripped, **parameter starts at the first NON WS char
* return 0 for arg_callback to quit parsing immediately * return 0 for arg_callback to quit parsing immediately
*/ */
void argparse(const char *parameter, int parameter_len, int (*arg_callback)(char argchar, const char **parameter)) void argparse(const char *parameter, int parameter_len, void *userdata,
int (*arg_callback)(char argchar, const char **parameter, void *userdata))
{ {
bool lastchr; bool lastchr;
char argchar; char argchar;
@ -222,7 +232,10 @@ void argparse(const char *parameter, int parameter_len, int (*arg_callback)(char
{ {
if ((*parameter) == '\0') if ((*parameter) == '\0')
return; return;
logf ("%s\n",parameter);
if (parameter_len < 0) { logf ("%s\n", parameter); }
else { logf ("%.*s\n", plen, parameter); }
argchar = *parameter; argchar = *parameter;
lastchr = (*(parameter + 1) == '\0'); lastchr = (*(parameter + 1) == '\0');
while (*++parameter || lastchr) while (*++parameter || lastchr)
@ -230,7 +243,7 @@ void argparse(const char *parameter, int parameter_len, int (*arg_callback)(char
lastchr = false; lastchr = false;
if (isspace(*parameter)) if (isspace(*parameter))
continue; /* eat spaces at beginning */ continue; /* eat spaces at beginning */
if (!arg_callback(argchar, &parameter)) if (!arg_callback(argchar, &parameter, userdata))
return; return;
break; break;
} }

View file

@ -54,7 +54,7 @@ int num_parse(const char **parameter, int *number, int *decimal);
* Note: WS at beginning is stripped, **parameter starts at the first NON WS char * Note: WS at beginning is stripped, **parameter starts at the first NON WS char
* return 0 for arg_callback to quit parsing immediately * return 0 for arg_callback to quit parsing immediately
*/ */
void argparse(const char *parameter, int parameter_len, void argparse(const char *parameter, int parameter_len, void *userdata,
int (*arg_callback)(char argchar, const char **parameter)); int (*arg_callback)(char argchar, const char **parameter, void *userdata));
#endif /* _LIB_ARG_HELPER_H_ */ #endif /* _LIB_ARG_HELPER_H_ */

View file

@ -1120,8 +1120,9 @@ int gui_syncpitchscreen_run(void)
return 0; return 0;
} }
static int arg_callback(char argchar, const char **parameter) static int arg_callback(char argchar, const char **parameter, void *userdata)
{ {
(void)userdata;
int ret; int ret;
long num, dec; long num, dec;
bool bret; bool bret;
@ -1232,7 +1233,7 @@ enum plugin_status plugin_start(const void* parameter)
struct pvars cur; struct pvars cur;
fill_pitchvars(&cur); fill_pitchvars(&cur);
fill_pitchvars(&pitch_vars); fill_pitchvars(&pitch_vars);
argparse((const char*) parameter, -1, &arg_callback); argparse((const char*) parameter, -1, NULL, &arg_callback);
if (pitch_vars.pitch != cur.pitch) if (pitch_vars.pitch != cur.pitch)
{ {
rb->sound_set_pitch(pitch_vars.pitch); rb->sound_set_pitch(pitch_vars.pitch);