FreeCalypso > hg > fc-sim-tools
view libutil/alpha_fromfile.c @ 93:6041c601304d
fcsim1-mkprov: revert OTA key addition
It appears that GrcardSIM2 cards (which is what we got for FCSIM1)
do not support OTA after all, contrary to what we were previously
led to believe by some tech support emails from Grcard - apparently
those support emails and OTA descriptions referred to some other
card model(s).
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Wed, 21 Apr 2021 05:38:39 +0000 | 
| parents | 4c475732660b | 
| children | 
line wrap: on
 line source
/* * This module implements functions for parsing alpha tag strings * from input data files, to be used by commands like pb-update * and smsp-restore. */ #include <sys/types.h> #include <ctype.h> #include <stdio.h> extern u_char gsm7_encode_table[256]; char * alpha_from_file_qstring(cp, record, maxlen, filename_for_errs, lineno_for_errs) char *cp, *filename_for_errs; u_char *record; unsigned maxlen; { unsigned acclen, nadd; int c; for (acclen = 0; ; ) { if (*cp == '\0') { unterm_qstring: fprintf(stderr, "%s line %d: unterminated quoted string\n", filename_for_errs, lineno_for_errs); return(0); } if (*cp == '"') break; c = *cp++; if (c == '\\') { if (*cp == '\0') goto unterm_qstring; c = *cp++; if (c >= '0' && c <= '7' && isxdigit(*cp)) { c = ((c - '0') << 4) | decode_hex_digit(*cp++); goto bypass_encoding; } switch (c) { case 'n': c = '\n'; goto bypass_encoding; case 'r': c = '\r'; goto bypass_encoding; case 'e': c = 0x1B; goto bypass_encoding; case 'E': /* Euro currency symbol */ c = 0xE5; goto bypass_encoding; case '"': case '\\': break; default: fprintf(stderr, "%s line %d: non-understood backslash escape\n", filename_for_errs, lineno_for_errs); return(0); } } c = gsm7_encode_table[c]; if (c == 0xFF) { fprintf(stderr, "%s line %d: character in quoted string cannot be encoded in GSM7\n", filename_for_errs, lineno_for_errs); return(0); } bypass_encoding: if (c & 0x80) nadd = 2; else nadd = 1; if (acclen + nadd > maxlen) { fprintf(stderr, "%s line %d: alpha tag string is longer than SIM limit\n", filename_for_errs, lineno_for_errs); return(0); } if (c & 0x80) record[acclen++] = 0x1B; record[acclen++] = c & 0x7F; } return(cp + 1); } char * alpha_from_file_hex(cp, record, maxlen, filename_for_errs, lineno_for_errs) char *cp, *filename_for_errs; u_char *record; unsigned maxlen; { unsigned acclen; for (acclen = 0; ; ) { if (!isxdigit(cp[0]) || !isxdigit(cp[1])) break; if (acclen >= maxlen) { fprintf(stderr, "%s line %d: alpha tag string is longer than SIM limit\n", filename_for_errs, lineno_for_errs); return(0); } record[acclen++] = (decode_hex_digit(cp[0]) << 4) | decode_hex_digit(cp[1]); cp += 2; } return(cp); }
