FreeCalypso > hg > freecalypso-tools
view tchtools/fc-vm2hex.c @ 965:2969032bdfac
fcup-smsend[mult]: fix buglet in K&R C NULL pointer passing
The only 100% safe way to pass a NULL pointer as a function argument
in K&R C is to cast 0 to a pointer type; failing to do so may cause
mysterious bugs (invalid stack frames or garbage in argument registers)
on 64-bit machines. This issue has already been fixed in most of
FC host tools, but I just found some missed spots: passing of NULL UDH
to PDU encoding functions in fcup-smsend[mult] in the case of single
(not concatenated) SMS.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 01 Sep 2023 07:33:51 +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); }