forked from hellcoderz/scheme
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sstream.c
78 lines (65 loc) · 1.51 KB
/
sstream.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <string.h>
#include "mem.h"
#include "sstream.h"
#include "log.h"
sstream* sstream_new(int capacity) {
sstream *stream;
int cap = DEFAULT_CAPACITY;
char *buf;
stream = sc_malloc(sizeof(sstream));
if (stream == NULL) {
sc_log("%s", "out of memory[sstream]");
return NULL;
}
if (capacity > 0) {
cap = capacity;
}
buf = sc_malloc(cap);
if (buf == NULL) {
sc_log("%s", "out of memory[sstream]");
sc_free(stream);
return NULL;
}
stream->buf = buf;
stream->capacity = cap;
stream->len = 0;
return stream;
}
void sstream_dispose(sstream *stream) {
if (stream == NULL) {
return;
}
sc_free(stream->buf);
stream->buf = NULL;
sc_free(stream);
}
int sstream_append(sstream *stream, char c) {
int newlen = stream->len + 1;
int cap = stream->capacity;
char *buf = stream->buf;
if (newlen > cap) {
cap *= 2;
buf = sc_realloc(buf, cap);
if (buf == NULL) {
sc_log("%s", "can not resize stream, no memory");
return -1;
}
stream->capacity = cap;
stream->buf = buf;
}
buf[newlen - 1] = c;
stream->len = newlen;
return 0;
}
char* sstream_cstr(sstream *stream) {
char *str;
int len = stream->len;
str = sc_malloc(len + 1);
if (str == NULL) {
sc_log("%s", "no memory for cstr");
return NULL;
}
strncpy(str, stream->buf, len);
str[len] = '\0';
return str;
}