@@ -471,7 +471,7 @@ void debugger_commands::execute_print(const std::vector<std::string_view> ¶m
471
471
472
472
bool debugger_commands::mini_printf (std::ostream &stream, const std::vector<std::string_view> ¶ms)
473
473
{
474
- std::string_view format (params[0 ]);
474
+ std::string_view const format (params[0 ]);
475
475
auto f = format.begin ();
476
476
477
477
int param = 1 ;
@@ -499,21 +499,48 @@ bool debugger_commands::mini_printf(std::ostream &stream, const std::vector<std:
499
499
// formatting
500
500
else if (c == ' %' )
501
501
{
502
+ bool left_justify = false ;
503
+ bool zero_fill = false ;
502
504
int width = 0 ;
503
- int zerofill = 0 ;
505
+ int precision = 0 ;
504
506
505
- // parse out the width
506
- while (f != format.end () && *f >= ' 0 ' && *f < = ' 9 ' )
507
+ // parse optional left justification flag
508
+ if (f != format.end () && *f = = ' - ' )
507
509
{
508
- c = *f++;
509
- if (c == ' 0' && width == 0 )
510
- zerofill = 1 ;
511
- width = width * 10 + (c - ' 0' );
510
+ left_justify = true ;
511
+ f++;
512
+ }
513
+
514
+ // parse optional zero fill flag
515
+ if (f != format.end () && *f == ' 0' )
516
+ {
517
+ zero_fill = true ;
518
+ f++;
519
+ }
520
+
521
+ // parse optional width
522
+ while (f != format.end () && isdigit (*f))
523
+ width = width * 10 + (*f++ - ' 0' );
524
+ if (f == format.end ())
525
+ break ;
526
+
527
+ // apply left justification
528
+ if (left_justify)
529
+ width = -width;
530
+
531
+ if ((c = *f++) == ' .' )
532
+ {
533
+ // parse optional precision
534
+ while (f != format.end () && isdigit (*f))
535
+ precision = precision * 10 + (*f++ - ' 0' );
536
+
537
+ // get the format
538
+ if (f != format.end ())
539
+ c = *f++;
540
+ else
541
+ break ;
512
542
}
513
- if (f == format.end ()) break ;
514
543
515
- // get the format
516
- c = *f++;
517
544
switch (c)
518
545
{
519
546
case ' %' :
@@ -522,7 +549,7 @@ bool debugger_commands::mini_printf(std::ostream &stream, const std::vector<std:
522
549
523
550
case ' X' :
524
551
if (param < params.size () && m_console.validate_number_parameter (params[param++], number))
525
- util::stream_format (stream, zerofill ? " %0*X" : " %*X" , width, number);
552
+ util::stream_format (stream, zero_fill ? " %0*X" : " %*X" , width, number);
526
553
else
527
554
{
528
555
m_console.printf (" Not enough parameters for format!\n " );
@@ -531,7 +558,7 @@ bool debugger_commands::mini_printf(std::ostream &stream, const std::vector<std:
531
558
break ;
532
559
case ' x' :
533
560
if (param < params.size () && m_console.validate_number_parameter (params[param++], number))
534
- util::stream_format (stream, zerofill ? " %0*x" : " %*x" , width, number);
561
+ util::stream_format (stream, zero_fill ? " %0*x" : " %*x" , width, number);
535
562
else
536
563
{
537
564
m_console.printf (" Not enough parameters for format!\n " );
@@ -542,7 +569,7 @@ bool debugger_commands::mini_printf(std::ostream &stream, const std::vector<std:
542
569
case ' O' :
543
570
case ' o' :
544
571
if (param < params.size () && m_console.validate_number_parameter (params[param++], number))
545
- util::stream_format (stream, zerofill ? " %0*o" : " %*o" , width, number);
572
+ util::stream_format (stream, zero_fill ? " %0*o" : " %*o" , width, number);
546
573
else
547
574
{
548
575
m_console.printf (" Not enough parameters for format!\n " );
@@ -553,7 +580,7 @@ bool debugger_commands::mini_printf(std::ostream &stream, const std::vector<std:
553
580
case ' D' :
554
581
case ' d' :
555
582
if (param < params.size () && m_console.validate_number_parameter (params[param++], number))
556
- util::stream_format (stream, zerofill ? " %0*d" : " %*d" , width, number);
583
+ util::stream_format (stream, zero_fill ? " %0*d" : " %*d" , width, number);
557
584
else
558
585
{
559
586
m_console.printf (" Not enough parameters for format!\n " );
@@ -572,6 +599,38 @@ bool debugger_commands::mini_printf(std::ostream &stream, const std::vector<std:
572
599
}
573
600
break ;
574
601
602
+ case ' s' :
603
+ {
604
+ address_space *space;
605
+ if (param < params.size () && m_console.validate_target_address_parameter (params[param++], -1 , space, number))
606
+ {
607
+ address_space *tspace;
608
+ std::string s;
609
+
610
+ for (u32 address = u32 (number), taddress; space->device ().memory ().translate (space->spacenum (), device_memory_interface::TR_READ, taddress = address, tspace); address++)
611
+ {
612
+ u8 const data = tspace->read_byte (taddress);
613
+
614
+ if (!data)
615
+ break ;
616
+
617
+ s += data;
618
+
619
+ if (precision == 1 )
620
+ break ;
621
+ else if (precision)
622
+ precision--;
623
+ }
624
+
625
+ util::stream_format (stream, " %*s" , width, s);
626
+ }
627
+ else
628
+ {
629
+ m_console.printf (" Not enough parameters for format!\n " );
630
+ return false ;
631
+ }
632
+ }
633
+ break ;
575
634
}
576
635
}
577
636
0 commit comments