FreeCalypso > hg > gsm-codec-lib
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 |
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 } |