text_ux 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +25 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +51 -0
  7. data/Rakefile +18 -0
  8. data/ext/text_ux/extconf.rb +5 -0
  9. data/ext/text_ux/text_ux.cpp +252 -0
  10. data/lib/text_ux.rb +5 -0
  11. data/lib/text_ux/version.rb +3 -0
  12. data/spec/fixtures/test.ux +0 -0
  13. data/spec/spec_helper.rb +19 -0
  14. data/spec/text_ux_spec.rb +137 -0
  15. data/text_ux.gemspec +26 -0
  16. data/vendor/ux-trie/ux-0.1.9/.lock-waf_darwin_build +8 -0
  17. data/vendor/ux-trie/ux-0.1.9/.unittest-gtest/gtest-1.6.0/fused-src/gtest/gtest-all.cc +9118 -0
  18. data/vendor/ux-trie/ux-0.1.9/.unittest-gtest/gtest-1.6.0/fused-src/gtest/gtest.h +19537 -0
  19. data/vendor/ux-trie/ux-0.1.9/.unittest-gtest/gtest-1.6.0/fused-src/gtest/gtest_main.cc +39 -0
  20. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Build.py +733 -0
  21. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Build.pyc +0 -0
  22. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ConfigSet.py +147 -0
  23. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ConfigSet.pyc +0 -0
  24. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Configure.py +314 -0
  25. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Configure.pyc +0 -0
  26. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Context.py +298 -0
  27. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Context.pyc +0 -0
  28. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Errors.py +37 -0
  29. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Errors.pyc +0 -0
  30. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Logs.py +149 -0
  31. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Logs.pyc +0 -0
  32. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Node.py +500 -0
  33. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Node.pyc +0 -0
  34. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Options.py +130 -0
  35. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Options.pyc +0 -0
  36. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Runner.py +191 -0
  37. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Runner.pyc +0 -0
  38. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Scripting.py +358 -0
  39. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Scripting.pyc +0 -0
  40. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Task.py +669 -0
  41. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Task.pyc +0 -0
  42. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/TaskGen.py +341 -0
  43. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/TaskGen.pyc +0 -0
  44. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/__init__.py +4 -0
  45. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/__init__.pyc +0 -0
  46. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ar.py +12 -0
  47. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ar.pyc +0 -0
  48. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/asm.py +25 -0
  49. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/bison.py +29 -0
  50. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c.py +27 -0
  51. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_aliases.py +56 -0
  52. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_aliases.pyc +0 -0
  53. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_config.py +708 -0
  54. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_config.pyc +0 -0
  55. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_osx.py +121 -0
  56. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_osx.pyc +0 -0
  57. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_preproc.py +606 -0
  58. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_preproc.pyc +0 -0
  59. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_tests.py +110 -0
  60. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_tests.pyc +0 -0
  61. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ccroot.py +372 -0
  62. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ccroot.pyc +0 -0
  63. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_c.py +39 -0
  64. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_cxx.py +39 -0
  65. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_cxx.pyc +0 -0
  66. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_d.py +30 -0
  67. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_fc.py +45 -0
  68. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/cs.py +98 -0
  69. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/cxx.py +27 -0
  70. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/cxx.pyc +0 -0
  71. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/d.py +51 -0
  72. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/d_config.py +47 -0
  73. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/d_scan.py +133 -0
  74. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/dbus.py +30 -0
  75. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/dmd.py +43 -0
  76. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/errcheck.py +153 -0
  77. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/fc.py +123 -0
  78. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/fc_config.py +271 -0
  79. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/fc_scan.py +68 -0
  80. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/flex.py +27 -0
  81. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/g95.py +55 -0
  82. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gas.py +10 -0
  83. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gcc.py +98 -0
  84. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gdc.py +34 -0
  85. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gfortran.py +69 -0
  86. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/glib2.py +174 -0
  87. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gnu_dirs.py +65 -0
  88. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gxx.py +98 -0
  89. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gxx.pyc +0 -0
  90. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/icc.py +31 -0
  91. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/icpc.py +30 -0
  92. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ifort.py +42 -0
  93. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/intltool.py +78 -0
  94. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/irixcc.py +49 -0
  95. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/javaw.py +272 -0
  96. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/kde4.py +49 -0
  97. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/lua.py +19 -0
  98. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/msvc.py +650 -0
  99. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/nasm.py +13 -0
  100. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/perl.py +78 -0
  101. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/python.py +303 -0
  102. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/qt4.py +424 -0
  103. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ruby.py +104 -0
  104. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/suncc.py +54 -0
  105. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/suncxx.py +55 -0
  106. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/tex.py +222 -0
  107. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/vala.py +215 -0
  108. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/waf_unit_test.py +79 -0
  109. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/winres.py +34 -0
  110. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/xlc.py +46 -0
  111. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/xlcxx.py +46 -0
  112. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Utils.py +334 -0
  113. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Utils.pyc +0 -0
  114. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/__init__.py +4 -0
  115. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/__init__.pyc +0 -0
  116. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ansiterm.py +173 -0
  117. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ansiterm.pyc +0 -0
  118. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/__init__.py +4 -0
  119. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/__init__.pyc +0 -0
  120. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/compat15.py +223 -0
  121. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/compat15.pyc +0 -0
  122. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/fixpy2.py +50 -0
  123. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/fixpy2.pyc +0 -0
  124. data/vendor/ux-trie/ux-0.1.9/src/bitVec.cpp +119 -0
  125. data/vendor/ux-trie/ux-0.1.9/src/bitVec.hpp +64 -0
  126. data/vendor/ux-trie/ux-0.1.9/src/bitVecTest.cpp +143 -0
  127. data/vendor/ux-trie/ux-0.1.9/src/cmdline.h +809 -0
  128. data/vendor/ux-trie/ux-0.1.9/src/rsDic.cpp +121 -0
  129. data/vendor/ux-trie/ux-0.1.9/src/rsDic.hpp +57 -0
  130. data/vendor/ux-trie/ux-0.1.9/src/ux.hpp +26 -0
  131. data/vendor/ux-trie/ux-0.1.9/src/uxMain.cpp +206 -0
  132. data/vendor/ux-trie/ux-0.1.9/src/uxMap.cpp +0 -0
  133. data/vendor/ux-trie/ux-0.1.9/src/uxMap.hpp +248 -0
  134. data/vendor/ux-trie/ux-0.1.9/src/uxMapTest.cpp +139 -0
  135. data/vendor/ux-trie/ux-0.1.9/src/uxTest.cpp +229 -0
  136. data/vendor/ux-trie/ux-0.1.9/src/uxTrie.cpp +529 -0
  137. data/vendor/ux-trie/ux-0.1.9/src/uxTrie.hpp +220 -0
  138. data/vendor/ux-trie/ux-0.1.9/src/uxUtil.cpp +92 -0
  139. data/vendor/ux-trie/ux-0.1.9/src/uxUtil.hpp +35 -0
  140. data/vendor/ux-trie/ux-0.1.9/src/wscript +43 -0
  141. data/vendor/ux-trie/ux-0.1.9/unittest_gtest.py +0 -0
  142. data/vendor/ux-trie/ux-0.1.9/unittest_gtest.pyc +0 -0
  143. data/vendor/ux-trie/ux-0.1.9/unittestt.py +166 -0
  144. data/vendor/ux-trie/ux-0.1.9/ux.pc.in +10 -0
  145. data/vendor/ux-trie/ux-0.1.9/waf +0 -0
  146. data/vendor/ux-trie/ux-0.1.9/wscript +32 -0
  147. metadata +249 -0
@@ -0,0 +1,500 @@
1
+ #! /usr/bin/env python
2
+ # encoding: utf-8
3
+ # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
4
+
5
+ import sys
6
+ if sys.hexversion < 0x020400f0: from sets import Set as set
7
+ import os,re,sys,shutil
8
+ from waflib import Utils,Errors
9
+ exclude_regs='''
10
+ **/*~
11
+ **/#*#
12
+ **/.#*
13
+ **/%*%
14
+ **/._*
15
+ **/CVS
16
+ **/CVS/**
17
+ **/.cvsignore
18
+ **/SCCS
19
+ **/SCCS/**
20
+ **/vssver.scc
21
+ **/.svn
22
+ **/.svn/**
23
+ **/BitKeeper
24
+ **/.git
25
+ **/.git/**
26
+ **/.gitignore
27
+ **/.bzr
28
+ **/.bzrignore
29
+ **/.bzr/**
30
+ **/.hg
31
+ **/.hg/**
32
+ **/_MTN
33
+ **/_MTN/**
34
+ **/.arch-ids
35
+ **/{arch}
36
+ **/_darcs
37
+ **/_darcs/**
38
+ **/.DS_Store'''
39
+ def split_path(path):
40
+ return path.split('/')
41
+ def split_path_cygwin(path):
42
+ if path.startswith('//'):
43
+ ret=path.split('/')[2:]
44
+ ret[0]='/'+ret[0]
45
+ return ret
46
+ return path.split('/')
47
+ re_sp=re.compile('[/\\\\]')
48
+ def split_path_win32(path):
49
+ if path.startswith('\\\\'):
50
+ ret=re.split(re_sp,path)[2:]
51
+ ret[0]='\\'+ret[0]
52
+ return ret
53
+ return re.split(re_sp,path)
54
+ if sys.platform=='cygwin':
55
+ split_path=split_path_cygwin
56
+ elif Utils.is_win32:
57
+ split_path=split_path_win32
58
+ class Node(object):
59
+ __slots__=('name','sig','children','parent','cache_abspath','cache_isdir')
60
+ def __init__(self,name,parent):
61
+ self.name=name
62
+ self.parent=parent
63
+ if parent:
64
+ if name in parent.children:
65
+ raise Errors.WafError('node %s exists in the parent files %r already'%(name,parent))
66
+ parent.children[name]=self
67
+ def __setstate__(self,data):
68
+ self.name=data[0]
69
+ self.parent=data[1]
70
+ if data[2]is not None:
71
+ self.children=data[2]
72
+ if data[3]is not None:
73
+ self.sig=data[3]
74
+ def __getstate__(self):
75
+ return(self.name,self.parent,getattr(self,'children',None),getattr(self,'sig',None))
76
+ def __str__(self):
77
+ return self.name
78
+ def __repr__(self):
79
+ return self.abspath()
80
+ def __hash__(self):
81
+ return id(self)
82
+ def __eq__(self,node):
83
+ return id(self)==id(node)
84
+ def __copy__(self):
85
+ raise Errors.WafError('nodes are not supposed to be copied')
86
+ def read(self,flags='r'):
87
+ return Utils.readf(self.abspath(),flags)
88
+ def write(self,data,flags='w'):
89
+ f=None
90
+ try:
91
+ f=open(self.abspath(),flags)
92
+ f.write(data)
93
+ finally:
94
+ if f:
95
+ f.close()
96
+ def chmod(self,val):
97
+ os.chmod(self.abspath(),val)
98
+ def delete(self):
99
+ try:
100
+ if getattr(self,'children',None):
101
+ shutil.rmtree(self.abspath())
102
+ else:
103
+ os.unlink(self.abspath())
104
+ except:
105
+ pass
106
+ try:
107
+ delattr(self,'children')
108
+ except:
109
+ pass
110
+ def suffix(self):
111
+ k=max(0,self.name.rfind('.'))
112
+ return self.name[k:]
113
+ def height(self):
114
+ d=self
115
+ val=-1
116
+ while d:
117
+ d=d.parent
118
+ val+=1
119
+ return val
120
+ def listdir(self):
121
+ lst=Utils.listdir(self.abspath())
122
+ lst.sort()
123
+ return lst
124
+ def mkdir(self):
125
+ if getattr(self,'cache_isdir',None):
126
+ return
127
+ try:
128
+ self.parent.mkdir()
129
+ except:
130
+ pass
131
+ if self.name:
132
+ try:
133
+ os.makedirs(self.abspath())
134
+ except OSError:
135
+ pass
136
+ if not os.path.isdir(self.abspath()):
137
+ raise Errors.WafError('Could not create the directory %s'%self.abspath())
138
+ try:
139
+ self.children
140
+ except:
141
+ self.children={}
142
+ self.cache_isdir=True
143
+ def find_node(self,lst):
144
+ if isinstance(lst,str):
145
+ lst=[x for x in split_path(lst)if x and x!='.']
146
+ cur=self
147
+ for x in lst:
148
+ if x=='..':
149
+ cur=cur.parent or cur
150
+ continue
151
+ try:
152
+ if x in cur.children:
153
+ cur=cur.children[x]
154
+ continue
155
+ except:
156
+ cur.children={}
157
+ cur=self.__class__(x,cur)
158
+ try:
159
+ os.stat(cur.abspath())
160
+ except:
161
+ del cur.parent.children[x]
162
+ return None
163
+ ret=cur
164
+ try:
165
+ while not getattr(cur.parent,'cache_isdir',None):
166
+ cur=cur.parent
167
+ cur.cache_isdir=True
168
+ except AttributeError:
169
+ pass
170
+ return ret
171
+ def make_node(self,lst):
172
+ if isinstance(lst,str):
173
+ lst=[x for x in split_path(lst)if x and x!='.']
174
+ cur=self
175
+ for x in lst:
176
+ if x=='..':
177
+ cur=cur.parent or cur
178
+ continue
179
+ if getattr(cur,'children',{}):
180
+ if x in cur.children:
181
+ cur=cur.children[x]
182
+ continue
183
+ else:
184
+ cur.children={}
185
+ cur=self.__class__(x,cur)
186
+ return cur
187
+ def search(self,lst):
188
+ if isinstance(lst,str):
189
+ lst=[x for x in split_path(lst)if x and x!='.']
190
+ cur=self
191
+ try:
192
+ for x in lst:
193
+ if x=='..':
194
+ cur=cur.parent or cur
195
+ else:
196
+ cur=cur.children[x]
197
+ return cur
198
+ except:
199
+ pass
200
+ def path_from(self,node):
201
+ c1=self
202
+ c2=node
203
+ c1h=c1.height()
204
+ c2h=c2.height()
205
+ lst=[]
206
+ up=0
207
+ while c1h>c2h:
208
+ lst.append(c1.name)
209
+ c1=c1.parent
210
+ c1h-=1
211
+ while c2h>c1h:
212
+ up+=1
213
+ c2=c2.parent
214
+ c2h-=1
215
+ while id(c1)!=id(c2):
216
+ lst.append(c1.name)
217
+ up+=1
218
+ c1=c1.parent
219
+ c2=c2.parent
220
+ for i in range(up):
221
+ lst.append('..')
222
+ lst.reverse()
223
+ return os.sep.join(lst)or'.'
224
+ def abspath(self):
225
+ try:
226
+ return self.cache_abspath
227
+ except:
228
+ pass
229
+ if os.sep=='/':
230
+ if not self.parent:
231
+ val=os.sep
232
+ elif not self.parent.name:
233
+ val=os.sep+self.name
234
+ else:
235
+ val=self.parent.abspath()+os.sep+self.name
236
+ else:
237
+ if not self.parent:
238
+ val=''
239
+ elif not self.parent.name:
240
+ val=self.name+os.sep
241
+ else:
242
+ val=self.parent.abspath().rstrip(os.sep)+os.sep+self.name
243
+ self.cache_abspath=val
244
+ return val
245
+ def is_child_of(self,node):
246
+ p=self
247
+ diff=self.height()-node.height()
248
+ while diff>0:
249
+ diff-=1
250
+ p=p.parent
251
+ return id(p)==id(node)
252
+ def ant_iter(self,accept=None,maxdepth=25,pats=[],dir=False,src=True,remove=True):
253
+ dircont=self.listdir()
254
+ dircont.sort()
255
+ try:
256
+ lst=set(self.children.keys())
257
+ if remove:
258
+ for x in lst-set(dircont):
259
+ del self.children[x]
260
+ except:
261
+ self.children={}
262
+ for name in dircont:
263
+ npats=accept(name,pats)
264
+ if npats and npats[0]:
265
+ accepted=[]in npats[0]
266
+ node=self.make_node([name])
267
+ isdir=os.path.isdir(node.abspath())
268
+ if accepted:
269
+ if isdir:
270
+ if dir:
271
+ yield node
272
+ else:
273
+ if src:
274
+ yield node
275
+ if getattr(node,'cache_isdir',None)or isdir:
276
+ node.cache_isdir=True
277
+ if maxdepth:
278
+ for k in node.ant_iter(accept=accept,maxdepth=maxdepth-1,pats=npats,dir=dir,src=src):
279
+ yield k
280
+ raise StopIteration
281
+ def ant_glob(self,*k,**kw):
282
+ src=kw.get('src',True)
283
+ dir=kw.get('dir',False)
284
+ excl=kw.get('excl',exclude_regs)
285
+ incl=k and k[0]or kw.get('incl','**')
286
+ def to_pat(s):
287
+ lst=Utils.to_list(s)
288
+ ret=[]
289
+ for x in lst:
290
+ x=x.replace('\\','/').replace('//','/')
291
+ if x.endswith('/'):
292
+ x+='**'
293
+ lst2=x.split('/')
294
+ accu=[]
295
+ for k in lst2:
296
+ if k=='**':
297
+ accu.append(k)
298
+ else:
299
+ k=k.replace('.','[.]').replace('*','.*').replace('?','.').replace('+','\\+')
300
+ k='^%s$'%k
301
+ try:
302
+ accu.append(re.compile(k))
303
+ except Exception ,e:
304
+ raise Errors.WafError("Invalid pattern: %s"%k,e)
305
+ ret.append(accu)
306
+ return ret
307
+ def filtre(name,nn):
308
+ ret=[]
309
+ for lst in nn:
310
+ if not lst:
311
+ pass
312
+ elif lst[0]=='**':
313
+ ret.append(lst)
314
+ if len(lst)>1:
315
+ if lst[1].match(name):
316
+ ret.append(lst[2:])
317
+ else:
318
+ ret.append([])
319
+ elif lst[0].match(name):
320
+ ret.append(lst[1:])
321
+ return ret
322
+ def accept(name,pats):
323
+ nacc=filtre(name,pats[0])
324
+ nrej=filtre(name,pats[1])
325
+ if[]in nrej:
326
+ nacc=[]
327
+ return[nacc,nrej]
328
+ ret=[x for x in self.ant_iter(accept=accept,pats=[to_pat(incl),to_pat(excl)],maxdepth=25,dir=dir,src=src,remove=kw.get('remove',True))]
329
+ if kw.get('flat',False):
330
+ return' '.join([x.path_from(self)for x in ret])
331
+ return ret
332
+ def find_nodes(self,find_dirs=True,find_files=True,match_fun=lambda x:True):
333
+ x="""
334
+ Recursively finds nodes::
335
+
336
+ def configure(cnf):
337
+ cnf.find_nodes()
338
+
339
+ :param find_dirs: whether to return directories
340
+ :param find_files: whether to return files
341
+ :param match_fun: matching function, taking a node as parameter
342
+ :rtype generator
343
+ :return: a generator that iterates over all the requested files
344
+ """
345
+ files=self.listdir()
346
+ for f in files:
347
+ node=self.make_node([f])
348
+ if os.path.isdir(node.abspath()):
349
+ if find_dirs and match_fun(node):
350
+ yield node
351
+ gen=node.find_nodes(find_dirs,find_files,match_fun)
352
+ for g in gen:
353
+ yield g
354
+ else:
355
+ if find_files and match_fun(node):
356
+ yield node
357
+ def is_src(self):
358
+ cur=self
359
+ x=id(self.ctx.srcnode)
360
+ y=id(self.ctx.bldnode)
361
+ while cur.parent:
362
+ if id(cur)==y:
363
+ return False
364
+ if id(cur)==x:
365
+ return True
366
+ cur=cur.parent
367
+ return False
368
+ def is_bld(self):
369
+ cur=self
370
+ y=id(self.ctx.bldnode)
371
+ while cur.parent:
372
+ if id(cur)==y:
373
+ return True
374
+ cur=cur.parent
375
+ return False
376
+ def get_src(self):
377
+ cur=self
378
+ x=id(self.ctx.srcnode)
379
+ y=id(self.ctx.bldnode)
380
+ lst=[]
381
+ while cur.parent:
382
+ if id(cur)==y:
383
+ lst.reverse()
384
+ return self.ctx.srcnode.make_node(lst)
385
+ if id(cur)==x:
386
+ return self
387
+ lst.append(cur.name)
388
+ cur=cur.parent
389
+ return self
390
+ def get_bld(self):
391
+ cur=self
392
+ x=id(self.ctx.srcnode)
393
+ y=id(self.ctx.bldnode)
394
+ lst=[]
395
+ while cur.parent:
396
+ if id(cur)==y:
397
+ return self
398
+ if id(cur)==x:
399
+ lst.reverse()
400
+ return self.ctx.bldnode.make_node(lst)
401
+ lst.append(cur.name)
402
+ cur=cur.parent
403
+ return self
404
+ def find_resource(self,lst):
405
+ if isinstance(lst,str):
406
+ lst=[x for x in split_path(lst)if x and x!='.']
407
+ node=self.get_bld().search(lst)
408
+ if not node:
409
+ self=self.get_src()
410
+ node=self.search(lst)
411
+ if not node:
412
+ node=self.find_node(lst)
413
+ try:
414
+ pat=node.abspath()
415
+ if os.path.isdir(pat):
416
+ return None
417
+ except:
418
+ pass
419
+ return node
420
+ def find_or_declare(self,lst):
421
+ if isinstance(lst,str):
422
+ lst=[x for x in split_path(lst)if x and x!='.']
423
+ node=self.get_bld().search(lst)
424
+ if node:
425
+ if not os.path.isfile(node.abspath()):
426
+ node.sig=None
427
+ try:
428
+ node.parent.mkdir()
429
+ except:
430
+ pass
431
+ return node
432
+ self=self.get_src()
433
+ node=self.find_node(lst)
434
+ if node:
435
+ if not os.path.isfile(node.abspath()):
436
+ node.sig=None
437
+ try:
438
+ node.parent.mkdir()
439
+ except:
440
+ pass
441
+ return node
442
+ node=self.get_bld().make_node(lst)
443
+ node.parent.mkdir()
444
+ return node
445
+ def find_dir(self,lst):
446
+ if isinstance(lst,str):
447
+ lst=[x for x in split_path(lst)if x and x!='.']
448
+ node=self.find_node(lst)
449
+ try:
450
+ if not os.path.isdir(node.abspath()):
451
+ return None
452
+ except(OSError,AttributeError):
453
+ return None
454
+ return node
455
+ def change_ext(self,ext,ext_in=None):
456
+ name=self.name
457
+ if ext_in is None:
458
+ k=name.rfind('.')
459
+ if k>=0:
460
+ name=name[:k]+ext
461
+ else:
462
+ name=name+ext
463
+ else:
464
+ name=name[:-len(ext_in)]+ext
465
+ return self.parent.find_or_declare([name])
466
+ def nice_path(self,env=None):
467
+ return self.path_from(self.ctx.launch_node())
468
+ def bldpath(self):
469
+ return self.path_from(self.ctx.bldnode)
470
+ def srcpath(self):
471
+ return self.path_from(self.ctx.srcnode)
472
+ def relpath(self):
473
+ cur=self
474
+ x=id(self.ctx.bldnode)
475
+ while cur.parent:
476
+ if id(cur)==x:
477
+ return self.bldpath()
478
+ cur=cur.parent
479
+ return self.srcpath()
480
+ def bld_dir(self):
481
+ return self.parent.bldpath()
482
+ def bld_base(self):
483
+ s=os.path.splitext(self.name)[0]
484
+ return self.bld_dir()+os.sep+s
485
+ def get_bld_sig(self):
486
+ try:
487
+ ret=self.ctx.hash_cache[id(self)]
488
+ except KeyError:
489
+ pass
490
+ except AttributeError:
491
+ self.ctx.hash_cache={}
492
+ else:
493
+ return ret
494
+ if not self.is_bld()or self.ctx.bldnode is self.ctx.srcnode:
495
+ self.sig=Utils.h_file(self.abspath())
496
+ self.ctx.hash_cache[id(self)]=ret=self.sig
497
+ return ret
498
+ pickle_lock=Utils.threading.Lock()
499
+ class Nod3(Node):
500
+ pass