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