Still got some failures, but a basic stream implementation
Need to fix what's going on with the example in main.c using stdin.
This commit is contained in:
59
alisp.h
59
alisp.h
@@ -17,14 +17,18 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdalign.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/// The bare fucking minimum
|
||||
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
||||
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
||||
#define ARRSIZE(A) (sizeof(A) / sizeof((A)[0]))
|
||||
#define NTH_BYTE(X, N) (((X) >> (8 * N)) & ((1 << 8) - 1))
|
||||
#define FAIL(MSG) assert(false && "FAIL: " #MSG)
|
||||
#define TODO(MSG) assert(false && "TODO: " #MSG)
|
||||
|
||||
typedef uint8_t u8;
|
||||
typedef uint16_t u16;
|
||||
@@ -91,6 +95,61 @@ void sym_table_init(sym_table_t *);
|
||||
char *sym_table_find(sym_table_t *, sv_t);
|
||||
void sym_table_cleanup(sym_table_t *);
|
||||
|
||||
/// Streams
|
||||
typedef enum
|
||||
{
|
||||
STREAM_TYPE_STRING,
|
||||
STREAM_TYPE_FILE,
|
||||
} stream_type_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
STREAM_ERR_INVALID_PTR = -4,
|
||||
STREAM_ERR_FILE_NONEXISTENT = -3,
|
||||
STREAM_ERR_FILE_READ = -2,
|
||||
STREAM_ERR_PIPE_NONEXISTENT = -1,
|
||||
STREAM_ERR_OK = 0,
|
||||
} stream_err_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vec_t cache;
|
||||
FILE *file;
|
||||
} stream_pipe_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
stream_type_t type;
|
||||
char *name;
|
||||
u64 position;
|
||||
union
|
||||
{
|
||||
sv_t string;
|
||||
stream_pipe_t pipe;
|
||||
};
|
||||
} stream_t;
|
||||
|
||||
#define STREAM_DEFAULT_CHUNK 64
|
||||
|
||||
stream_err_t stream_init_string(stream_t *, char *, sv_t);
|
||||
stream_err_t stream_init_file(stream_t *, char *, FILE *);
|
||||
void stream_stop(stream_t *);
|
||||
|
||||
// end of stream
|
||||
bool stream_eos(stream_t *);
|
||||
// end of cache
|
||||
bool stream_eoc(stream_t *);
|
||||
u64 stream_size(stream_t *);
|
||||
|
||||
bool stream_chunk(stream_t *);
|
||||
char stream_next(stream_t *);
|
||||
char stream_peek(stream_t *);
|
||||
bool stream_seek(stream_t *, i64);
|
||||
bool stream_seek_forward(stream_t *, u64);
|
||||
bool stream_seek_backward(stream_t *, u64);
|
||||
sv_t stream_substr(stream_t *, u64);
|
||||
sv_t stream_substr_abs(stream_t *, u64, u64);
|
||||
|
||||
/// Basic defintions for a Lisp
|
||||
#define NIL 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user