aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--common.h3
-rw-r--r--interactive-test.c65
-rw-r--r--libterminput.h2
-rw-r--r--libterminput_init.34
-rw-r--r--libterminput_init.c2
-rw-r--r--libterminput_is_ready.34
-rw-r--r--libterminput_marshal_input.c4
-rw-r--r--libterminput_marshal_keypress__.c2
-rw-r--r--libterminput_marshal_mouseevent__.c2
-rw-r--r--libterminput_marshal_position__.c2
-rw-r--r--libterminput_marshal_state.c2
-rw-r--r--libterminput_marshal_text__.c4
-rw-r--r--libterminput_set_flags.34
-rw-r--r--libterminput_unmarshal_input.c2
-rw-r--r--libterminput_unmarshal_keypress__.c4
-rw-r--r--libterminput_unmarshal_mouseevent__.c2
-rw-r--r--libterminput_unmarshal_position__.c2
-rw-r--r--libterminput_unmarshal_state.c2
-rw-r--r--libterminput_unmarshal_text__.c2
-rw-r--r--test.c372
21 files changed, 463 insertions, 25 deletions
diff --git a/Makefile b/Makefile
index 7ea07c4..23045d4 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@ include $(CONFIGFILE)
OS = linux
# Linux: linux
# Mac OS: macos
-# Windows: windows
+# Windows: windows
include mk/$(OS).mk
diff --git a/common.h b/common.h
index 11d0d6b..b8b2801 100644
--- a/common.h
+++ b/common.h
@@ -6,6 +6,7 @@
#include <errno.h>
#include <limits.h>
#include <stdint.h>
+#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -31,7 +32,7 @@
/**
- * Singlar read symbol
+ * Singular read symbol
*/
struct input {
/**
diff --git a/interactive-test.c b/interactive-test.c
index 00b5776..3945eb2 100644
--- a/interactive-test.c
+++ b/interactive-test.c
@@ -2,6 +2,7 @@
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -11,8 +12,68 @@
#include "libterminput.h"
+#define TEST(EXPR)\
+ do {\
+ if (EXPR)\
+ break;\
+ fprintf(stderr, "Failure at line %i, with errno = %i (%s): %s\n",\
+ __LINE__, errno, strerror(errno), #EXPR);\
+ exit(1);\
+ } while (0)
+
+
static volatile sig_atomic_t interrupted = 0;
+static struct libterminput_state ctx;
+
+static char *marshalled = NULL;
+static size_t nmarshalled = 0;
+static size_t nunmarshalled = 0;
+static size_t marshalled_size = 0;
+
+
+static int
+store(struct libterminput_marshaller *this, const void *data, size_t size)
+{
+ (void) this;
+ if (size > marshalled_size - nmarshalled) {
+ TEST(size < SIZE_MAX - nmarshalled);
+ marshalled_size = nmarshalled + size;
+ TEST((marshalled = realloc(marshalled, marshalled_size)));
+ }
+ memcpy(&marshalled[nmarshalled], data, size);
+ nmarshalled += size;
+ return 0;
+}
+
+
+static int
+load(struct libterminput_unmarshaller *this, void *data, size_t size)
+{
+ (void) this;
+ TEST(nunmarshalled <= nmarshalled);
+ TEST(size <= nmarshalled - nunmarshalled);
+ memcpy(data, &marshalled[nunmarshalled], size);
+ nunmarshalled += size;
+ return 0;
+}
+
+
+static struct libterminput_marshaller marshaller = {.store = &store};
+static struct libterminput_unmarshaller unmarshaller = {.load = &load};
+
+
+static void
+check_ctx_marshal(void)
+{
+ struct libterminput_state old_ctx;
+ memcpy(&old_ctx, &ctx, sizeof(ctx));
+ TEST(!libterminput_marshal_state(&marshaller, &ctx));
+ memset(&ctx, 255, sizeof(ctx));
+ TEST(!libterminput_unmarshal_state(&unmarshaller, &ctx));
+ TEST(!memcmp(&old_ctx, &ctx, sizeof(ctx)));
+}
+
static void
sigint_handler(int signo)
@@ -25,7 +86,6 @@ sigint_handler(int signo)
int
main(void)
{
- struct libterminput_state ctx;
union libterminput_input input;
struct termios stty, saved_stty;
int r, print_state, flags;
@@ -96,6 +156,7 @@ main(void)
again:
while ((r = libterminput_read(STDIN_FILENO, &input, &ctx)) > 0) {
+ check_ctx_marshal();
if (input.type == LIBTERMINPUT_NONE) {
printf("none\n");
} else if (input.type == LIBTERMINPUT_KEYPRESS) {
@@ -232,6 +293,7 @@ again:
(int)(ctx.stored_tail - ctx.stored_head), &ctx.stored[ctx.stored_head]);
}
}
+ check_ctx_marshal();
if (r < 0 && !interrupted) {
if (errno == EAGAIN) {
@@ -249,5 +311,6 @@ again:
tcsetattr(STDERR_FILENO, TCSAFLUSH, &saved_stty);
libterminput_destroy(&ctx);
+ free(marshalled);
return -r && !interrupted;
}
diff --git a/libterminput.h b/libterminput.h
index 5cd634d..464850f 100644
--- a/libterminput.h
+++ b/libterminput.h
@@ -187,7 +187,7 @@ enum libterminput_key {
LIBTERMINPUT_KEYPAD_POINT,
LIBTERMINPUT_KEYPAD_ENTER
-#define LIBTERMINPUT_KEYPAD__LAST__ LIBTERMINPUT_KEYPAD_ENTER /* for internal use */
+#define LIBTERMINPUT_LAST_KEY__ LIBTERMINPUT_KEYPAD_ENTER /* for internal use */
};
diff --git a/libterminput_init.3 b/libterminput_init.3
index fa739a0..7fc6518 100644
--- a/libterminput_init.3
+++ b/libterminput_init.3
@@ -2,7 +2,7 @@
.SH NAME
libterminput_init \- Configure library for terminal quirks
.br
-libterminput_destory \- Deallocate library configuration resources
+libterminput_destroy \- Deallocate library configuration resources
.SH SYNOPSIS
.nf
@@ -74,7 +74,7 @@ avoid failing for any reason other than:
.B EINTR
Default.
.TP
-.B AGAIN
+.B EAGAIN
Default.
.PP
The
diff --git a/libterminput_init.c b/libterminput_init.c
index 0e65d40..06b93a6 100644
--- a/libterminput_init.c
+++ b/libterminput_init.c
@@ -10,5 +10,5 @@ libterminput_init(struct libterminput_state *ctx, int fd)
{
(void) ctx;
(void) fd;
- return -1;
+ return 0;
}
diff --git a/libterminput_is_ready.3 b/libterminput_is_ready.3
index c624008..de1e919 100644
--- a/libterminput_is_ready.3
+++ b/libterminput_is_ready.3
@@ -15,13 +15,13 @@ Link with
.SH DESCRIPTION
The
.BR libterminput_is_ready ()
-function check if a call to the
+function checks if a call to the
.BR libterminput_read (3)
function will skip reading from the file
descriptor passed to it because it already
has read data buffered. However, if there
is buffered data but the library knows it
-it not enough to return something they,
+is not enough to return anything yet,
it will also return that there is nothing
buffered.
.PP
diff --git a/libterminput_marshal_input.c b/libterminput_marshal_input.c
index 9949838..4064956 100644
--- a/libterminput_marshal_input.c
+++ b/libterminput_marshal_input.c
@@ -3,13 +3,13 @@
int
-libterminput_marshal_input(struct libterminput_marshaller *how, const union libterminput_input *what) /* TODO test */
+libterminput_marshal_input(struct libterminput_marshaller *how, const union libterminput_input *what)
{
enum libterminput_type type = what->type;
if (how->store(how, &type, sizeof(type)))
return -1;
if (type == LIBTERMINPUT_NONE) {
- if (what->keypress.key == LIBTERMINPUT_SYMBOL)
+ if (what->keypress.key != LIBTERMINPUT_SYMBOL)
type = LIBTERMINPUT_KEYPRESS;
if (how->store(how, &type, sizeof(type)))
return -1;
diff --git a/libterminput_marshal_keypress__.c b/libterminput_marshal_keypress__.c
index 8924b4f..1ffba01 100644
--- a/libterminput_marshal_keypress__.c
+++ b/libterminput_marshal_keypress__.c
@@ -3,7 +3,7 @@
int
-libterminput_marshal_keypress__(struct libterminput_marshaller *how, const struct libterminput_keypress *what) /* TODO test */
+libterminput_marshal_keypress__(struct libterminput_marshaller *how, const struct libterminput_keypress *what)
{
if (how->store(how, &what->key, sizeof(what->key)) ||
how->store(how, &what->times, sizeof(what->times)) ||
diff --git a/libterminput_marshal_mouseevent__.c b/libterminput_marshal_mouseevent__.c
index 7da80fe..8fe64c7 100644
--- a/libterminput_marshal_mouseevent__.c
+++ b/libterminput_marshal_mouseevent__.c
@@ -3,7 +3,7 @@
int
-libterminput_marshal_mouseevent__(struct libterminput_marshaller *how, const struct libterminput_mouseevent *what) /* TODO test */
+libterminput_marshal_mouseevent__(struct libterminput_marshaller *how, const struct libterminput_mouseevent *what)
{
if (how->store(how, &what->event, sizeof(what->event)) ||
how->store(how, &what->x, sizeof(size_t) * 2U))
diff --git a/libterminput_marshal_position__.c b/libterminput_marshal_position__.c
index 80e4bae..59fc20e 100644
--- a/libterminput_marshal_position__.c
+++ b/libterminput_marshal_position__.c
@@ -3,7 +3,7 @@
int
-libterminput_marshal_position__(struct libterminput_marshaller *how, const struct libterminput_position *what) /* TODO test */
+libterminput_marshal_position__(struct libterminput_marshaller *how, const struct libterminput_position *what)
{
return how->store(how, &what->x, sizeof(size_t) * 2U);
}
diff --git a/libterminput_marshal_state.c b/libterminput_marshal_state.c
index 8c0c79c..d27966e 100644
--- a/libterminput_marshal_state.c
+++ b/libterminput_marshal_state.c
@@ -3,7 +3,7 @@
int
-libterminput_marshal_state(struct libterminput_marshaller *how, const struct libterminput_state *what) /* TODO test */
+libterminput_marshal_state(struct libterminput_marshaller *how, const struct libterminput_state *what)
{
return how->store(how, what, sizeof(*what));
}
diff --git a/libterminput_marshal_text__.c b/libterminput_marshal_text__.c
index 264ec04..5fa1325 100644
--- a/libterminput_marshal_text__.c
+++ b/libterminput_marshal_text__.c
@@ -3,8 +3,10 @@
int
-libterminput_marshal_text__(struct libterminput_marshaller *how, const struct libterminput_text *what) /* TODO test */
+libterminput_marshal_text__(struct libterminput_marshaller *how, const struct libterminput_text *what)
{
+ if (what->nbytes > sizeof(what->bytes))
+ abort();
if (how->store(how, &what->nbytes, sizeof(what->nbytes)) ||
how->store(how, what->bytes, what->nbytes))
return -1;
diff --git a/libterminput_set_flags.3 b/libterminput_set_flags.3
index fd1df68..7219066 100644
--- a/libterminput_set_flags.3
+++ b/libterminput_set_flags.3
@@ -8,8 +8,8 @@ libterminput_clear_flags \- Remove input parsing flags
.nf
#include <libterminput.h>
-int libterminput_set_flags(struct libterminput_state *ctx *\fIctx\fP, enum libterminput_flags \fIflags\fP);
-int libterminput_clear_flags(struct libterminput_state *ctx *\fIctx\fP, enum libterminput_flags \fIflags\fP);
+int libterminput_set_flags(struct libterminput_state *\fIctx\fP, enum libterminput_flags \fIflags\fP);
+int libterminput_clear_flags(struct libterminput_state *\fIctx\fP, enum libterminput_flags \fIflags\fP);
.fi
.PP
Link with
diff --git a/libterminput_unmarshal_input.c b/libterminput_unmarshal_input.c
index 851d0be..c8c20a2 100644
--- a/libterminput_unmarshal_input.c
+++ b/libterminput_unmarshal_input.c
@@ -3,7 +3,7 @@
int
-libterminput_unmarshal_input(struct libterminput_unmarshaller *how, union libterminput_input *what) /* TODO test */
+libterminput_unmarshal_input(struct libterminput_unmarshaller *how, union libterminput_input *what)
{
enum libterminput_type type;
int r;
diff --git a/libterminput_unmarshal_keypress__.c b/libterminput_unmarshal_keypress__.c
index f4b4fc6..bd67e1e 100644
--- a/libterminput_unmarshal_keypress__.c
+++ b/libterminput_unmarshal_keypress__.c
@@ -3,14 +3,14 @@
int
-libterminput_unmarshal_keypress__(struct libterminput_unmarshaller *how, struct libterminput_keypress *what) /* TODO test */
+libterminput_unmarshal_keypress__(struct libterminput_unmarshaller *how, struct libterminput_keypress *what)
{
what->type = LIBTERMINPUT_KEYPRESS;
if (how->load(how, &what->key, sizeof(what->key)) ||
how->load(how, &what->times, sizeof(what->times)) ||
how->load(how, &what->mods, sizeof(what->mods)))
return -1;
- if ((uintmax_t)what->key > (uintmax_t)LIBTERMINPUT_KEYPAD__LAST__) {
+ if ((uintmax_t)what->key > (uintmax_t)LIBTERMINPUT_LAST_KEY__) {
errno = EINVAL;
return -1;
}
diff --git a/libterminput_unmarshal_mouseevent__.c b/libterminput_unmarshal_mouseevent__.c
index f91b606..ab35b95 100644
--- a/libterminput_unmarshal_mouseevent__.c
+++ b/libterminput_unmarshal_mouseevent__.c
@@ -3,7 +3,7 @@
int
-libterminput_unmarshal_mouseevent__(struct libterminput_unmarshaller *how, struct libterminput_mouseevent *what) /* TODO test */
+libterminput_unmarshal_mouseevent__(struct libterminput_unmarshaller *how, struct libterminput_mouseevent *what)
{
what->type = LIBTERMINPUT_MOUSEEVENT;
if (how->load(how, &what->event, sizeof(what->event)) ||
diff --git a/libterminput_unmarshal_position__.c b/libterminput_unmarshal_position__.c
index 093c0b1..9040c50 100644
--- a/libterminput_unmarshal_position__.c
+++ b/libterminput_unmarshal_position__.c
@@ -3,7 +3,7 @@
int
-libterminput_unmarshal_position__(struct libterminput_unmarshaller *how, struct libterminput_position *what) /* TODO test */
+libterminput_unmarshal_position__(struct libterminput_unmarshaller *how, struct libterminput_position *what)
{
what->type = LIBTERMINPUT_CURSOR_POSITION;
return how->load(how, &what->x, sizeof(size_t) * 2U);
diff --git a/libterminput_unmarshal_state.c b/libterminput_unmarshal_state.c
index a41c4fe..07dc625 100644
--- a/libterminput_unmarshal_state.c
+++ b/libterminput_unmarshal_state.c
@@ -3,7 +3,7 @@
int
-libterminput_unmarshal_state(struct libterminput_unmarshaller *how, struct libterminput_state *what) /* TODO test */
+libterminput_unmarshal_state(struct libterminput_unmarshaller *how, struct libterminput_state *what)
{
if (how->load(how, what, sizeof(*what)))
return -1;
diff --git a/libterminput_unmarshal_text__.c b/libterminput_unmarshal_text__.c
index bb25fe4..be9bb10 100644
--- a/libterminput_unmarshal_text__.c
+++ b/libterminput_unmarshal_text__.c
@@ -3,7 +3,7 @@
int
-libterminput_unmarshal_text__(struct libterminput_unmarshaller *how, struct libterminput_text *what) /* TODO test */
+libterminput_unmarshal_text__(struct libterminput_unmarshaller *how, struct libterminput_text *what)
{
what->type = LIBTERMINPUT_TEXT;
if (how->load(how, &what->nbytes, sizeof(what->nbytes)))
diff --git a/test.c b/test.c
index 63c70ff..eb007c3 100644
--- a/test.c
+++ b/test.c
@@ -1,6 +1,7 @@
/* See LICENSE file for copyright and license details. */
#include <errno.h>
#include <fcntl.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -360,6 +361,54 @@ static struct libterminput_state ctx;
static union libterminput_input input;
static int fds[2];
+static char *marshalled = NULL;
+static size_t nmarshalled = 0;
+static size_t nunmarshalled = 0;
+static size_t marshalled_size = 0;
+
+
+static int
+store(struct libterminput_marshaller *this, const void *data, size_t size)
+{
+ (void) this;
+ if (size > marshalled_size - nmarshalled) {
+ TEST(size < SIZE_MAX - nmarshalled);
+ marshalled_size = nmarshalled + size;
+ TEST((marshalled = realloc(marshalled, marshalled_size)));
+ }
+ memcpy(&marshalled[nmarshalled], data, size);
+ nmarshalled += size;
+ return 0;
+}
+
+
+static int
+load(struct libterminput_unmarshaller *this, void *data, size_t size)
+{
+ (void) this;
+ TEST(nunmarshalled <= nmarshalled);
+ TEST(size <= nmarshalled - nunmarshalled);
+ memcpy(data, &marshalled[nunmarshalled], size);
+ nunmarshalled += size;
+ return 0;
+}
+
+
+static struct libterminput_marshaller marshaller = {.store = &store};
+static struct libterminput_unmarshaller unmarshaller = {.load = &load};
+
+
+static void
+check_ctx_marshal(void)
+{
+ struct libterminput_state old_ctx;
+ memcpy(&old_ctx, &ctx, sizeof(ctx));
+ TEST(!libterminput_marshal_state(&marshaller, &ctx));
+ memset(&ctx, 255, sizeof(ctx));
+ TEST(!libterminput_unmarshal_state(&unmarshaller, &ctx));
+ TEST(!memcmp(&old_ctx, &ctx, sizeof(ctx)));
+}
+
static void
type_mem(const char *str, size_t len, enum libterminput_type type)
@@ -371,14 +420,17 @@ type_mem(const char *str, size_t len, enum libterminput_type type)
TEST((flags = fcntl(fds[0], F_GETFL)) >= 0);
if (flags & O_NONBLOCK) {
do {
+ check_ctx_marshal();
r = libterminput_read(fds[0], &input, &ctx);
TEST(r == 1 || (r == -1 && errno == EAGAIN));
} while (input.type == LIBTERMINPUT_NONE && r > 0);
} else {
do {
+ check_ctx_marshal();
TEST(libterminput_read(fds[0], &input, &ctx) == 1);
} while (input.type == LIBTERMINPUT_NONE && libterminput_is_ready(&input, &ctx));
}
+ check_ctx_marshal();
TEST(input.type == type);
}
@@ -397,14 +449,17 @@ keypress_(const char *str1, const char *str2, const char *str3, const char *str4
for (times_ = times; times_; times_--) {
if (flags & O_NONBLOCK) {
do {
+ check_ctx_marshal();
r = libterminput_read(fds[0], &input, &ctx);
TEST(r == 1 || (r == -1 && errno == EAGAIN));
} while (input.type == LIBTERMINPUT_NONE && r > 0);
} else {
do {
+ check_ctx_marshal();
TEST(libterminput_read(fds[0], &input, &ctx) == 1);
} while (input.type == LIBTERMINPUT_NONE && libterminput_is_ready(&input, &ctx));
}
+ check_ctx_marshal();
TEST(input.type == LIBTERMINPUT_KEYPRESS);
TEST(input.keypress.key == key);
TEST(input.keypress.mods == mods);
@@ -415,9 +470,11 @@ keypress_(const char *str1, const char *str2, const char *str3, const char *str4
TEST(write(fds[1], &buffer[i], 1) == 1);
TEST(libterminput_read(fds[0], &input, &ctx) == 1);
TEST(input.type == LIBTERMINPUT_NONE);
+ check_ctx_marshal();
}
TEST(write(fds[1], &buffer[i], 1) == 1);
TEST(libterminput_read(fds[0], &input, &ctx) == 1);
+ check_ctx_marshal();
TEST(input.keypress.key == key);
TEST(input.keypress.mods == mods);
TEST(input.keypress.times == times);
@@ -546,6 +603,319 @@ main(void)
size_t i;
int flags;
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_BRACKETED_PASTE_START;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ input.type = LIBTERMINPUT_NONE;
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_BRACKETED_PASTE_START);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_BRACKETED_PASTE_END;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ input.type = LIBTERMINPUT_NONE;
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_BRACKETED_PASTE_END);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_TERMINAL_IS_OK;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ input.type = LIBTERMINPUT_NONE;
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_TERMINAL_IS_OK);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_TERMINAL_IS_NOT_OK;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ input.type = LIBTERMINPUT_NONE;
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_TERMINAL_IS_NOT_OK);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_CURSOR_POSITION;
+ input.position.x = 5U;
+ input.position.y = 10U;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_CURSOR_POSITION);
+ TEST(input.position.x == 5U);
+ TEST(input.position.y == 10U);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_TEXT;
+ input.text.nbytes = 10U;
+ stpcpy(input.text.bytes, "1234567890");
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_TEXT);
+ TEST(input.text.nbytes == 10U);
+ TEST(!memcmp(input.text.bytes, "1234567890", 10U));
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_TEXT;
+ input.text.nbytes = sizeof(input.text.bytes);
+ memset(input.text.bytes, 1, input.text.nbytes);
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_TEXT);
+ TEST(input.text.nbytes == sizeof(input.text.bytes));
+ TEST(input.text.bytes[0] == 1);
+ TEST(input.text.bytes[input.text.nbytes - 1U] == 1);
+
+ errno = 0;
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_TEXT;
+ input.text.nbytes = sizeof(input.text.bytes);
+ memset(input.text.bytes, 2, sizeof(input.text.bytes));
+ TEST(!marshaller.store(&marshaller, &input.type, sizeof(input.type)));
+ TEST(!marshaller.store(&marshaller, &input.text.nbytes, sizeof(input.text.nbytes)));
+ TEST(!marshaller.store(&marshaller, input.text.bytes, sizeof(input.text.bytes)));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_TEXT);
+ TEST(input.text.nbytes == sizeof(input.text.bytes));
+ TEST(input.text.bytes[0] == 2);
+ TEST(input.text.bytes[input.text.nbytes - 1U] == 2);
+
+ errno = 0;
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_TEXT;
+ input.text.nbytes = sizeof(input.text.bytes) + 1U;
+ TEST(!marshaller.store(&marshaller, &input.type, sizeof(input.type)));
+ TEST(!marshaller.store(&marshaller, &input.text.nbytes, sizeof(input.text.nbytes)));
+ TEST(!marshaller.store(&marshaller, input.text.bytes, sizeof(input.text.bytes)));
+ TEST(!marshaller.store(&marshaller, input.text.bytes, 1U));
+ TEST(libterminput_unmarshal_input(&unmarshaller, &input)== -1 && errno == EINVAL);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_MOUSEEVENT;
+ input.mouseevent.mods = 9;
+ input.mouseevent.button = 7;
+ input.mouseevent.event = LIBTERMINPUT_PRESS;
+ input.mouseevent.x = 13U;
+ input.mouseevent.y = 21U;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_MOUSEEVENT);
+ TEST(input.mouseevent.mods == 9);
+ TEST(input.mouseevent.button == 7);
+ TEST(input.mouseevent.event == LIBTERMINPUT_PRESS);
+ TEST(input.mouseevent.x == 13U);
+ TEST(input.mouseevent.y == 21U);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_MOUSEEVENT;
+ input.mouseevent.mods = 77;
+ input.mouseevent.button = 88;
+ input.mouseevent.event = LIBTERMINPUT_RELEASE;
+ input.mouseevent.x = 41U;
+ input.mouseevent.y = 22U;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_MOUSEEVENT);
+ TEST(input.mouseevent.mods == 77);
+ TEST(input.mouseevent.button == 88);
+ TEST(input.mouseevent.event == LIBTERMINPUT_RELEASE);
+ TEST(input.mouseevent.x == 41U);
+ TEST(input.mouseevent.y == 22U);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_MOUSEEVENT;
+ input.mouseevent.mods = 12;
+ input.mouseevent.button = 14;
+ input.mouseevent.event = LIBTERMINPUT_MOTION;
+ input.mouseevent.x = 42U;
+ input.mouseevent.y = 23U;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_MOUSEEVENT);
+ TEST(input.mouseevent.mods == 12);
+ TEST(input.mouseevent.button == 14);
+ TEST(input.mouseevent.event == LIBTERMINPUT_MOTION);
+ TEST(input.mouseevent.x == 42U);
+ TEST(input.mouseevent.y == 23U);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_MOUSEEVENT;
+ input.mouseevent.mods = 99; /* invalid, will be set to 0 */
+ input.mouseevent.button = 99; /* invalid, will be set to 1 */
+ input.mouseevent.event = LIBTERMINPUT_HIGHLIGHT_INSIDE;
+ input.mouseevent.x = 52U;
+ input.mouseevent.y = 53U;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_MOUSEEVENT);
+ TEST(input.mouseevent.mods == 0);
+ TEST(input.mouseevent.button == 1);
+ TEST(input.mouseevent.event == LIBTERMINPUT_HIGHLIGHT_INSIDE);
+ TEST(input.mouseevent.x == 52U);
+ TEST(input.mouseevent.y == 53U);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_MOUSEEVENT;
+ input.mouseevent.mods = 99; /* invalid, will be set to 0 */
+ input.mouseevent.button = 99; /* invalid, will be set to 1 */
+ input.mouseevent.event = LIBTERMINPUT_HIGHLIGHT_OUTSIDE;
+ input.mouseevent.x = 62U;
+ input.mouseevent.y = 63U;
+ input.mouseevent.start_x = 12U;
+ input.mouseevent.start_y = 13U;
+ input.mouseevent.end_x = 22U;
+ input.mouseevent.end_y = 23U;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_MOUSEEVENT);
+ TEST(input.mouseevent.mods == 0);
+ TEST(input.mouseevent.button == 1);
+ TEST(input.mouseevent.event == LIBTERMINPUT_HIGHLIGHT_OUTSIDE);
+ TEST(input.mouseevent.x == 62U);
+ TEST(input.mouseevent.y == 63U);
+ TEST(input.mouseevent.start_x == 12U);
+ TEST(input.mouseevent.start_y == 13U);
+ TEST(input.mouseevent.end_x == 22U);
+ TEST(input.mouseevent.end_y == 23U);
+
+ errno = 0;
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_MOUSEEVENT;
+ input.mouseevent.mods = 1;
+ input.mouseevent.button = 1;
+ input.mouseevent.event = (enum libterminput_event)99999;
+ input.mouseevent.x = 1U;
+ input.mouseevent.y = 1U;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ TEST(libterminput_unmarshal_input(&unmarshaller, &input) == -1 && errno == EINVAL);
+
+ errno = 0;
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_MOUSEEVENT;
+ input.mouseevent.mods = 1;
+ input.mouseevent.button = 1;
+ input.mouseevent.event = (enum libterminput_event)-1;
+ input.mouseevent.x = 1U;
+ input.mouseevent.y = 1U;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ TEST(libterminput_unmarshal_input(&unmarshaller, &input) == -1 && errno == EINVAL);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_KEYPRESS;
+ input.keypress.key = LIBTERMINPUT_UP;
+ input.keypress.times = 0;
+ input.keypress.mods = 0;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_KEYPRESS);
+ TEST(input.keypress.key == LIBTERMINPUT_UP);
+ TEST(input.keypress.times == 0);
+ TEST(input.keypress.mods == 0);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_KEYPRESS;
+ input.keypress.key = LIBTERMINPUT_LAST_KEY__;
+ input.keypress.times = 1;
+ input.keypress.mods = 7;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_KEYPRESS);
+ TEST(input.keypress.key == LIBTERMINPUT_LAST_KEY__);
+ TEST(input.keypress.times == 1);
+ TEST(input.keypress.mods == 7);
+
+ errno = 0;
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_KEYPRESS;
+ input.keypress.key = (enum libterminput_key)(LIBTERMINPUT_LAST_KEY__ + 1);
+ input.keypress.times = 1;
+ input.keypress.mods = 7;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ TEST(libterminput_unmarshal_input(&unmarshaller, &input) == -1 && errno == EINVAL);
+
+ errno = 0;
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_KEYPRESS;
+ input.keypress.key = (enum libterminput_key)-1;
+ input.keypress.times = 1;
+ input.keypress.mods = 7;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ TEST(libterminput_unmarshal_input(&unmarshaller, &input) == -1 && errno == EINVAL);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_KEYPRESS;
+ input.keypress.key = LIBTERMINPUT_SYMBOL;
+ input.keypress.times = 5;
+ input.keypress.mods = 10;
+ stpcpy(input.keypress.symbol, "\xFD\x82\x83\x84\x85\x86");
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_KEYPRESS);
+ TEST(input.keypress.key == LIBTERMINPUT_SYMBOL);
+ TEST(input.keypress.times == 5);
+ TEST(input.keypress.mods == 10);
+ TEST(!memcmp(input.keypress.symbol, "\xFD\x82\x83\x84\x85\x86", 7U));
+
+ errno = 0;
+ nunmarshalled = nmarshalled = 0;
+ input.type = (enum libterminput_type)-1;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ TEST(libterminput_unmarshal_input(&unmarshaller, &input) == -1 && errno == EINVAL);
+
+ errno = 0;
+ nunmarshalled = nmarshalled = 0;
+ input.type = (enum libterminput_type)99;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ TEST(libterminput_unmarshal_input(&unmarshaller, &input) == -1 && errno == EINVAL);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_NONE;
+ input.keypress.key = LIBTERMINPUT_LEFT;
+ input.keypress.times = 5;
+ input.keypress.mods = 8;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_NONE);
+ TEST(input.keypress.key == LIBTERMINPUT_LEFT);
+ TEST(input.keypress.times == 5);
+ TEST(input.keypress.mods == 8);
+
+ nunmarshalled = nmarshalled = 0;
+ input.type = LIBTERMINPUT_NONE;
+ input.keypress.key = LIBTERMINPUT_SYMBOL;
+ TEST(!libterminput_marshal_input(&marshaller, &input));
+ memset(&input, 0, sizeof(input));
+ TEST(!libterminput_unmarshal_input(&unmarshaller, &input));
+ TEST(nunmarshalled == nmarshalled);
+ TEST(input.type == LIBTERMINPUT_NONE);
+ TEST(input.keypress.key == LIBTERMINPUT_SYMBOL);
+
memset(&ctx, 0, sizeof(ctx));
TEST(!pipe(fds));
@@ -1048,5 +1418,7 @@ main(void)
TEST(libterminput_read(fds[0], &input, &ctx) == 0);
close(fds[0]);
TEST(libterminput_read(fds[0], &input, &ctx) == -1 && errno == EBADF);
+
+ free(marshalled);
return 0;
}