Move everything under .git
[svn-fe.git] / line_buffer.c
blobd91d4f3ecbb6950dc50a1a588d9f71a5227a4a44
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
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)
16 char *end;
17 uint32_t n_read;
19 if (line_len) {
20 memmove(line_buffer, &line_buffer[line_len],
21 line_buffer_len - line_len);
22 line_buffer_len -= line_len;
23 line_len = 0;
26 end = memchr(line_buffer, '\n', line_buffer_len);
27 while (line_buffer_len < LINE_BUFFER_LEN - 1 &&
28 !feof(stdin) && NULL == end) {
29 n_read =
30 fread(&line_buffer[line_buffer_len], 1,
31 LINE_BUFFER_LEN - 1 - line_buffer_len,
32 stdin);
33 end = memchr(&line_buffer[line_buffer_len], '\n', n_read);
34 line_buffer_len += n_read;
37 if (ferror(stdin))
38 return NULL;
40 if (end != NULL) {
41 line_len = end - line_buffer;
42 line_buffer[line_len++] = '\0';
43 } else {
44 line_len = line_buffer_len;
45 line_buffer[line_buffer_len] = '\0';
48 if (line_len == 0)
49 return NULL;
51 return line_buffer;
54 char *buffer_read_string(uint32_t len)
56 char *s = malloc(len + 1);
57 uint32_t offset = 0;
58 if (line_buffer_len > line_len) {
59 offset = line_buffer_len - line_len;
60 if (offset > len)
61 offset = len;
62 memcpy(s, &line_buffer[line_len], offset);
63 line_len += offset;
65 while (offset < len && !feof(stdin)) {
66 offset += fread(&s[offset], 1, len - offset, stdin);
68 s[offset] = '\0';
69 return s;
72 static char byte_buffer[COPY_BUFFER_LEN];
73 void buffer_copy_bytes(uint32_t len)
75 uint32_t in, out;
76 if (line_buffer_len > line_len) {
77 in = line_buffer_len - line_len;
78 if (in > len)
79 in = len;
80 out = 0;
81 while (out < in && !ferror(stdout)) {
82 out +=
83 fwrite(&line_buffer[line_len + out], 1, in - out, stdout);
85 len -= in;
86 line_len += in;
88 while (len > 0 && !feof(stdin)) {
89 in = len < COPY_BUFFER_LEN ? len : COPY_BUFFER_LEN;
90 in = fread(byte_buffer, 1, in, stdin);
91 len -= in;
92 out = 0;
93 while (out < in && !ferror(stdout)) {
94 out += fwrite(&byte_buffer[out], 1, in - out, stdout);
99 void buffer_skip_bytes(uint32_t len)
101 uint32_t in;
102 if (line_buffer_len > line_len) {
103 in = line_buffer_len - line_len;
104 if (in > len)
105 in = len;
106 line_len += in;
107 len -= in;
109 while (len > 0 && !feof(stdin)) {
110 in = len < COPY_BUFFER_LEN ? len : COPY_BUFFER_LEN;
111 in = fread(byte_buffer, 1, in, stdin);
112 len -= in;