FreeCalypso > hg > fc-pcsc-tools
comparison simtool/pbupdate.c @ 11:62cdfed70de7
phone number encoding factored out of pb-update code
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Fri, 12 Feb 2021 01:08:20 +0000 |
| parents | a76ec3e7da09 |
| children | 8a34f5b7c812 |
comparison
equal
deleted
inserted
replaced
| 10:a76ec3e7da09 | 11:62cdfed70de7 |
|---|---|
| 43 0x04, 0x05, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, | 43 0x04, 0x05, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, |
| 44 0xFF, 0x7D, 0x08, 0xFF, 0xFF, 0xFF, 0x7C, 0xFF, /* 0xF0 */ | 44 0xFF, 0x7D, 0x08, 0xFF, 0xFF, 0xFF, 0x7C, 0xFF, /* 0xF0 */ |
| 45 0x0C, 0x06, 0xFF, 0xFF, 0x7E, 0xFF, 0xFF, 0xFF | 45 0x0C, 0x06, 0xFF, 0xFF, 0x7E, 0xFF, 0xFF, 0xFF |
| 46 }; | 46 }; |
| 47 | 47 |
| 48 static | |
| 49 digit_char_to_gsm(ch) | |
| 50 { | |
| 51 switch (ch) { | |
| 52 case '0': | |
| 53 case '1': | |
| 54 case '2': | |
| 55 case '3': | |
| 56 case '4': | |
| 57 case '5': | |
| 58 case '6': | |
| 59 case '7': | |
| 60 case '8': | |
| 61 case '9': | |
| 62 return (ch - '0'); | |
| 63 case '*': | |
| 64 return 0xA; | |
| 65 case '#': | |
| 66 return 0xB; | |
| 67 case 'a': | |
| 68 case 'b': | |
| 69 case 'c': | |
| 70 return (ch - 'a' + 0xC); | |
| 71 case 'A': | |
| 72 case 'B': | |
| 73 case 'C': | |
| 74 return (ch - 'A' + 0xC); | |
| 75 } | |
| 76 return (-1); | |
| 77 } | |
| 78 | |
| 79 static void | |
| 80 pack_digit_bytes(digits, dest, num_digit_bytes) | |
| 81 u_char *digits, *dest; | |
| 82 unsigned num_digit_bytes; | |
| 83 { | |
| 84 u_char *sp, *dp; | |
| 85 unsigned n; | |
| 86 | |
| 87 sp = digits; | |
| 88 dp = dest; | |
| 89 for (n = 0; n < num_digit_bytes; n++) { | |
| 90 *dp++ = sp[0] | (sp[1] << 4); | |
| 91 sp += 2; | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 static char * | 48 static char * |
| 96 decode_qstring_alpha(cp, record, maxlen, filename_for_errs, lineno_for_errs) | 49 decode_qstring_alpha(cp, record, maxlen, filename_for_errs, lineno_for_errs) |
| 97 char *cp, *filename_for_errs; | 50 char *cp, *filename_for_errs; |
| 98 u_char *record; | 51 u_char *record; |
| 99 unsigned maxlen; | 52 unsigned maxlen; |
| 314 fclose(inf); | 267 fclose(inf); |
| 315 return(0); | 268 return(0); |
| 316 } | 269 } |
| 317 | 270 |
| 318 static | 271 static |
| 319 decode_number_arg(arg, fixp) | |
| 320 char *arg; | |
| 321 u_char *fixp; | |
| 322 { | |
| 323 u_char digits[20]; | |
| 324 unsigned ndigits, num_digit_bytes; | |
| 325 char *cp, *endp; | |
| 326 int c; | |
| 327 | |
| 328 cp = arg; | |
| 329 if (*cp == '+') { | |
| 330 fixp[1] = 0x91; | |
| 331 cp++; | |
| 332 } else | |
| 333 fixp[1] = 0x81; | |
| 334 if (digit_char_to_gsm(*cp) < 0) { | |
| 335 inv_arg: fprintf(stderr, "error: invalid phone number argument\n"); | |
| 336 return(-1); | |
| 337 } | |
| 338 for (ndigits = 0; ; ndigits++) { | |
| 339 c = digit_char_to_gsm(*cp); | |
| 340 if (c < 0) | |
| 341 break; | |
| 342 cp++; | |
| 343 if (ndigits >= 20) { | |
| 344 fprintf(stderr, "error: too many number digits\n"); | |
| 345 return(-1); | |
| 346 } | |
| 347 digits[ndigits] = c; | |
| 348 } | |
| 349 if (ndigits & 1) | |
| 350 digits[ndigits++] = 0xF; | |
| 351 num_digit_bytes = ndigits >> 1; | |
| 352 fixp[0] = num_digit_bytes + 1; | |
| 353 pack_digit_bytes(digits, fixp + 2, num_digit_bytes); | |
| 354 if (*cp == ',') { | |
| 355 cp++; | |
| 356 if (!isdigit(*cp)) | |
| 357 goto inv_arg; | |
| 358 fixp[1] = strtoul(cp, &endp, 0); | |
| 359 if (*endp) | |
| 360 goto inv_arg; | |
| 361 } else if (*cp) | |
| 362 goto inv_arg; | |
| 363 return(0); | |
| 364 } | |
| 365 | |
| 366 static | |
| 367 decode_alphatag_arg(arg, record, maxlen) | 272 decode_alphatag_arg(arg, record, maxlen) |
| 368 char *arg; | 273 char *arg; |
| 369 u_char *record; | 274 u_char *record; |
| 370 unsigned maxlen; | 275 unsigned maxlen; |
| 371 { | 276 { |
| 436 fprintf(stderr, "error: specified record number is invalid\n"); | 341 fprintf(stderr, "error: specified record number is invalid\n"); |
| 437 return(-1); | 342 return(-1); |
| 438 } | 343 } |
| 439 memset(record, 0xFF, curfile_record_len); | 344 memset(record, 0xFF, curfile_record_len); |
| 440 fixp = record + curfile_record_len - 14; | 345 fixp = record + curfile_record_len - 14; |
| 441 rc = decode_number_arg(argv[3], fixp); | 346 rc = encode_phone_number_arg(argv[3], fixp); |
| 442 if (rc < 0) | 347 if (rc < 0) |
| 443 return(rc); | 348 return(rc); |
| 444 if (argv[4]) { | 349 if (argv[4]) { |
| 445 rc = decode_alphatag_arg(argv[4], record, | 350 rc = decode_alphatag_arg(argv[4], record, |
| 446 curfile_record_len - 14); | 351 curfile_record_len - 14); |
| 494 fprintf(stderr, "error: specified record number is invalid\n"); | 399 fprintf(stderr, "error: specified record number is invalid\n"); |
| 495 return(-1); | 400 return(-1); |
| 496 } | 401 } |
| 497 memset(record, 0xFF, curfile_record_len); | 402 memset(record, 0xFF, curfile_record_len); |
| 498 fixp = record + curfile_record_len - 14; | 403 fixp = record + curfile_record_len - 14; |
| 499 rc = decode_number_arg(argv[3], fixp); | 404 rc = encode_phone_number_arg(argv[3], fixp); |
| 500 if (rc < 0) | 405 if (rc < 0) |
| 501 return(rc); | 406 return(rc); |
| 502 rc = decode_alphatag_arg_hex(argv[4], record, curfile_record_len - 14); | 407 rc = decode_alphatag_arg_hex(argv[4], record, curfile_record_len - 14); |
| 503 if (rc < 0) | 408 if (rc < 0) |
| 504 return(rc); | 409 return(rc); |
