auser-poolparty 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (353) hide show
  1. data/VERSION.yml +1 -1
  2. data/examples/monitored_cloud.rb +1 -1
  3. data/examples/thrift/thrift_example.rb +1 -1
  4. data/lib/proto/command_interface_handler.rb +1 -1
  5. data/vendor/gems/thrift/CHANGES +35 -0
  6. data/vendor/gems/thrift/CONTRIBUTORS +77 -0
  7. data/vendor/gems/thrift/DISCLAIMER +6 -0
  8. data/vendor/gems/thrift/LICENSE +202 -0
  9. data/vendor/gems/thrift/Makefile.am +28 -0
  10. data/vendor/gems/thrift/NEWS +79 -0
  11. data/vendor/gems/thrift/NOTICE +26 -0
  12. data/vendor/gems/thrift/README +137 -0
  13. data/vendor/gems/thrift/aclocal/ax_boost_base.m4 +198 -0
  14. data/vendor/gems/thrift/aclocal/ax_javac_and_java.m4 +107 -0
  15. data/vendor/gems/thrift/aclocal/ax_lib_event.m4 +194 -0
  16. data/vendor/gems/thrift/aclocal/ax_lib_zlib.m4 +173 -0
  17. data/vendor/gems/thrift/aclocal/ax_signed_right_shift.m4 +127 -0
  18. data/vendor/gems/thrift/aclocal/ax_thrift_internal.m4 +39 -0
  19. data/vendor/gems/thrift/bootstrap.sh +35 -0
  20. data/vendor/gems/thrift/cleanup.sh +58 -0
  21. data/vendor/gems/thrift/compiler/cpp/Makefile.am +136 -0
  22. data/vendor/gems/thrift/compiler/cpp/README +39 -0
  23. data/vendor/gems/thrift/compiler/cpp/src/generate/t_cocoa_generator.cc +2331 -0
  24. data/vendor/gems/thrift/compiler/cpp/src/generate/t_cpp_generator.cc +3003 -0
  25. data/vendor/gems/thrift/compiler/cpp/src/generate/t_csharp_generator.cc +1700 -0
  26. data/vendor/gems/thrift/compiler/cpp/src/generate/t_erl_generator.cc +932 -0
  27. data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.cc +173 -0
  28. data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.h +321 -0
  29. data/vendor/gems/thrift/compiler/cpp/src/generate/t_hs_generator.cc +1445 -0
  30. data/vendor/gems/thrift/compiler/cpp/src/generate/t_html_generator.cc +637 -0
  31. data/vendor/gems/thrift/compiler/cpp/src/generate/t_java_generator.cc +3069 -0
  32. data/vendor/gems/thrift/compiler/cpp/src/generate/t_ocaml_generator.cc +1673 -0
  33. data/vendor/gems/thrift/compiler/cpp/src/generate/t_oop_generator.h +77 -0
  34. data/vendor/gems/thrift/compiler/cpp/src/generate/t_perl_generator.cc +1812 -0
  35. data/vendor/gems/thrift/compiler/cpp/src/generate/t_php_generator.cc +2281 -0
  36. data/vendor/gems/thrift/compiler/cpp/src/generate/t_py_generator.cc +2310 -0
  37. data/vendor/gems/thrift/compiler/cpp/src/generate/t_rb_generator.cc +1114 -0
  38. data/vendor/gems/thrift/compiler/cpp/src/generate/t_st_generator.cc +1071 -0
  39. data/vendor/gems/thrift/compiler/cpp/src/generate/t_xsd_generator.cc +354 -0
  40. data/vendor/gems/thrift/compiler/cpp/src/globals.h +117 -0
  41. data/vendor/gems/thrift/compiler/cpp/src/main.cc +1207 -0
  42. data/vendor/gems/thrift/compiler/cpp/src/main.h +103 -0
  43. data/vendor/gems/thrift/compiler/cpp/src/md5.c +381 -0
  44. data/vendor/gems/thrift/compiler/cpp/src/md5.h +91 -0
  45. data/vendor/gems/thrift/compiler/cpp/src/parse/t_base_type.h +137 -0
  46. data/vendor/gems/thrift/compiler/cpp/src/parse/t_const.h +59 -0
  47. data/vendor/gems/thrift/compiler/cpp/src/parse/t_const_value.h +121 -0
  48. data/vendor/gems/thrift/compiler/cpp/src/parse/t_container.h +56 -0
  49. data/vendor/gems/thrift/compiler/cpp/src/parse/t_doc.h +51 -0
  50. data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum.h +59 -0
  51. data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum_value.h +64 -0
  52. data/vendor/gems/thrift/compiler/cpp/src/parse/t_field.h +150 -0
  53. data/vendor/gems/thrift/compiler/cpp/src/parse/t_function.h +93 -0
  54. data/vendor/gems/thrift/compiler/cpp/src/parse/t_list.h +56 -0
  55. data/vendor/gems/thrift/compiler/cpp/src/parse/t_map.h +64 -0
  56. data/vendor/gems/thrift/compiler/cpp/src/parse/t_program.h +223 -0
  57. data/vendor/gems/thrift/compiler/cpp/src/parse/t_scope.h +86 -0
  58. data/vendor/gems/thrift/compiler/cpp/src/parse/t_service.h +68 -0
  59. data/vendor/gems/thrift/compiler/cpp/src/parse/t_set.h +55 -0
  60. data/vendor/gems/thrift/compiler/cpp/src/parse/t_struct.h +127 -0
  61. data/vendor/gems/thrift/compiler/cpp/src/parse/t_type.h +176 -0
  62. data/vendor/gems/thrift/compiler/cpp/src/parse/t_typedef.h +70 -0
  63. data/vendor/gems/thrift/compiler/cpp/src/platform.h +36 -0
  64. data/vendor/gems/thrift/compiler/cpp/src/thriftl.ll +303 -0
  65. data/vendor/gems/thrift/compiler/cpp/src/thrifty.yy +1140 -0
  66. data/vendor/gems/thrift/configure.ac +255 -0
  67. data/vendor/gems/thrift/contrib/fb303/LICENSE +16 -0
  68. data/vendor/gems/thrift/contrib/fb303/Makefile.am +31 -0
  69. data/vendor/gems/thrift/contrib/fb303/README +37 -0
  70. data/vendor/gems/thrift/contrib/fb303/acinclude.m4 +258 -0
  71. data/vendor/gems/thrift/contrib/fb303/aclocal/ax_boost_base.m4 +198 -0
  72. data/vendor/gems/thrift/contrib/fb303/bootstrap.sh +26 -0
  73. data/vendor/gems/thrift/contrib/fb303/configure.ac +115 -0
  74. data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.cpp +124 -0
  75. data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.h +103 -0
  76. data/vendor/gems/thrift/contrib/fb303/cpp/Makefile.am +84 -0
  77. data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.cpp +481 -0
  78. data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.h +215 -0
  79. data/vendor/gems/thrift/contrib/fb303/global_footer.mk +21 -0
  80. data/vendor/gems/thrift/contrib/fb303/global_header.mk +38 -0
  81. data/vendor/gems/thrift/contrib/fb303/if/fb303.thrift +112 -0
  82. data/vendor/gems/thrift/contrib/fb303/java/FacebookBase.java +103 -0
  83. data/vendor/gems/thrift/contrib/fb303/java/build.xml +84 -0
  84. data/vendor/gems/thrift/contrib/fb303/php/FacebookBase.php +89 -0
  85. data/vendor/gems/thrift/contrib/fb303/py/Makefile.am +44 -0
  86. data/vendor/gems/thrift/contrib/fb303/py/fb303/FacebookBase.py +82 -0
  87. data/vendor/gems/thrift/contrib/fb303/py/fb303_scripts/__init__.py +20 -0
  88. data/vendor/gems/thrift/contrib/fb303/py/fb303_scripts/fb303_simple_mgmt.py +195 -0
  89. data/vendor/gems/thrift/contrib/fb303/py/setup.py +27 -0
  90. data/vendor/gems/thrift/contrib/thrift.el +126 -0
  91. data/vendor/gems/thrift/contrib/thrift.spec +206 -0
  92. data/vendor/gems/thrift/contrib/thrift.vim +91 -0
  93. data/vendor/gems/thrift/contrib/thrift_dump.cpp +91 -0
  94. data/vendor/gems/thrift/doc/lgpl-2.1.txt +504 -0
  95. data/vendor/gems/thrift/doc/otp-base-license.txt +20 -0
  96. data/vendor/gems/thrift/doc/thrift.bnf +96 -0
  97. data/vendor/gems/thrift/doc/thrift.tex +1057 -0
  98. data/vendor/gems/thrift/lib/Makefile.am +55 -0
  99. data/vendor/gems/thrift/lib/cocoa/README +21 -0
  100. data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.h +44 -0
  101. data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.m +130 -0
  102. data/vendor/gems/thrift/lib/cocoa/src/TException.h +34 -0
  103. data/vendor/gems/thrift/lib/cocoa/src/TException.m +64 -0
  104. data/vendor/gems/thrift/lib/cocoa/src/TProcessor.h +29 -0
  105. data/vendor/gems/thrift/lib/cocoa/src/TProcessorFactory.h +27 -0
  106. data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.h +27 -0
  107. data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.m +51 -0
  108. data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.h +51 -0
  109. data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.m +477 -0
  110. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocol.h +148 -0
  111. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolException.h +25 -0
  112. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolException.m +23 -0
  113. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolFactory.h +29 -0
  114. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.h +29 -0
  115. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.m +104 -0
  116. data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.h +50 -0
  117. data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.m +153 -0
  118. data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.h +42 -0
  119. data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.m +159 -0
  120. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.h +35 -0
  121. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.m +91 -0
  122. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.h +38 -0
  123. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.m +89 -0
  124. data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.h +32 -0
  125. data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.m +58 -0
  126. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransport.h +36 -0
  127. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.h +30 -0
  128. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.m +43 -0
  129. data/vendor/gems/thrift/lib/cpp/Makefile.am +158 -0
  130. data/vendor/gems/thrift/lib/cpp/README +67 -0
  131. data/vendor/gems/thrift/lib/cpp/src/TLogging.h +163 -0
  132. data/vendor/gems/thrift/lib/cpp/src/TProcessor.h +53 -0
  133. data/vendor/gems/thrift/lib/cpp/src/TReflectionLocal.h +96 -0
  134. data/vendor/gems/thrift/lib/cpp/src/Thrift.cpp +148 -0
  135. data/vendor/gems/thrift/lib/cpp/src/Thrift.h +191 -0
  136. data/vendor/gems/thrift/lib/cpp/src/concurrency/Exception.h +60 -0
  137. data/vendor/gems/thrift/lib/cpp/src/concurrency/FunctionRunner.h +77 -0
  138. data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.cpp +137 -0
  139. data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.h +84 -0
  140. data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.cpp +160 -0
  141. data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.h +114 -0
  142. data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.cpp +314 -0
  143. data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.h +130 -0
  144. data/vendor/gems/thrift/lib/cpp/src/concurrency/Thread.h +125 -0
  145. data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.cpp +493 -0
  146. data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.h +169 -0
  147. data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.cpp +284 -0
  148. data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.h +122 -0
  149. data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.cpp +55 -0
  150. data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.h +100 -0
  151. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/Tests.cpp +155 -0
  152. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadFactoryTests.h +354 -0
  153. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadManagerTests.h +379 -0
  154. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/TimerManagerTests.h +155 -0
  155. data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.cpp +122 -0
  156. data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.h +77 -0
  157. data/vendor/gems/thrift/lib/cpp/src/processor/StatsProcessor.h +264 -0
  158. data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.cpp +79 -0
  159. data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.h +42 -0
  160. data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.cpp +394 -0
  161. data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.h +254 -0
  162. data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.cpp +736 -0
  163. data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.h +279 -0
  164. data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.cpp +346 -0
  165. data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.h +225 -0
  166. data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.cpp +762 -0
  167. data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.h +253 -0
  168. data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.cpp +998 -0
  169. data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.h +340 -0
  170. data/vendor/gems/thrift/lib/cpp/src/protocol/TOneWayProtocol.h +304 -0
  171. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocol.h +438 -0
  172. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolException.h +104 -0
  173. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolTap.h +187 -0
  174. data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.cpp +750 -0
  175. data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.h +435 -0
  176. data/vendor/gems/thrift/lib/cpp/src/server/TServer.cpp +38 -0
  177. data/vendor/gems/thrift/lib/cpp/src/server/TServer.h +213 -0
  178. data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.cpp +118 -0
  179. data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.h +70 -0
  180. data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.cpp +217 -0
  181. data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.h +79 -0
  182. data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.cpp +243 -0
  183. data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.h +74 -0
  184. data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.cpp +370 -0
  185. data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.h +667 -0
  186. data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.cpp +77 -0
  187. data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.h +73 -0
  188. data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.cpp +953 -0
  189. data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.h +442 -0
  190. data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.cpp +348 -0
  191. data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.h +111 -0
  192. data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.cpp +368 -0
  193. data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.h +76 -0
  194. data/vendor/gems/thrift/lib/cpp/src/transport/TServerTransport.h +92 -0
  195. data/vendor/gems/thrift/lib/cpp/src/transport/TShortReadTransport.h +96 -0
  196. data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.cpp +54 -0
  197. data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.h +41 -0
  198. data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.cpp +591 -0
  199. data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.h +242 -0
  200. data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.cpp +235 -0
  201. data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.h +191 -0
  202. data/vendor/gems/thrift/lib/cpp/src/transport/TTransport.h +224 -0
  203. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.cpp +31 -0
  204. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.h +117 -0
  205. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.cpp +178 -0
  206. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.h +287 -0
  207. data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.cpp +299 -0
  208. data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.h +219 -0
  209. data/vendor/gems/thrift/lib/cpp/thrift-nb.pc.in +30 -0
  210. data/vendor/gems/thrift/lib/cpp/thrift-z.pc.in +30 -0
  211. data/vendor/gems/thrift/lib/cpp/thrift.pc.in +29 -0
  212. data/vendor/gems/thrift/lib/csharp/Makefile.am +70 -0
  213. data/vendor/gems/thrift/lib/csharp/README +26 -0
  214. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs +55 -0
  215. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs +242 -0
  216. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj +62 -0
  217. data/vendor/gems/thrift/lib/csharp/src/Collections/THashSet.cs +142 -0
  218. data/vendor/gems/thrift/lib/csharp/src/Protocol/TBase.cs +34 -0
  219. data/vendor/gems/thrift/lib/csharp/src/Protocol/TBinaryProtocol.cs +392 -0
  220. data/vendor/gems/thrift/lib/csharp/src/Protocol/TField.cs +58 -0
  221. data/vendor/gems/thrift/lib/csharp/src/Protocol/TList.cs +50 -0
  222. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMap.cs +58 -0
  223. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMessage.cs +58 -0
  224. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMessageType.cs +31 -0
  225. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocol.cs +87 -0
  226. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolException.cs +61 -0
  227. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolFactory.cs +29 -0
  228. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolUtil.cs +94 -0
  229. data/vendor/gems/thrift/lib/csharp/src/Protocol/TSet.cs +50 -0
  230. data/vendor/gems/thrift/lib/csharp/src/Protocol/TStruct.cs +42 -0
  231. data/vendor/gems/thrift/lib/csharp/src/Protocol/TType.cs +40 -0
  232. data/vendor/gems/thrift/lib/csharp/src/Server/TServer.cs +135 -0
  233. data/vendor/gems/thrift/lib/csharp/src/Server/TSimpleServer.cs +148 -0
  234. data/vendor/gems/thrift/lib/csharp/src/Server/TThreadPoolServer.cs +186 -0
  235. data/vendor/gems/thrift/lib/csharp/src/Server/TThreadedServer.cs +234 -0
  236. data/vendor/gems/thrift/lib/csharp/src/TApplicationException.cs +131 -0
  237. data/vendor/gems/thrift/lib/csharp/src/TProcessor.cs +29 -0
  238. data/vendor/gems/thrift/lib/csharp/src/Thrift.csproj +73 -0
  239. data/vendor/gems/thrift/lib/csharp/src/Thrift.sln +35 -0
  240. data/vendor/gems/thrift/lib/csharp/src/Transport/TBufferedTransport.cs +100 -0
  241. data/vendor/gems/thrift/lib/csharp/src/Transport/TServerSocket.cs +157 -0
  242. data/vendor/gems/thrift/lib/csharp/src/Transport/TServerTransport.cs +39 -0
  243. data/vendor/gems/thrift/lib/csharp/src/Transport/TSocket.cs +144 -0
  244. data/vendor/gems/thrift/lib/csharp/src/Transport/TStreamTransport.cs +103 -0
  245. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransport.cs +66 -0
  246. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportException.cs +64 -0
  247. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportFactory.cs +38 -0
  248. data/vendor/gems/thrift/lib/erl/Makefile +37 -0
  249. data/vendor/gems/thrift/lib/erl/README +56 -0
  250. data/vendor/gems/thrift/lib/erl/build/beamver +59 -0
  251. data/vendor/gems/thrift/lib/erl/build/buildtargets.mk +15 -0
  252. data/vendor/gems/thrift/lib/erl/build/colors.mk +24 -0
  253. data/vendor/gems/thrift/lib/erl/build/docs.mk +12 -0
  254. data/vendor/gems/thrift/lib/erl/build/mime.types +98 -0
  255. data/vendor/gems/thrift/lib/erl/build/otp.mk +146 -0
  256. data/vendor/gems/thrift/lib/erl/build/otp_subdir.mk +85 -0
  257. data/vendor/gems/thrift/lib/erl/build/raw_test.mk +29 -0
  258. data/vendor/gems/thrift/lib/erl/include/thrift_constants.hrl +54 -0
  259. data/vendor/gems/thrift/lib/erl/include/thrift_protocol.hrl +31 -0
  260. data/vendor/gems/thrift/lib/erl/src/Makefile +116 -0
  261. data/vendor/gems/thrift/lib/erl/src/test_handler.erl +26 -0
  262. data/vendor/gems/thrift/lib/erl/src/test_service.erl +29 -0
  263. data/vendor/gems/thrift/lib/erl/src/thrift.app.src +44 -0
  264. data/vendor/gems/thrift/lib/erl/src/thrift.appup.src +1 -0
  265. data/vendor/gems/thrift/lib/erl/src/thrift_base64_transport.erl +64 -0
  266. data/vendor/gems/thrift/lib/erl/src/thrift_binary_protocol.erl +325 -0
  267. data/vendor/gems/thrift/lib/erl/src/thrift_buffered_transport.erl +180 -0
  268. data/vendor/gems/thrift/lib/erl/src/thrift_client.erl +384 -0
  269. data/vendor/gems/thrift/lib/erl/src/thrift_disk_log_transport.erl +118 -0
  270. data/vendor/gems/thrift/lib/erl/src/thrift_file_transport.erl +87 -0
  271. data/vendor/gems/thrift/lib/erl/src/thrift_framed_transport.erl +208 -0
  272. data/vendor/gems/thrift/lib/erl/src/thrift_http_transport.erl +199 -0
  273. data/vendor/gems/thrift/lib/erl/src/thrift_memory_buffer.erl +164 -0
  274. data/vendor/gems/thrift/lib/erl/src/thrift_processor.erl +188 -0
  275. data/vendor/gems/thrift/lib/erl/src/thrift_protocol.erl +356 -0
  276. data/vendor/gems/thrift/lib/erl/src/thrift_server.erl +183 -0
  277. data/vendor/gems/thrift/lib/erl/src/thrift_service.erl +25 -0
  278. data/vendor/gems/thrift/lib/erl/src/thrift_socket_server.erl +249 -0
  279. data/vendor/gems/thrift/lib/erl/src/thrift_socket_transport.erl +119 -0
  280. data/vendor/gems/thrift/lib/erl/src/thrift_transport.erl +57 -0
  281. data/vendor/gems/thrift/lib/erl/vsn.mk +1 -0
  282. data/vendor/gems/thrift/lib/hs/README +82 -0
  283. data/vendor/gems/thrift/lib/hs/Setup.lhs +23 -0
  284. data/vendor/gems/thrift/lib/hs/TODO +2 -0
  285. data/vendor/gems/thrift/lib/hs/Thrift.cabal +20 -0
  286. data/vendor/gems/thrift/lib/hs/src/Thrift.hs +111 -0
  287. data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol.hs +191 -0
  288. data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol/Binary.hs +147 -0
  289. data/vendor/gems/thrift/lib/hs/src/Thrift/Server.hs +65 -0
  290. data/vendor/gems/thrift/lib/hs/src/Thrift/Transport.hs +60 -0
  291. data/vendor/gems/thrift/lib/hs/src/Thrift/Transport/Handle.hs +58 -0
  292. data/vendor/gems/thrift/lib/java/Makefile.am +38 -0
  293. data/vendor/gems/thrift/lib/java/README +43 -0
  294. data/vendor/gems/thrift/lib/java/build.xml +195 -0
  295. data/vendor/gems/thrift/lib/java/ivy.xml +8 -0
  296. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/IntRangeSet.java +171 -0
  297. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TApplicationException.java +123 -0
  298. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBase.java +66 -0
  299. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBaseHelper.java +102 -0
  300. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TByteArrayOutputStream.java +46 -0
  301. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TDeserializer.java +94 -0
  302. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TException.java +45 -0
  303. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TFieldRequirementType.java +30 -0
  304. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessor.java +32 -0
  305. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessorFactory.java +39 -0
  306. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TSerializer.java +110 -0
  307. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldMetaData.java +69 -0
  308. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java +42 -0
  309. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/ListMetaData.java +29 -0
  310. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/MapMetaData.java +31 -0
  311. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/SetMetaData.java +29 -0
  312. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/StructMetaData.java +31 -0
  313. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBase64Utils.java +128 -0
  314. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java +331 -0
  315. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java +741 -0
  316. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TField.java +48 -0
  317. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TJSONProtocol.java +927 -0
  318. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TList.java +38 -0
  319. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMap.java +40 -0
  320. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessage.java +48 -0
  321. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessageType.java +31 -0
  322. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocol.java +146 -0
  323. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolException.java +81 -0
  324. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolFactory.java +30 -0
  325. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolUtil.java +158 -0
  326. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSet.java +42 -0
  327. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSimpleJSONProtocol.java +384 -0
  328. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TStruct.java +36 -0
  329. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TType.java +40 -0
  330. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/THsHaServer.java +304 -0
  331. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TNonblockingServer.java +772 -0
  332. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TServer.java +126 -0
  333. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TSimpleServer.java +145 -0
  334. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java +271 -0
  335. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TFramedTransport.java +126 -0
  336. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/THttpClient.java +157 -0
  337. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TIOStreamTransport.java +159 -0
  338. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TMemoryBuffer.java +98 -0
  339. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerSocket.java +160 -0
  340. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerTransport.java +31 -0
  341. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingSocket.java +213 -0
  342. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingTransport.java +31 -0
  343. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TServerSocket.java +145 -0
  344. metadata +348 -37
  345. data/vendor/gems/trollop/FAQ.txt +0 -35
  346. data/vendor/gems/trollop/History.txt +0 -84
  347. data/vendor/gems/trollop/Manifest.txt +0 -7
  348. data/vendor/gems/trollop/README.txt +0 -38
  349. data/vendor/gems/trollop/Rakefile +0 -36
  350. data/vendor/gems/trollop/lib/trollop.rb +0 -695
  351. data/vendor/gems/trollop/release-script.txt +0 -13
  352. data/vendor/gems/trollop/test/test_trollop.rb +0 -957
  353. data/vendor/gems/trollop/www/index.html +0 -167
@@ -0,0 +1,1207 @@
1
+ /*
2
+ * Licensed to the Apache Software Foundation (ASF) under one
3
+ * or more contributor license agreements. See the NOTICE file
4
+ * distributed with this work for additional information
5
+ * regarding copyright ownership. The ASF licenses this file
6
+ * to you under the Apache License, Version 2.0 (the
7
+ * "License"); you may not use this file except in compliance
8
+ * with the License. You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing,
13
+ * software distributed under the License is distributed on an
14
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ * KIND, either express or implied. See the License for the
16
+ * specific language governing permissions and limitations
17
+ * under the License.
18
+ */
19
+
20
+ /**
21
+ * thrift - a lightweight cross-language rpc/serialization tool
22
+ *
23
+ * This file contains the main compiler engine for Thrift, which invokes the
24
+ * scanner/parser to build the thrift object tree. The interface generation
25
+ * code for each language lives in a file by the language name under the
26
+ * generate/ folder, and all parse structures live in parse/
27
+ *
28
+ */
29
+
30
+ #include <cassert>
31
+ #include <stdlib.h>
32
+ #include <stdio.h>
33
+ #include <stdarg.h>
34
+ #include <string>
35
+ #include <algorithm>
36
+ #include <sys/types.h>
37
+ #include <sys/stat.h>
38
+ #include <errno.h>
39
+ #include <limits.h>
40
+
41
+ #ifdef MINGW
42
+ # include <windows.h> /* for GetFullPathName */
43
+ #endif
44
+
45
+ // Careful: must include globals first for extern definitions
46
+ #include "globals.h"
47
+
48
+ #include "main.h"
49
+ #include "parse/t_program.h"
50
+ #include "parse/t_scope.h"
51
+ #include "generate/t_generator.h"
52
+
53
+ #include "version.h"
54
+
55
+ using namespace std;
56
+
57
+ /**
58
+ * Global program tree
59
+ */
60
+ t_program* g_program;
61
+
62
+ /**
63
+ * Global types
64
+ */
65
+
66
+ t_type* g_type_void;
67
+ t_type* g_type_string;
68
+ t_type* g_type_binary;
69
+ t_type* g_type_slist;
70
+ t_type* g_type_bool;
71
+ t_type* g_type_byte;
72
+ t_type* g_type_i16;
73
+ t_type* g_type_i32;
74
+ t_type* g_type_i64;
75
+ t_type* g_type_double;
76
+
77
+ /**
78
+ * Global scope
79
+ */
80
+ t_scope* g_scope;
81
+
82
+ /**
83
+ * Parent scope to also parse types
84
+ */
85
+ t_scope* g_parent_scope;
86
+
87
+ /**
88
+ * Prefix for putting types in parent scope
89
+ */
90
+ string g_parent_prefix;
91
+
92
+ /**
93
+ * Parsing pass
94
+ */
95
+ PARSE_MODE g_parse_mode;
96
+
97
+ /**
98
+ * Current directory of file being parsed
99
+ */
100
+ string g_curdir;
101
+
102
+ /**
103
+ * Current file being parsed
104
+ */
105
+ string g_curpath;
106
+
107
+ /**
108
+ * Search path for inclusions
109
+ */
110
+ vector<string> g_incl_searchpath;
111
+
112
+ /**
113
+ * Should C++ include statements use path prefixes for other thrift-generated
114
+ * header files
115
+ */
116
+ bool g_cpp_use_include_prefix = false;
117
+
118
+ /**
119
+ * Global debug state
120
+ */
121
+ int g_debug = 0;
122
+
123
+ /**
124
+ * Strictness level
125
+ */
126
+ int g_strict = 127;
127
+
128
+ /**
129
+ * Warning level
130
+ */
131
+ int g_warn = 1;
132
+
133
+ /**
134
+ * Verbose output
135
+ */
136
+ int g_verbose = 0;
137
+
138
+ /**
139
+ * Global time string
140
+ */
141
+ char* g_time_str;
142
+
143
+ /**
144
+ * The last parsed doctext comment.
145
+ */
146
+ char* g_doctext;
147
+
148
+ /**
149
+ * The location of the last parsed doctext comment.
150
+ */
151
+ int g_doctext_lineno;
152
+
153
+ /**
154
+ * Flags to control code generation
155
+ */
156
+ bool gen_cpp = false;
157
+ bool gen_dense = false;
158
+ bool gen_java = false;
159
+ bool gen_javabean = false;
160
+ bool gen_rb = false;
161
+ bool gen_py = false;
162
+ bool gen_py_newstyle = false;
163
+ bool gen_xsd = false;
164
+ bool gen_php = false;
165
+ bool gen_phpi = false;
166
+ bool gen_phps = true;
167
+ bool gen_phpa = false;
168
+ bool gen_phpo = false;
169
+ bool gen_rest = false;
170
+ bool gen_perl = false;
171
+ bool gen_erl = false;
172
+ bool gen_ocaml = false;
173
+ bool gen_hs = false;
174
+ bool gen_cocoa = false;
175
+ bool gen_csharp = false;
176
+ bool gen_st = false;
177
+ bool gen_recurse = false;
178
+
179
+ /**
180
+ * MinGW doesn't have realpath, so use fallback implementation in that case,
181
+ * otherwise this just calls through to realpath
182
+ */
183
+ char *saferealpath(const char *path, char *resolved_path) {
184
+ #ifdef MINGW
185
+ char buf[MAX_PATH];
186
+ char* basename;
187
+ DWORD len = GetFullPathName(path, MAX_PATH, buf, &basename);
188
+ if (len == 0 || len > MAX_PATH - 1){
189
+ strcpy(resolved_path, path);
190
+ } else {
191
+ CharLowerBuff(buf, len);
192
+ strcpy(resolved_path, buf);
193
+ }
194
+ return resolved_path;
195
+ #else
196
+ return realpath(path, resolved_path);
197
+ #endif
198
+ }
199
+
200
+
201
+ /**
202
+ * Report an error to the user. This is called yyerror for historical
203
+ * reasons (lex and yacc expect the error reporting routine to be called
204
+ * this). Call this function to report any errors to the user.
205
+ * yyerror takes printf style arguments.
206
+ *
207
+ * @param fmt C format string followed by additional arguments
208
+ */
209
+ void yyerror(const char* fmt, ...) {
210
+ va_list args;
211
+ fprintf(stderr,
212
+ "[ERROR:%s:%d] (last token was '%s')\n",
213
+ g_curpath.c_str(),
214
+ yylineno,
215
+ yytext);
216
+
217
+ va_start(args, fmt);
218
+ vfprintf(stderr, fmt, args);
219
+ va_end(args);
220
+
221
+ fprintf(stderr, "\n");
222
+ }
223
+
224
+ /**
225
+ * Prints a debug message from the parser.
226
+ *
227
+ * @param fmt C format string followed by additional arguments
228
+ */
229
+ void pdebug(const char* fmt, ...) {
230
+ if (g_debug == 0) {
231
+ return;
232
+ }
233
+ va_list args;
234
+ printf("[PARSE:%d] ", yylineno);
235
+ va_start(args, fmt);
236
+ vprintf(fmt, args);
237
+ va_end(args);
238
+ printf("\n");
239
+ }
240
+
241
+ /**
242
+ * Prints a verbose output mode message
243
+ *
244
+ * @param fmt C format string followed by additional arguments
245
+ */
246
+ void pverbose(const char* fmt, ...) {
247
+ if (g_verbose == 0) {
248
+ return;
249
+ }
250
+ va_list args;
251
+ va_start(args, fmt);
252
+ vprintf(fmt, args);
253
+ va_end(args);
254
+ }
255
+
256
+ /**
257
+ * Prints a warning message
258
+ *
259
+ * @param fmt C format string followed by additional arguments
260
+ */
261
+ void pwarning(int level, const char* fmt, ...) {
262
+ if (g_warn < level) {
263
+ return;
264
+ }
265
+ va_list args;
266
+ printf("[WARNING:%s:%d] ", g_curpath.c_str(), yylineno);
267
+ va_start(args, fmt);
268
+ vprintf(fmt, args);
269
+ va_end(args);
270
+ printf("\n");
271
+ }
272
+
273
+ /**
274
+ * Prints a failure message and exits
275
+ *
276
+ * @param fmt C format string followed by additional arguments
277
+ */
278
+ void failure(const char* fmt, ...) {
279
+ va_list args;
280
+ fprintf(stderr, "[FAILURE:%s:%d] ", g_curpath.c_str(), yylineno);
281
+ va_start(args, fmt);
282
+ vfprintf(stderr, fmt, args);
283
+ va_end(args);
284
+ printf("\n");
285
+ exit(1);
286
+ }
287
+
288
+ /**
289
+ * Converts a string filename into a thrift program name
290
+ */
291
+ string program_name(string filename) {
292
+ string::size_type slash = filename.rfind("/");
293
+ if (slash != string::npos) {
294
+ filename = filename.substr(slash+1);
295
+ }
296
+ string::size_type dot = filename.rfind(".");
297
+ if (dot != string::npos) {
298
+ filename = filename.substr(0, dot);
299
+ }
300
+ return filename;
301
+ }
302
+
303
+ /**
304
+ * Gets the directory path of a filename
305
+ */
306
+ string directory_name(string filename) {
307
+ string::size_type slash = filename.rfind("/");
308
+ // No slash, just use the current directory
309
+ if (slash == string::npos) {
310
+ return ".";
311
+ }
312
+ return filename.substr(0, slash);
313
+ }
314
+
315
+ /**
316
+ * Finds the appropriate file path for the given filename
317
+ */
318
+ string include_file(string filename) {
319
+ // Absolute path? Just try that
320
+ if (filename[0] == '/') {
321
+ // Realpath!
322
+ char rp[PATH_MAX];
323
+ if (saferealpath(filename.c_str(), rp) == NULL) {
324
+ pwarning(0, "Cannot open include file %s\n", filename.c_str());
325
+ return std::string();
326
+ }
327
+
328
+ // Stat this file
329
+ struct stat finfo;
330
+ if (stat(rp, &finfo) == 0) {
331
+ return rp;
332
+ }
333
+ } else { // relative path, start searching
334
+ // new search path with current dir global
335
+ vector<string> sp = g_incl_searchpath;
336
+ sp.insert(sp.begin(), g_curdir);
337
+
338
+ // iterate through paths
339
+ vector<string>::iterator it;
340
+ for (it = sp.begin(); it != sp.end(); it++) {
341
+ string sfilename = *(it) + "/" + filename;
342
+
343
+ // Realpath!
344
+ char rp[PATH_MAX];
345
+ if (saferealpath(sfilename.c_str(), rp) == NULL) {
346
+ continue;
347
+ }
348
+
349
+ // Stat this files
350
+ struct stat finfo;
351
+ if (stat(rp, &finfo) == 0) {
352
+ return rp;
353
+ }
354
+ }
355
+ }
356
+
357
+ // Uh oh
358
+ pwarning(0, "Could not find include file %s\n", filename.c_str());
359
+ return std::string();
360
+ }
361
+
362
+ /**
363
+ * Clears any previously stored doctext string.
364
+ * Also prints a warning if we are discarding information.
365
+ */
366
+ void clear_doctext() {
367
+ if (g_doctext != NULL) {
368
+ pwarning(2, "Uncaptured doctext at on line %d.", g_doctext_lineno);
369
+ }
370
+ free(g_doctext);
371
+ g_doctext = NULL;
372
+ }
373
+
374
+ /**
375
+ * Cleans up text commonly found in doxygen-like comments
376
+ *
377
+ * Warning: if you mix tabs and spaces in a non-uniform way,
378
+ * you will get what you deserve.
379
+ */
380
+ char* clean_up_doctext(char* doctext) {
381
+ // Convert to C++ string, and remove Windows's carriage returns.
382
+ string docstring = doctext;
383
+ docstring.erase(
384
+ remove(docstring.begin(), docstring.end(), '\r'),
385
+ docstring.end());
386
+
387
+ // Separate into lines.
388
+ vector<string> lines;
389
+ string::size_type pos = string::npos;
390
+ string::size_type last;
391
+ while (true) {
392
+ last = (pos == string::npos) ? 0 : pos+1;
393
+ pos = docstring.find('\n', last);
394
+ if (pos == string::npos) {
395
+ // First bit of cleaning. If the last line is only whitespace, drop it.
396
+ string::size_type nonwhite = docstring.find_first_not_of(" \t", last);
397
+ if (nonwhite != string::npos) {
398
+ lines.push_back(docstring.substr(last));
399
+ }
400
+ break;
401
+ }
402
+ lines.push_back(docstring.substr(last, pos-last));
403
+ }
404
+
405
+ // A very profound docstring.
406
+ if (lines.empty()) {
407
+ return NULL;
408
+ }
409
+
410
+ // Clear leading whitespace from the first line.
411
+ pos = lines.front().find_first_not_of(" \t");
412
+ lines.front().erase(0, pos);
413
+
414
+ // If every nonblank line after the first has the same number of spaces/tabs,
415
+ // then a star, remove them.
416
+ bool have_prefix = true;
417
+ bool found_prefix = false;
418
+ string::size_type prefix_len = 0;
419
+ vector<string>::iterator l_iter;
420
+ for (l_iter = lines.begin()+1; l_iter != lines.end(); ++l_iter) {
421
+ if (l_iter->empty()) {
422
+ continue;
423
+ }
424
+
425
+ pos = l_iter->find_first_not_of(" \t");
426
+ if (!found_prefix) {
427
+ if (pos != string::npos) {
428
+ if (l_iter->at(pos) == '*') {
429
+ found_prefix = true;
430
+ prefix_len = pos;
431
+ } else {
432
+ have_prefix = false;
433
+ break;
434
+ }
435
+ } else {
436
+ // Whitespace-only line. Truncate it.
437
+ l_iter->clear();
438
+ }
439
+ } else if (l_iter->size() > pos
440
+ && l_iter->at(pos) == '*'
441
+ && pos == prefix_len) {
442
+ // Business as usual.
443
+ } else if (pos == string::npos) {
444
+ // Whitespace-only line. Let's truncate it for them.
445
+ l_iter->clear();
446
+ } else {
447
+ // The pattern has been broken.
448
+ have_prefix = false;
449
+ break;
450
+ }
451
+ }
452
+
453
+ // If our prefix survived, delete it from every line.
454
+ if (have_prefix) {
455
+ // Get the star too.
456
+ prefix_len++;
457
+ for (l_iter = lines.begin()+1; l_iter != lines.end(); ++l_iter) {
458
+ l_iter->erase(0, prefix_len);
459
+ }
460
+ }
461
+
462
+ // Now delete the minimum amount of leading whitespace from each line.
463
+ prefix_len = string::npos;
464
+ for (l_iter = lines.begin()+1; l_iter != lines.end(); ++l_iter) {
465
+ if (l_iter->empty()) {
466
+ continue;
467
+ }
468
+ pos = l_iter->find_first_not_of(" \t");
469
+ if (pos != string::npos
470
+ && (prefix_len == string::npos || pos < prefix_len)) {
471
+ prefix_len = pos;
472
+ }
473
+ }
474
+
475
+ // If our prefix survived, delete it from every line.
476
+ if (prefix_len != string::npos) {
477
+ for (l_iter = lines.begin()+1; l_iter != lines.end(); ++l_iter) {
478
+ l_iter->erase(0, prefix_len);
479
+ }
480
+ }
481
+
482
+ // Remove trailing whitespace from every line.
483
+ for (l_iter = lines.begin(); l_iter != lines.end(); ++l_iter) {
484
+ pos = l_iter->find_last_not_of(" \t");
485
+ if (pos != string::npos && pos != l_iter->length()-1) {
486
+ l_iter->erase(pos+1);
487
+ }
488
+ }
489
+
490
+ // If the first line is empty, remove it.
491
+ // Don't do this earlier because a lot of steps skip the first line.
492
+ if (lines.front().empty()) {
493
+ lines.erase(lines.begin());
494
+ }
495
+
496
+ // Now rejoin the lines and copy them back into doctext.
497
+ docstring.clear();
498
+ for (l_iter = lines.begin(); l_iter != lines.end(); ++l_iter) {
499
+ docstring += *l_iter;
500
+ docstring += '\n';
501
+ }
502
+
503
+ assert(docstring.length() <= strlen(doctext));
504
+ strcpy(doctext, docstring.c_str());
505
+ return doctext;
506
+ }
507
+
508
+ /** Set to true to debug docstring parsing */
509
+ static bool dump_docs = false;
510
+
511
+ /**
512
+ * Dumps docstrings to stdout
513
+ * Only works for top-level definitions and the whole program doc
514
+ * (i.e., not enum constants, struct fields, or functions.
515
+ */
516
+ void dump_docstrings(t_program* program) {
517
+ string progdoc = program->get_doc();
518
+ if (!progdoc.empty()) {
519
+ printf("Whole program doc:\n%s\n", progdoc.c_str());
520
+ }
521
+ const vector<t_typedef*>& typedefs = program->get_typedefs();
522
+ vector<t_typedef*>::const_iterator t_iter;
523
+ for (t_iter = typedefs.begin(); t_iter != typedefs.end(); ++t_iter) {
524
+ t_typedef* td = *t_iter;
525
+ if (td->has_doc()) {
526
+ printf("typedef %s:\n%s\n", td->get_name().c_str(), td->get_doc().c_str());
527
+ }
528
+ }
529
+ const vector<t_enum*>& enums = program->get_enums();
530
+ vector<t_enum*>::const_iterator e_iter;
531
+ for (e_iter = enums.begin(); e_iter != enums.end(); ++e_iter) {
532
+ t_enum* en = *e_iter;
533
+ if (en->has_doc()) {
534
+ printf("enum %s:\n%s\n", en->get_name().c_str(), en->get_doc().c_str());
535
+ }
536
+ }
537
+ const vector<t_const*>& consts = program->get_consts();
538
+ vector<t_const*>::const_iterator c_iter;
539
+ for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
540
+ t_const* co = *c_iter;
541
+ if (co->has_doc()) {
542
+ printf("const %s:\n%s\n", co->get_name().c_str(), co->get_doc().c_str());
543
+ }
544
+ }
545
+ const vector<t_struct*>& structs = program->get_structs();
546
+ vector<t_struct*>::const_iterator s_iter;
547
+ for (s_iter = structs.begin(); s_iter != structs.end(); ++s_iter) {
548
+ t_struct* st = *s_iter;
549
+ if (st->has_doc()) {
550
+ printf("struct %s:\n%s\n", st->get_name().c_str(), st->get_doc().c_str());
551
+ }
552
+ }
553
+ const vector<t_struct*>& xceptions = program->get_xceptions();
554
+ vector<t_struct*>::const_iterator x_iter;
555
+ for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
556
+ t_struct* xn = *x_iter;
557
+ if (xn->has_doc()) {
558
+ printf("xception %s:\n%s\n", xn->get_name().c_str(), xn->get_doc().c_str());
559
+ }
560
+ }
561
+ const vector<t_service*>& services = program->get_services();
562
+ vector<t_service*>::const_iterator v_iter;
563
+ for (v_iter = services.begin(); v_iter != services.end(); ++v_iter) {
564
+ t_service* sv = *v_iter;
565
+ if (sv->has_doc()) {
566
+ printf("service %s:\n%s\n", sv->get_name().c_str(), sv->get_doc().c_str());
567
+ }
568
+ }
569
+ }
570
+
571
+ /**
572
+ * Call generate_fingerprint for every structure and enum.
573
+ */
574
+ void generate_all_fingerprints(t_program* program) {
575
+ const vector<t_struct*>& structs = program->get_structs();
576
+ vector<t_struct*>::const_iterator s_iter;
577
+ for (s_iter = structs.begin(); s_iter != structs.end(); ++s_iter) {
578
+ t_struct* st = *s_iter;
579
+ st->generate_fingerprint();
580
+ }
581
+
582
+ const vector<t_struct*>& xceptions = program->get_xceptions();
583
+ vector<t_struct*>::const_iterator x_iter;
584
+ for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
585
+ t_struct* st = *x_iter;
586
+ st->generate_fingerprint();
587
+ }
588
+
589
+ const vector<t_enum*>& enums = program->get_enums();
590
+ vector<t_enum*>::const_iterator e_iter;
591
+ for (e_iter = enums.begin(); e_iter != enums.end(); ++e_iter) {
592
+ t_enum* e = *e_iter;
593
+ e->generate_fingerprint();
594
+ }
595
+
596
+ g_type_void->generate_fingerprint();
597
+
598
+ // If you want to generate fingerprints for implicit structures, start here.
599
+ /*
600
+ const vector<t_service*>& services = program->get_services();
601
+ vector<t_service*>::const_iterator v_iter;
602
+ for (v_iter = services.begin(); v_iter != services.end(); ++v_iter) {
603
+ t_service* sv = *v_iter;
604
+ }
605
+ */
606
+ }
607
+
608
+ /**
609
+ * Prints the version number
610
+ */
611
+ void version() {
612
+ printf("Thrift version %s-%s\n", THRIFT_VERSION, THRIFT_REVISION);
613
+ }
614
+
615
+ /**
616
+ * Diplays the usage message and then exits with an error code.
617
+ */
618
+ void usage() {
619
+ fprintf(stderr, "Usage: thrift [options] file\n");
620
+ fprintf(stderr, "Options:\n");
621
+ fprintf(stderr, " -version Print the compiler version\n");
622
+ fprintf(stderr, " -o dir Set the output directory for gen-* packages\n");
623
+ fprintf(stderr, " (default: current directory)\n");
624
+ fprintf(stderr, " -I dir Add a directory to the list of directories\n");
625
+ fprintf(stderr, " searched for include directives\n");
626
+ fprintf(stderr, " -nowarn Suppress all compiler warnings (BAD!)\n");
627
+ fprintf(stderr, " -strict Strict compiler warnings on\n");
628
+ fprintf(stderr, " -v[erbose] Verbose mode\n");
629
+ fprintf(stderr, " -r[ecurse] Also generate included files\n");
630
+ fprintf(stderr, " -debug Parse debug trace to stdout\n");
631
+ fprintf(stderr, " --gen STR Generate code with a dynamically-registered generator.\n");
632
+ fprintf(stderr, " STR has the form language[:key1=val1[,key2,[key3=val3]]].\n");
633
+ fprintf(stderr, " Keys and values are options passed to the generator.\n");
634
+ fprintf(stderr, " Many options will not require values.\n");
635
+ fprintf(stderr, "\n");
636
+ fprintf(stderr, "Available generators (and options):\n");
637
+
638
+ t_generator_registry::gen_map_t gen_map = t_generator_registry::get_generator_map();
639
+ t_generator_registry::gen_map_t::iterator iter;
640
+ for (iter = gen_map.begin(); iter != gen_map.end(); ++iter) {
641
+ fprintf(stderr, " %s (%s):\n",
642
+ iter->second->get_short_name().c_str(),
643
+ iter->second->get_long_name().c_str());
644
+ fprintf(stderr, "%s", iter->second->get_documentation().c_str());
645
+ }
646
+ exit(1);
647
+ }
648
+
649
+ /**
650
+ * You know, when I started working on Thrift I really thought it wasn't going
651
+ * to become a programming language because it was just a generator and it
652
+ * wouldn't need runtime type information and all that jazz. But then we
653
+ * decided to add constants, and all of a sudden that means runtime type
654
+ * validation and inference, except the "runtime" is the code generator
655
+ * runtime. Shit. I've been had.
656
+ */
657
+ void validate_const_rec(std::string name, t_type* type, t_const_value* value) {
658
+ if (type->is_void()) {
659
+ throw "type error: cannot declare a void const: " + name;
660
+ }
661
+
662
+ if (type->is_base_type()) {
663
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
664
+ switch (tbase) {
665
+ case t_base_type::TYPE_STRING:
666
+ if (value->get_type() != t_const_value::CV_STRING) {
667
+ throw "type error: const \"" + name + "\" was declared as string";
668
+ }
669
+ break;
670
+ case t_base_type::TYPE_BOOL:
671
+ if (value->get_type() != t_const_value::CV_INTEGER) {
672
+ throw "type error: const \"" + name + "\" was declared as bool";
673
+ }
674
+ break;
675
+ case t_base_type::TYPE_BYTE:
676
+ if (value->get_type() != t_const_value::CV_INTEGER) {
677
+ throw "type error: const \"" + name + "\" was declared as byte";
678
+ }
679
+ break;
680
+ case t_base_type::TYPE_I16:
681
+ if (value->get_type() != t_const_value::CV_INTEGER) {
682
+ throw "type error: const \"" + name + "\" was declared as i16";
683
+ }
684
+ break;
685
+ case t_base_type::TYPE_I32:
686
+ if (value->get_type() != t_const_value::CV_INTEGER) {
687
+ throw "type error: const \"" + name + "\" was declared as i32";
688
+ }
689
+ break;
690
+ case t_base_type::TYPE_I64:
691
+ if (value->get_type() != t_const_value::CV_INTEGER) {
692
+ throw "type error: const \"" + name + "\" was declared as i64";
693
+ }
694
+ break;
695
+ case t_base_type::TYPE_DOUBLE:
696
+ if (value->get_type() != t_const_value::CV_INTEGER &&
697
+ value->get_type() != t_const_value::CV_DOUBLE) {
698
+ throw "type error: const \"" + name + "\" was declared as double";
699
+ }
700
+ break;
701
+ default:
702
+ throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase) + name;
703
+ }
704
+ } else if (type->is_enum()) {
705
+ if (value->get_type() != t_const_value::CV_INTEGER) {
706
+ throw "type error: const \"" + name + "\" was declared as enum";
707
+ }
708
+ } else if (type->is_struct() || type->is_xception()) {
709
+ if (value->get_type() != t_const_value::CV_MAP) {
710
+ throw "type error: const \"" + name + "\" was declared as struct/xception";
711
+ }
712
+ const vector<t_field*>& fields = ((t_struct*)type)->get_members();
713
+ vector<t_field*>::const_iterator f_iter;
714
+
715
+ const map<t_const_value*, t_const_value*>& val = value->get_map();
716
+ map<t_const_value*, t_const_value*>::const_iterator v_iter;
717
+ for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
718
+ if (v_iter->first->get_type() != t_const_value::CV_STRING) {
719
+ throw "type error: " + name + " struct key must be string";
720
+ }
721
+ t_type* field_type = NULL;
722
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
723
+ if ((*f_iter)->get_name() == v_iter->first->get_string()) {
724
+ field_type = (*f_iter)->get_type();
725
+ }
726
+ }
727
+ if (field_type == NULL) {
728
+ throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
729
+ }
730
+
731
+ validate_const_rec(name + "." + v_iter->first->get_string(), field_type, v_iter->second);
732
+ }
733
+ } else if (type->is_map()) {
734
+ t_type* k_type = ((t_map*)type)->get_key_type();
735
+ t_type* v_type = ((t_map*)type)->get_val_type();
736
+ const map<t_const_value*, t_const_value*>& val = value->get_map();
737
+ map<t_const_value*, t_const_value*>::const_iterator v_iter;
738
+ for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
739
+ validate_const_rec(name + "<key>", k_type, v_iter->first);
740
+ validate_const_rec(name + "<val>", v_type, v_iter->second);
741
+ }
742
+ } else if (type->is_list() || type->is_set()) {
743
+ t_type* e_type;
744
+ if (type->is_list()) {
745
+ e_type = ((t_list*)type)->get_elem_type();
746
+ } else {
747
+ e_type = ((t_set*)type)->get_elem_type();
748
+ }
749
+ const vector<t_const_value*>& val = value->get_list();
750
+ vector<t_const_value*>::const_iterator v_iter;
751
+ for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
752
+ validate_const_rec(name + "<elem>", e_type, *v_iter);
753
+ }
754
+ }
755
+ }
756
+
757
+ /**
758
+ * Check the type of the parsed const information against its declared type
759
+ */
760
+ void validate_const_type(t_const* c) {
761
+ validate_const_rec(c->get_name(), c->get_type(), c->get_value());
762
+ }
763
+
764
+ /**
765
+ * Check the type of a default value assigned to a field.
766
+ */
767
+ void validate_field_value(t_field* field, t_const_value* cv) {
768
+ validate_const_rec(field->get_name(), field->get_type(), cv);
769
+ }
770
+
771
+ /**
772
+ * Check that all the elements of a throws block are actually exceptions.
773
+ */
774
+ bool validate_throws(t_struct* throws) {
775
+ const vector<t_field*>& members = throws->get_members();
776
+ vector<t_field*>::const_iterator m_iter;
777
+ for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
778
+ if (!(*m_iter)->get_type()->is_xception()) {
779
+ return false;
780
+ }
781
+ }
782
+ return true;
783
+ }
784
+
785
+ /**
786
+ * Parses a program
787
+ */
788
+ void parse(t_program* program, t_program* parent_program) {
789
+ // Get scope file path
790
+ string path = program->get_path();
791
+
792
+ // Set current dir global, which is used in the include_file function
793
+ g_curdir = directory_name(path);
794
+ g_curpath = path;
795
+
796
+ // Open the file
797
+ yyin = fopen(path.c_str(), "r");
798
+ if (yyin == 0) {
799
+ failure("Could not open input file: \"%s\"", path.c_str());
800
+ }
801
+
802
+ // Create new scope and scan for includes
803
+ pverbose("Scanning %s for includes\n", path.c_str());
804
+ g_parse_mode = INCLUDES;
805
+ g_program = program;
806
+ g_scope = program->scope();
807
+ try {
808
+ yylineno = 1;
809
+ if (yyparse() != 0) {
810
+ failure("Parser error during include pass.");
811
+ }
812
+ } catch (string x) {
813
+ failure(x.c_str());
814
+ }
815
+ fclose(yyin);
816
+
817
+ // Recursively parse all the include programs
818
+ vector<t_program*>& includes = program->get_includes();
819
+ vector<t_program*>::iterator iter;
820
+ for (iter = includes.begin(); iter != includes.end(); ++iter) {
821
+ parse(*iter, program);
822
+ }
823
+
824
+ // Parse the program file
825
+ g_parse_mode = PROGRAM;
826
+ g_program = program;
827
+ g_scope = program->scope();
828
+ g_parent_scope = (parent_program != NULL) ? parent_program->scope() : NULL;
829
+ g_parent_prefix = program->get_name() + ".";
830
+ g_curpath = path;
831
+ yyin = fopen(path.c_str(), "r");
832
+ if (yyin == 0) {
833
+ failure("Could not open input file: \"%s\"", path.c_str());
834
+ }
835
+ pverbose("Parsing %s for types\n", path.c_str());
836
+ yylineno = 1;
837
+ try {
838
+ if (yyparse() != 0) {
839
+ failure("Parser error during types pass.");
840
+ }
841
+ } catch (string x) {
842
+ failure(x.c_str());
843
+ }
844
+ fclose(yyin);
845
+ }
846
+
847
+ /**
848
+ * Generate code
849
+ */
850
+ void generate(t_program* program, const vector<string>& generator_strings) {
851
+ // Oooohh, recursive code generation, hot!!
852
+ if (gen_recurse) {
853
+ const vector<t_program*>& includes = program->get_includes();
854
+ for (size_t i = 0; i < includes.size(); ++i) {
855
+ // Propogate output path from parent to child programs
856
+ includes[i]->set_out_path(program->get_out_path());
857
+
858
+ generate(includes[i], generator_strings);
859
+ }
860
+ }
861
+
862
+ // Generate code!
863
+ try {
864
+ pverbose("Program: %s\n", program->get_path().c_str());
865
+
866
+ // Compute fingerprints.
867
+ generate_all_fingerprints(program);
868
+
869
+ if (dump_docs) {
870
+ dump_docstrings(program);
871
+ }
872
+
873
+ vector<string>::const_iterator iter;
874
+ for (iter = generator_strings.begin(); iter != generator_strings.end(); ++iter) {
875
+ t_generator* generator = t_generator_registry::get_generator(program, *iter);
876
+
877
+ if (generator == NULL) {
878
+ pwarning(1, "Unable to get a generator for \"%s\".\n", iter->c_str());
879
+ } else {
880
+ pverbose("Generating \"%s\"\n", iter->c_str());
881
+ generator->generate_program();
882
+ delete generator;
883
+ }
884
+ }
885
+
886
+ } catch (string s) {
887
+ printf("Error: %s\n", s.c_str());
888
+ } catch (const char* exc) {
889
+ printf("Error: %s\n", exc);
890
+ }
891
+
892
+ }
893
+
894
+ /**
895
+ * Parse it up.. then spit it back out, in pretty much every language. Alright
896
+ * not that many languages, but the cool ones that we care about.
897
+ */
898
+ int main(int argc, char** argv) {
899
+ int i;
900
+ std::string out_path;
901
+
902
+ // Setup time string
903
+ time_t now = time(NULL);
904
+ g_time_str = ctime(&now);
905
+
906
+ // Check for necessary arguments, you gotta have at least a filename and
907
+ // an output language flag
908
+ if (argc < 2) {
909
+ usage();
910
+ }
911
+
912
+ vector<string> generator_strings;
913
+
914
+ // Set the current path to a dummy value to make warning messages clearer.
915
+ g_curpath = "arguments";
916
+
917
+ // Hacky parameter handling... I didn't feel like using a library sorry!
918
+ for (i = 1; i < argc-1; i++) {
919
+ char* arg;
920
+
921
+ arg = strtok(argv[i], " ");
922
+ while (arg != NULL) {
923
+ // Treat double dashes as single dashes
924
+ if (arg[0] == '-' && arg[1] == '-') {
925
+ ++arg;
926
+ }
927
+
928
+ if (strcmp(arg, "-version") == 0) {
929
+ version();
930
+ exit(1);
931
+ } else if (strcmp(arg, "-debug") == 0) {
932
+ g_debug = 1;
933
+ } else if (strcmp(arg, "-nowarn") == 0) {
934
+ g_warn = 0;
935
+ } else if (strcmp(arg, "-strict") == 0) {
936
+ g_strict = 255;
937
+ g_warn = 2;
938
+ } else if (strcmp(arg, "-v") == 0 || strcmp(arg, "-verbose") == 0 ) {
939
+ g_verbose = 1;
940
+ } else if (strcmp(arg, "-r") == 0 || strcmp(arg, "-recurse") == 0 ) {
941
+ gen_recurse = true;
942
+ } else if (strcmp(arg, "-gen") == 0) {
943
+ arg = argv[++i];
944
+ if (arg == NULL) {
945
+ fprintf(stderr, "!!! Missing generator specification\n");
946
+ usage();
947
+ }
948
+ generator_strings.push_back(arg);
949
+ } else if (strcmp(arg, "-dense") == 0) {
950
+ gen_dense = true;
951
+ } else if (strcmp(arg, "-cpp") == 0) {
952
+ gen_cpp = true;
953
+ } else if (strcmp(arg, "-javabean") == 0) {
954
+ gen_javabean = true;
955
+ } else if (strcmp(arg, "-java") == 0) {
956
+ gen_java = true;
957
+ } else if (strcmp(arg, "-php") == 0) {
958
+ gen_php = true;
959
+ } else if (strcmp(arg, "-phpi") == 0) {
960
+ gen_phpi = true;
961
+ } else if (strcmp(arg, "-phps") == 0) {
962
+ gen_php = true;
963
+ gen_phps = true;
964
+ } else if (strcmp(arg, "-phpl") == 0) {
965
+ gen_php = true;
966
+ gen_phps = false;
967
+ } else if (strcmp(arg, "-phpa") == 0) {
968
+ gen_php = true;
969
+ gen_phps = false;
970
+ gen_phpa = true;
971
+ } else if (strcmp(arg, "-phpo") == 0) {
972
+ gen_php = true;
973
+ gen_phpo = true;
974
+ } else if (strcmp(arg, "-rest") == 0) {
975
+ gen_rest = true;
976
+ } else if (strcmp(arg, "-py") == 0) {
977
+ gen_py = true;
978
+ } else if (strcmp(arg, "-pyns") == 0) {
979
+ gen_py = true;
980
+ gen_py_newstyle = true;
981
+ } else if (strcmp(arg, "-rb") == 0) {
982
+ gen_rb = true;
983
+ } else if (strcmp(arg, "-xsd") == 0) {
984
+ gen_xsd = true;
985
+ } else if (strcmp(arg, "-perl") == 0) {
986
+ gen_perl = true;
987
+ } else if (strcmp(arg, "-erl") == 0) {
988
+ gen_erl = true;
989
+ } else if (strcmp(arg, "-ocaml") == 0) {
990
+ gen_ocaml = true;
991
+ } else if (strcmp(arg, "-hs") == 0) {
992
+ gen_hs = true;
993
+ } else if (strcmp(arg, "-cocoa") == 0) {
994
+ gen_cocoa = true;
995
+ } else if (strcmp(arg, "-st") == 0) {
996
+ gen_st = true;
997
+ } else if (strcmp(arg, "-csharp") == 0) {
998
+ gen_csharp = true;
999
+ } else if (strcmp(arg, "-cpp_use_include_prefix") == 0) {
1000
+ g_cpp_use_include_prefix = true;
1001
+ } else if (strcmp(arg, "-I") == 0) {
1002
+ // An argument of "-I\ asdf" is invalid and has unknown results
1003
+ arg = argv[++i];
1004
+
1005
+ if (arg == NULL) {
1006
+ fprintf(stderr, "!!! Missing Include directory\n");
1007
+ usage();
1008
+ }
1009
+ g_incl_searchpath.push_back(arg);
1010
+ } else if (strcmp(arg, "-o") == 0) {
1011
+ arg = argv[++i];
1012
+ if (arg == NULL) {
1013
+ fprintf(stderr, "-o: missing output directory\n");
1014
+ usage();
1015
+ }
1016
+ out_path = arg;
1017
+
1018
+ #ifdef MINGW
1019
+ //strip out trailing \ on Windows
1020
+ int last = out_path.length()-1;
1021
+ if (out_path[last] == '\\')
1022
+ {
1023
+ out_path.erase(last);
1024
+ }
1025
+ #endif
1026
+
1027
+ struct stat sb;
1028
+ if (stat(out_path.c_str(), &sb) < 0) {
1029
+ fprintf(stderr, "Output directory %s is unusable: %s\n", out_path.c_str(), strerror(errno));
1030
+ return -1;
1031
+ }
1032
+ if (! S_ISDIR(sb.st_mode)) {
1033
+ fprintf(stderr, "Output directory %s exists but is not a directory\n", out_path.c_str());
1034
+ return -1;
1035
+ }
1036
+ } else {
1037
+ fprintf(stderr, "!!! Unrecognized option: %s\n", arg);
1038
+ usage();
1039
+ }
1040
+
1041
+ // Tokenize more
1042
+ arg = strtok(NULL, " ");
1043
+ }
1044
+ }
1045
+
1046
+ // if you're asking for version, you have a right not to pass a file
1047
+ if (strcmp(argv[argc-1], "-version") == 0) {
1048
+ version();
1049
+ exit(1);
1050
+ }
1051
+
1052
+ // TODO(dreiss): Delete these when everyone is using the new hotness.
1053
+ if (gen_cpp) {
1054
+ pwarning(1, "-cpp is deprecated. Use --gen cpp");
1055
+ string gen_string = "cpp:";
1056
+ if (gen_dense) {
1057
+ gen_string.append("dense,");
1058
+ }
1059
+ if (g_cpp_use_include_prefix) {
1060
+ gen_string.append("include_prefix,");
1061
+ }
1062
+ generator_strings.push_back(gen_string);
1063
+ }
1064
+ if (gen_java) {
1065
+ pwarning(1, "-java is deprecated. Use --gen java");
1066
+ generator_strings.push_back("java");
1067
+ }
1068
+ if (gen_javabean) {
1069
+ pwarning(1, "-javabean is deprecated. Use --gen java:beans");
1070
+ generator_strings.push_back("java:beans");
1071
+ }
1072
+ if (gen_csharp) {
1073
+ pwarning(1, "-csharp is deprecated. Use --gen csharp");
1074
+ generator_strings.push_back("csharp");
1075
+ }
1076
+ if (gen_py) {
1077
+ pwarning(1, "-py is deprecated. Use --gen py");
1078
+ generator_strings.push_back("py");
1079
+ }
1080
+ if (gen_rb) {
1081
+ pwarning(1, "-rb is deprecated. Use --gen rb");
1082
+ generator_strings.push_back("rb");
1083
+ }
1084
+ if (gen_perl) {
1085
+ pwarning(1, "-perl is deprecated. Use --gen perl");
1086
+ generator_strings.push_back("perl");
1087
+ }
1088
+ if (gen_php || gen_phpi) {
1089
+ pwarning(1, "-php is deprecated. Use --gen php");
1090
+ string gen_string = "php:";
1091
+ if (gen_phpi) {
1092
+ gen_string.append("inlined,");
1093
+ } else if(gen_phps) {
1094
+ gen_string.append("server,");
1095
+ } else if(gen_phpa) {
1096
+ gen_string.append("autoload,");
1097
+ } else if(gen_phpo) {
1098
+ gen_string.append("oop,");
1099
+ } else if(gen_rest) {
1100
+ gen_string.append("rest,");
1101
+ }
1102
+ generator_strings.push_back(gen_string);
1103
+ }
1104
+ if (gen_cocoa) {
1105
+ pwarning(1, "-cocoa is deprecated. Use --gen cocoa");
1106
+ generator_strings.push_back("cocoa");
1107
+ }
1108
+ if (gen_erl) {
1109
+ pwarning(1, "-erl is deprecated. Use --gen erl");
1110
+ generator_strings.push_back("erl");
1111
+ }
1112
+ if (gen_st) {
1113
+ pwarning(1, "-st is deprecated. Use --gen st");
1114
+ generator_strings.push_back("st");
1115
+ }
1116
+ if (gen_ocaml) {
1117
+ pwarning(1, "-ocaml is deprecated. Use --gen ocaml");
1118
+ generator_strings.push_back("ocaml");
1119
+ }
1120
+ if (gen_hs) {
1121
+ pwarning(1, "-hs is deprecated. Use --gen hs");
1122
+ generator_strings.push_back("hs");
1123
+ }
1124
+ if (gen_xsd) {
1125
+ pwarning(1, "-xsd is deprecated. Use --gen xsd");
1126
+ generator_strings.push_back("xsd");
1127
+ }
1128
+
1129
+ // You gotta generate something!
1130
+ if (generator_strings.empty()) {
1131
+ fprintf(stderr, "!!! No output language(s) specified\n\n");
1132
+ usage();
1133
+ }
1134
+
1135
+ // Real-pathify it
1136
+ char rp[PATH_MAX];
1137
+ if (argv[i] == NULL) {
1138
+ fprintf(stderr, "!!! Missing file name\n");
1139
+ usage();
1140
+ }
1141
+ if (saferealpath(argv[i], rp) == NULL) {
1142
+ failure("Could not open input file with realpath: %s", argv[i]);
1143
+ }
1144
+ string input_file(rp);
1145
+
1146
+ // Instance of the global parse tree
1147
+ t_program* program = new t_program(input_file);
1148
+ if (out_path.size()) {
1149
+ program->set_out_path(out_path);
1150
+ }
1151
+
1152
+ // Compute the cpp include prefix.
1153
+ // infer this from the filename passed in
1154
+ string input_filename = argv[i];
1155
+ string include_prefix;
1156
+
1157
+ string::size_type last_slash = string::npos;
1158
+ if ((last_slash = input_filename.rfind("/")) != string::npos) {
1159
+ include_prefix = input_filename.substr(0, last_slash);
1160
+ }
1161
+
1162
+ program->set_include_prefix(include_prefix);
1163
+
1164
+ // Initialize global types
1165
+ g_type_void = new t_base_type("void", t_base_type::TYPE_VOID);
1166
+ g_type_string = new t_base_type("string", t_base_type::TYPE_STRING);
1167
+ g_type_binary = new t_base_type("string", t_base_type::TYPE_STRING);
1168
+ ((t_base_type*)g_type_binary)->set_binary(true);
1169
+ g_type_slist = new t_base_type("string", t_base_type::TYPE_STRING);
1170
+ ((t_base_type*)g_type_slist)->set_string_list(true);
1171
+ g_type_bool = new t_base_type("bool", t_base_type::TYPE_BOOL);
1172
+ g_type_byte = new t_base_type("byte", t_base_type::TYPE_BYTE);
1173
+ g_type_i16 = new t_base_type("i16", t_base_type::TYPE_I16);
1174
+ g_type_i32 = new t_base_type("i32", t_base_type::TYPE_I32);
1175
+ g_type_i64 = new t_base_type("i64", t_base_type::TYPE_I64);
1176
+ g_type_double = new t_base_type("double", t_base_type::TYPE_DOUBLE);
1177
+
1178
+ // Parse it!
1179
+ parse(program, NULL);
1180
+
1181
+ // The current path is not really relevant when we are doing generation.
1182
+ // Reset the variable to make warning messages clearer.
1183
+ g_curpath = "generation";
1184
+ // Reset yylineno for the heck of it. Use 1 instead of 0 because
1185
+ // That is what shows up during argument parsing.
1186
+ yylineno = 1;
1187
+
1188
+ // Generate it!
1189
+ generate(program, generator_strings);
1190
+
1191
+ // Clean up. Who am I kidding... this program probably orphans heap memory
1192
+ // all over the place, but who cares because it is about to exit and it is
1193
+ // all referenced and used by this wacky parse tree up until now anyways.
1194
+
1195
+ delete program;
1196
+ delete g_type_void;
1197
+ delete g_type_string;
1198
+ delete g_type_bool;
1199
+ delete g_type_byte;
1200
+ delete g_type_i16;
1201
+ delete g_type_i32;
1202
+ delete g_type_i64;
1203
+ delete g_type_double;
1204
+
1205
+ // Finished
1206
+ return 0;
1207
+ }