@@ -575,7 +575,6 @@ bool SMB_E_NUMBER_FP(parse &s)
575575
576576#endif
577577
578- static std::string last_label_name;
579578bool SMB_E_LABEL_DEF (parse &s)
580579{
581580 s.debug (" E_LABEL_DEF" );
@@ -584,10 +583,11 @@ bool SMB_E_LABEL_DEF(parse &s)
584583 if ( !s.get_ident (name) )
585584 return false ;
586585 if ( v.find (name) == v.end () )
587- v[name] = VT_UNDEF ;
588- if ( v[name] != VT_UNDEF )
586+ v[name] = labelType () ;
587+ if ( v[name]. is_defined () )
589588 return false ;
590- last_label_name = name;
589+ s.last_label = name;
590+ s.current_params = 0 ;
591591 s.add_text (name);
592592 s.emit_label (" fb_lbl_" + name);
593593 return true ;
@@ -597,61 +597,81 @@ bool SMB_E_LABEL(parse &s)
597597{
598598 s.debug (" E_LABEL" );
599599 // Get type
600- enum VarType type = get_vartype (s.remove_last ().get_str ());
601- auto &v = s. labels ;
600+ auto ltype = labelType (s.remove_last ().get_str ());
601+ // Get identifier
602602 std::string name;
603603 if ( !s.get_ident (name) )
604604 return false ;
605- if ( v.find (name) == v.end () )
605+ auto it = s.labels .find (name);
606+ if ( it == s.labels .end () )
606607 return false ;
607608 // Check type
608- if ( v[name] != type )
609+ if ( it-> second != ltype )
609610 return false ;
610611 s.add_text (name);
611612 s.emit_word (" fb_lbl_" + name);
612613 return true ;
613614}
614615
616+ bool SMB_E_COUNT_PARAM (parse &s)
617+ {
618+ s.debug (" E_COUNT_PARAM" );
619+ s.current_params ++;
620+ return false ;
621+ }
622+
615623// Called in EXEC, creates a label if not exists, if already exists checks
616624// that it is a PROC.
617625bool SMB_E_LABEL_CREATE (parse &s)
618626{
619627 s.debug (" E_LABEL_CREATE" );
620- // Get type
621- auto &v = s.labels ;
622628 std::string name;
623629 if ( !s.get_ident (name) )
624630 return false ;
625- // Create if not exists
626- if ( v.find (name) == v.end () )
627- v[name] = VT_UNDEF;
631+ // Get type, create if not exists
632+ auto &v = s.labels [name];
628633 // Check type
629- if ( v[name] != VT_UNDEF )
634+ if ( !v. is_proc () )
630635 return false ;
631636 // Store variable name
632637 s.add_text (name);
633638 s.last_label = name;
639+ s.current_params = 0 ;
634640 return true ;
635641}
636642
637643bool SMB_E_DO_EXEC (parse &s)
638644{
645+ int pnum = s.current_params ;
639646 s.debug (" E_DO_EXEC" );
647+ auto &l = s.labels [s.last_label ];
648+ if ( !l.add_proc_params (pnum) )
649+ throw parse_error (" invalid number of parameters in EXEC, expected " +
650+ std::to_string (l.num_params ()) + " , got "
651+ + std::to_string (pnum) , s.pos );
640652 s.emit_word (" fb_lbl_" + s.last_label );
641653 return true ;
642654}
643655
656+ bool SMB_E_PROC_CHECK (parse &s)
657+ {
658+ int pnum = s.current_params - 1 ;
659+ s.debug (" E_PROC_CHECK" );
660+ auto &l = s.labels [s.last_label ];
661+ if ( !l.add_proc_params (pnum) )
662+ throw parse_error (" invalid number of parameters in PROC, expected " +
663+ std::to_string (l.num_params ()) + " , got "
664+ + std::to_string (pnum) , s.pos );
665+ l.define ();
666+ return true ;
667+ }
668+
644669bool SMB_E_LABEL_SET_TYPE (parse &s)
645670{
646671 s.debug (" E_LABEL_SET_TYPE" );
647-
648672 s.skipws ();
649673 // Get type
650- enum VarType type = get_vartype (s.remove_last ().get_str ());
651- auto &v = s.labels ;
652- if ( do_debug )
653- std::cout << " \t set label '" << last_label_name << " ' to " << int (type) << " \n " ;
654- v[last_label_name] = (v[last_label_name] & ~0xFF ) + type;
674+ s.labels [s.last_label ] = labelType (s.remove_last ().get_str ());
655675 return true ;
656676}
657677
0 commit comments