@@ -454,31 +454,88 @@ ssize_t ATHandler::read_bytes(uint8_t *buf, size_t len)
454
454
return read_len;
455
455
}
456
456
457
- ssize_t ATHandler::read (char *buf, size_t size, bool read_even_stop_tag, bool hex )
457
+ ssize_t ATHandler::read_string (char *buf, size_t size, bool read_even_stop_tag)
458
458
{
459
459
if (_last_err || !_stop_tag || (_stop_tag->found && read_even_stop_tag == false )) {
460
460
return -1 ;
461
461
}
462
462
463
+ consume_char (' \" ' );
464
+
465
+ if (_last_err) {
466
+ return -1 ;
467
+ }
468
+
469
+ size_t len = 0 ;
470
+ size_t match_pos = 0 ;
471
+
472
+ for (; len < (size - 1 + match_pos); len++) {
473
+ int c = get_char ();
474
+ if (c == -1 ) {
475
+ set_error (NSAPI_ERROR_DEVICE_ERROR);
476
+ return -1 ;
477
+ } else if (c == _delimiter) {
478
+ buf[len] = ' \0 ' ;
479
+ break ;
480
+ } else if (c == ' \" ' ) {
481
+ match_pos = 0 ;
482
+ len--;
483
+ continue ;
484
+ } else if (_stop_tag->len && c == _stop_tag->tag [match_pos]) {
485
+ match_pos++;
486
+ if (match_pos == _stop_tag->len ) {
487
+ _stop_tag->found = true ;
488
+ // remove tag from string if it was matched
489
+ len -= (_stop_tag->len - 1 );
490
+ buf[len] = ' \0 ' ;
491
+ break ;
492
+ }
493
+ } else if (match_pos) {
494
+ match_pos = 0 ;
495
+ }
496
+
497
+ buf[len] = c;
498
+ }
499
+
500
+ if (len && (len == size - 1 + match_pos)) {
501
+ buf[len] = ' \0 ' ;
502
+ }
503
+
504
+ return len;
505
+ }
506
+
507
+ ssize_t ATHandler::read_hex_string (char *buf, size_t size)
508
+ {
509
+ if (_last_err || !_stop_tag || _stop_tag->found ) {
510
+ return -1 ;
511
+ }
512
+
463
513
size_t match_pos = 0 ;
464
- size_t read_size = hex ? size * 2 : size;
465
514
466
515
consume_char (' \" ' );
467
516
517
+ if (_last_err) {
518
+ return -1 ;
519
+ }
520
+
468
521
size_t read_idx = 0 ;
469
522
size_t buf_idx = 0 ;
470
523
char hexbuf[2 ];
471
524
472
- for (; read_idx < (read_size + match_pos) ; read_idx++) {
525
+ for (; read_idx < size * 2 + match_pos; read_idx++) {
473
526
int c = get_char ();
474
- buf_idx = hex ? read_idx / 2 : read_idx;
527
+
528
+ if (match_pos) {
529
+ buf_idx++;
530
+ } else {
531
+ buf_idx = read_idx / 2 ;
532
+ }
533
+
475
534
if (c == -1 ) {
476
- buf[buf_idx] = ' \0 ' ;
477
535
set_error (NSAPI_ERROR_DEVICE_ERROR);
478
536
return -1 ;
479
537
}
480
538
if (c == _delimiter) {
481
- buf[buf_idx] = ' \0 ' ;
482
539
break ;
483
540
} else if (c == ' \" ' ) {
484
541
match_pos = 0 ;
@@ -490,14 +547,13 @@ ssize_t ATHandler::read(char *buf, size_t size, bool read_even_stop_tag, bool he
490
547
_stop_tag->found = true ;
491
548
// remove tag from string if it was matched
492
549
buf_idx -= (_stop_tag->len - 1 );
493
- buf[buf_idx] = ' \0 ' ;
494
550
break ;
495
551
}
496
552
} else if (match_pos) {
497
553
match_pos = 0 ;
498
554
}
499
555
500
- if (!hex ) {
556
+ if (match_pos ) {
501
557
buf[buf_idx] = c;
502
558
} else {
503
559
hexbuf[read_idx % 2 ] = c;
@@ -507,17 +563,11 @@ ssize_t ATHandler::read(char *buf, size_t size, bool read_even_stop_tag, bool he
507
563
}
508
564
}
509
565
510
- return buf_idx;
511
- }
512
-
513
- ssize_t ATHandler::read_string (char *buf, size_t size, bool read_even_stop_tag)
514
- {
515
- return read (buf, size, read_even_stop_tag, false );
516
- }
566
+ if (read_idx && (read_idx == size * 2 + match_pos)) {
567
+ buf_idx++;
568
+ }
517
569
518
- ssize_t ATHandler::read_hex_string (char *buf, size_t size)
519
- {
520
- return read (buf, size, false , true );
570
+ return buf_idx;
521
571
}
522
572
523
573
int32_t ATHandler::read_int ()
0 commit comments