]> mj.ucw.cz Git - libucw.git/blob - ucw/ff-stkstring.c
Libucw: Split ff-string.c.
[libucw.git] / ucw / ff-stkstring.c
1 /*
2  *      UCW Library -- Fast Buffered I/O: Strings on stack
3  *
4  *      (c) 2008 Michal Vaner <vorner@ucw.cz>
5  *
6  *      Code taken from ff-string.c by:
7  *
8  *      (c) 1997--2006 Martin Mares <mj@ucw.cz>
9  *      (c) 2006 Pavel Charvat <pchar@ucw.cz>
10  *
11  *      This software may be freely distributed and used according to the terms
12  *      of the GNU Lesser General Public License.
13  */
14
15 #include "ucw/lib.h"
16 #include "ucw/fastbuf.h"
17
18 void
19 bgets_stk_init(struct bgets_stk_struct *s)
20 {
21   s->src_len = bdirect_read_prepare(s->f, &s->src);
22   if (!s->src_len)
23     {
24       s->cur_buf = NULL;
25       s->cur_len = 0;
26     }
27   else
28     {
29       s->old_buf = NULL;
30       s->cur_len = 256;
31     }
32 }
33
34 void
35 bgets_stk_step(struct bgets_stk_struct *s)
36 {
37   byte *buf = s->cur_buf;
38   uns buf_len = s->cur_len;
39   if (s->old_buf)
40     {
41       memcpy( s->cur_buf, s->old_buf, s->old_len);
42       buf += s->old_len;
43       buf_len -= s->old_len;
44     }
45   do
46     {
47       uns cnt = MIN(s->src_len, buf_len);
48       for (uns i = cnt; i--;)
49         {
50           byte v = *s->src++;
51           if (v == '\n')
52             {
53               bdirect_read_commit(s->f, s->src);
54               goto exit;
55             }
56           *buf++ = v;
57         }
58       if (cnt == s->src_len)
59         {
60           bdirect_read_commit(s->f, s->src);
61           s->src_len = bdirect_read_prepare(s->f, &s->src);
62         }
63       else
64         s->src_len -= cnt;
65       if (cnt == buf_len)
66         {
67           s->old_len = s->cur_len;
68           s->old_buf = s->cur_buf;
69           s->cur_len *= 2;
70           return;
71         }
72       else
73         buf_len -= cnt;
74     }
75   while (s->src_len);
76 exit:
77   *buf = 0;
78   s->cur_len = 0;
79 }
80