FreeCalypso > hg > fc-pcsc-tools
annotate libcommon/alpha_fromfile.c @ 60:090704d1ddc1
simtool: C module implementing sst command renamed
from sstdump.c to sstlist.c
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sun, 14 Feb 2021 01:45:05 +0000 | 
| parents | 90e7020df08a | 
| children | 
| rev | line source | 
|---|---|
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 18 
2ef261371347
alpha tag from file parsing functions factored out of pb-update
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 2 * This module implements functions for parsing alpha tag strings | 
| 
2ef261371347
alpha tag from file parsing functions factored out of pb-update
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 3 * from input data files, to be used by commands like pb-update | 
| 
2ef261371347
alpha tag from file parsing functions factored out of pb-update
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 4 * and smsp-restore. | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 */ | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 #include <sys/types.h> | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include <ctype.h> | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include <stdio.h> | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 | 
| 12 
8a34f5b7c812
gsm7_encode_table[] factored out into libcommon
 Mychaela Falconia <falcon@freecalypso.org> parents: 
11diff
changeset | 11 extern u_char gsm7_encode_table[256]; | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 | 
| 18 
2ef261371347
alpha tag from file parsing functions factored out of pb-update
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 13 char * | 
| 
2ef261371347
alpha tag from file parsing functions factored out of pb-update
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 14 alpha_from_file_qstring(cp, record, maxlen, filename_for_errs, lineno_for_errs) | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 char *cp, *filename_for_errs; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 u_char *record; | 
| 10 
a76ec3e7da09
simtool/pbupdate.c: a little refactoring from fc-uicc-tool
 Mychaela Falconia <falcon@freecalypso.org> parents: 
1diff
changeset | 17 unsigned maxlen; | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 { | 
| 10 
a76ec3e7da09
simtool/pbupdate.c: a little refactoring from fc-uicc-tool
 Mychaela Falconia <falcon@freecalypso.org> parents: 
1diff
changeset | 19 unsigned acclen, nadd; | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 int c; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 for (acclen = 0; ; ) { | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 if (*cp == '\0') { | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 unterm_qstring: fprintf(stderr, | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 "%s line %d: unterminated quoted string\n", | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 filename_for_errs, lineno_for_errs); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 return(0); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 } | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 if (*cp == '"') | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 break; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 c = *cp++; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 if (c == '\\') { | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 if (*cp == '\0') | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 goto unterm_qstring; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 c = *cp++; | 
| 20 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 36 if (c >= '0' && c <= '7' && isxdigit(*cp)) { | 
| 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 37 c = ((c - '0') << 4) | decode_hex_digit(*cp++); | 
| 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 38 goto bypass_encoding; | 
| 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 39 } | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 switch (c) { | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 case 'n': | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 c = '\n'; | 
| 20 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 43 goto bypass_encoding; | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 case 'r': | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 c = '\r'; | 
| 20 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 46 goto bypass_encoding; | 
| 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 47 case 'e': | 
| 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 48 c = 0x1B; | 
| 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 49 goto bypass_encoding; | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 case '"': | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 case '\\': | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 break; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 default: | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 fprintf(stderr, | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 "%s line %d: non-understood backslash escape\n", | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 filename_for_errs, lineno_for_errs); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 return(0); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 } | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 } | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 c = gsm7_encode_table[c]; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 if (c == 0xFF) { | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 fprintf(stderr, | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 "%s line %d: character in quoted string cannot be encoded in GSM7\n", | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 filename_for_errs, lineno_for_errs); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 return(0); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 } | 
| 20 
90e7020df08a
GSM7 string parsers accept new bypass-encoding escapes
 Mychaela Falconia <falcon@freecalypso.org> parents: 
18diff
changeset | 67 bypass_encoding: | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 if (c & 0x80) | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 nadd = 2; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 else | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 nadd = 1; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 if (acclen + nadd > maxlen) { | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 fprintf(stderr, | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 "%s line %d: alpha tag string is longer than SIM limit\n", | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 filename_for_errs, lineno_for_errs); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 return(0); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 } | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 if (c & 0x80) | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 record[acclen++] = 0x1B; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 record[acclen++] = c & 0x7F; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 } | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 return(cp + 1); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 } | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 | 
| 18 
2ef261371347
alpha tag from file parsing functions factored out of pb-update
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 85 char * | 
| 
2ef261371347
alpha tag from file parsing functions factored out of pb-update
 Mychaela Falconia <falcon@freecalypso.org> parents: 
13diff
changeset | 86 alpha_from_file_hex(cp, record, maxlen, filename_for_errs, lineno_for_errs) | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 87 char *cp, *filename_for_errs; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 88 u_char *record; | 
| 10 
a76ec3e7da09
simtool/pbupdate.c: a little refactoring from fc-uicc-tool
 Mychaela Falconia <falcon@freecalypso.org> parents: 
1diff
changeset | 89 unsigned maxlen; | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 { | 
| 10 
a76ec3e7da09
simtool/pbupdate.c: a little refactoring from fc-uicc-tool
 Mychaela Falconia <falcon@freecalypso.org> parents: 
1diff
changeset | 91 unsigned acclen; | 
| 1 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 92 | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 93 for (acclen = 0; ; ) { | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 94 if (!isxdigit(cp[0]) || !isxdigit(cp[1])) | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 95 break; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 96 if (acclen >= maxlen) { | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 97 fprintf(stderr, | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 98 "%s line %d: alpha tag string is longer than SIM limit\n", | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 99 filename_for_errs, lineno_for_errs); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 100 return(0); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 101 } | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 102 record[acclen++] = (decode_hex_digit(cp[0]) << 4) | | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 103 decode_hex_digit(cp[1]); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 104 cp += 2; | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 105 } | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 106 return(cp); | 
| 
2071b28cd0c7
simtool: first refactored version
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 107 } | 
