facter 3.9.6.cfacter.20180612 → 3.11.0.cfacter.20180319

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/ext/facter/facter/CMakeLists.txt +1 -1
  3. data/ext/facter/facter/acceptance/Gemfile +3 -4
  4. data/ext/facter/facter/acceptance/Rakefile +342 -2
  5. data/ext/facter/facter/acceptance/config/aio/options.rb +6 -0
  6. data/ext/facter/facter/acceptance/config/git/options.rb +5 -1
  7. data/ext/facter/facter/acceptance/setup/aio/pre-suite/010_Install.rb +22 -0
  8. data/ext/facter/facter/acceptance/setup/aio/pre-suite/021_InstallAristaModule.rb +12 -0
  9. data/ext/facter/facter/acceptance/setup/aio/pre-suite/022_Remove_LD_PRELOAD.rb +11 -0
  10. data/ext/facter/facter/acceptance/setup/common/00_EnvSetup.rb +64 -0
  11. data/ext/facter/facter/acceptance/setup/common/pre-suite/000-delete-puppet-when-none.rb +11 -0
  12. data/ext/facter/facter/acceptance/setup/git/pre-suite/01_TestSetup.rb +31 -0
  13. data/ext/facter/facter/acceptance/tests/ticket_1238_hostname_fqdn.rb +20 -0
  14. data/ext/facter/facter/lib/CMakeLists.txt +3 -2
  15. data/ext/facter/facter/lib/Doxyfile +1 -1
  16. data/ext/facter/facter/lib/inc/facter/facts/fact.hpp +5 -0
  17. data/ext/facter/facter/lib/inc/internal/facts/aix/networking_resolver.hpp +0 -7
  18. data/ext/facter/facter/lib/inc/internal/facts/freebsd/networking_resolver.hpp +0 -7
  19. data/ext/facter/facter/lib/inc/internal/facts/linux/fips_resolver.hpp +31 -0
  20. data/ext/facter/facter/lib/inc/internal/facts/linux/networking_resolver.hpp +0 -7
  21. data/ext/facter/facter/lib/inc/internal/facts/openbsd/networking_resolver.hpp +0 -7
  22. data/ext/facter/facter/lib/inc/internal/facts/osx/networking_resolver.hpp +0 -7
  23. data/ext/facter/facter/lib/inc/internal/facts/posix/networking_resolver.hpp +0 -7
  24. data/ext/facter/facter/lib/inc/internal/facts/resolvers/fips_resolver.hpp +46 -0
  25. data/ext/facter/facter/lib/inc/internal/facts/resolvers/networking_resolver.hpp +2 -3
  26. data/ext/facter/facter/lib/inc/internal/facts/resolvers/ssh_resolver.hpp +6 -0
  27. data/ext/facter/facter/lib/inc/internal/facts/solaris/networking_resolver.hpp +0 -7
  28. data/ext/facter/facter/lib/schema/facter.yaml +38 -18
  29. data/ext/facter/facter/lib/src/cwrapper.cc +5 -0
  30. data/ext/facter/facter/lib/src/facts/aix/disk_resolver.cc +2 -11
  31. data/ext/facter/facter/lib/src/facts/aix/networking_resolver.cc +0 -5
  32. data/ext/facter/facter/lib/src/facts/freebsd/dmi_resolver.cc +5 -1
  33. data/ext/facter/facter/lib/src/facts/freebsd/networking_resolver.cc +1 -10
  34. data/ext/facter/facter/lib/src/facts/freebsd/virtualization_resolver.cc +1 -4
  35. data/ext/facter/facter/lib/src/facts/linux/collection.cc +2 -0
  36. data/ext/facter/facter/lib/src/facts/linux/fips_resolver.cc +31 -0
  37. data/ext/facter/facter/lib/src/facts/linux/networking_resolver.cc +1 -10
  38. data/ext/facter/facter/lib/src/facts/openbsd/networking_resolver.cc +1 -10
  39. data/ext/facter/facter/lib/src/facts/osx/networking_resolver.cc +1 -10
  40. data/ext/facter/facter/lib/src/facts/posix/networking_resolver.cc +2 -3
  41. data/ext/facter/facter/lib/src/facts/posix/ssh_resolver.cc +3 -2
  42. data/ext/facter/facter/lib/src/facts/resolvers/fips_resolver.cc +23 -0
  43. data/ext/facter/facter/lib/src/facts/resolvers/networking_resolver.cc +7 -23
  44. data/ext/facter/facter/lib/src/facts/resolvers/ssh_resolver.cc +1 -0
  45. data/ext/facter/facter/lib/src/facts/solaris/networking_resolver.cc +0 -5
  46. data/ext/facter/facter/lib/tests/facts/resolvers/ssh_resolver.cc +8 -1
  47. data/ext/facter/facter/lib/tests/facts/schema.cc +17 -0
  48. data/ext/facter/facter/locales/FACTER.pot +2 -23
  49. data/ext/facter/leatherman/CHANGELOG.md +16 -9
  50. data/ext/facter/leatherman/CMakeLists.txt +1 -2
  51. data/ext/facter/leatherman/appveyor.yml +26 -19
  52. data/ext/facter/leatherman/catch/CMakeLists.txt +1 -1
  53. data/ext/facter/leatherman/curl/tests/client_test.cc +396 -398
  54. data/ext/facter/leatherman/curl/tests/mock_curl.cc +2 -0
  55. data/ext/facter/leatherman/curl/tests/request_test.cc +66 -68
  56. data/ext/facter/leatherman/curl/tests/response_test.cc +50 -52
  57. data/ext/facter/leatherman/dynamic_library/tests/dynamic_library_tests.cc +71 -75
  58. data/ext/facter/leatherman/execution/src/execution.cc +3 -0
  59. data/ext/facter/leatherman/execution/src/posix/execution.cc +5 -6
  60. data/ext/facter/leatherman/execution/src/windows/execution.cc +2 -0
  61. data/ext/facter/leatherman/execution/tests/windows/execution.cc +4 -2
  62. data/ext/facter/leatherman/file_util/tests/directory_utils_test.cc +66 -68
  63. data/ext/facter/leatherman/file_util/tests/file_utils_test.cc +175 -177
  64. data/ext/facter/leatherman/json_container/inc/leatherman/json_container/json_container.hpp +7 -0
  65. data/ext/facter/leatherman/json_container/src/json_container.cc +10 -1
  66. data/ext/facter/leatherman/json_container/tests/json_container_test.cc +152 -8
  67. data/ext/facter/leatherman/locale/CMakeLists.txt +0 -7
  68. data/ext/facter/leatherman/locales/leatherman.pot +8 -13
  69. data/ext/facter/leatherman/logging/src/logging.cc +2 -0
  70. data/ext/facter/leatherman/util/tests/timer.cc +1 -3
  71. data/ext/facter/leatherman/vendor/Catch-1.10.0.zip +0 -0
  72. data/ext/facter/leatherman/vendor/nowide/doc/Doxyfile +4 -4
  73. data/ext/facter/leatherman/vendor/nowide/doc/LICENSE_1_0.txt +23 -0
  74. data/ext/facter/leatherman/vendor/nowide/doc/main.txt +62 -54
  75. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/convert.hpp +16 -16
  76. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/cstdio.hpp +4 -4
  77. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/utf8_codecvt.hpp +1 -1
  78. data/ext/facter/leatherman/vendor/nowide/src/iostream.cpp +32 -30
  79. data/ext/facter/leatherman/vendor/nowide/standalone/convert +6 -6
  80. data/ext/facter/leatherman/vendor/nowide/standalone/encoding_utf.hpp +1 -1
  81. data/ext/facter/leatherman/vendor/nowide/standalone/run_convert_and_build.sh +1 -3
  82. metadata +15 -6
  83. data/ext/facter/leatherman/cmake/FindICU.cmake +0 -690
  84. data/ext/facter/leatherman/scripts/travis_target.sh +0 -79
  85. data/ext/facter/leatherman/vendor/catch-1.4.0.zip +0 -0
@@ -20,6 +20,9 @@ namespace rapidjson {
20
20
  } // namespace rapidjson
21
21
 
22
22
  namespace leatherman { namespace json_container {
23
+ // Constants
24
+ constexpr size_t DEFAULT_LEFT_PADDING { 4 };
25
+
23
26
  // Errors
24
27
 
25
28
  /// Parent error class.
@@ -139,9 +142,13 @@ namespace leatherman { namespace json_container {
139
142
  /// Throw a data_key_error in case the specified key is unknown.
140
143
  std::string toString(const std::vector<JsonContainerKey>& keys) const;
141
144
 
145
+ // TODO: Refactor this to use a default parameter of DEFAULT_LEFT_PADDING
146
+ // for left_padding to remove the empty-argument variant.
142
147
  std::string toPrettyString(size_t left_padding) const;
143
148
  std::string toPrettyString() const;
144
149
 
150
+ std::string toPrettyJson(size_t left_padding = DEFAULT_LEFT_PADDING) const;
151
+
145
152
  /// Return true if the root is an empty JSON array or an empty
146
153
  /// JSON object, false otherwise.
147
154
  bool empty() const;
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include <rapidjson/document.h>
5
5
  #include <rapidjson/stringbuffer.h>
6
+ #include <rapidjson/prettywriter.h>
6
7
  #include <rapidjson/writer.h>
7
8
  #include <rapidjson/allocators.h>
8
9
  #include <rapidjson/rapidjson.h>
@@ -12,7 +13,6 @@ using leatherman::locale::_;
12
13
 
13
14
  namespace leatherman { namespace json_container {
14
15
 
15
- const size_t DEFAULT_LEFT_PADDING { 4 };
16
16
  const size_t LEFT_PADDING_INCREMENT { 2 };
17
17
 
18
18
  //
@@ -146,6 +146,15 @@ namespace leatherman { namespace json_container {
146
146
  return toPrettyString(DEFAULT_LEFT_PADDING);
147
147
  }
148
148
 
149
+ std::string JsonContainer::toPrettyJson(size_t left_padding) const {
150
+ rapidjson::StringBuffer buffer;
151
+ rapidjson::PrettyWriter<rapidjson::StringBuffer> writer { buffer };
152
+ writer.SetIndent(' ', left_padding);
153
+ auto& jval = *getValueInJson();
154
+ jval.Accept(writer);
155
+ return buffer.GetString();
156
+ }
157
+
149
158
  // capacity
150
159
 
151
160
  bool JsonContainer::empty() const {
@@ -16,7 +16,7 @@ static const std::string JSON = "{\"foo\" : {\"bar\" : 2},"
16
16
  " }"
17
17
  "}";
18
18
 
19
- namespace leatherman { namespace json_container {
19
+ using namespace leatherman::json_container;
20
20
 
21
21
  TEST_CASE("JsonContainer::JsonContainer - passing JSON string", "[data]") {
22
22
  std::string json_value {};
@@ -149,7 +149,7 @@ TEST_CASE("JsonContainer::get for object entries", "[data]") {
149
149
  }
150
150
 
151
151
  SECTION("it can get the root object") {
152
- REQUIRE(data.get<JsonContainer>().get<int>("goo") == 1);
152
+ REQUIRE(data.get<JsonContainer>().get<int>("goo") == 1);
153
153
  }
154
154
 
155
155
  SECTION("it should behave correctly given a null value") {
@@ -355,7 +355,7 @@ TEST_CASE("JsonContainer::get for object entries", "[data]") {
355
355
 
356
356
  SECTION("array with values of different types") {
357
357
  JsonContainer a { "[ 1, \"foo\", true, [2.718, 3.14], 42, 42.0, "
358
- "{\"spam\":\"eggs\"} ]" };
358
+ "{\"spam\":\"eggs\"} ]" };
359
359
 
360
360
  SECTION("boolean") {
361
361
  REQUIRE(a.get<bool>(2));
@@ -511,6 +511,152 @@ TEST_CASE("JsonContainer::toPrettyString", "[data]") {
511
511
  }
512
512
  }
513
513
 
514
+ TEST_CASE("JsonContainer::toPrettyJson", "[data]") {
515
+ SECTION("it pretty prints valid json") {
516
+ SECTION("a null value") {
517
+ std::string EXPECTED_OUTPUT = "null";
518
+
519
+ JsonContainer data(EXPECTED_OUTPUT);
520
+ auto pretty_json = data.toPrettyJson();
521
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
522
+ }
523
+
524
+ SECTION("a double") {
525
+ std::string EXPECTED_OUTPUT = "42.5";
526
+
527
+ JsonContainer data(EXPECTED_OUTPUT);
528
+ auto pretty_json = data.toPrettyJson();
529
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
530
+ }
531
+
532
+ SECTION("a bool") {
533
+ std::string EXPECTED_OUTPUT = "true";
534
+
535
+ JsonContainer data(EXPECTED_OUTPUT);
536
+ auto pretty_json = data.toPrettyJson();
537
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
538
+ }
539
+
540
+ SECTION("an int") {
541
+ std::string EXPECTED_OUTPUT = "42";
542
+
543
+ JsonContainer data(EXPECTED_OUTPUT);
544
+ auto pretty_json = data.toPrettyJson();
545
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
546
+ }
547
+
548
+ SECTION("a string") {
549
+ std::string EXPECTED_OUTPUT = "\"string\"";
550
+
551
+ JsonContainer data(EXPECTED_OUTPUT);
552
+ auto pretty_json = data.toPrettyJson();
553
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
554
+ }
555
+
556
+ SECTION("a simple array") {
557
+ std::string EXPECTED_OUTPUT =
558
+ "[\n"
559
+ " null,\n"
560
+ " 42.5,\n"
561
+ " true,\n"
562
+ " 42,\n"
563
+ " \"string\"\n"
564
+ "]";
565
+
566
+ JsonContainer data(EXPECTED_OUTPUT);
567
+ auto pretty_json = data.toPrettyJson();
568
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
569
+ }
570
+
571
+ SECTION("a simple object") {
572
+ std::string EXPECTED_OUTPUT =
573
+ "{\n"
574
+ " \"null-key\": null,\n"
575
+ " \"double-key\": 42.5,\n"
576
+ " \"bool-key\": true,\n"
577
+ " \"int-key\": 42,\n"
578
+ " \"string-key\": \"string\"\n"
579
+ "}";
580
+
581
+ JsonContainer data(EXPECTED_OUTPUT);
582
+ auto pretty_json = data.toPrettyJson();
583
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
584
+ }
585
+
586
+ SECTION("a nested object") {
587
+ std::string EXPECTED_OUTPUT =
588
+ "{\n"
589
+ " \"object-key\": {\n"
590
+ " \"null-key\": null,\n"
591
+ " \"double-key\": 42.5,\n"
592
+ " \"bool-key\": true,\n"
593
+ " \"int-key\": 42,\n"
594
+ " \"string-key\": \"string\"\n"
595
+ " },\n"
596
+ " \"array-key\": [\n"
597
+ " null,\n"
598
+ " 42.5,\n"
599
+ " true,\n"
600
+ " 42,\n"
601
+ " \"string\"\n"
602
+ " ]\n"
603
+ "}";
604
+
605
+ JsonContainer data(EXPECTED_OUTPUT);
606
+ auto pretty_json = data.toPrettyJson();
607
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
608
+ }
609
+
610
+ SECTION("a nested array") {
611
+ std::string EXPECTED_OUTPUT =
612
+ "[\n"
613
+ " {\n"
614
+ " \"null-key\": null,\n"
615
+ " \"double-key\": 42.5,\n"
616
+ " \"bool-key\": true,\n"
617
+ " \"int-key\": 42,\n"
618
+ " \"string-key\": \"string\"\n"
619
+ " },\n"
620
+ " [\n"
621
+ " null,\n"
622
+ " 42.5,\n"
623
+ " true,\n"
624
+ " 42,\n"
625
+ " \"string\"\n"
626
+ " ]\n"
627
+ "]";
628
+
629
+ JsonContainer data(EXPECTED_OUTPUT);
630
+ auto pretty_json = data.toPrettyJson();
631
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
632
+ }
633
+ }
634
+
635
+ SECTION("handles variable padding") {
636
+ std::string EXPECTED_OUTPUT =
637
+ "{\n"
638
+ " \"object-key\": {\n"
639
+ " \"null-key\": null,\n"
640
+ " \"double-key\": 42.5,\n"
641
+ " \"bool-key\": true,\n"
642
+ " \"int-key\": 42,\n"
643
+ " \"string-key\": \"string\"\n"
644
+ " },\n"
645
+ " \"array-key\": [\n"
646
+ " null,\n"
647
+ " 42.5,\n"
648
+ " true,\n"
649
+ " 42,\n"
650
+ " \"string\"\n"
651
+ " ]\n"
652
+ "}";
653
+
654
+ JsonContainer data(EXPECTED_OUTPUT);
655
+ auto pretty_json = data.toPrettyJson(2);
656
+ REQUIRE(pretty_json == EXPECTED_OUTPUT);
657
+ }
658
+ }
659
+
514
660
  TEST_CASE("JsonContainer::empty", "[data]") {
515
661
  SECTION("works correctly for an empty JsonContainer instance") {
516
662
  JsonContainer data {};
@@ -754,8 +900,8 @@ TEST_CASE("JsonContainer::set", "[data]") {
754
900
  TEST_CASE("JsonContainer::keys", "[data]") {
755
901
  SECTION("It returns a vector of keys") {
756
902
  JsonContainer data { "{ \"a\" : 1, "
757
- " \"b\" : 2, "
758
- " \"c\\u0000null\" : 2}" };
903
+ " \"b\" : 2, "
904
+ " \"c\\u0000null\" : 2}" };
759
905
  std::vector<std::string> expected_keys { "a", "b", { "c\0null", 6 } };
760
906
 
761
907
  REQUIRE(data.keys() == expected_keys);
@@ -907,7 +1053,7 @@ TEST_CASE("JsonContainer::type", "[data]") {
907
1053
 
908
1054
  TEST_CASE("JsonContainer::type for arrays entries", "[data]") {
909
1055
  JsonContainer data { "[false, -42, 3.14, \"spam\", {\"foo\" : [3, true]}, "
910
- "[1, 2, 3, 4] ]" };
1056
+ "[1, 2, 3, 4] ]" };
911
1057
 
912
1058
  SECTION("root entry") {
913
1059
  SECTION("array") {
@@ -981,5 +1127,3 @@ TEST_CASE("JsonContainer::type for arrays entries", "[data]") {
981
1127
  }
982
1128
  }
983
1129
  }
984
-
985
- }} // namespace leatherman::json_container
@@ -1,8 +1,5 @@
1
1
  if (LEATHERMAN_USE_LOCALES)
2
2
  find_package(Boost 1.54 REQUIRED COMPONENTS locale system)
3
- if (BOOST_STATIC AND LEATHERMAN_USE_ICU)
4
- find_package(ICU COMPONENTS i18n uc)
5
- endif()
6
3
  else()
7
4
  find_package(Boost 1.54 REQUIRED regex)
8
5
  endif()
@@ -10,10 +7,6 @@ endif()
10
7
  add_leatherman_includes(${Boost_INCLUDE_DIRS})
11
8
  add_leatherman_deps(${Boost_LIBRARIES})
12
9
 
13
- if (ICU_LIBRARIES)
14
- add_leatherman_deps(${ICU_LIBRARIES})
15
- endif()
16
-
17
10
  if (LEATHERMAN_USE_LOCALES AND BOOST_STATIC AND APPLE)
18
11
  # Boost.Locale relies on libiconv; if not using shared boost libraries
19
12
  # we need to include the dependency ourselves. So far this is only a
@@ -6,7 +6,7 @@
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
- "Project-Id-Version: leatherman 1.2.2\n"
9
+ "Project-Id-Version: leatherman 1.4.0\n"
10
10
  "Report-Msgid-Bugs-To: docs@puppet.com\n"
11
11
  "POT-Creation-Date: \n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
@@ -203,12 +203,7 @@ msgid "{1}: {2} ({3})."
203
203
  msgstr ""
204
204
 
205
205
  #: execution/src/posix/execution.cc
206
- msgid "select call failed"
207
- msgstr ""
208
-
209
- #: execution/src/posix/execution.cc
210
- #: execution/src/windows/execution.cc
211
- msgid "child i/o failed."
206
+ msgid "select call failed waiting for child i/o"
212
207
  msgstr ""
213
208
 
214
209
  #. debug
@@ -267,15 +262,11 @@ msgid "waitpid failed"
267
262
  msgstr ""
268
263
 
269
264
  #: execution/src/posix/execution.cc
270
- msgid "sigaction failed"
271
- msgstr ""
272
-
273
- #: execution/src/posix/execution.cc
274
- msgid "failed to setup timer"
265
+ msgid "sigaction failed while setting up timeout"
275
266
  msgstr ""
276
267
 
277
268
  #: execution/src/posix/execution.cc
278
- msgid "setitimer failed"
269
+ msgid "setitimer failed while setting up timeout"
279
270
  msgstr ""
280
271
 
281
272
  #. debug
@@ -353,6 +344,10 @@ msgstr ""
353
344
  msgid "{1} pipe i/o failed: {2}."
354
345
  msgstr ""
355
346
 
347
+ #: execution/src/windows/execution.cc
348
+ msgid "child i/o failed."
349
+ msgstr ""
350
+
356
351
  #. error
357
352
  #: execution/src/windows/execution.cc
358
353
  msgid "failed to wait for child process i/o: {1}."
@@ -75,6 +75,7 @@ namespace leatherman { namespace logging {
75
75
  _dst << endl;
76
76
  }
77
77
 
78
+ // cppcheck-suppress passedByValue
78
79
  void setup_logging(ostream &dst, string locale, string domain, bool use_locale)
79
80
  {
80
81
  // Remove existing sinks before adding a new one
@@ -149,6 +150,7 @@ namespace leatherman { namespace logging {
149
150
  g_error_logged = false;
150
151
  }
151
152
 
153
+ // cppcheck-suppress passedByValue
152
154
  void on_message(function<bool(log_level, string const&)> callback)
153
155
  {
154
156
  g_callback = callback;
@@ -1,7 +1,7 @@
1
1
  #include <catch.hpp>
2
2
  #include <leatherman/util/timer.hpp>
3
3
 
4
- namespace leatherman { namespace util {
4
+ using namespace leatherman::util;
5
5
 
6
6
  SCENARIO("Using Timer", "[util]") {
7
7
  SECTION("can instantiate") {
@@ -37,5 +37,3 @@ SCENARIO("Using Timer", "[util]") {
37
37
  REQUIRE_NOTHROW(t.elapsed_milliseconds());
38
38
  }
39
39
  }
40
-
41
- }} // namespace leatherman::util
@@ -114,7 +114,7 @@ FULL_PATH_NAMES = YES
114
114
  # If left blank the directory from which doxygen is run is used as the
115
115
  # path to strip.
116
116
 
117
- STRIP_FROM_PATH = ../../..
117
+ STRIP_FROM_PATH = ../include
118
118
 
119
119
  # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
120
120
  # the path mentioned in the documentation of a class, which tells
@@ -123,7 +123,7 @@ STRIP_FROM_PATH = ../../..
123
123
  # definition is used. Otherwise one should specify the include paths that
124
124
  # are normally passed to the compiler using the -I flag.
125
125
 
126
- STRIP_FROM_INC_PATH = ../../..
126
+ STRIP_FROM_INC_PATH = ../include
127
127
 
128
128
  # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
129
129
  # (but less readable) file names. This can be useful is your file systems
@@ -581,7 +581,7 @@ WARN_LOGFILE =
581
581
  # directories like "/usr/src/myproject". Separate the files or directories
582
582
  # with spaces.
583
583
 
584
- INPUT = ../../../boost/nowide/ \
584
+ INPUT = ../include/boost/nowide ../include/boost/nowide/integration \
585
585
  .
586
586
 
587
587
  # This tag can be used to specify the character encoding of the source files
@@ -1349,7 +1349,7 @@ SEARCH_INCLUDES = YES
1349
1349
  # contain include files that are not input files but should be processed by
1350
1350
  # the preprocessor.
1351
1351
 
1352
- INCLUDE_PATH =
1352
+ INCLUDE_PATH = ../include
1353
1353
 
1354
1354
  # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
1355
1355
  # patterns (like *.h and *.hpp) to filter out the header-files in the
@@ -0,0 +1,23 @@
1
+ Boost Software License - Version 1.0 - August 17th, 2003
2
+
3
+ Permission is hereby granted, free of charge, to any person or organization
4
+ obtaining a copy of the software and accompanying documentation covered by
5
+ this license (the "Software") to use, reproduce, display, distribute,
6
+ execute, and transmit the Software, and to prepare derivative works of the
7
+ Software, and to permit third-parties to whom the Software is furnished to
8
+ do so, all subject to the following:
9
+
10
+ The copyright notices in the Software and this entire statement, including
11
+ the above license grant, this restriction and the following disclaimer,
12
+ must be included in all copies of the Software, in whole or in part, and
13
+ all derivative works of the Software, unless such copies or derivative
14
+ works are solely in the form of machine-executable object code generated by
15
+ a source language processor.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
20
+ SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
21
+ FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
22
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23
+ DEALINGS IN THE SOFTWARE.
@@ -22,6 +22,7 @@ Table of Contents:
22
22
  - \ref using
23
23
  - \ref using_standard
24
24
  - \ref using_custom
25
+ - \ref using_integration
25
26
  - \ref technical
26
27
  - \ref technical_imple
27
28
  - \ref technical_cio
@@ -32,7 +33,7 @@ Table of Contents:
32
33
  \section main What is Boost.Nowide
33
34
 
34
35
  Boost.Nowide is a library implemented by Artyom Beilis
35
- that make cross platform Unicode aware programming
36
+ that makes cross platform Unicode aware programming
36
37
  easier.
37
38
 
38
39
  The library provides an implementation of standard C and C++ library
@@ -45,22 +46,22 @@ requiring to use Wide API.
45
46
  \subsection main_the_problem The Problem
46
47
 
47
48
  Consider a simple application that splits a big file into chunks, such that
48
- they can be sent by e-mail. It requires doing few very simple taks:
49
+ they can be sent by e-mail. It requires doing a few very simple tasks:
49
50
 
50
51
  - Access command line arguments: <code>int main(int argc,char **argv)</code>
51
- - Open a input file, open several output files: <code>std::fstream::open(char const *,std::ios::openmode m)</code>
52
+ - Open an input file, open several output files: <code>std::fstream::open(char const *,std::ios::openmode m)</code>
52
53
  - Remove the files in case of fault: <code>std::remove(char const *file)</code>
53
- - Print a progress report into console: <code>std::cout << file_name </code>
54
+ - Print a progress report onto the console: <code>std::cout << file_name </code>
54
55
 
55
- Unfortunately it is impossible to implement this simple task in a plain C++
56
- if the file names contain non-ASCII characters
56
+ Unfortunately it is impossible to implement this simple task in plain C++
57
+ if the file names contain non-ASCII characters.
57
58
 
58
59
  The simple program that uses the API would work on the systems that use UTF-8
59
60
  internally -- the vast majority of Unix-Line operating systems: Linux, Mac OS X,
60
61
  Solaris, BSD. But it would fail on files like <code>War and Peace - Война и мир - מלחמה ושלום.zip</code>
61
- under Microsoft Windows because the native Windows Unicode aware API is Wide-API - UTF-16.
62
+ under Microsoft Windows because the native Windows Unicode aware API is Wide-API -- UTF-16.
62
63
 
63
- This, such a trivial task is very hard to implement in a cross platform manner.
64
+ This incredibly trivial task is very hard to implement in a cross platform manner.
64
65
 
65
66
  \subsection main_the_solution The Solution
66
67
 
@@ -70,14 +71,14 @@ makes Unicode aware programming easier.
70
71
  The library provides:
71
72
 
72
73
  - Easy to use functions for converting UTF-8 to/from UTF-16
73
- - A class to fixing \c argc, \c argc and \c env \c main parameters to use UTF-8
74
+ - A class to make the \c argc, \c argc and \c env parameters of \c main use UTF-8
74
75
  - UTF-8 aware functions
75
76
  - \c stdio.h functions:
76
77
  - \c fopen
77
78
  - \c freopen
78
79
  - \c remove
79
80
  - \c rename
80
- - \c stdlib.h functions
81
+ - \c stdlib.h functions:
81
82
  - \c system
82
83
  - \c getenv
83
84
  - \c setenv
@@ -95,13 +96,13 @@ The library provides:
95
96
 
96
97
  \subsection main_wide Why Not Narrow and Wide?
97
98
 
98
- Why not to provide both Wide and Narrow implementations so the
99
- developer can choose to use Wide characters on Unix-Like platforms
99
+ Why not provide both Wide and Narrow implementations so the
100
+ developer can choose to use Wide characters on Unix-like platforms?
100
101
 
101
102
  Several reasons:
102
103
 
103
104
  - \c wchar_t is not really portable, it can be 2 bytes, 4 bytes or even 1 byte making Unicode aware programming harder
104
- - Standard C and C++ library uses narrow strings for OS interactions. This library follows this general rule. There is
105
+ - The C and C++ standard libraries use narrow strings for OS interactions. This library follows the same general rule. There is
105
106
  no such thing as <code>fopen(wchar_t const *,wchar_t const *)</code> in the standard library, so it is better
106
107
  to stick to the standards rather than re-implement Wide API in "Microsoft Windows Style"
107
108
 
@@ -114,12 +115,12 @@ Several reasons:
114
115
  \section using Using The Library
115
116
  \subsection using_standard Standard Features
116
117
 
117
- The library is mostly header only library, only console I/O requires separate compilation under Windows.
118
+ The library is mostly header only, only console I/O requires separate compilation under Windows.
118
119
 
119
- As a developer you are expected to to \c boost::nowide functions instead of the function avalible in the
120
+ As a developer you are expected to use \c boost::nowide functions instead of the functions available in the
120
121
  \c std namespace.
121
122
 
122
- For example, Unicode unaware implementation of line counter:
123
+ For example, here is a Unicode unaware implementation of a line counter:
123
124
  \code
124
125
  #include <fstream>
125
126
  #include <iostream>
@@ -133,7 +134,7 @@ int main(int argc,char **argv)
133
134
 
134
135
  std::ifstream f(argv[1]);
135
136
  if(!f) {
136
- std::cerr << "Can't open a file " << argv[1] << std::endl;
137
+ std::cerr << "Can't open " << argv[1] << std::endl;
137
138
  return 1;
138
139
  }
139
140
  int total_lines = 0;
@@ -147,7 +148,7 @@ int main(int argc,char **argv)
147
148
  }
148
149
  \endcode
149
150
 
150
- To make this program handle Unicode properly we do the following changes:
151
+ To make this program handle Unicode properly, we do the following changes:
151
152
 
152
153
 
153
154
  \code
@@ -166,7 +167,7 @@ int main(int argc,char **argv)
166
167
  boost::nowide::ifstream f(argv[1]); // argv[1] - is UTF-8
167
168
  if(!f) {
168
169
  // the console can display UTF-8
169
- boost::nowide::cerr << "Can't open a file " << argv[1] << std::endl;
170
+ boost::nowide::cerr << "Can't open " << argv[1] << std::endl;
170
171
  return 1;
171
172
  }
172
173
  int total_lines = 0;
@@ -181,30 +182,30 @@ int main(int argc,char **argv)
181
182
  }
182
183
  \endcode
183
184
 
184
- This is very simple and straight forward approach helps writing Unicode aware programs.
185
+ This very simple and straightforward approach helps writing Unicode aware programs.
185
186
 
186
187
  \subsection using_custom Custom API
187
188
 
188
- Of course this simple set of functions does not cover all needs. However if you need
189
- to access Wide API from Windows application using UTF-8 encoding internally you can use
189
+ Of course, this simple set of functions does not cover all needs. If you need
190
+ to access Wide API from a Windows application that uses UTF-8 internally you can use
190
191
  functions like \c boost::nowide::widen and \c boost::nowide::narrow.
191
192
 
192
- For example
193
+ For example:
193
194
  \code
194
195
  CopyFileW( boost::nowide::widen(existing_file).c_str(),
195
196
  boost::nowide::widen(new_file).c_str(),
196
197
  TRUE);
197
198
  \endcode
198
199
 
199
- So the conversion is done at the last stage and you continue using
200
- UTF-8 strings anywhere and only at glue points you switch to
201
- Wide API.
200
+ The conversion is done at the last stage, and you continue using UTF-8
201
+ strings everywhere else. You only switch to the Wide API at glue points.
202
202
 
203
203
  \c boost::nowide::widen returns \c std::string. Sometimes
204
- it is convenient to prevent allocation and use on stack buffers
205
- if possible. Boot.Nowide provides \c boost::nowide::basic_stackstring class.
204
+ it is useful to prevent allocation and use on-stack buffers
205
+ instead. Boost.Nowide provides the \c boost::nowide::basic_stackstring
206
+ class for this purpose.
206
207
 
207
- Such that the example above can be rewritten as:
208
+ The example above could be rewritten as:
208
209
 
209
210
  \code
210
211
  boost::nowide::basic_stackstring<wchar_t,char,64> wexisting_file,wnew_file;
@@ -216,25 +217,31 @@ if(!wexisting_file.convert(existing_file) || !wnew_file.convert(new_file)) {
216
217
  CopyFileW(wexisting_file.c_str(),wnew_file.c_str(),TRUE);
217
218
  \endcode
218
219
 
219
- \note There are convenience typedefs \c stackstring, \c wstackstring, \c short_stackstring and \c wshort_stackstring
220
- that use buffers of size 256 or 16 characters, and if the string is longer, they fall-back to memory
221
- allocation
220
+ \note There are a few convenience typedefs: \c stackstring and \c wstackstring using
221
+ 256-character buffers, and \c short_stackstring and \c wshort_stackstring using 16-character
222
+ buffers. If the string is longer, they fall back to memory allocation.
222
223
 
223
- \subsection using_windows_h windows.h header
224
+ \subsection using_windows_h The windows.h header
224
225
 
225
226
  The library does not include the \c windows.h in order to prevent namespace pollution with numerous
226
- defines and types. The library rather defines the prototypes to the Win32 API functions.
227
+ defines and types. Instead, the library defines the prototypes of the Win32 API functions.
228
+
229
+ However, you may request to use the \c windows.h header by defining \c BOOST_NOWIDE_USE_WINDOWS_H
230
+ before including any of the Boost.Nowide headers
231
+
232
+ \subsection using_integration Integration with Boost.Filesystem
233
+
234
+ Boost.Filesystem supports selection of narrow encoding. Unfortunatelly the default narrow encoding on Windows isn't UTF-8, you can enable UTF-8 as default encoding on Boost.Filesystem
235
+ by calling `boost::nowide::nowide_filesystem()` in the beginning of your program
227
236
 
228
- However if you may request to use original \c windows.h header by setting \c BOOST_NOWIDE_USE_WINDOWS_H
229
- define before including any of the Boost.Nowide headers
230
237
 
231
238
  \section technical Technical Details
232
239
  \subsection technical_imple Windows vs POSIX
233
240
 
234
- The library provide UTF-8 aware functions for Microsoft Windows in \c boost::nowide namespace that usually lay in \c std:: namespace,
235
- for example \c std::fopen goes to \c boost::nowide::fopen.
241
+ For Microsoft Windows, the library provides UTF-8 aware variants of some \c std:: functions in the \c boost::nowide namespace.
242
+ For example, \c std::fopen becomes \c boost::nowide::fopen.
236
243
 
237
- Under POSIX platforms the boost::nowide::fopen and all other functions are aliases to standard library functions:
244
+ Under POSIX platforms, the functions in boost::nowide are aliases of their standard library counterparts:
238
245
 
239
246
  \code
240
247
  namespace boost {
@@ -253,25 +260,26 @@ using std::fopen
253
260
 
254
261
  \subsection technical_cio Console I/O
255
262
 
256
- Console I/O implemented as wrapper over ReadConsoleW/WriteConsoleW unless
257
- the stream is not "atty" like a pipe than ReadFile/WriteFile is used.
263
+ Console I/O is implemented as a wrapper around ReadConsoleW/WriteConsoleW
264
+ (used when the stream goes to the "real" console) and ReadFile/WriteFile
265
+ (used when the stream was piped/redirected).
258
266
 
259
267
  This approach eliminates a need of manual code page handling. If TrueType
260
- fonts are used the Unicode aware input and output would work.
268
+ fonts are used the Unicode aware input and output works as intended.
261
269
 
262
270
  \section qna Q & A
263
271
 
264
- <b>Q: Why the library does not convert the string from Locale's encoding not UTF-8 and wise versa on POSIX systems</b>
272
+ <b>Q: Why doesn't the library convert the string to/from the locale's encoding (instead of UTF-8) on POSIX systems?</b>
265
273
 
266
274
  A: It is inherently incorrect
267
275
  to convert strings to/from locale encodings on POSIX platforms.
268
276
 
269
- You can create a file named "\xFF\xFF.txt" (invalid UTF-8), remove it, pass its name as a parameter to program
270
- and it would work whether the current locale is UTF-8 locale or not.
271
- Also changing the locale from let's say \c en_US.UTF-8 to \c en_US.ISO-8859-1 would not magically change all
272
- files in OS or the strings a user may pass to the program (which is different on Windows)
277
+ You can create a file named "\xFF\xFF.txt" (invalid UTF-8), remove it, pass its name as a parameter to a program
278
+ and it would work whether the current locale is UTF-8 or not.
279
+ Also, changing the locale from let's say \c en_US.UTF-8 to \c en_US.ISO-8859-1 would not magically change all
280
+ files in the OS or the strings a user may pass to the program (which is different on Windows)
273
281
 
274
- POSIX OSs treat strings as \c NUL terminated cookies.
282
+ POSIX OSs treat strings as \c NULL terminated cookies.
275
283
 
276
284
  So altering their content according to the locale would
277
285
  actually lead to incorrect behavior.
@@ -283,21 +291,21 @@ For example, this is a naive implementation of a standard program "rm"
283
291
 
284
292
  int main(int argc,char **argv)
285
293
  {
286
- for(int i=1;i<argc;i++)
287
- std::remove(argv[i]);
288
- return 0;
294
+ for(int i=1;i<argc;i++)
295
+ std::remove(argv[i]);
296
+ return 0;
289
297
  }
290
298
  \endcode
291
299
 
292
300
  It would work with ANY locale and changing the strings would
293
301
  lead to incorrect behavior.
294
302
 
295
- The meaning of a locale under POSIX and Windows paltforms
303
+ The meaning of a locale under POSIX and Windows platforms
296
304
  is different and has very different effects.
297
305
 
298
306
  \subsection standalone_version Standalone Version
299
307
 
300
- It is possible to use Nowide library without dependency on the huge Boost project. There is a standalone version that all the functionality is placed in \c nowide namespace instead of \c boost::nowide. The example above would look like
308
+ It is possible to use Nowide library without having the huge Boost project as a dependency. There is a standalone version that has all the functionality in the \c nowide namespace instead of \c boost::nowide. The example above would look like
301
309
 
302
310
  \code
303
311
  #include <nowide/args.hpp>
@@ -337,7 +345,7 @@ The upstream sources can be found at GitHub: <a href="https://github.com/artyom-
337
345
 
338
346
  You can download the latest sources there:
339
347
 
340
- - Standard Version: <a href="../boost_nowide.zip">boost_nowide.zip</a>
348
+ - Standard Version: <a href="https://github.com/artyom-beilis/nowide/archive/master.zip">nowide-master.zip</a>
341
349
  - Standalone Boost independent version <a href="../nowide_standalone.zip">nowide_standalone.zip</a>
342
350
 
343
351
  */