1
0
Fork 0
forked from len0rd/rockbox

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[] = "\'\"";
int skipped = 0;
int found = 0;
if (!parameter || !*parameter)
{
*buf = '\0';
return 0;
}
const char* start = *parameter;
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 */
int found = 0;
const char tf_val[]="fn0ty1";/* false chars on left f/t should be balanced fffttt */
if (!parameter || !*parameter)
return 0;
const char* start = *parameter;
@ -133,6 +140,8 @@ int longnum_parse(const char **parameter, long *number, long *decimal)
int neg = 0;
int digits = 0;
//logf ("n: %s\n", *parameter);
if (!parameter || !*parameter)
return 0;
const char* start = *parameter;
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
* 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;
char argchar;
@ -222,7 +232,10 @@ void argparse(const char *parameter, int parameter_len, int (*arg_callback)(char
{
if ((*parameter) == '\0')
return;
logf ("%s\n",parameter);
if (parameter_len < 0) { logf ("%s\n", parameter); }
else { logf ("%.*s\n", plen, parameter); }
argchar = *parameter;
lastchr = (*(parameter + 1) == '\0');
while (*++parameter || lastchr)
@ -230,7 +243,7 @@ void argparse(const char *parameter, int parameter_len, int (*arg_callback)(char
lastchr = false;
if (isspace(*parameter))
continue; /* eat spaces at beginning */
if (!arg_callback(argchar, &parameter))
if (!arg_callback(argchar, &parameter, userdata))
return;
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
* 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));
#endif /* _LIB_ARG_HELPER_H_ */

View file

@ -1120,8 +1120,9 @@ int gui_syncpitchscreen_run(void)
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;
long num, dec;
bool bret;
@ -1232,7 +1233,7 @@ enum plugin_status plugin_start(const void* parameter)
struct pvars cur;
fill_pitchvars(&cur);
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)
{
rb->sound_set_pitch(pitch_vars.pitch);