On Sun, Nov 23, 2008 at 10:49 PM, Enlightenment SVN
<[EMAIL PROTECTED]> wrote:
> Log:
> Easy to use and powerful getopt implementation.
>
> Create a parser description and give it the parameters, that's it. You
> can store values (automatically converting types!), count occurrences,
> make it true or false, create a list, choose from a list of items or
> even specify your own callback to process arguments!
>
> It was inspired by Python's optparse:
> http://www.python.org/doc/2.5.2/lib/module-optparse.html
If you wonder about usage, see attached file. If you use the provided
macros it become very easy. I tried to provide common cases, but we
can extend it even further, like callbacks to parse
rectangles/geometry and other stuff we consider often used.
--
Gustavo Sverzut Barbieri
http://profusion.mobi embedded systems
--------------------------------------
MSN: [EMAIL PROTECTED]
Skype: gsbarbieri
Mobile: +55 (19) 9225-2202
#include <Evas.h>
#include <Ecore.h>
#include <Ecore_Getopt.h>
#include <Ecore_Evas.h>
struct geometry
{
int x, y, w, h;
};
static unsigned char
geometry_parse(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage)
{
struct geometry *v = (struct geometry *)storage->ptrp;
if (sscanf(str, "%d:%d:%d:%d", &v->x, &v->y, &v->w, &v->h) != 4)
{
fprintf(stderr, "ERROR: incorrect geometry value '%s'\n", str);
return 0;
}
return 1;
}
static const char *choices[] = {"apple", "orange", "banana", NULL};
static const Ecore_Getopt options = {
"envision",
"abc %prog [options] %prog <xxx>",
"0.1.0",
"(C) 2008 Enlightenment",
"BSD\nThis is a 3 clause bsd bla bla",
"a simple document viewer using enlightenment foundation libraries.\n"
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
"ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC\n"
"\tteste\tteste\tteste\tteste\tteste\tteste\tteste\tteste\tteste\tteste\tteste\tteste\tteste\tteste\n"
"\tx\ta\tb\tc\n"
"\tXX\tAA\tBB\tCC\n"
"xxx %prog %version yyy",
1,
{
ECORE_GETOPT_STORE_INT('i', "integer", "remeber some integer"),
ECORE_GETOPT_STORE_METAVAR_INT('I', "INTEGER", "remeber some integer", "VAL"),
ECORE_GETOPT_STORE_FULL_INT('X', "INT", "remeber some integer", "X", ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL, 1234),
ECORE_GETOPT_STORE_BOOL('b', "boolean", "remeber some boolean"),
ECORE_GETOPT_STORE_DEF_BOOL('B', "BOOLEAN", "remeber some boolean", 1),
ECORE_GETOPT_STORE_DEF_DOUBLE('D', "DOUBLE", "remeber some double", 123.456),
ECORE_GETOPT_STORE_CONST('c', "const", "store const value", "abc"),
ECORE_GETOPT_STORE_TRUE('t', "true", "store true bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla"),
ECORE_GETOPT_STORE_FALSE('f', "false", "store false"),
ECORE_GETOPT_CHOICE('C', "choice", "choose an option", choices),
ECORE_GETOPT_APPEND('a', "append", "append some integers", ECORE_GETOPT_TYPE_INT),
ECORE_GETOPT_CALLBACK_ARGS('G', "geometry", "geometry to use in x:y:w:h form.", "X:Y:W:H", geometry_parse, NULL),
ECORE_GETOPT_COUNT('v', "verbose", "be more verbose"),
ECORE_GETOPT_VERSION('V', "version"),
ECORE_GETOPT_COPYRIGHT('R', "copyright"),
ECORE_GETOPT_LICENSE('L', "license"),
ECORE_GETOPT_HELP('h', "help"),
ECORE_GETOPT_SENTINEL
}
};
int
main(int argc, char *argv[])
{
struct geometry geometry = {0, 0, 0, 0};
int args, i1 = 0, i2 = 0, i3 = 0, verbose = 0;
unsigned char b1 = 0, b2 = 0, truev = 0, falsev = 1, help = 0;
double d1 = 0.0;
void *constant = NULL;
char *choice = NULL;
Eina_List *list = NULL, *n;
Ecore_Getopt_Value values[] = {
ECORE_GETOPT_VALUE_INT(i1),
ECORE_GETOPT_VALUE_INT(i2),
ECORE_GETOPT_VALUE_INT(i3),
ECORE_GETOPT_VALUE_BOOL(b1),
ECORE_GETOPT_VALUE_BOOL(b2),
ECORE_GETOPT_VALUE_DOUBLE(d1),
ECORE_GETOPT_VALUE_PTR(constant),
ECORE_GETOPT_VALUE_BOOL(truev),
ECORE_GETOPT_VALUE_BOOL(falsev),
ECORE_GETOPT_VALUE_STR(choice),
ECORE_GETOPT_VALUE_LIST(list),
ECORE_GETOPT_VALUE_PTR_CAST(geometry),
ECORE_GETOPT_VALUE_INT(verbose),
ECORE_GETOPT_VALUE_NONE,
ECORE_GETOPT_VALUE_NONE,
ECORE_GETOPT_VALUE_NONE,
ECORE_GETOPT_VALUE_BOOL(help),
ECORE_GETOPT_VALUE_NONE
};
ecore_init();
ecore_app_args_set(argc, (const char **)argv);
if (ecore_getopt_parser_has_duplicates(&options))
return -1;
args = ecore_getopt_parse(&options, values, argc, argv);
if (args < 0)
{
fputs("ERROR: could not parse options.\n", stderr);
ecore_shutdown();
return args;
}
if (help)
{
printf("help was displayed, exit\n");
return 0;
}
printf("Arguments parsed fine. first non option is at %d\n", args);
for (; args < argc; args++)
printf("args: [%s]\n", argv[args]);
printf("Values:\n");
printf("\tgeometry: %d %d %d %d\n",
geometry.x, geometry.y, geometry.w, geometry.h);
printf("\ti1=%d, i2=%d, i3=%d, verbose=%d\n", i1, i2, i3, verbose);
printf("\tb1=%hhu, b2=%hhu, truev=%d, falsev=%d\n", b1, b2, truev, falsev);
printf("\td1=%f\n", d1);
printf("\tconstant=%p\n", constant);
printf("\tchoice=%s\n", choice);
printf("\tlist=%p:\n", list);
for (n = list; n != NULL; n = n->next)
{
int *v = n->data;
printf("\t\tnode value: %d\n", *v);
}
list = ecore_getopt_list_free(list);
ecore_shutdown();
return 0;
}
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel