@@ -569,22 +569,37 @@ fn make_cpu(cmod: &Hash) -> Result<CpuBuilder> {
569569}
570570
571571/// Find left and right indices of enumeration token in specification string
572- fn spec_ind ( spec : & str ) -> ( usize , usize ) {
572+ ///
573+ /// # Examples
574+ ///
575+ /// ```ignore
576+ /// let cases = [
577+ /// ("RELOAD?", (6, 0)),
578+ /// ("TMR[1-57]_MUX", (3, 4)),
579+ /// ("DT[1-3]?", (2, 0)),
580+ /// ("GPIO[ABCDE]", (4, 0)),
581+ /// ("CSPT[1][7-9],CSPT[2][0-5]", (4, 0)),
582+ /// ];
583+ /// for (spec, (li, ri)) in cases {
584+ /// assert_eq!(spec_ind(spec), Some((li, ri)));
585+ /// }
586+ /// ```
587+ ///
588+ fn spec_ind ( spec : & str ) -> Option < ( usize , usize ) > {
589+ use once_cell:: sync:: Lazy ;
590+ use regex:: Regex ;
573591 let spec = spec. split ( ',' ) . next ( ) . unwrap_or ( spec) ;
574- let li = spec
575- . bytes ( )
576- . position ( |b| b == b'*' )
577- . or_else ( || spec. bytes ( ) . position ( |b| b == b'?' ) )
578- . or_else ( || spec. bytes ( ) . position ( |b| b == b'[' ) )
579- . unwrap ( ) ;
580- let ri = spec
581- . bytes ( )
582- . rev ( )
583- . position ( |b| b == b'*' )
584- . or_else ( || spec. bytes ( ) . rev ( ) . position ( |b| b == b'?' ) )
585- . or_else ( || spec. bytes ( ) . rev ( ) . position ( |b| b == b']' ) )
586- . unwrap ( ) ;
587- ( li, ri)
592+ static RE : Lazy < Regex > = Lazy :: new ( || {
593+ Regex :: new ( r"^\w*((?:[\?*]|\[\d+(?:-\d+)?\]|\[[a-zA-Z]+(?:-[a-zA-Z]+)?\])+)\w*$" ) . unwrap ( )
594+ } ) ;
595+ let Some ( caps) = RE . captures ( spec) else {
596+ return None ;
597+ } ;
598+ let spec = caps. get ( 0 ) . unwrap ( ) ;
599+ let token = caps. get ( 1 ) . unwrap ( ) ;
600+ let li = token. start ( ) ;
601+ let ri = spec. end ( ) - token. end ( ) ;
602+ Some ( ( li, ri) )
588603}
589604
590605fn check_offsets ( offsets : & [ u32 ] , dim_increment : u32 ) -> bool {
0 commit comments