predef_check.h 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. const char * str_token(const char ** str, const char * space)
  9. {
  10. unsigned span;
  11. char * token;
  12. for (; **str != 0; *str += 1)
  13. {
  14. if (0 == strchr(space, **str))
  15. {
  16. break;
  17. }
  18. }
  19. span = strcspn(*str, space);
  20. token = (char *)malloc(span+1);
  21. strncpy(token, *str, span);
  22. token[span] = 0;
  23. for (*str += span; **str != 0; *str += 1)
  24. {
  25. if (0 == strchr(space, **str))
  26. {
  27. break;
  28. }
  29. }
  30. return token;
  31. }
  32. const char * whitespace = " ";
  33. const char * dot = ".";
  34. int main(int argc, const char ** argv)
  35. {
  36. unsigned x = 0;
  37. int argi = 1;
  38. create_predef_entries();
  39. #if 0
  40. qsort(generated_predef_info,generated_predef_info_count,
  41. sizeof(predef_info),predef_info_compare);
  42. for (x = 0; x < generated_predef_info_count; ++x)
  43. {
  44. printf("%s: %d\n", generated_predef_info[x].name, generated_predef_info[x].value);
  45. }
  46. #endif
  47. int result = -1;
  48. for (argi = 1; argi < argc; ++argi)
  49. {
  50. const char * exp = argv[argi];
  51. const char * exp_name = str_token(&exp, whitespace);
  52. const char * exp_op = str_token(&exp, whitespace);
  53. const char * exp_val = str_token(&exp, whitespace);
  54. unsigned exp_version = 0;
  55. if (*exp_val != 0)
  56. {
  57. exp = exp_val;
  58. const char * exp_val_a = str_token(&exp, dot);
  59. const char * exp_val_b = str_token(&exp, dot);
  60. const char * exp_val_c = str_token(&exp, dot);
  61. exp_version = BOOST_VERSION_NUMBER(atoi(exp_val_a), atoi(exp_val_b),atoi(exp_val_c));
  62. }
  63. for (x = 0; x < generated_predef_info_count; ++x)
  64. {
  65. if (*exp_op == 0 &&
  66. generated_predef_info[x].value > 0 &&
  67. strcmp(exp_name, generated_predef_info[x].name) == 0)
  68. {
  69. /* Expression of the form "BOOST_x_yy" is true. */
  70. result = 0;
  71. break;
  72. }
  73. else if (*exp_op == 0 &&
  74. generated_predef_info[x].value == 0 &&
  75. strcmp(exp_name, generated_predef_info[x].name) == 0)
  76. {
  77. /* Expression of the form "BOOST_x_yy" is false. */
  78. return argi;
  79. }
  80. else if (*exp_op != 0 && *exp_val != 0 &&
  81. strcmp(exp_name, generated_predef_info[x].name) == 0)
  82. {
  83. /* Expression of the form "BOOST_x_yy op val". */
  84. result = 0;
  85. if (0 == strcmp(">",exp_op) && !(generated_predef_info[x].value > exp_version)) return argi;
  86. if (0 == strcmp("<",exp_op) && !(generated_predef_info[x].value < exp_version)) return argi;
  87. if (0 == strcmp(">=",exp_op) && !(generated_predef_info[x].value >= exp_version)) return argi;
  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. }
  92. }
  93. }
  94. return result;
  95. }