name: Allow negative start index in getSubName method

refs #1962

Change-Id: I2f1b77d95d534d837d925022934f9a6ccaa340d2
diff --git a/src/name.cpp b/src/name.cpp
index c5adb7d..ff698d8 100644
--- a/src/name.cpp
+++ b/src/name.cpp
@@ -188,11 +188,11 @@
 }
 
 Name&
-Name::append(const Name& name)
+Name::append(const PartialName& name)
 {
   if (&name == this)
     // Copying from this name, so need to make a copy first.
-    return append(Name(name));
+    return append(PartialName(name));
 
   for (size_t i = 0; i < name.size(); ++i)
     append(name.at(i));
@@ -270,16 +270,20 @@
   return *this;
 }
 
-Name
-Name::getSubName(size_t iStartComponent, size_t nComponents) const
+PartialName
+Name::getSubName(ssize_t iStartComponent, size_t nComponents) const
 {
-  Name result;
+  PartialName result;
 
+  ssize_t iStart = iStartComponent < 0 ? this->size() + iStartComponent : iStartComponent;
   size_t iEnd = this->size();
-  if (nComponents != npos)
-    iEnd = std::min(this->size(), iStartComponent + nComponents);
 
-  for (size_t i = iStartComponent; i < iEnd; ++i)
+  iStart = std::max(iStart, static_cast<ssize_t>(0));
+
+  if (nComponents != npos)
+    iEnd = std::min(this->size(), iStart + nComponents);
+
+  for (size_t i = iStart; i < iEnd; ++i)
     result.append(at(i));
 
   return result;