# HG changeset patch # User Mychaela Falconia # Date 1726715327 0 # Node ID 4d2cccaeb4a76a4f44a0c0a8a180bbd4ad064694 # Parent 68fe269b43164c0f792f49dbd9d06dff558c7986 libtest: implement TW-TS-005 reader function Spec reference: https://www.freecalypso.org/specs/tw-ts-005-v010002.txt diff -r 68fe269b4316 -r 4d2cccaeb4a7 libtest/Makefile --- 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 diff -r 68fe269b4316 -r 4d2cccaeb4a7 libtest/tw5reader.c --- /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 +#include +#include +#include +#include +#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; +} diff -r 68fe269b4316 -r 4d2cccaeb4a7 libtest/tw5reader.h --- /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);