1 /*
2 Copyright Rene Rivera 2011-2015
3 Distributed under the Boost Software License, Version 1.0.
4 (See accompanying file LICENSE_1_0.txt or copy at
5 http://www.boost.org/LICENSE_1_0.txt)
6 */
7 #include <boost/predef/detail/test_def.h>
8 
str_token(const char ** str,const char * space)9 const char * str_token(const char ** str, const char * space)
10 {
11     unsigned span;
12     char * token;
13     for (; **str != 0; *str += 1)
14     {
15         if (0 == strchr(space, **str))
16         {
17             break;
18         }
19     }
20     span = strcspn(*str, space);
21     token = (char *)malloc(span+1);
22     strncpy(token, *str, span);
23     token[span] = 0;
24     for (*str += span; **str != 0; *str += 1)
25     {
26         if (0 == strchr(space, **str))
27         {
28             break;
29         }
30     }
31     return token;
32 }
33 
34 const char * whitespace = " ";
35 const char * dot = ".";
36 
main(int argc,const char ** argv)37 int main(int argc, const char ** argv)
38 {
39     unsigned x = 0;
40     int argi = 1;
41     create_predef_entries();
42 #if 0
43     qsort(generated_predef_info,generated_predef_info_count,
44         sizeof(predef_info),predef_info_compare);
45     for (x = 0; x < generated_predef_info_count; ++x)
46     {
47         printf("%s: %d\n", generated_predef_info[x].name, generated_predef_info[x].value);
48     }
49 #endif
50     int result = -1;
51     for (argi = 1; argi < argc; ++argi)
52     {
53         const char * exp = argv[argi];
54         const char * exp_name = str_token(&exp, whitespace);
55         const char * exp_op = str_token(&exp, whitespace);
56         const char * exp_val = str_token(&exp, whitespace);
57         unsigned exp_version = 0;
58         if (*exp_val != 0)
59         {
60             exp = exp_val;
61             const char * exp_val_a = str_token(&exp, dot);
62             const char * exp_val_b = str_token(&exp, dot);
63             const char * exp_val_c = str_token(&exp, dot);
64             exp_version = BOOST_VERSION_NUMBER(atoi(exp_val_a), atoi(exp_val_b),atoi(exp_val_c));
65         }
66         for (x = 0; x < generated_predef_info_count; ++x)
67         {
68             if (*exp_op == 0 &&
69                 generated_predef_info[x].value > 0 &&
70                 strcmp(exp_name, generated_predef_info[x].name) == 0)
71             {
72                 /* Expression of the form "BOOST_x_yy" is true. */
73                 result = 0;
74                 break;
75             }
76             else if (*exp_op == 0 &&
77                 generated_predef_info[x].value == 0 &&
78                 strcmp(exp_name, generated_predef_info[x].name) == 0)
79             {
80                 /* Expression of the form "BOOST_x_yy" is false. */
81                 return argi;
82             }
83             else if (*exp_op != 0 && *exp_val != 0 &&
84                 strcmp(exp_name, generated_predef_info[x].name) == 0)
85             {
86                 /* Expression of the form "BOOST_x_yy op val". */
87                 result = 0;
88                 if (0 == strcmp(">",exp_op) && !(generated_predef_info[x].value > exp_version)) return argi;
89                 if (0 == strcmp("<",exp_op) && !(generated_predef_info[x].value < exp_version)) return argi;
90                 if (0 == strcmp(">=",exp_op) && !(generated_predef_info[x].value >= exp_version)) return argi;
91                 if (0 == strcmp("<=",exp_op) && !(generated_predef_info[x].value <= exp_version)) return argi;
92                 if (0 == strcmp("==",exp_op) && !(generated_predef_info[x].value == exp_version)) return argi;
93                 if (0 == strcmp("!=",exp_op) && !(generated_predef_info[x].value != exp_version)) return argi;
94             }
95         }
96     }
97     return result;
98 }
99