FreeCalypso > hg > freecalypso-hwlab
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 } |