]> gcc.gnu.org Git - gcc.git/blame - libstdc++-v3/libio/wgenops.c
acinclude.m4: Include ../libtool.m4.
[gcc.git] / libstdc++-v3 / libio / wgenops.c
CommitLineData
20427c6b
BK
1/* Copyright (C) 1993, 1995, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
2 This file is part of the GNU IO Library.
3 Written by Ulrich Drepper <drepper@cygnus.com>.
4 Based on the single byte version by Per Bothner <bothner@cygnus.com>.
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2, or (at
9 your option) any later version.
10
11 This library is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this library; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19 MA 02111-1307, USA.
20
21 As a special exception, if you link this library with files
22 compiled with a GNU compiler to produce an executable, this does
23 not cause the resulting executable to be covered by the GNU General
24 Public License. This exception does not however invalidate any
25 other reasons why the executable file might be covered by the GNU
26 General Public License. */
27
28/* Generic or default I/O operations. */
29
30#include "libioP.h"
31#ifdef __STDC__
32#include <stdlib.h>
33#endif
34#include <string.h>
35#include <wchar.h>
36
37
38#ifndef _LIBC
39# define __wmemcpy(dst, src, n) wmemcpy (dst, src, n)
40#endif
41
42static int save_for_wbackup __P ((_IO_FILE *fp, wchar_t *end_p))
43#ifdef _LIBC
44 internal_function
45#endif
46 ;
47
48/* Return minimum _pos markers
49 Assumes the current get area is the main get area. */
50_IO_ssize_t _IO_least_wmarker __P ((_IO_FILE *fp, wchar_t *end_p));
51
52_IO_ssize_t
53_IO_least_wmarker (fp, end_p)
54 _IO_FILE *fp;
55 wchar_t *end_p;
56{
57 _IO_ssize_t least_so_far = end_p - fp->_wide_data->_IO_read_base;
58 struct _IO_marker *mark;
59 for (mark = fp->_markers; mark != NULL; mark = mark->_next)
60 if (mark->_pos < least_so_far)
61 least_so_far = mark->_pos;
62 return least_so_far;
63}
64
65/* Switch current get area from backup buffer to (start of) main get area. */
66void
67_IO_switch_to_main_wget_area (fp)
68 _IO_FILE *fp;
69{
70 wchar_t *tmp;
71 fp->_flags &= ~_IO_IN_BACKUP;
72 /* Swap _IO_read_end and _IO_save_end. */
73 tmp = fp->_wide_data->_IO_read_end;
74 fp->_wide_data->_IO_read_end = fp->_wide_data->_IO_save_end;
75 fp->_wide_data->_IO_save_end= tmp;
76 /* Swap _IO_read_base and _IO_save_base. */
77 tmp = fp->_wide_data->_IO_read_base;
78 fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_save_base;
79 fp->_wide_data->_IO_save_base = tmp;
80 /* Set _IO_read_ptr. */
81 fp->_wide_data->_IO_read_ptr = fp->_wide_data->_IO_read_base;
82}
83
84
85/* Switch current get area from main get area to (end of) backup area. */
86void
87_IO_switch_to_wbackup_area (fp)
88 _IO_FILE *fp;
89{
90 wchar_t *tmp;
91 fp->_flags |= _IO_IN_BACKUP;
92 /* Swap _IO_read_end and _IO_save_end. */
93 tmp = fp->_wide_data->_IO_read_end;
94 fp->_wide_data->_IO_read_end = fp->_wide_data->_IO_save_end;
95 fp->_wide_data->_IO_save_end = tmp;
96 /* Swap _IO_read_base and _IO_save_base. */
97 tmp = fp->_wide_data->_IO_read_base;
98 fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_save_base;
99 fp->_wide_data->_IO_save_base = tmp;
100 /* Set _IO_read_ptr. */
101 fp->_wide_data->_IO_read_ptr = fp->_wide_data->_IO_read_end;
102}
103
104
105void
106_IO_wsetb (f, b, eb, a)
107 _IO_FILE *f;
108 wchar_t *b;
109 wchar_t *eb;
110 int a;
111{
112 if (f->_wide_data->_IO_buf_base && !(f->_flags & _IO_USER_BUF))
113 FREE_BUF (f->_wide_data->_IO_buf_base, _IO_wblen (f));
114 f->_wide_data->_IO_buf_base = b;
115 f->_wide_data->_IO_buf_end = eb;
116 if (a)
117 f->_flags &= ~_IO_USER_BUF;
118 else
119 f->_flags |= _IO_USER_BUF;
120}
121
122
123wint_t
124_IO_wdefault_pbackfail (fp, c)
125 _IO_FILE *fp;
126 wint_t c;
127{
128 if (fp->_wide_data->_IO_read_ptr > fp->_wide_data->_IO_read_base
129 && !_IO_in_backup (fp)
130 && (wint_t) fp->_IO_read_ptr[-1] == c)
131 --fp->_IO_read_ptr;
132 else
133 {
134 /* Need to handle a filebuf in write mode (switch to read mode). FIXME!*/
135 if (!_IO_in_backup (fp))
136 {
137 /* We need to keep the invariant that the main get area
138 logically follows the backup area. */
139 if (fp->_wide_data->_IO_read_ptr > fp->_wide_data->_IO_read_base
140 && _IO_have_wbackup (fp))
141 {
142 if (save_for_wbackup (fp, fp->_wide_data->_IO_read_ptr))
143 return WEOF;
144 }
145 else if (!_IO_have_wbackup (fp))
146 {
147 /* No backup buffer: allocate one. */
148 /* Use nshort buffer, if unused? (probably not) FIXME */
149 int backup_size = 128;
150 wchar_t *bbuf = (wchar_t *) malloc (backup_size
151 * sizeof (wchar_t));
152 if (bbuf == NULL)
153 return WEOF;
154 fp->_wide_data->_IO_save_base = bbuf;
155 fp->_wide_data->_IO_save_end = (fp->_wide_data->_IO_save_base
156 + backup_size);
157 fp->_wide_data->_IO_backup_base = fp->_wide_data->_IO_save_end;
158 }
159 fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_read_ptr;
160 _IO_switch_to_wbackup_area (fp);
161 }
162 else if (fp->_wide_data->_IO_read_ptr <= fp->_wide_data->_IO_read_base)
163 {
164 /* Increase size of existing backup buffer. */
165 _IO_size_t new_size;
166 _IO_size_t old_size = (fp->_wide_data->_IO_read_end
167 - fp->_wide_data->_IO_read_base);
168 wchar_t *new_buf;
169 new_size = 2 * old_size;
170 new_buf = (wchar_t *) malloc (new_size * sizeof (wchar_t));
171 if (new_buf == NULL)
172 return WEOF;
173 __wmemcpy (new_buf + (new_size - old_size),
174 fp->_wide_data->_IO_read_base, old_size);
175 free (fp->_wide_data->_IO_read_base);
176 _IO_wsetg (fp, new_buf, new_buf + (new_size - old_size),
177 new_buf + new_size);
178 fp->_wide_data->_IO_backup_base = fp->_wide_data->_IO_read_ptr;
179 }
180
181 *--fp->_wide_data->_IO_read_ptr = c;
182 }
183 return c;
184}
185
186
187void
188_IO_wdefault_finish (fp, dummy)
189 _IO_FILE *fp;
190 int dummy;
191{
192 struct _IO_marker *mark;
193 if (fp->_wide_data->_IO_buf_base && !(fp->_flags & _IO_USER_BUF))
194 {
195 FREE_BUF (fp->_wide_data->_IO_buf_base,
196 _IO_wblen (fp) * sizeof (wchar_t));
197 fp->_wide_data->_IO_buf_base = fp->_wide_data->_IO_buf_end = NULL;
198 }
199
200 for (mark = fp->_markers; mark != NULL; mark = mark->_next)
201 mark->_sbuf = NULL;
202
203 if (fp->_IO_save_base)
204 {
205 free (fp->_wide_data->_IO_save_base);
206 fp->_IO_save_base = NULL;
207 }
208
209#ifdef _IO_MTSAFE_IO
210 _IO_lock_fini (*fp->_lock);
211#endif
212
213 _IO_un_link ((struct _IO_FILE_plus *) fp);
214}
215
216
217wint_t
218_IO_wdefault_uflow (fp)
219 _IO_FILE *fp;
220{
221 wint_t wch;
222 wch = _IO_UNDERFLOW (fp);
223 if (wch == WEOF)
224 return WEOF;
225 return *fp->_wide_data->_IO_read_ptr++;
226}
227
228
229wint_t
230__woverflow (f, wch)
231 _IO_FILE *f;
232 wint_t wch;
233{
234 if (f->_mode == 0)
235 _IO_fwide (f, 1);
236 return _IO_OVERFLOW (f, wch);
237}
238
239
240wint_t
241__wuflow (fp)
242 _IO_FILE *fp;
243{
244 if (fp->_mode < 0 || (fp->_mode == 0 && _IO_fwide (fp, 1) != 1))
245 return WEOF;
246
247 if (fp->_mode == 0)
248 _IO_fwide (fp, 1);
249 if (_IO_in_put_mode (fp))
250 if (_IO_switch_to_wget_mode (fp) == EOF)
251 return WEOF;
252 if (fp->_wide_data->_IO_read_ptr < fp->_wide_data->_IO_read_end)
253 return *fp->_wide_data->_IO_read_ptr++;
254 if (_IO_in_backup (fp))
255 {
256 _IO_switch_to_main_wget_area (fp);
257 if (fp->_wide_data->_IO_read_ptr < fp->_wide_data->_IO_read_end)
258 return *fp->_wide_data->_IO_read_ptr++;
259 }
260 if (_IO_have_markers (fp))
261 {
262 if (save_for_wbackup (fp, fp->_wide_data->_IO_read_end))
263 return WEOF;
264 }
265 else if (_IO_have_wbackup (fp))
266 _IO_free_wbackup_area (fp);
267 return _IO_UFLOW (fp);
268}
269
270
271wint_t
272__wunderflow (fp)
273 _IO_FILE *fp;
274{
275 if (fp->_mode < 0 || (fp->_mode == 0 && _IO_fwide (fp, 1) != 1))
276 return WEOF;
277
278 if (_IO_in_put_mode (fp))
279 if (_IO_switch_to_wget_mode (fp) == EOF)
280 return WEOF;
281 if (fp->_wide_data->_IO_read_ptr < fp->_wide_data->_IO_read_end)
282 return *fp->_wide_data->_IO_read_ptr;
283 if (_IO_in_backup (fp))
284 {
285 _IO_switch_to_main_wget_area (fp);
286 if (fp->_wide_data->_IO_read_ptr < fp->_wide_data->_IO_read_end)
287 return *fp->_wide_data->_IO_read_ptr;
288 }
289 if (_IO_have_markers (fp))
290 {
291 if (save_for_wbackup (fp, fp->_wide_data->_IO_read_end))
292 return WEOF;
293 }
294 else if (_IO_have_backup (fp))
295 _IO_free_wbackup_area (fp);
296 return _IO_UNDERFLOW (fp);
297}
298
299
300_IO_size_t
301_IO_wdefault_xsputn (f, data, n)
302 _IO_FILE *f;
303 const void *data;
304 _IO_size_t n;
305{
306 const wchar_t *s = (const wchar_t *) data;
307 _IO_size_t more = n;
308 if (more <= 0)
309 return 0;
310 for (;;)
311 {
312 /* Space available. */
313 _IO_ssize_t count = (f->_wide_data->_IO_write_end
314 - f->_wide_data->_IO_write_ptr);
315 if (count > 0)
316 {
317 if ((_IO_size_t) count > more)
318 count = more;
319 if (count > 20)
320 {
321#ifdef _LIBC
322 f->_wide_data->_IO_write_ptr =
323 __wmempcpy (f->_wide_data->_IO_write_ptr, s, count);
324#else
325 memcpy (f->_wide_data->_IO_write_ptr, s, count);
326 f->_wide_data->_IO_write_ptr += count;
327#endif
328 s += count;
329 }
330 else if (count <= 0)
331 count = 0;
332 else
333 {
334 wchar_t *p = f->_wide_data->_IO_write_ptr;
335 _IO_ssize_t i;
336 for (i = count; --i >= 0; )
337 *p++ = *s++;
338 f->_wide_data->_IO_write_ptr = p;
339 }
340 more -= count;
341 }
342 if (more == 0 || __woverflow (f, *s++) == WEOF)
343 break;
344 more--;
345 }
346 return n - more;
347}
348
349
350_IO_size_t
351_IO_wdefault_xsgetn (fp, data, n)
352 _IO_FILE *fp;
353 void *data;
354 _IO_size_t n;
355{
356 _IO_size_t more = n;
357 wchar_t *s = (wchar_t*) data;
358 for (;;)
359 {
360 /* Data available. */
361 _IO_ssize_t count = (fp->_wide_data->_IO_read_end
362 - fp->_wide_data->_IO_read_ptr);
363 if (count > 0)
364 {
365 if ((_IO_size_t) count > more)
366 count = more;
367 if (count > 20)
368 {
369#ifdef _LIBC
370 s = __wmempcpy (s, fp->_wide_data->_IO_read_ptr, count);
371#else
372 memcpy (s, fp->_wide_data->_IO_read_ptr, count);
373 s += count;
374#endif
375 fp->_wide_data->_IO_read_ptr += count;
376 }
377 else if (count <= 0)
378 count = 0;
379 else
380 {
381 wchar_t *p = fp->_wide_data->_IO_read_ptr;
382 int i = (int) count;
383 while (--i >= 0)
384 *s++ = *p++;
385 fp->_wide_data->_IO_read_ptr = p;
386 }
387 more -= count;
388 }
389 if (more == 0 || __wunderflow (fp) == WEOF)
390 break;
391 }
392 return n - more;
393}
394
395
396void
397_IO_wdoallocbuf (fp)
398 _IO_FILE *fp;
399{
400 if (fp->_wide_data->_IO_buf_base)
401 return;
402 if (!(fp->_flags & _IO_UNBUFFERED))
403 if (_IO_DOALLOCATE (fp) != WEOF)
404 return;
405 _IO_wsetb (fp, fp->_wide_data->_shortbuf, fp->_wide_data->_shortbuf + 1, 0);
406}
407
408
409_IO_FILE *
410_IO_wdefault_setbuf (fp, p, len)
411 _IO_FILE *fp;
412 wchar_t *p;
413 _IO_ssize_t len;
414{
415 if (_IO_SYNC (fp) == EOF)
416 return NULL;
417 if (p == NULL || len == 0)
418 {
419 fp->_flags |= _IO_UNBUFFERED;
420 _IO_wsetb (fp, fp->_wide_data->_shortbuf, fp->_wide_data->_shortbuf + 1,
421 0);
422 }
423 else
424 {
425 fp->_flags &= ~_IO_UNBUFFERED;
426 _IO_wsetb (fp, p, p + len, 0);
427 }
428 fp->_wide_data->_IO_write_base = fp->_wide_data->_IO_write_ptr
429 = fp->_wide_data->_IO_write_end = 0;
430 fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_read_ptr
431 = fp->_wide_data->_IO_read_end = 0;
432 return fp;
433}
434
435
436int
437_IO_wdefault_doallocate (fp)
438 _IO_FILE *fp;
439{
440 wchar_t *buf;
441
442 ALLOC_WBUF (buf, _IO_BUFSIZ, EOF);
443 _IO_wsetb (fp, buf, buf + _IO_BUFSIZ, 1);
444 return 1;
445}
446
447
448int
449_IO_switch_to_wget_mode (fp)
450 _IO_FILE *fp;
451{
452 if (fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base)
453 if (_IO_OVERFLOW (fp, WEOF) == WEOF)
454 return EOF;
455 if (_IO_in_backup (fp))
456 fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_backup_base;
457 else
458 {
459 fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_buf_base;
460 if (fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_read_end)
461 fp->_wide_data->_IO_read_end = fp->_wide_data->_IO_write_ptr;
462 }
463 fp->_wide_data->_IO_read_ptr = fp->_wide_data->_IO_write_ptr;
464
465 fp->_wide_data->_IO_write_base = fp->_wide_data->_IO_write_ptr
466 = fp->_wide_data->_IO_write_end = fp->_wide_data->_IO_read_ptr;
467
468 fp->_flags &= ~_IO_CURRENTLY_PUTTING;
469 return 0;
470}
471
472void
473_IO_free_wbackup_area (fp)
474 _IO_FILE *fp;
475{
476 if (_IO_in_backup (fp))
477 _IO_switch_to_main_wget_area (fp); /* Just in case. */
478 free (fp->_wide_data->_IO_save_base);
479 fp->_wide_data->_IO_save_base = NULL;
480 fp->_wide_data->_IO_save_end = NULL;
481 fp->_wide_data->_IO_backup_base = NULL;
482}
483
484#if 0
485int
486_IO_switch_to_wput_mode (fp)
487 _IO_FILE *fp;
488{
489 fp->_wide_data->_IO_write_base = fp->_wide_data->_IO_read_ptr;
490 fp->_wide_data->_IO_write_ptr = fp->_wide_data->_IO_read_ptr;
491 /* Following is wrong if line- or un-buffered? */
492 fp->_wide_data->_IO_write_end = (fp->_flags & _IO_IN_BACKUP
493 ? fp->_wide_data->_IO_read_end
494 : fp->_wide_data->_IO_buf_end);
495
496 fp->_wide_data->_IO_read_ptr = fp->_wide_data->_IO_read_end;
497 fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_read_end;
498
499 fp->_flags |= _IO_CURRENTLY_PUTTING;
500 return 0;
501}
502#endif
503
504
505static int
506#ifdef _LIBC
507internal_function
508#endif
509save_for_wbackup (fp, end_p)
510 _IO_FILE *fp;
511 wchar_t *end_p;
512{
513 /* Append [_IO_read_base..end_p] to backup area. */
514 _IO_ssize_t least_mark = _IO_least_wmarker (fp, end_p);
515 /* needed_size is how much space we need in the backup area. */
516 _IO_size_t needed_size = ((end_p - fp->_wide_data->_IO_read_base)
517 - least_mark);
518 /* FIXME: Dubious arithmetic if pointers are NULL */
519 _IO_size_t current_Bsize = (fp->_wide_data->_IO_save_end
520 - fp->_wide_data->_IO_save_base);
521 _IO_size_t avail; /* Extra space available for future expansion. */
522 _IO_ssize_t delta;
523 struct _IO_marker *mark;
524 if (needed_size > current_Bsize)
525 {
526 wchar_t *new_buffer;
527 avail = 100;
528 new_buffer = (wchar_t *) malloc ((avail + needed_size)
529 * sizeof (wchar_t));
530 if (new_buffer == NULL)
531 return EOF; /* FIXME */
532 if (least_mark < 0)
533 {
534#ifdef _LIBC
535 __wmempcpy (__wmempcpy (new_buffer + avail,
536 fp->_wide_data->_IO_save_end + least_mark,
537 -least_mark),
538 fp->_wide_data->_IO_read_base,
539 end_p - fp->_wide_data->_IO_read_base);
540#else
541 memcpy (new_buffer + avail,
542 fp->_wide_data->_IO_save_end + least_mark,
543 -least_mark * sizeof (wchar_t));
544 memcpy (new_buffer + avail - least_mark,
545 fp->_wide_data->_IO_read_base,
546 (end_p - fp->_wide_data->_IO_read_base) * sizeof (wchar_t));
547#endif
548 }
549 else
550 {
551#ifdef _LIBC
552 __wmemcpy (new_buffer + avail,
553 fp->_wide_data->_IO_read_base + least_mark,
554 needed_size);
555#else
556 memcpy (new_buffer + avail,
557 fp->_wide_data->_IO_read_base + least_mark,
558 needed_size * sizeof (wchar_t));
559#endif
560 }
561 if (fp->_wide_data->_IO_save_base)
562 free (fp->_wide_data->_IO_save_base);
563 fp->_wide_data->_IO_save_base = new_buffer;
564 fp->_wide_data->_IO_save_end = new_buffer + avail + needed_size;
565 }
566 else
567 {
568 avail = current_Bsize - needed_size;
569 if (least_mark < 0)
570 {
571#ifdef _LIBC
572 __wmemmove (fp->_wide_data->_IO_save_base + avail,
573 fp->_wide_data->_IO_save_end + least_mark,
574 -least_mark);
575 __wmemcpy (fp->_wide_data->_IO_save_base + avail - least_mark,
576 fp->_wide_data->_IO_read_base,
577 end_p - fp->_wide_data->_IO_read_base);
578#else
579 memmove (fp->_wide_data->_IO_save_base + avail,
580 fp->_wide_data->_IO_save_end + least_mark,
581 -least_mark * sizeof (wchar_t));
582 memcpy (fp->_wide_data->_IO_save_base + avail - least_mark,
583 fp->_wide_data->_IO_read_base,
584 (end_p - fp->_wide_data->_IO_read_base) * sizeof (wchar_t));
585#endif
586 }
587 else if (needed_size > 0)
588#ifdef _LIBC
589 __wmemcpy (fp->_wide_data->_IO_save_base + avail,
590 fp->_wide_data->_IO_read_base + least_mark,
591 needed_size);
592#else
593 memcpy (fp->_wide_data->_IO_save_base + avail,
594 fp->_wide_data->_IO_read_base + least_mark,
595 needed_size * sizeof (wchar_t));
596#endif
597 }
598 fp->_wide_data->_IO_backup_base = fp->_wide_data->_IO_save_base + avail;
599 /* Adjust all the streammarkers. */
600 delta = end_p - fp->_wide_data->_IO_read_base;
601 for (mark = fp->_markers; mark != NULL; mark = mark->_next)
602 mark->_pos -= delta;
603 return 0;
604}
605
606wint_t
607_IO_sputbackwc (fp, c)
608 _IO_FILE *fp;
609 wint_t c;
610{
611 wint_t result;
612
613 if (fp->_wide_data->_IO_read_ptr > fp->_wide_data->_IO_read_base
614 && (wchar_t)fp->_wide_data->_IO_read_ptr[-1] == (wchar_t) c)
615 {
616 fp->_wide_data->_IO_read_ptr--;
617 result = c;
618 }
619 else
620 result = _IO_PBACKFAIL (fp, c);
621
622 if (result != EOF)
623 fp->_flags &= ~_IO_EOF_SEEN;
624
625 return result;
626}
627
628wint_t
629_IO_sungetwc (fp)
630 _IO_FILE *fp;
631{
632 int result;
633
634 if (fp->_wide_data->_IO_read_ptr > fp->_wide_data->_IO_read_base)
635 {
636 fp->_wide_data->_IO_read_ptr--;
637 result = *fp->_wide_data->_IO_read_ptr;
638 }
639 else
640 result = _IO_PBACKFAIL (fp, EOF);
641
642 if (result != WEOF)
643 fp->_flags &= ~_IO_EOF_SEEN;
644
645 return result;
646}
647
648
649unsigned
650_IO_adjust_wcolumn (start, line, count)
651 unsigned start;
652 const wchar_t *line;
653 int count;
654{
655 const wchar_t *ptr = line + count;
656 while (ptr > line)
657 if (*--ptr == L'\n')
658 return line + count - ptr - 1;
659 return start + count;
660}
661
662void
663_IO_init_wmarker (marker, fp)
664 struct _IO_marker *marker;
665 _IO_FILE *fp;
666{
667 marker->_sbuf = fp;
668 if (_IO_in_put_mode (fp))
669 _IO_switch_to_wget_mode (fp);
670 if (_IO_in_backup (fp))
671 marker->_pos = fp->_wide_data->_IO_read_ptr - fp->_wide_data->_IO_read_end;
672 else
673 marker->_pos = (fp->_wide_data->_IO_read_ptr
674 - fp->_wide_data->_IO_read_base);
675
676 /* Should perhaps sort the chain? */
677 marker->_next = fp->_markers;
678 fp->_markers = marker;
679}
680
681#define BAD_DELTA EOF
682
683/* Return difference between MARK and current position of MARK's stream. */
684int
685_IO_wmarker_delta (mark)
686 struct _IO_marker *mark;
687{
688 int cur_pos;
689 if (mark->_sbuf == NULL)
690 return BAD_DELTA;
691 if (_IO_in_backup (mark->_sbuf))
692 cur_pos = (mark->_sbuf->_wide_data->_IO_read_ptr
693 - mark->_sbuf->_wide_data->_IO_read_end);
694 else
695 cur_pos = (mark->_sbuf->_wide_data->_IO_read_ptr
696 - mark->_sbuf->_wide_data->_IO_read_base);
697 return mark->_pos - cur_pos;
698}
699
700int
701_IO_seekwmark (fp, mark, delta)
702 _IO_FILE *fp;
703 struct _IO_marker *mark;
704 int delta;
705{
706 if (mark->_sbuf != fp)
707 return EOF;
708 if (mark->_pos >= 0)
709 {
710 if (_IO_in_backup (fp))
711 _IO_switch_to_main_wget_area (fp);
712 fp->_wide_data->_IO_read_ptr = (fp->_wide_data->_IO_read_base
713 + mark->_pos);
714 }
715 else
716 {
717 if (!_IO_in_backup (fp))
718 _IO_switch_to_wbackup_area (fp);
719 fp->_wide_data->_IO_read_ptr = fp->_wide_data->_IO_read_end + mark->_pos;
720 }
721 return 0;
722}
723
724void
725_IO_unsave_wmarkers (fp)
726 _IO_FILE *fp;
727{
728 struct _IO_marker *mark = fp->_markers;
729 if (mark)
730 {
731#ifdef TODO
732 streampos offset = seekoff (0, ios::cur, ios::in);
733 if (offset != EOF)
734 {
735 offset += eGptr () - Gbase ();
736 for ( ; mark != NULL; mark = mark->_next)
737 mark->set_streampos (mark->_pos + offset);
738 }
739 else
740 {
741 for ( ; mark != NULL; mark = mark->_next)
742 mark->set_streampos (EOF);
743 }
744#endif
745 fp->_markers = 0;
746 }
747
748 if (_IO_have_backup (fp))
749 _IO_free_wbackup_area (fp);
750}
This page took 0.099167 seconds and 5 git commands to generate.