isl_arg.h: add missing include
[platform/upstream/isl.git] / include / isl_arg.h
1 /*
2  * Copyright 2008-2009 Katholieke Universiteit Leuven
3  *
4  * Use of this software is governed by the GNU LGPLv2.1 license
5  *
6  * Written by Sven Verdoolaege, K.U.Leuven, Departement
7  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
8  */
9
10 #ifndef ISL_ARG_H
11 #define ISL_ARG_H
12
13 #include <stddef.h>
14 #include <stdlib.h>
15
16 #if defined(__cplusplus)
17 extern "C" {
18 #endif
19
20 struct isl_arg_choice {
21         const char      *name;
22         unsigned         value;
23 };
24
25 enum isl_arg_type {
26         isl_arg_end,
27         isl_arg_choice,
28         isl_arg_bool,
29         isl_arg_child
30 };
31
32 struct isl_arg {
33         enum isl_arg_type        type;
34         char                     short_name;
35         const char              *long_name;
36         size_t                   offset;
37         union {
38         struct {
39                 struct isl_arg_choice   *choice;
40                 unsigned                 default_value;
41         } choice;
42         struct {
43                 unsigned                 default_value;
44         } b;
45         struct {
46                 struct isl_arg          *child;
47                 size_t                   size;
48         } child;
49         } u;
50 };
51
52 #define ISL_ARG_CHOICE(st,f,s,l,c,d)    {                               \
53         .type = isl_arg_choice,                                         \
54         .short_name = s,                                                \
55         .long_name = l,                                                 \
56         .offset = offsetof(st, f),                                      \
57         .u = { .choice = { .choice = c, .default_value = d } }          \
58 },
59 #define ISL_ARG_BOOL(st,f,s,l,d)        {                               \
60         .type = isl_arg_bool,                                           \
61         .short_name = s,                                                \
62         .long_name = l,                                                 \
63         .offset = offsetof(st, f),                                      \
64         .u = { .b = { .default_value = d } }                            \
65 },
66 #define ISL_ARG_CHILD(st,f,l,c)         {                               \
67         .type = isl_arg_child,                                          \
68         .long_name = l,                                                 \
69         .offset = offsetof(st, f),                                      \
70         .u = { .child = { .child = c, .size = sizeof(*((st *)NULL)->f) } }\
71 },
72 #define ISL_ARG_END     { isl_arg_end }
73
74 #define ISL_ARG_ALL     (1 << 0)
75
76 void isl_arg_set_defaults(struct isl_arg *arg, void *opt);
77 int isl_arg_parse(struct isl_arg *arg, int argc, char **argv, void *opt,
78         unsigned flags);
79
80 #define ISL_ARG_DECL(prefix,st,arg)                                     \
81 st *prefix ## _new_with_defaults();                                     \
82 int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags);
83
84 #define ISL_ARG_DEF(prefix,st,arg)                                      \
85 st *prefix ## _new_with_defaults()                                      \
86 {                                                                       \
87         st *opt = (st *)calloc(1, sizeof(st));                          \
88         if (opt)                                                        \
89                 isl_arg_set_defaults(arg, opt);                         \
90         return opt;                                                     \
91 }                                                                       \
92                                                                         \
93 int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags)    \
94 {                                                                       \
95         return isl_arg_parse(arg, argc, argv, opt, flags);              \
96 }
97
98 #if defined(__cplusplus)
99 }
100 #endif
101
102 #endif