[libcxx-commits] [libcxx] 61cecf6 - [libc++][NFC] tidy up strstreambuf::seekoff and strstreambuf::seekpos

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Fri Sep 8 05:50:26 PDT 2023


Author: Daniel McIntosh
Date: 2023-09-08T08:50:20-04:00
New Revision: 61cecf641f5b3a17a61a6badf069964d9f72db08

URL: https://github.com/llvm/llvm-project/commit/61cecf641f5b3a17a61a6badf069964d9f72db08
DIFF: https://github.com/llvm/llvm-project/commit/61cecf641f5b3a17a61a6badf069964d9f72db08.diff

LOG: [libc++][NFC] tidy up strstreambuf::seekoff and strstreambuf::seekpos

Should be the same logic, but hopefully easier to read this way. Gets
rid of some superfluous state variables, and uses early returns.

Differential Revision: https://reviews.llvm.org/D112956

Added: 
    

Modified: 
    libcxx/src/strstream.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/src/strstream.cpp b/libcxx/src/strstream.cpp
index a4c949ccb196c46..c97db698c0a1e95 100644
--- a/libcxx/src/strstream.cpp
+++ b/libcxx/src/strstream.cpp
@@ -171,81 +171,80 @@ strstreambuf::int_type strstreambuf::underflow() {
 }
 
 strstreambuf::pos_type strstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which) {
-  off_type __p(-1);
   bool pos_in  = (__which & ios::in) != 0;
   bool pos_out = (__which & ios::out) != 0;
-  bool legal   = false;
   switch (__way) {
   case ios::beg:
   case ios::end:
-    if (pos_in || pos_out)
-      legal = true;
+    if (!pos_in && !pos_out)
+      return pos_type(off_type(-1));
     break;
   case ios::cur:
-    if (pos_in != pos_out)
-      legal = true;
+    if (pos_in == pos_out)
+      return pos_type(off_type(-1));
     break;
   }
+
   if (pos_in && gptr() == nullptr)
-    legal = false;
+    return pos_type(off_type(-1));
   if (pos_out && pptr() == nullptr)
-    legal = false;
-  if (legal) {
-    off_type newoff;
-    char* seekhigh = epptr() ? epptr() : egptr();
-    switch (__way) {
-    case ios::beg:
-      newoff = 0;
-      break;
-    case ios::cur:
-      newoff = (pos_in ? gptr() : pptr()) - eback();
-      break;
-    case ios::end:
-      newoff = seekhigh - eback();
-      break;
-    default:
-      __libcpp_unreachable();
-    }
-    newoff += __off;
-    if (0 <= newoff && newoff <= seekhigh - eback()) {
-      char* newpos = eback() + newoff;
-      if (pos_in)
-        setg(eback(), newpos, _VSTD::max(newpos, egptr()));
-      if (pos_out) {
-        // min(pbase, newpos), newpos, epptr()
-        __off = epptr() - newpos;
-        setp(min(pbase(), newpos), epptr());
-        __pbump((epptr() - pbase()) - __off);
-      }
-      __p = newoff;
-    }
+    return pos_type(off_type(-1));
+
+  off_type newoff;
+  char* seekhigh = epptr() ? epptr() : egptr();
+  switch (__way) {
+  case ios::beg:
+    newoff = 0;
+    break;
+  case ios::cur:
+    newoff = (pos_in ? gptr() : pptr()) - eback();
+    break;
+  case ios::end:
+    newoff = seekhigh - eback();
+    break;
+  default:
+    __libcpp_unreachable();
+  }
+  newoff += __off;
+  if (newoff < 0 || newoff > seekhigh - eback())
+    return pos_type(off_type(-1));
+
+  char* newpos = eback() + newoff;
+  if (pos_in)
+    setg(eback(), newpos, _VSTD::max(newpos, egptr()));
+  if (pos_out) {
+    // min(pbase, newpos), newpos, epptr()
+    __off = epptr() - newpos;
+    setp(min(pbase(), newpos), epptr());
+    __pbump((epptr() - pbase()) - __off);
   }
-  return pos_type(__p);
+  return pos_type(newoff);
 }
 
 strstreambuf::pos_type strstreambuf::seekpos(pos_type __sp, ios_base::openmode __which) {
-  off_type __p(-1);
   bool pos_in  = (__which & ios::in) != 0;
   bool pos_out = (__which & ios::out) != 0;
-  if (pos_in || pos_out) {
-    if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr))) {
-      off_type newoff = __sp;
-      char* seekhigh  = epptr() ? epptr() : egptr();
-      if (0 <= newoff && newoff <= seekhigh - eback()) {
-        char* newpos = eback() + newoff;
-        if (pos_in)
-          setg(eback(), newpos, _VSTD::max(newpos, egptr()));
-        if (pos_out) {
-          // min(pbase, newpos), newpos, epptr()
-          off_type temp = epptr() - newpos;
-          setp(min(pbase(), newpos), epptr());
-          __pbump((epptr() - pbase()) - temp);
-        }
-        __p = newoff;
-      }
-    }
+  if (!pos_in && !pos_out)
+    return pos_type(off_type(-1));
+
+  if ((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr))
+    return pos_type(off_type(-1));
+
+  off_type newoff = __sp;
+  char* seekhigh  = epptr() ? epptr() : egptr();
+  if (newoff < 0 || newoff > seekhigh - eback())
+    return pos_type(off_type(-1));
+
+  char* newpos = eback() + newoff;
+  if (pos_in)
+    setg(eback(), newpos, _VSTD::max(newpos, egptr()));
+  if (pos_out) {
+    // min(pbase, newpos), newpos, epptr()
+    off_type temp = epptr() - newpos;
+    setp(min(pbase(), newpos), epptr());
+    __pbump((epptr() - pbase()) - temp);
   }
-  return pos_type(__p);
+  return pos_type(newoff);
 }
 
 istrstream::~istrstream() {}


        


More information about the libcxx-commits mailing list