FreeCalypso > hg > ice1-trau-tester
changeset 4:2ce0ed560a34
libutil: implement stdin handler
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 23 Jun 2024 17:58:32 +0000 |
parents | 90e78243d367 |
children | 7233c10af3ad |
files | libutil/Makefile libutil/stdin_handler.c libutil/stdin_handler.h |
diffstat | 3 files changed, 61 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/libutil/Makefile Sun Jun 23 17:17:18 2024 +0000 +++ b/libutil/Makefile Sun Jun 23 17:58:32 2024 +0000 @@ -1,4 +1,4 @@ -OBJS= open_ts.o +OBJS= open_ts.o stdin_handler.o LIB= libutil.a include ../config.defs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libutil/stdin_handler.c Sun Jun 23 17:58:32 2024 +0000 @@ -0,0 +1,49 @@ +/* + * Stdin handler function: gets called from Osmocom select loop for stdin, + * does line read and initial parsing into arguments, then calls + * program-supplied handler. + */ + +#include <ctype.h> +#include <stdint.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include <osmocom/core/select.h> + +#include "stdin_handler.h" + +#define MAX_ARGS 16 + +int stdin_select_cb(struct osmo_fd *ofd, unsigned int what) +{ + stdin_dispatch_t dispatch_func = ofd->data; + char buf[256], *argv[MAX_ARGS+1], *cp; + int argc; + + fgets(buf, sizeof buf, stdin); + argc = 0; + for (cp = buf; ; ) { + while (isspace(*cp)) + cp++; + if (*cp == '\0' || *cp == '#') + break; + if (argc >= MAX_ARGS) { + printf("error: input command exceeds MAX_ARGS\n"); + return 0; + } + argv[argc] = cp; + while (*cp && !isspace(*cp)) + cp++; + if (*cp) + *cp++ = '\0'; + argc++; + } + if (!argc) + return 0; + argv[argc] = NULL; + dispatch_func(argc, argv); + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libutil/stdin_handler.h Sun Jun 23 17:58:32 2024 +0000 @@ -0,0 +1,11 @@ +/* + * This header file defines the interface to the stdin handler module: + * gets called from Osmocom select loop for stdin, does line read and + * initial parsing into arguments, then calls program-supplied handler. + */ + +#pragma once + +typedef void (*stdin_dispatch_t)(int argc, char **argv); + +int stdin_select_cb(struct osmo_fd *ofd, unsigned int what);