/******************************************************************************
Online C Compiler.
Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdio.h>
#include <string.h>
int string_parse(char **parameter, char* buf, size_t buf_sz)
{
char stopchar = ' ';
char stopchars[] = "\'\"\0";
while(*++(*parameter) != ' ')
{;;}
while(*++(*parameter))
{
if (strchr(stopchars, **parameter))
{
stopchar = **parameter;
continue;
}
if (**parameter != stopchar && buf_sz > 1)
{
*buf++ = **parameter;
buf_sz--;
}
else
break;
}
*buf = '\0';
return 1;
}
int path_parse(char **parameter, char* buf, size_t buf_sz)
{
}
int num_parse(char **parameter, int *number, int *decimal)
{
int num = 0;
int dec = 0;
int found = 0;
int neg = 0;
//printf ("n: %s\n", *parameter);
char* start = *parameter;
while(**parameter)
{
if (**parameter == '-')
neg++;
while (isdigit(**parameter))
{
found++;
num = num *10 + **parameter - '0';
(*parameter)++;
}
if(found)
{
if (**parameter == '.')
{
while (isdigit(*++(*parameter)))
{
found++;
dec = dec *10 + **parameter - '0';
}
}
break;
}
(*parameter)++;
}
if (found == 0)
*parameter = start;
if(number)
*number = neg & 1 ? -num : num;
if (decimal)
*decimal = dec;
return found;
}
void argparse(char *parameter, int (*arg_callback)(char **parameter))
{
//printf ("%s\n",parameter);
while (*parameter)
{
switch (*parameter)
{
case '-':
{
while (*++parameter)
{
if (!arg_callback(¶meter))
return;
break;
}
}
}
parameter++;
}
}
int arg_callback(char **parameter)
{
int num, dec;
char buf[32];
switch (**parameter)
{
case 'P' :
case 'p' :
printf ("Arg: %c\n", **parameter); //50 - 200%
if (num_parse(parameter, &num, &dec))
printf ("Val: %d.%d\n", num, dec);
break;
case 'S' :
case 's' :
printf ("Arg: %c\n", **parameter); //50 - 200%
if (num_parse(parameter, &num, &dec))
printf ("Val: %d.%d\n", num, dec);
break;
case 'e' :
case 'E' :
printf ("Arg: %c\n", **parameter);
if (string_parse(parameter, buf, sizeof(buf)))
printf ("Val: %s\n", buf);
break;
default :
printf ("Unknown switch '%c'\n",**parameter);
//return 0;
}
return 1;
}
int main()
{
argparse("-p 42 -s 9.9 -P -78.9009 -f -E /rockbox/path/f -e 'Yestest'", &arg_callback);
return 0;
}