comparison simtool/pbupdate.c @ 117:06e2d5c60cbd

fc-simtool: pb-update-imm command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 28 Jan 2021 03:41:06 +0000
parents 5bfb5a7262c1
children 70219d92c32e
comparison
equal deleted inserted replaced
116:c8685074c845 117:06e2d5c60cbd
311 } 311 }
312 } 312 }
313 fclose(inf); 313 fclose(inf);
314 return(0); 314 return(0);
315 } 315 }
316
317 static
318 decode_number_arg(arg, fixp)
319 char *arg;
320 u_char *fixp;
321 {
322 u_char digits[20];
323 unsigned ndigits, num_digit_bytes;
324 char *cp, *endp;
325 int c;
326
327 cp = arg;
328 if (*cp == '+') {
329 fixp[1] = 0x91;
330 cp++;
331 } else
332 fixp[1] = 0x81;
333 if (digit_char_to_gsm(*cp) < 0) {
334 inv_arg: fprintf(stderr, "error: invalid phone number argument\n");
335 return(-1);
336 }
337 for (ndigits = 0; ; ndigits++) {
338 c = digit_char_to_gsm(*cp);
339 if (c < 0)
340 break;
341 cp++;
342 if (ndigits >= 20) {
343 fprintf(stderr, "error: too many number digits\n");
344 return(-1);
345 }
346 digits[ndigits] = c;
347 }
348 if (ndigits & 1)
349 digits[ndigits++] = 0xF;
350 num_digit_bytes = ndigits >> 1;
351 fixp[0] = num_digit_bytes + 1;
352 pack_digit_bytes(digits, fixp + 2, num_digit_bytes);
353 if (*cp == ',') {
354 cp++;
355 if (!isdigit(*cp))
356 goto inv_arg;
357 fixp[1] = strtoul(cp, &endp, 0);
358 if (*endp)
359 goto inv_arg;
360 } else if (*cp)
361 goto inv_arg;
362 return(0);
363 }
364
365 static
366 decode_alphatag_arg(arg, record)
367 char *arg;
368 u_char *record;
369 {
370 unsigned maxlen, acclen, nadd;
371 char *cp;
372 int c;
373
374 maxlen = curfile_record_len - 14;
375 cp = arg;
376 for (acclen = 0; *cp; ) {
377 c = *cp++;
378 if (c == '\\') {
379 if (*cp == '\0') {
380 fprintf(stderr,
381 "error: danging backslash escape\n");
382 return(-1);
383 }
384 c = *cp++;
385 switch (c) {
386 case 'n':
387 c = '\n';
388 break;
389 case 'r':
390 c = '\r';
391 break;
392 case '"':
393 case '\\':
394 break;
395 default:
396 fprintf(stderr,
397 "error: non-understood backslash escape\n");
398 return(-1);
399 }
400 }
401 c = gsm7_encode_table[c];
402 if (c == 0xFF) {
403 fprintf(stderr,
404 "error: character in alpha tag string cannot be encoded in GSM7\n");
405 return(-1);
406 }
407 if (c & 0x80)
408 nadd = 2;
409 else
410 nadd = 1;
411 if (acclen + nadd > maxlen) {
412 fprintf(stderr,
413 "error: alpha tag string is longer than SIM limit\n");
414 return(-1);
415 }
416 if (c & 0x80)
417 record[acclen++] = 0x1B;
418 record[acclen++] = c & 0x7F;
419 }
420 return(0);
421 }
422
423 cmd_pb_update_imm(argc, argv)
424 char **argv;
425 {
426 int rc;
427 unsigned recno;
428 u_char record[255], *fixp;
429
430 rc = phonebook_op_common(argv[1]);
431 if (rc < 0)
432 return(rc);
433 recno = strtoul(argv[2], 0, 0);
434 if (recno < 1 || recno > curfile_record_count) {
435 fprintf(stderr, "error: specified record number is invalid\n");
436 return(-1);
437 }
438 memset(record, 0xFF, curfile_record_len);
439 fixp = record + curfile_record_len - 14;
440 rc = decode_number_arg(argv[3], fixp);
441 if (rc < 0)
442 return(rc);
443 if (argv[4]) {
444 rc = decode_alphatag_arg(argv[4], record);
445 if (rc < 0)
446 return(rc);
447 }
448 return update_rec_op(recno, 0x04, record, curfile_record_len);
449 }