Skip to content

Commit 61cecf6

Browse files
DanielMcIntoshldionne
authored andcommitted
[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
1 parent 521c611 commit 61cecf6

File tree

1 file changed

+56
-57
lines changed

1 file changed

+56
-57
lines changed

libcxx/src/strstream.cpp

Lines changed: 56 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -171,81 +171,80 @@ strstreambuf::int_type strstreambuf::underflow() {
171171
}
172172

173173
strstreambuf::pos_type strstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which) {
174-
off_type __p(-1);
175174
bool pos_in = (__which & ios::in) != 0;
176175
bool pos_out = (__which & ios::out) != 0;
177-
bool legal = false;
178176
switch (__way) {
179177
case ios::beg:
180178
case ios::end:
181-
if (pos_in || pos_out)
182-
legal = true;
179+
if (!pos_in && !pos_out)
180+
return pos_type(off_type(-1));
183181
break;
184182
case ios::cur:
185-
if (pos_in != pos_out)
186-
legal = true;
183+
if (pos_in == pos_out)
184+
return pos_type(off_type(-1));
187185
break;
188186
}
187+
189188
if (pos_in && gptr() == nullptr)
190-
legal = false;
189+
return pos_type(off_type(-1));
191190
if (pos_out && pptr() == nullptr)
192-
legal = false;
193-
if (legal) {
194-
off_type newoff;
195-
char* seekhigh = epptr() ? epptr() : egptr();
196-
switch (__way) {
197-
case ios::beg:
198-
newoff = 0;
199-
break;
200-
case ios::cur:
201-
newoff = (pos_in ? gptr() : pptr()) - eback();
202-
break;
203-
case ios::end:
204-
newoff = seekhigh - eback();
205-
break;
206-
default:
207-
__libcpp_unreachable();
208-
}
209-
newoff += __off;
210-
if (0 <= newoff && newoff <= seekhigh - eback()) {
211-
char* newpos = eback() + newoff;
212-
if (pos_in)
213-
setg(eback(), newpos, _VSTD::max(newpos, egptr()));
214-
if (pos_out) {
215-
// min(pbase, newpos), newpos, epptr()
216-
__off = epptr() - newpos;
217-
setp(min(pbase(), newpos), epptr());
218-
__pbump((epptr() - pbase()) - __off);
219-
}
220-
__p = newoff;
221-
}
191+
return pos_type(off_type(-1));
192+
193+
off_type newoff;
194+
char* seekhigh = epptr() ? epptr() : egptr();
195+
switch (__way) {
196+
case ios::beg:
197+
newoff = 0;
198+
break;
199+
case ios::cur:
200+
newoff = (pos_in ? gptr() : pptr()) - eback();
201+
break;
202+
case ios::end:
203+
newoff = seekhigh - eback();
204+
break;
205+
default:
206+
__libcpp_unreachable();
207+
}
208+
newoff += __off;
209+
if (newoff < 0 || newoff > seekhigh - eback())
210+
return pos_type(off_type(-1));
211+
212+
char* newpos = eback() + newoff;
213+
if (pos_in)
214+
setg(eback(), newpos, _VSTD::max(newpos, egptr()));
215+
if (pos_out) {
216+
// min(pbase, newpos), newpos, epptr()
217+
__off = epptr() - newpos;
218+
setp(min(pbase(), newpos), epptr());
219+
__pbump((epptr() - pbase()) - __off);
222220
}
223-
return pos_type(__p);
221+
return pos_type(newoff);
224222
}
225223

226224
strstreambuf::pos_type strstreambuf::seekpos(pos_type __sp, ios_base::openmode __which) {
227-
off_type __p(-1);
228225
bool pos_in = (__which & ios::in) != 0;
229226
bool pos_out = (__which & ios::out) != 0;
230-
if (pos_in || pos_out) {
231-
if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr))) {
232-
off_type newoff = __sp;
233-
char* seekhigh = epptr() ? epptr() : egptr();
234-
if (0 <= newoff && newoff <= seekhigh - eback()) {
235-
char* newpos = eback() + newoff;
236-
if (pos_in)
237-
setg(eback(), newpos, _VSTD::max(newpos, egptr()));
238-
if (pos_out) {
239-
// min(pbase, newpos), newpos, epptr()
240-
off_type temp = epptr() - newpos;
241-
setp(min(pbase(), newpos), epptr());
242-
__pbump((epptr() - pbase()) - temp);
243-
}
244-
__p = newoff;
245-
}
246-
}
227+
if (!pos_in && !pos_out)
228+
return pos_type(off_type(-1));
229+
230+
if ((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr))
231+
return pos_type(off_type(-1));
232+
233+
off_type newoff = __sp;
234+
char* seekhigh = epptr() ? epptr() : egptr();
235+
if (newoff < 0 || newoff > seekhigh - eback())
236+
return pos_type(off_type(-1));
237+
238+
char* newpos = eback() + newoff;
239+
if (pos_in)
240+
setg(eback(), newpos, _VSTD::max(newpos, egptr()));
241+
if (pos_out) {
242+
// min(pbase, newpos), newpos, epptr()
243+
off_type temp = epptr() - newpos;
244+
setp(min(pbase(), newpos), epptr());
245+
__pbump((epptr() - pbase()) - temp);
247246
}
248-
return pos_type(__p);
247+
return pos_type(newoff);
249248
}
250249

251250
istrstream::~istrstream() {}

0 commit comments

Comments
 (0)