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); |