FreeCalypso > hg > freecalypso-tools
view tchtools/fc-vm2hex.c @ 963:b515a97e5dff
sms-pdu-decode family: fix VP-Relative header spacing
When VP-Relative is small enough to be reckoned in 5 min or 30 min units,
it was printed incorrectly, with a cosmetic defect of one extra space.
Fix this bug.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 28 Aug 2023 03:52:53 +0000 |
parents | 5041bcb8140f |
children |
line wrap: on
line source
/* * This utility converts old-fashioned (non-AMR) TCS211 voice memo files * read out of FFS into hex strings that can be analyzed by a human, * either directly or with the aid of gsmfr-dlcap-parse utility from * Themyscira Wireless GSM codec libraries & utilities package. */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> char *infname; FILE *inf, *outf; static unsigned get_word() { u_char b[2]; int i, c; for (i = 0; i < 2; i++) { c = getc(inf); if (c < 0) { fprintf(stderr, "error: premature EOF in %s\n", infname); exit(1); } b[i] = c; } return((b[1] << 8) | b[0]); } convert_speech_sample() { u_char bytes[34]; int i, dp; unsigned word; dp = 0; for (i = 0; i < 17; i++) { word = get_word(); bytes[dp++] = word >> 8; bytes[dp++] = word; } for (i = 0; i < 33; i++) fprintf(outf, "%02X", bytes[i]); } main(argc, argv) char **argv; { unsigned first_word; if (argc < 2 || argc > 3) { fprintf(stderr, "usage: %s infile [outfile]\n", argv[0]); exit(1); } infname = argv[1]; inf = fopen(infname, "r"); if (!inf) { perror(infname); exit(1); } if (argc > 2) { outf = fopen(argv[2], "w"); if (!outf) { perror(argv[2]); exit(1); } } else outf = stdout; for (;;) { first_word = get_word(); if (first_word == 0xFBFF) /* SC_VM_END_MASK */ break; fprintf(outf, "%04X", first_word); if (first_word & 0x8000) { /* B_VM_SPEECH */ fprintf(outf, " %04X", get_word()); fprintf(outf, " %04X", get_word()); putc(' ', outf); convert_speech_sample(); } putc('\n', outf); } exit(0); }