@@ -171,81 +171,80 @@ strstreambuf::int_type strstreambuf::underflow() {
171
171
}
172
172
173
173
strstreambuf::pos_type strstreambuf::seekoff (off_type __off, ios_base::seekdir __way, ios_base::openmode __which) {
174
- off_type __p (-1 );
175
174
bool pos_in = (__which & ios::in) != 0 ;
176
175
bool pos_out = (__which & ios::out) != 0 ;
177
- bool legal = false ;
178
176
switch (__way) {
179
177
case ios::beg:
180
178
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 )) ;
183
181
break ;
184
182
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 )) ;
187
185
break ;
188
186
}
187
+
189
188
if (pos_in && gptr () == nullptr )
190
- legal = false ;
189
+ return pos_type ( off_type (- 1 )) ;
191
190
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);
222
220
}
223
- return pos_type (__p );
221
+ return pos_type (newoff );
224
222
}
225
223
226
224
strstreambuf::pos_type strstreambuf::seekpos (pos_type __sp, ios_base::openmode __which) {
227
- off_type __p (-1 );
228
225
bool pos_in = (__which & ios::in) != 0 ;
229
226
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);
247
246
}
248
- return pos_type (__p );
247
+ return pos_type (newoff );
249
248
}
250
249
251
250
istrstream::~istrstream () {}
0 commit comments