45 lines
		
	
	
		
			807 B
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			807 B
		
	
	
	
		
			C
		
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include "strbuf.h"
 | |
| #include "cache.h"
 | |
| 
 | |
| void strbuf_init(struct strbuf *sb) {
 | |
| 	sb->buf = NULL;
 | |
| 	sb->eof = sb->alloc = sb->len = 0;
 | |
| }
 | |
| 
 | |
| static void strbuf_begin(struct strbuf *sb) {
 | |
| 	free(sb->buf);
 | |
| 	strbuf_init(sb);
 | |
| }
 | |
| 
 | |
| static void inline strbuf_add(struct strbuf *sb, int ch) {
 | |
| 	if (sb->alloc <= sb->len) {
 | |
| 		sb->alloc = sb->alloc * 3 / 2 + 16;
 | |
| 		sb->buf = xrealloc(sb->buf, sb->alloc);
 | |
| 	}
 | |
| 	sb->buf[sb->len++] = ch;
 | |
| }
 | |
| 
 | |
| static void strbuf_end(struct strbuf *sb) {
 | |
| 	strbuf_add(sb, 0);
 | |
| }
 | |
| 
 | |
| void read_line(struct strbuf *sb, FILE *fp, int term) {
 | |
| 	int ch;
 | |
| 	strbuf_begin(sb);
 | |
| 	if (feof(fp)) {
 | |
| 		sb->eof = 1;
 | |
| 		return;
 | |
| 	}
 | |
| 	while ((ch = fgetc(fp)) != EOF) {
 | |
| 		if (ch == term)
 | |
| 			break;
 | |
| 		strbuf_add(sb, ch);
 | |
| 	}
 | |
| 	if (ch == EOF && sb->len == 0)
 | |
| 		sb->eof = 1;
 | |
| 	strbuf_end(sb);
 | |
| }
 | |
| 
 |