summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/cescal.c60
-rw-r--r--core/readbuf.c46
-rw-r--r--core/state.c34
3 files changed, 140 insertions, 0 deletions
diff --git a/core/cescal.c b/core/cescal.c
new file mode 100644
index 0000000..b9a2c17
--- /dev/null
+++ b/core/cescal.c
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2026, Chloe M.
+ * Provided under the BSD-3 clause
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include "cescal/state.h"
+
+static void
+help(void)
+{
+ printf("usage: ./cescal [flags]\n");
+ printf("[-h] Display this help menu\n");
+}
+
+static int
+compile(const char *pathname)
+{
+ struct cescal_state st;
+
+ if (pathname == NULL) {
+ return -1;
+ }
+
+ if (state_init(&st, pathname) < 0) {
+ return -1;
+ }
+
+ state_close(&st);
+ return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+ int opt;
+
+ if (argc < 2) {
+ printf("fatal: too few arguments\n");
+ help();
+ return -1;
+ }
+
+ while ((opt = getopt(argc, argv, "h")) != -1) {
+ switch (opt) {
+ case 'h':
+ help();
+ return -1;
+ }
+ }
+
+ while (optind < argc) {
+ if (compile(argv[optind++]) < 0) {
+ break;
+ }
+ }
+
+ return 0;
+}
diff --git a/core/readbuf.c b/core/readbuf.c
new file mode 100644
index 0000000..ee10362
--- /dev/null
+++ b/core/readbuf.c
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2026, Chloe M.
+ * Provided under the BSD-3 clause
+ */
+
+#include <stdint.h>
+#include <stddef.h>
+#include <errno.h>
+#include <unistd.h>
+#include "cescal/readbuf.h"
+
+int
+readbuf_init(struct readbuf *rb)
+{
+ if (rb == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ rb->size = 0;
+ rb->tail = 0;
+ return 0;
+}
+
+char
+readbuf_read(struct readbuf *rb, int fd)
+{
+ ssize_t nread = -1;
+
+ if (rb == NULL || fd < 0) {
+ errno = EINVAL;
+ return '\0';
+ }
+
+#define N_RESIDUAL(rb) ((rb)->size - (rb)->tail)
+ if (N_RESIDUAL(rb) == 0 || rb->size == 0) {
+ if ((nread = read(fd, rb->buf, READBUF_CAP)) <= 0)
+ return nread;
+
+ rb->size = nread;
+ rb->tail = 0;
+ }
+#undef N_RESIDUAL
+
+ return rb->buf[rb->tail++];
+}
diff --git a/core/state.c b/core/state.c
new file mode 100644
index 0000000..7d80acd
--- /dev/null
+++ b/core/state.c
@@ -0,0 +1,34 @@
+#include <stdint.h>
+#include <stddef.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include "cescal/state.h"
+
+int
+state_init(struct cescal_state *state, const char *pathname)
+{
+ if (state == NULL || pathname == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ state->in_fd = open(pathname, O_RDONLY);
+ if (state->in_fd < 0) {
+ return -1;
+ }
+
+ if (readbuf_init(&state->rb) < 0) {
+ close(state->in_fd);
+ return -1;
+ }
+
+ return 0;
+}
+
+void
+state_close(struct cescal_state *state)
+{
+ close(state->in_fd);
+ state->in_fd = -1;
+}