annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
522
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
2 * Here we implement our twts005_read_frame() function.
10
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 */
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4
522
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
5 #include <ctype.h>
10
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <stdio.h>
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <stdint.h>
522
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
8 #include <string.h>
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
9 #include <strings.h>
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
10 #include "tw5reader.h"
10
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
522
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
12 static int decode_hex_digit(char c)
10
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 {
522
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
14 if (isdigit(c))
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
15 return c - '0';
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
16 else if (isupper(c))
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
17 return c - 'A' + 10;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
18 else
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
19 return c - 'a' + 10;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
20 }
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
21
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
22 int twts005_read_frame(FILE *hexf, unsigned *lineno, uint8_t *frame,
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
23 unsigned *lenp)
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
24 {
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
25 char linebuf[81];
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
26 char *cp, *np;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
27 uint8_t *dp;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
28 unsigned len;
10
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29
522
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
30 for (;;) {
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
31 if (!fgets(linebuf, sizeof linebuf, hexf))
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
32 return 0;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
33 (*lineno)++;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
34 if (!index(linebuf, '\n'))
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
35 return -2;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
36 for (cp = linebuf; isspace(*cp); cp++)
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
37 ;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
38 if (*cp != '\0' && *cp != '#')
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
39 break;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
40 }
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
41 for (np = cp; *cp && !isspace(*cp); cp++)
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
42 ;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
43 if (*cp)
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
44 *cp++ = '\0';
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
45 while (isspace(*cp))
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
46 cp++;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
47 if (*cp != '\0' && *cp != '#')
10
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 return -1;
522
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
49 if (!strcasecmp(np, "NULL")) {
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
50 *lenp = 0;
10
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 return 1;
522
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
52 }
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
53
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
54 dp = frame;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
55 len = 0;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
56 for (cp = np; *cp; cp += 2) {
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
57 if (!isxdigit(cp[0]) || !isxdigit(cp[1]))
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
58 return -1;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
59 *dp++ = (decode_hex_digit(cp[0]) << 4) |
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
60 decode_hex_digit(cp[1]);
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
61 len++;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
62 }
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
63 *lenp = len;
4d2cccaeb4a7 libtest: implement TW-TS-005 reader function
Mychaela Falconia <falcon@freecalypso.org>
parents: 10
diff changeset
64 return 1;
10
820d88b97924 libtest: implement binary file reader
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 }