FreeCalypso > hg > gsm-codec-lib
changeset 522:4d2cccaeb4a7
libtest: implement TW-TS-005 reader function
Spec reference:
https://www.freecalypso.org/specs/tw-ts-005-v010002.txt
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 19 Sep 2024 03:08:47 +0000 |
parents | 68fe269b4316 |
children | 86d4ec69b36c |
files | libtest/Makefile libtest/tw5reader.c libtest/tw5reader.h |
diffstat | 3 files changed, 88 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/libtest/Makefile Thu Sep 19 02:21:08 2024 +0000 +++ b/libtest/Makefile Thu Sep 19 03:08:47 2024 +0000 @@ -1,5 +1,5 @@ -OBJS= binreader.o parse_dlcap.o pcmwrite.o roberead.o robewrite.o wavrdhelp.o\ - wavreader.o wavwriter.o +OBJS= binreader.o parse_dlcap.o pcmwrite.o roberead.o robewrite.o tw5reader.o\ + wavrdhelp.o wavreader.o wavwriter.o LIB= libtest.a include ../config.defs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtest/tw5reader.c Thu Sep 19 03:08:47 2024 +0000 @@ -0,0 +1,65 @@ +/* + * Here we implement our twts005_read_frame() function. + */ + +#include <ctype.h> +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <strings.h> +#include "tw5reader.h" + +static int decode_hex_digit(char c) +{ + if (isdigit(c)) + return c - '0'; + else if (isupper(c)) + return c - 'A' + 10; + else + return c - 'a' + 10; +} + +int twts005_read_frame(FILE *hexf, unsigned *lineno, uint8_t *frame, + unsigned *lenp) +{ + char linebuf[81]; + char *cp, *np; + uint8_t *dp; + unsigned len; + + for (;;) { + if (!fgets(linebuf, sizeof linebuf, hexf)) + return 0; + (*lineno)++; + if (!index(linebuf, '\n')) + return -2; + for (cp = linebuf; isspace(*cp); cp++) + ; + if (*cp != '\0' && *cp != '#') + break; + } + for (np = cp; *cp && !isspace(*cp); cp++) + ; + if (*cp) + *cp++ = '\0'; + while (isspace(*cp)) + cp++; + if (*cp != '\0' && *cp != '#') + return -1; + if (!strcasecmp(np, "NULL")) { + *lenp = 0; + return 1; + } + + dp = frame; + len = 0; + for (cp = np; *cp; cp += 2) { + if (!isxdigit(cp[0]) || !isxdigit(cp[1])) + return -1; + *dp++ = (decode_hex_digit(cp[0]) << 4) | + decode_hex_digit(cp[1]); + len++; + } + *lenp = len; + return 1; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtest/tw5reader.h Thu Sep 19 03:08:47 2024 +0000 @@ -0,0 +1,21 @@ +/* + * This header file defines the interface to our reader function for + * hexadecimal RTP frame sequence files in TW-TS-005 format. + * + * twts005_read_frame() return values are: + * 1 = successfully read valid frame + * 0 = normal EOF + * -1 = read line with invalid content + * -2 = line too long or missing newline + * + * The reader function skips blank, whitespace-only and comment lines, + * returning only actual frames. lineno variable must be initialized to 0 + * by the application program, but not touched otherwise. In case of an + * error, this variable will hold the line number at which the error was + * encountered. + */ + +#define TWTS005_MAX_FRAME 40 + +int twts005_read_frame(FILE *hexf, unsigned *lineno, uint8_t *frame, + unsigned *lenp);