PageRenderTime 28ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/source/ArmarXCore/core/util/FileSystemPathBuilder.cpp

https://gitlab.com/mkroehnert/ArmarXCore
C++ | 347 lines | 311 code | 9 blank | 27 comment | 5 complexity | 75417d4916ef8c96fcf9e561666cd8f6 MD5 | raw file
  1. /*
  2. * This file is part of ArmarX.
  3. *
  4. * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
  5. *
  6. * ArmarX is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. *
  10. * ArmarX is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. *
  18. * @package ArmarXCore
  19. * @author Raphael Grimm ( raphael dot grimm at kit dot edu)
  20. * @date 2017
  21. * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
  22. * GNU General Public License
  23. */
  24. #include <ctime>
  25. #include "FileSystemPathBuilder.h"
  26. #include "../system/cmake/CMakePackageFinder.h"
  27. #include "../exceptions/local/ExpressionException.h"
  28. #include "Preprocessor.h"
  29. namespace armarx
  30. {
  31. const boost::regex FileSystemPathBuilder::RawPathRegex
  32. {
  33. "([^{}]+|\\{[^{}]+\\})+"
  34. };
  35. std::map<std::string, FileSystemPathBuilder::FormatStringOption> FileSystemPathBuilder::GetFormatStringOptions()
  36. {
  37. std::map<std::string, FormatStringOption> descr;
  38. for (const auto& key : FileSystemPathBuilderFormatStringOptionRegistrar::getKeys())
  39. {
  40. descr[key] = FileSystemPathBuilderFormatStringOptionRegistrar::get(key);
  41. }
  42. return descr;
  43. }
  44. std::string FileSystemPathBuilder::ApplyFormatting(const std::string& rawPath)
  45. {
  46. ARMARX_CHECK_EXPRESSION_W_HINT(
  47. boost::regex_match(rawPath, RawPathRegex),
  48. VAROUT(rawPath));
  49. std::stringstream strstr;
  50. boost::regex expression {"([^{}]+|\\{([^{}]+)\\})"};
  51. std::string::const_iterator start = rawPath.begin();
  52. const std::string::const_iterator end = rawPath.end();
  53. boost::match_results<std::string::const_iterator> match;
  54. while (boost::regex_search(start, end, match, expression))
  55. {
  56. if (match[2].matched)
  57. {
  58. const std::string matched
  59. {
  60. match[2].first, match[2].second
  61. };
  62. bool hit = false;
  63. for (const auto& key : FileSystemPathBuilderFormatStringOptionRegistrar::getKeys())
  64. {
  65. const FormatStringOption& opt = FileSystemPathBuilderFormatStringOptionRegistrar::get(key);
  66. if (boost::regex_match(matched, opt.patternRegex))
  67. {
  68. strstr << opt.patternReplacer(matched);
  69. hit = true;
  70. break;
  71. }
  72. }
  73. ARMARX_CHECK_EXPRESSION_W_HINT(hit, "pattern '{" + matched + "}' did not match any known FormatString");
  74. }
  75. else
  76. {
  77. strstr << match[0];
  78. }
  79. //advance
  80. start = match[0].second;
  81. }
  82. return strstr.str();
  83. }
  84. FileSystemPathBuilder::RegisterFormatStringOption::RegisterFormatStringOption(
  85. std::string name, boost::regex patternRegex, std::function<std::string(const std::string&)> replacer, std::string description)
  86. {
  87. FileSystemPathBuilderFormatStringOptionRegistrar::registerElement(
  88. name, {name, std::move(description), std::move(patternRegex), std::move(replacer)});
  89. }
  90. //chars
  91. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  92. {
  93. "LEFT CURLY",
  94. boost::regex{"LEFT CURLY"},
  95. [](const std::string&){return "{";},
  96. "prints {"
  97. };
  98. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  99. {
  100. "RIGHT CURLY",
  101. boost::regex{"RIGHT CURLY"},
  102. [](const std::string&){return "}";},
  103. "prints }"
  104. };
  105. //date&time
  106. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  107. {
  108. "year",
  109. boost::regex{"year"},
  110. [](const std::string&)
  111. {
  112. std::time_t t = std::time(nullptr);
  113. char buff[8];
  114. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%y", std::localtime(&t)));
  115. return std::string {buff};
  116. },
  117. "year (last two digits)"
  118. };
  119. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  120. {
  121. "Year",
  122. boost::regex{"Year"},
  123. [](const std::string&)
  124. {
  125. std::time_t t = std::time(nullptr);
  126. char buff[5];
  127. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%Y", std::localtime(&t)));
  128. return std::string {buff};
  129. },
  130. "Year (all four digits)"
  131. };
  132. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  133. {
  134. "month",
  135. boost::regex{"month"},
  136. [](const std::string&)
  137. {
  138. std::time_t t = std::time(nullptr);
  139. char buff[3];
  140. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%m", std::localtime(&t)));
  141. return std::string {buff};
  142. },
  143. "month (01-12)"
  144. };
  145. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  146. {
  147. "day",
  148. boost::regex{"day"},
  149. [](const std::string&)
  150. {
  151. std::time_t t = std::time(nullptr);
  152. char buff[3];
  153. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%d", std::localtime(&t)));
  154. return std::string {buff};
  155. },
  156. "day (01-31)"
  157. };
  158. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  159. {
  160. "hour",
  161. boost::regex{"hour"},
  162. [](const std::string&)
  163. {
  164. std::time_t t = std::time(nullptr);
  165. char buff[3];
  166. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%H", std::localtime(&t)));
  167. return std::string {buff};
  168. },
  169. "hour (00-23)"
  170. };
  171. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  172. {
  173. "minute",
  174. boost::regex{"minute"},
  175. [](const std::string&)
  176. {
  177. std::time_t t = std::time(nullptr);
  178. char buff[3];
  179. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%M", std::localtime(&t)));
  180. return std::string {buff};
  181. },
  182. "minute (00-59)"
  183. };
  184. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  185. {
  186. "second",
  187. boost::regex{"second"},
  188. [](const std::string&)
  189. {
  190. std::time_t t = std::time(nullptr);
  191. char buff[3];
  192. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%S", std::localtime(&t)));
  193. return std::string {buff};
  194. },
  195. "second (00-59)"
  196. };
  197. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  198. {
  199. "Time",
  200. boost::regex{"Time"},
  201. [](const std::string&)
  202. {
  203. std::time_t t = std::time(nullptr);
  204. char buff[9];
  205. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%H-%M-%S", std::localtime(&t)));
  206. return std::string {buff};
  207. },
  208. "HH-MM-SS"
  209. };
  210. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  211. {
  212. "Date",
  213. boost::regex{"Date"},
  214. [](const std::string&)
  215. {
  216. std::time_t t = std::time(nullptr);
  217. char buff[11];
  218. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%Y-%m-%d", std::localtime(&t)));
  219. return std::string {buff};
  220. },
  221. "YYYY-MM-DD"
  222. };
  223. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  224. {
  225. "DateTime",
  226. boost::regex{"DateTime"},
  227. [](const std::string&)
  228. {
  229. std::time_t t = std::time(nullptr);
  230. char buff[20];
  231. ARMARX_CHECK_EXPRESSION(std::strftime(buff, sizeof(buff), "%Y-%m-%d_%H-%M-%S", std::localtime(&t)));
  232. return std::string {buff};
  233. },
  234. "YYYY-MM-DD_HH-MM-SS"
  235. };
  236. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  237. {
  238. "time-since-epoch",
  239. boost::regex{"time-since-epoch"},
  240. [](const std::string&)
  241. {
  242. return to_string(std::chrono::high_resolution_clock::now().time_since_epoch().count());
  243. },
  244. "time since epoch in nanoseconds (can be used as UUID)"
  245. };
  246. //package paths
  247. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  248. {
  249. "PackageDir",
  250. boost::regex{"PackageDir:.+"},
  251. [](const std::string & s)
  252. {
  253. const auto pkg = s.substr(11);
  254. CMakePackageFinder pf {pkg};
  255. ARMARX_CHECK_EXPRESSION_W_HINT(pf.packageFound(), "package '" + pkg + "' not found!");
  256. return pf.getPackageDir();
  257. },
  258. "PackageDir:<PACKAGE>: Package dir of the armarx Package <PACKAGE>."
  259. };
  260. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  261. {
  262. "ScenarioDir",
  263. boost::regex{"ScenarioDir:.+"},
  264. [](const std::string & s)
  265. {
  266. const auto pkg = s.substr(12);
  267. CMakePackageFinder pf {pkg};
  268. ARMARX_CHECK_EXPRESSION_W_HINT(pf.packageFound(), "package '" + pkg + "' not found!");
  269. return pf.getScenariosDir();
  270. },
  271. "ScenarioDir:<PACKAGE>: Scenario dir of the armarx Package <PACKAGE>."
  272. };
  273. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  274. {
  275. "DataDir",
  276. boost::regex{"DataDir:.+"},
  277. [](const std::string & s)
  278. {
  279. const auto pkg = s.substr(8);
  280. CMakePackageFinder pf {pkg};
  281. ARMARX_CHECK_EXPRESSION_W_HINT(pf.packageFound(), "package '" + pkg + "' not found!");
  282. return pf.getDataDir();
  283. },
  284. "DataDir:<PACKAGE>: Data dir of the armarx Package <PACKAGE>."
  285. };
  286. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  287. {
  288. "BuildDir",
  289. boost::regex{"BuildDir:.+"},
  290. [](const std::string & s)
  291. {
  292. const auto pkg = s.substr(9);
  293. CMakePackageFinder pf {pkg};
  294. ARMARX_CHECK_EXPRESSION_W_HINT(pf.packageFound(), "package '" + pkg + "' not found!");
  295. return pf.getBuildDir();
  296. },
  297. "BuildDir:<PACKAGE>: Build dir of the armarx Package <PACKAGE>."
  298. };
  299. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  300. {
  301. "BinaryDir",
  302. boost::regex{"BinaryDir:.+"},
  303. [](const std::string & s)
  304. {
  305. const auto pkg = s.substr(10);
  306. CMakePackageFinder pf {pkg};
  307. ARMARX_CHECK_EXPRESSION_W_HINT(pf.packageFound(), "package '" + pkg + "' not found!");
  308. return pf.getBinaryDir();
  309. },
  310. "BinaryDir:<PACKAGE>: Binary dir of the armarx Package <PACKAGE>."
  311. };
  312. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  313. {
  314. "CMakeDir",
  315. boost::regex{"CMakeDir:.+"},
  316. [](const std::string & s)
  317. {
  318. const auto pkg = s.substr(9);
  319. CMakePackageFinder pf {pkg};
  320. ARMARX_CHECK_EXPRESSION_W_HINT(pf.packageFound(), "package '" + pkg + "' not found!");
  321. return pf.getCMakeDir();
  322. },
  323. "CMakeDir:<PACKAGE>: CMake dir of the armarx Package <PACKAGE>."
  324. };
  325. FileSystemPathBuilder::RegisterFormatStringOption ARMARX_ANONYMOUS_VARIABLE
  326. {
  327. "SourceDir",
  328. boost::regex{"SourceDir:.+"},
  329. [](const std::string & s)
  330. {
  331. const auto pkg = s.substr(10);
  332. CMakePackageFinder pf {pkg};
  333. ARMARX_CHECK_EXPRESSION_W_HINT(pf.packageFound(), "package '" + pkg + "' not found!");
  334. return pf.getPackageDir() + "/source/" + pkg;
  335. },
  336. "SourceDir:<PACKAGE>: CMake dir of the armarx Package <PACKAGE>."
  337. };
  338. }