-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuffer.c
68 lines (58 loc) · 1.33 KB
/
buffer.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
#include "buffer.h"
#include "cdefs.h"
#include "cmem.h"
LexerBuffer *lexer_buffer_new(size_t size)
{
LexerBuffer *buf = cmalloc(sizeof(*buf));
buf->size = size;
buf->data = ccalloc(size, 1);
buf->bend = buf->data + size;
buf->bptr = buf->data;
return buf;
}
void lexer_buffer_destroy(LexerBuffer *buf)
{
cfree(buf->data);
cfree(buf);
}
int lexer_buffer_is_start(LexerBuffer *buf)
{
return buf->bptr == buf->data;
}
int lexer_buffer_is_end(LexerBuffer *buf)
{
return buf->bptr == buf->bend;
}
char lexer_buffer_advance(LexerBuffer *buf)
{
return *buf->bptr++;
}
void lexer_buffer_unadvance(LexerBuffer *buf)
{
--buf->bptr;
}
void lexer_buffer_put(LexerBuffer *buf, char c)
{
if (lexer_buffer_is_end(buf)) {
ptrdiff_t d = buf->bptr - buf->data;
buf->size *= 2;
buf->data = crealloc(buf->data, buf->size);
buf->bend = buf->data + buf->size;
buf->bptr = buf->data + d;
}
*buf->bptr++ = c;
}
void lexer_buffer_seek(LexerBuffer *buf, size_t offset, int whence)
{
if (whence == LEXER_BUFFER_END) {
buf->bptr = buf->bend + offset;
} else if (whence == LEXER_BUFFER_CUR) {
buf->bptr += offset;
} else {
buf->bptr = buf->data + offset;
}
}
ptrdiff_t lexer_buffer_offset(LexerBuffer *buf)
{
return buf->bptr - buf->data;
}