diff --git a/buffer.c b/buffer.c
index 5d93d3a..79e7a65 100644
--- a/buffer.c
+++ b/buffer.c
@@ -5,18 +5,20 @@
*/
#include <assert.h>
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "buffer.h"
-int buffer_init (s_buffer *b, FILE *fp, void *state)
+int buffer_init (s_buffer *b, const char *file_path, FILE *fp, void *state)
{
assert(b);
b->chars = calloc(BUFFER_SIZE, 1);
if (!b->chars)
return -1;
b->col = 0;
+ b->file_path = file_path;
b->fp = fp;
b->line = 0;
b->pos = 0;
@@ -27,12 +29,12 @@ int buffer_init (s_buffer *b, FILE *fp, void *state)
return 0;
}
-s_buffer * buffer_new (FILE *fp, void *state)
+s_buffer * buffer_new (const char *file_path, FILE *fp, void *state)
{
s_buffer *b = calloc(1, sizeof(s_buffer));
if (!b)
return NULL;
- if (buffer_init(b, fp, state))
+ if (buffer_init(b, file_path, fp, state))
return NULL;
return b;
}
@@ -141,3 +143,32 @@ int buffer_delete (s_buffer *b)
free(b);
return 0;
}
+
+void buffer_err (s_buffer *b, const char *fmt, ...)
+{
+ va_list va;
+ va_start(va, fmt);
+ printf("%s:%lu:%lu ",
+ b->file_path,
+ b->line,
+ b->col);
+ vprintf(fmt, va);
+}
+
+int buffer_eat (s_buffer *b, const char *str)
+{
+ size_t len;
+ int r;
+ assert(b);
+ assert(str);
+ len = strlen(str);
+ r = buffer_peek_n(b, len);
+ if (r) {
+ if (r == -1)
+ buffer_err(b, "unexpected EOF, expected \"%s\"", str);
+ return r;
+ }
+ if (strncmp(str, b->chars + b->pos, len))
+ buffer_err(b, "unexpected token, expected \"%s\"", str);
+ return buffer_read_n(b, len);
+}
diff --git a/buffer.h b/buffer.h
index 7566d23..a87f36b 100644
--- a/buffer.h
+++ b/buffer.h
@@ -17,19 +17,21 @@
typedef struct buffer
{
- char *chars;
- size_t col;
- FILE *fp;
- s_kv_path *k;
- size_t line;
- size_t pos;
- size_t size;
- void *state;
- size_t wpos;
+ char *chars;
+ size_t col;
+ const char *file_path;
+ FILE *fp;
+ s_kv_path *k;
+ size_t line;
+ size_t pos;
+ size_t size;
+ void *state;
+ size_t wpos;
} s_buffer;
-int buffer_init (s_buffer *b, FILE *fp, void *state);
-s_buffer * buffer_new (FILE *fp, void *state);
+int buffer_init (s_buffer *b, const char *file_path, FILE *fp,
+ void *state);
+s_buffer * buffer_new (const char *file_path, FILE *fp, void *state);
int buffer_resize (s_buffer *b, size_t new_size);
int buffer_fill (s_buffer *b);
int buffer_peek (s_buffer *b);
@@ -39,5 +41,7 @@ int buffer_read_n (s_buffer *b, size_t n);
int buffer_flush (s_buffer *b);
int buffer_close (s_buffer *b);
int buffer_delete (s_buffer *b);
+void buffer_err (s_buffer *b, const char *fmt, ...);
+int buffer_eat (s_buffer *b, const char *str);
#endif