5 #include "line_buffer.h"
7 #define LINE_BUFFER_LEN 10000
8 #define COPY_BUFFER_LEN 4096
10 static char line_buffer
[LINE_BUFFER_LEN
];
11 static uint32_t line_buffer_len
= 0;
12 static uint32_t line_len
= 0;
14 char *buffer_read_line(void)
20 memmove(line_buffer
, &line_buffer
[line_len
],
21 line_buffer_len
- line_len
);
22 line_buffer_len
-= line_len
;
26 end
= memchr(line_buffer
, '\n', line_buffer_len
);
27 while (line_buffer_len
< LINE_BUFFER_LEN
- 1 &&
28 !feof(stdin
) && NULL
== end
) {
30 fread(&line_buffer
[line_buffer_len
], 1,
31 LINE_BUFFER_LEN
- 1 - line_buffer_len
,
33 end
= memchr(&line_buffer
[line_buffer_len
], '\n', n_read
);
34 line_buffer_len
+= n_read
;
41 line_len
= end
- line_buffer
;
42 line_buffer
[line_len
++] = '\0';
44 line_len
= line_buffer_len
;
45 line_buffer
[line_buffer_len
] = '\0';
54 char *buffer_read_string(uint32_t len
)
56 char *s
= malloc(len
+ 1);
58 if (line_buffer_len
> line_len
) {
59 offset
= line_buffer_len
- line_len
;
62 memcpy(s
, &line_buffer
[line_len
], offset
);
65 while (offset
< len
&& !feof(stdin
)) {
66 offset
+= fread(&s
[offset
], 1, len
- offset
, stdin
);
72 static char byte_buffer
[COPY_BUFFER_LEN
];
73 void buffer_copy_bytes(uint32_t len
)
76 if (line_buffer_len
> line_len
) {
77 in
= line_buffer_len
- line_len
;
81 while (out
< in
&& !ferror(stdout
)) {
83 fwrite(&line_buffer
[line_len
+ out
], 1, in
- out
, stdout
);
88 while (len
> 0 && !feof(stdin
)) {
89 in
= len
< COPY_BUFFER_LEN
? len
: COPY_BUFFER_LEN
;
90 in
= fread(byte_buffer
, 1, in
, stdin
);
93 while (out
< in
&& !ferror(stdout
)) {
94 out
+= fwrite(&byte_buffer
[out
], 1, in
- out
, stdout
);
99 void buffer_skip_bytes(uint32_t len
)
102 if (line_buffer_len
> line_len
) {
103 in
= line_buffer_len
- line_len
;
109 while (len
> 0 && !feof(stdin
)) {
110 in
= len
< COPY_BUFFER_LEN
? len
: COPY_BUFFER_LEN
;
111 in
= fread(byte_buffer
, 1, in
, stdin
);