@@ -469,10 +469,14 @@ void debugger_commands::execute_print(const std::vector<std::string_view> ¶m
469
469
mini_printf - safe printf to a buffer
470
470
-------------------------------------------------*/
471
471
472
- bool debugger_commands::mini_printf (std::ostream &stream, std::string_view format, int params, u64 *param )
472
+ bool debugger_commands::mini_printf (std::ostream &stream, const std::vector<std:: string_view> & params)
473
473
{
474
+ std::string_view format (params[0 ]);
474
475
auto f = format.begin ();
475
476
477
+ int param = 1 ;
478
+ u64 number;
479
+
476
480
// parse the string looking for % signs
477
481
while (f != format.end ())
478
482
{
@@ -517,68 +521,55 @@ bool debugger_commands::mini_printf(std::ostream &stream, std::string_view forma
517
521
break ;
518
522
519
523
case ' X' :
524
+ if (param < params.size () && m_console.validate_number_parameter (params[param++], number))
525
+ util::stream_format (stream, zerofill ? " %0*X" : " %*X" , width, number);
526
+ else
527
+ {
528
+ m_console.printf (" Not enough parameters for format!\n " );
529
+ return false ;
530
+ }
531
+ break ;
520
532
case ' x' :
521
- if (params == 0 )
533
+ if (param < params.size () && m_console.validate_number_parameter (params[param++], number))
534
+ util::stream_format (stream, zerofill ? " %0*x" : " %*x" , width, number);
535
+ else
522
536
{
523
537
m_console.printf (" Not enough parameters for format!\n " );
524
538
return false ;
525
539
}
526
- if (u32 (*param >> 32 ) != 0 )
527
- util::stream_format (stream, zerofill ? " %0*X" : " %*X" , (width <= 8 ) ? 1 : width - 8 , u32 (*param >> 32 ));
528
- else if (width > 8 )
529
- util::stream_format (stream, zerofill ? " %0*X" : " %*X" , width - 8 , 0 );
530
- util::stream_format (stream, zerofill ? " %0*X" : " %*X" , (width < 8 ) ? width : 8 , u32 (*param));
531
- param++;
532
- params--;
533
540
break ;
534
541
535
542
case ' O' :
536
543
case ' o' :
537
- if (params == 0 )
544
+ if (param < params.size () && m_console.validate_number_parameter (params[param++], number))
545
+ util::stream_format (stream, zerofill ? " %0*o" : " %*o" , width, number);
546
+ else
538
547
{
539
548
m_console.printf (" Not enough parameters for format!\n " );
540
549
return false ;
541
550
}
542
- if (u32 (*param >> 60 ) != 0 )
543
- {
544
- util::stream_format (stream, zerofill ? " %0*o" : " %*o" , (width <= 20 ) ? 1 : width - 20 , u32 (*param >> 60 ));
545
- util::stream_format (stream, " %0*o" , 10 , u32 (BIT (*param, 30 , 30 )));
546
- }
547
- else
548
- {
549
- if (width > 20 )
550
- util::stream_format (stream, zerofill ? " %0*o" : " %*o" , width - 20 , 0 );
551
- if (u32 (BIT (*param, 30 , 30 )) != 0 )
552
- util::stream_format (stream, zerofill ? " %0*o" : " %*o" , (width <= 10 ) ? 1 : width - 10 , u32 (BIT (*param, 30 , 30 )));
553
- else if (width > 10 )
554
- util::stream_format (stream, zerofill ? " %0*o" : " %*o" , width - 10 , 0 );
555
- }
556
- util::stream_format (stream, zerofill ? " %0*o" : " %*o" , (width < 10 ) ? width : 10 , u32 (BIT (*param, 0 , 30 )));
557
- param++;
558
- params--;
559
551
break ;
560
552
561
553
case ' D' :
562
554
case ' d' :
563
- if (params == 0 )
555
+ if (param < params.size () && m_console.validate_number_parameter (params[param++], number))
556
+ util::stream_format (stream, zerofill ? " %0*d" : " %*d" , width, number);
557
+ else
564
558
{
565
559
m_console.printf (" Not enough parameters for format!\n " );
566
560
return false ;
567
561
}
568
- util::stream_format (stream, zerofill ? " %0*d" : " %*d" , width, u32 (*param));
569
- param++;
570
- params--;
571
562
break ;
563
+
572
564
case ' C' :
573
565
case ' c' :
574
- if (params == 0 )
566
+ if (param < params.size () && m_console.validate_number_parameter (params[param++], number))
567
+ stream << char (number);
568
+ else
575
569
{
576
570
m_console.printf (" Not enough parameters for format!\n " );
577
571
return false ;
578
572
}
579
- stream << char (*param);
580
- param++;
581
- params--;
582
573
break ;
583
574
584
575
}
@@ -630,15 +621,9 @@ void debugger_commands::execute_index_command(std::vector<std::string_view> cons
630
621
631
622
void debugger_commands::execute_printf (const std::vector<std::string_view> ¶ms)
632
623
{
633
- /* validate the other parameters */
634
- u64 values[MAX_COMMAND_PARAMS];
635
- for (int i = 1 ; i < params.size (); i++)
636
- if (!m_console.validate_number_parameter (params[i], values[i]))
637
- return ;
638
-
639
624
/* then do a printf */
640
625
std::ostringstream buffer;
641
- if (mini_printf (buffer, params[ 0 ], params. size () - 1 , &values[ 1 ] ))
626
+ if (mini_printf (buffer, params))
642
627
m_console.printf (" %s\n " , std::move (buffer).str ());
643
628
}
644
629
@@ -649,15 +634,9 @@ void debugger_commands::execute_printf(const std::vector<std::string_view> ¶
649
634
650
635
void debugger_commands::execute_logerror (const std::vector<std::string_view> ¶ms)
651
636
{
652
- /* validate the other parameters */
653
- u64 values[MAX_COMMAND_PARAMS];
654
- for (int i = 1 ; i < params.size (); i++)
655
- if (!m_console.validate_number_parameter (params[i], values[i]))
656
- return ;
657
-
658
637
/* then do a printf */
659
638
std::ostringstream buffer;
660
- if (mini_printf (buffer, params[ 0 ], params. size () - 1 , &values[ 1 ] ))
639
+ if (mini_printf (buffer, params))
661
640
m_machine.logerror (" %s" , std::move (buffer).str ());
662
641
}
663
642
@@ -668,15 +647,9 @@ void debugger_commands::execute_logerror(const std::vector<std::string_view> &pa
668
647
669
648
void debugger_commands::execute_tracelog (const std::vector<std::string_view> ¶ms)
670
649
{
671
- /* validate the other parameters */
672
- u64 values[MAX_COMMAND_PARAMS];
673
- for (int i = 1 ; i < params.size (); i++)
674
- if (!m_console.validate_number_parameter (params[i], values[i]))
675
- return ;
676
-
677
650
/* then do a printf */
678
651
std::ostringstream buffer;
679
- if (mini_printf (buffer, params[ 0 ], params. size () - 1 , &values[ 1 ] ))
652
+ if (mini_printf (buffer, params))
680
653
m_console.get_visible_cpu ()->debug ()->trace_printf (" %s" , std::move (buffer).str ());
681
654
}
682
655
@@ -689,7 +662,6 @@ void debugger_commands::execute_tracesym(const std::vector<std::string_view> &pa
689
662
{
690
663
// build a format string appropriate for the parameters and validate them
691
664
std::stringstream format;
692
- u64 values[MAX_COMMAND_PARAMS];
693
665
for (int i = 0 ; i < params.size (); i++)
694
666
{
695
667
// find this symbol
@@ -704,15 +676,15 @@ void debugger_commands::execute_tracesym(const std::vector<std::string_view> &pa
704
676
util::stream_format (format, " %s=%s " ,
705
677
params[i],
706
678
sym->format ().empty () ? " %16X" : sym->format ());
707
-
708
- // validate the parameter
709
- if (!m_console.validate_number_parameter (params[i], values[i]))
710
- return ;
711
679
}
712
680
681
+ // build parameters for printf
682
+ std::vector<std::string_view> printf_params (params);
683
+ printf_params.insert (printf_params.begin (), format.str ());
684
+
713
685
// then do a printf
714
686
std::ostringstream buffer;
715
- if (mini_printf (buffer, format. str (), params. size (), values ))
687
+ if (mini_printf (buffer, printf_params ))
716
688
m_console.get_visible_cpu ()->debug ()->trace_printf (" %s" , std::move (buffer).str ());
717
689
}
718
690
0 commit comments