FreeCalypso > hg > gsm-codec-lib
diff libtest/tw5reader.c @ 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 | libtest/binreader.c@820d88b97924 |
children |
line wrap: on
line diff
--- /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; +}