hidl_string: Add cstr + length constructor

This will allow non-terminated strings to be turned into a hidl_string
with only one copy among other things.

Test: libhidl_test
Fixes: 34221748
Change-Id: I443f7920a65d23b7bcb583db55c3cec7266ec2d4
diff --git a/base/HidlSupport.cpp b/base/HidlSupport.cpp
index dce2585..5237088 100644
--- a/base/HidlSupport.cpp
+++ b/base/HidlSupport.cpp
@@ -44,6 +44,10 @@
     copyFrom(s, strlen(s));
 }
 
+hidl_string::hidl_string(const char *s, size_t length) : hidl_string() {
+    copyFrom(s, length);
+}
+
 hidl_string::hidl_string(const hidl_string &other): hidl_string() {
     copyFrom(other.c_str(), other.size());
 }
diff --git a/base/include/hidl/HidlSupport.h b/base/include/hidl/HidlSupport.h
index 106fb02..7477352 100644
--- a/base/include/hidl/HidlSupport.h
+++ b/base/include/hidl/HidlSupport.h
@@ -128,6 +128,8 @@
     hidl_string(const hidl_string &);
     // copy from a C-style string.
     hidl_string(const char *);
+    // copy the first length characters from a C-style string.
+    hidl_string(const char *, size_t length);
     // copy from an std::string.
     hidl_string(const std::string &);
 
diff --git a/test_main.cpp b/test_main.cpp
index 5349fc8..1967614 100644
--- a/test_main.cpp
+++ b/test_main.cpp
@@ -61,16 +61,18 @@
     EXPECT_STREQ(s2.c_str(), "s2");
     hidl_string s3 = hidl_string("s3"); // move =
     EXPECT_STREQ(s3.c_str(), "s3");
-    hidl_string s4(hidl_string(hidl_string("s4"))); // move constructor
-    EXPECT_STREQ(s4.c_str(), "s4");
-    hidl_string s5(std::string("s5")); // copy constructor from std::string
-    EXPECT_STREQ(s5, "s5");
-    hidl_string s6 = std::string("s6"); // copy = from std::string
+    hidl_string s4 = hidl_string("12345", 3); // copy constructor from cstr w/ length
+    EXPECT_STREQ(s4.c_str(), "123");
+    hidl_string s5(hidl_string(hidl_string("s5"))); // move constructor
+    EXPECT_STREQ(s5.c_str(), "s5");
+    hidl_string s6(std::string("s6")); // copy constructor from std::string
     EXPECT_STREQ(s6, "s6");
-    hidl_string s7(s6); // copy constructor
-    EXPECT_STREQ(s7, "s6");
-    hidl_string s8 = s7; // copy =
-    EXPECT_STREQ(s8, "s6");
+    hidl_string s7 = std::string("s7"); // copy = from std::string
+    EXPECT_STREQ(s7, "s7");
+    hidl_string s8(s7); // copy constructor
+    EXPECT_STREQ(s8, "s7");
+    hidl_string s9 = s8; // copy =
+    EXPECT_STREQ(s9, "s7");
     char myCString[20] = "myCString";
     s.setToExternal(&myCString[0], strlen(myCString));
     EXPECT_STREQ(s, "myCString");