diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-04-14 02:16:26 +0200 |
---|---|---|
committer | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-04-20 19:14:20 +0200 |
commit | 485a1984e9ed20de3c997f0fe2d394f651504fe8 (patch) | |
tree | 87bc3e2752b24150c0456741033739ab650a141d | |
parent | 340150ca84cca55bcf98ecd6dc9b951f8c74feaa (diff) | |
download | busybox-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.c | 119 |
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 | |||
4 | struct 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 | |||
15 | int sfclose(struct strbuf_file *sf) | ||
16 | { | ||
17 | strbuf_release(&sf->input); | ||
18 | close(sf->fd); | ||
19 | free(sf); | ||
20 | return 0; | ||
21 | } | ||
22 | |||
23 | int 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 | |||
50 | void sfclearerr(struct strbuf_file *sf) | ||
51 | { | ||
52 | sf->has_error = 0; | ||
53 | } | ||
54 | |||
55 | int 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 | |||
86 | int 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 | |||
104 | char *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 | } | ||