aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-04-14 02:16:26 +0200
committerNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-04-20 19:14:20 +0200
commit485a1984e9ed20de3c997f0fe2d394f651504fe8 (patch)
tree87bc3e2752b24150c0456741033739ab650a141d
parent340150ca84cca55bcf98ecd6dc9b951f8c74feaa (diff)
downloadbusybox-w32-485a1984e9ed20de3c997f0fe2d394f651504fe8.tar.gz
busybox-w32-485a1984e9ed20de3c997f0fe2d394f651504fe8.tar.bz2
busybox-w32-485a1984e9ed20de3c997f0fe2d394f651504fe8.zip
win32: mingw32/strbuf_file.c
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
-rw-r--r--win32/strbuf_file.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/win32/strbuf_file.c b/win32/strbuf_file.c
new file mode 100644
index 000000000..cdacf5344
--- /dev/null
+++ b/win32/strbuf_file.c
@@ -0,0 +1,119 @@
1#include "libbb.h"
2#include "strbuf_file.h"
3
4struct strbuf_file *sfdopen(int fd, const char *mode)
5{
6 struct strbuf_file *s;
7
8 s = xmalloc(sizeof(*s));
9 strbuf_init(&s->input, 0);
10 s->has_error = 0;
11 s->fd = fd;
12 return s;
13}
14
15int sfclose(struct strbuf_file *sf)
16{
17 strbuf_release(&sf->input);
18 close(sf->fd);
19 free(sf);
20 return 0;
21}
22
23int sfprintf(struct strbuf_file *sf, const char *fmt, ...)
24{
25 int len;
26 va_list ap;
27 struct strbuf sb = STRBUF_INIT;
28
29 strbuf_grow(&sb, 64);
30 va_start(ap, fmt);
31 len = vsnprintf(sb.buf + sb.len, sb.alloc - sb.len, fmt, ap);
32 va_end(ap);
33 if (len < 0)
34 bb_error_msg_and_die("your vsnprintf is broken");
35 if (len > strbuf_avail(&sb)) {
36 strbuf_grow(&sb, len);
37 va_start(ap, fmt);
38 len = vsnprintf(sb.buf + sb.len, sb.alloc - sb.len, fmt, ap);
39 va_end(ap);
40 if (len > strbuf_avail(&sb)) {
41 bb_error_msg_and_die("this should not happen, your snprintf is broken");
42 }
43 }
44 strbuf_setlen(&sb, sb.len + len);
45 len = write(sf->fd, sb.buf, sb.len);
46 strbuf_release(&sb);
47 return len;
48}
49
50void sfclearerr(struct strbuf_file *sf)
51{
52 sf->has_error = 0;
53}
54
55int sfread(char *buf, int size, int n, struct strbuf_file *sf)
56{
57 int avail = size * n;
58 int len = avail > sf->input.len ? sf->input.len : avail;
59 char *p;
60 struct strbuf *sb = &sf->input;
61
62 if (len) {
63 memcpy(buf, sb->buf, len);
64 strbuf_setlen(sb, sb->len - len);
65 avail -= len;
66 }
67
68 p = buf + len;
69 while ((len = read(sf->fd, p, avail)) > 0) {
70 p += len;
71 avail -= len;
72 if (!avail)
73 break;
74 }
75 if (len == -1)
76 sf->has_error = 1;
77 /* just in case we have some leftover */
78 if ((p-buf) % size) {
79 len = (p-buf) % size;
80 strbuf_grow(sb, len);
81 strbuf_add(sb, p-len, len);
82 }
83 return (p-buf) / size;
84}
85
86int sfgetc(struct strbuf_file *sf)
87{
88 int ret;
89 char ch;
90 if (sf->input.len) {
91 ret = sf->input.buf[0];
92 memcpy(sf->input.buf, sf->input.buf+1, sf->input.len);
93 sf->input.len--;
94 return ret;
95 }
96 ret = read(sf->fd, &ch, 1);
97 if (ret > 0)
98 return ch;
99 if (ret == -1)
100 sf->has_error = 1;
101 return EOF;
102}
103
104char *sfgets(char *buf, int size, struct strbuf_file *sf)
105{
106 char *p = buf;
107 int ch = -1;
108 while (size > 1 && (ch = sfgetc(sf)) != EOF) {
109 *p++ = ch;
110 size--;
111 if (ch == '\n')
112 break;
113 }
114 if (p > buf && size > 0) {
115 *p++ = '\0';
116 return buf;
117 }
118 return NULL;
119}