summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meson.build4
-rw-r--r--src/cache.c12
-rw-r--r--src/defs.h5
-rw-r--r--src/io.c29
-rw-r--r--src/main.c11
5 files changed, 35 insertions, 26 deletions
diff --git a/meson.build b/meson.build
index 3d101a4..4718a70 100644
--- a/meson.build
+++ b/meson.build
@@ -2,6 +2,8 @@ project('usurpation', 'c',
license : 'LGPL2.1',
default_options : ['c_std=gnu11', 'buildtype=release', 'warning_level=2'])
+deps = [dependency('rin', version : '>= 0.0.4')]
+
progname = 'alg'
add_project_arguments('-D', '_GNU_SOURCE', language : 'c')
@@ -9,4 +11,4 @@ add_project_arguments('-fplan9-extensions', language : 'c')
subdir('src')
-executable(progname, sources, install : true)
+executable(progname, sources, dependencies : deps, install : true)
diff --git a/src/cache.c b/src/cache.c
index c88cc78..ebe1047 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -11,7 +11,7 @@ int cache_create(struct stream * const restrict in, const struct settings * cons
int ret;
void *cache;
- try(!(cache = calloc(in->n, s->stride)), err, ENOMEM);
+ try(!(cache = calloc(in->n, s->stride)), err, ENOMEM, "out of memory");
in->cache = cache;
err:
@@ -23,8 +23,8 @@ int cache_populate(struct stream * const restrict in)
int ret = 0;
ssize_t i;
- for (i = 0; i < in->n; ++i) {
- try_s((ret = in->get_element(in, i, in->cache + i)), err);
+ for (i = 0; i < in->n && !ret; ++i) {
+ ret = in->get_element(in, i, in->cache + i);
}
err:
@@ -36,8 +36,8 @@ int cache_flush(struct stream * const in)
int ret;
ssize_t i;
- for (i = 0; i < in->n; ++i) {
- try_s((ret = in->put_element(in, i, in->cache + i)), err);
+ for (i = 0; i < in->n && !ret; ++i) {
+ ret = in->put_element(in, i, in->cache + i);
}
err:
@@ -48,7 +48,7 @@ int cache_destroy(struct stream * const in)
{
int ret;
- try(!in->cache, err, EINVAL);
+ try(!in->cache, err, EINVAL, "trying to destroy cache of uncached streadm");
free(in->cache);
in->cache = NULL;
err:
diff --git a/src/defs.h b/src/defs.h
index 3b8f1c1..ff19102 100644
--- a/src/defs.h
+++ b/src/defs.h
@@ -8,18 +8,21 @@
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>
+#include <rin/diagnostic.h>
#define try_s(a,l) do {\
if(a) {\
goto l;\
}} while (0);
-#define try(a,l,e) do {\
+#define try(a,l,e,m,...) do {\
if(a) {\
ret = e;\
+ rin_err(m __VA_OPT__(,) __VA_ARGS__);\
goto l;\
}} while (0);
+
#define get(in, idx, data) (in->cached ? in->get_element_cache(in, idx, data) | in->get_element(in, idx, data))
#define put(in, idx, data) (in->cached ? in->put_element_cache(in, idx, data) | in->put_element(in, idx, data))
diff --git a/src/io.c b/src/io.c
index b18cc00..9fdad38 100644
--- a/src/io.c
+++ b/src/io.c
@@ -25,7 +25,7 @@ int stream_open(struct stream * const in, const struct settings * const s)
{
int ret = 0;
- try(!in || in->fd > 0 || !in->name || !s, err, EINVAL);
+ try(!in || in->fd > 0 || !in->name || !s, err, EINVAL, "invalid argunent");
if (in->out == 1) {
ret = stream_open_out(in, s);
@@ -43,7 +43,7 @@ int stream_close(struct stream * const in)
{
int ret = 0;
- try(!in || in->fd < 0, early_err, EINVAL);
+ try(!in || in->fd < 0, early_err, EINVAL, "invalid argunent");
if (!in->out) {
goto out;
@@ -60,13 +60,14 @@ int stream_close(struct stream * const in)
unlink(in->name);
} else {
ret = EINVAL;
- /* TODO: error message */
+ rin_err("the given output file already exists and is not a regular file");
goto err;
}
}
- try(linkat(AT_FDCWD, path, AT_FDCWD, in->name, AT_SYMLINK_FOLLOW), err, errno);
+ try(linkat(AT_FDCWD, path, AT_FDCWD, in->name, AT_SYMLINK_FOLLOW), err, errno, "error linking output file to filesystem: %s", strerror(ret));
} else {
+ rin_err("no output filename given");
ret = EINVAL;
goto err;
}
@@ -92,17 +93,17 @@ static int stream_open_out(struct stream * const in, const struct settings * con
dname = strdup(tmp[1]);
free(tmp[0]);
- try(stat(dname, &st), err, errno);
- try(!(st.st_mode & S_IFDIR), err, EINVAL); /* TODO: err msg */
+ try(stat(dname, &st), err, errno, "stat failed: %s", strerror(ret));
+ try(!(st.st_mode & S_IFDIR), err, EINVAL, "invalid output path");
if (!stat(in->name, &st)) {
- try(!(st.st_mode & S_IFREG), err, EINVAL); /* TODO: err msg */
+ try(!(st.st_mode & S_IFREG), err, EINVAL, "the given output file already exists and is not a regular file");
mode = st.st_mode;
}
in->fd = open(dname, O_TMPFILE | O_WRONLY, mode);
- try(in->fd < 0, err, errno); /* TODO: err msg */
- try(ftruncate(in->fd, s->stride * in->n), err, errno); /* TODO: err msg */
+ try(in->fd < 0, err, errno, "failed creating temporary output file: %s", strerror(ret));
+ try(ftruncate(in->fd, s->stride * in->n), err, errno, "failed setting output file size: %s", strerror(ret));
err:
free(dname);
@@ -114,11 +115,11 @@ static int stream_open_in(struct stream * const in, const struct settings * cons
struct stat st;
int ret = 0;
- try(stat(in->name, &st), err, errno); /* TODO: err msg */
- try(!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % s->stride), err, EINVAL); /* TODO: err msg */
+ try(stat(in->name, &st), err, errno, "stat failed: %s", strerror(ret));
+ try(!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % s->stride), err, EINVAL, "invalid input file");
in->n = st.st_size / s->stride;
in->fd = open(in->name, O_RDONLY | O_NOATIME);
- try(in->fd < 0, err, errno); /* TODO: err msg */
+ try(in->fd < 0, err, errno, "failed opening input file: %s", strerror(ret));
if (in->cached) {
cache_create(in, s);
cache_populate(in);
@@ -133,9 +134,9 @@ static int stream_open_special(struct stream * const in)
struct stat st;
int ret = 0;
- try(stat(in->name, &st), err, errno); /* TODO: err msg */
+ try(stat(in->name, &st), err, errno, "stat failed: %s", strerror(ret));
in->fd = open(in->name, O_RDONLY | O_NOATIME);
- try(in->fd < 0, err, errno); /* TODO: err msg */
+ try(in->fd < 0, err, errno, "failed opening input file: %s", strerror(ret));
err:
return ret;
diff --git a/src/main.c b/src/main.c
index fabc612..ddae024 100644
--- a/src/main.c
+++ b/src/main.c
@@ -7,6 +7,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <rin/diagnostic.h>
#include "io.h"
#include "defs.h"
@@ -24,24 +25,26 @@ int main(int argc, char **argv)
{
int ret = 0;
- try_s((ret = parseargs(argc, argv, &settings)), out);
+ rin_diag_init();
+ try_s((ret = parseargs(argc, argv, &settings)), early_out);
if (settings.opmode == mode_generate) {
file_in.name = randfile;
file_in.out = -1;
file_in.n = settings.to;
- file_out.n = settings.to;
} else {
file_in.name = settings.filein;
}
file_out.name = settings.fileout ? settings.fileout : settings.filein;
- try_s(( ret = stream_open(&file_in, &settings)) ||
- (ret = stream_open(&file_out, &settings)), out);
+ try_s((ret = stream_open(&file_in, &settings)), out);
+ file_out.n = file_in.n;
+ try_s((ret = stream_open(&file_out, &settings)), out);
out:
stream_close(&file_in);
stream_close(&file_out);
+early_out:
return ret;
}