@@ -517,9 +517,10 @@ F4_Index_PeekTokenSubKind(F4_Index_ParseCtx *ctx, int sub_kind, Token **token_ou
517
517
return result;
518
518
}
519
519
520
- internal void
520
+ internal b32
521
521
F4_Index_SeekToken (F4_Index_ParseCtx *ctx, String_Const_u8 string)
522
522
{
523
+ b32 found = 0 ;
523
524
Token_Iterator_Array it_restore = ctx->it ;
524
525
for (;;)
525
526
{
@@ -529,6 +530,7 @@ F4_Index_SeekToken(F4_Index_ParseCtx *ctx, String_Const_u8 string)
529
530
String_Const_u8 token_string = F4_Index_StringFromToken (ctx, token);
530
531
if (string_match (token_string, string))
531
532
{
533
+ found = 1 ;
532
534
break ;
533
535
}
534
536
}
@@ -541,7 +543,11 @@ F4_Index_SeekToken(F4_Index_ParseCtx *ctx, String_Const_u8 string)
541
543
break ;
542
544
}
543
545
}
544
- ctx->it = it_restore;
546
+ if (found == 0 )
547
+ {
548
+ ctx->it = it_restore;
549
+ }
550
+ return found;
545
551
}
546
552
547
553
internal void
@@ -571,7 +577,8 @@ F4_Index_SkipSoftTokens(F4_Index_ParseCtx *ctx, b32 preproc)
571
577
Token *token = token_it_read (&ctx->it );
572
578
if (preproc)
573
579
{
574
- if (!(token->flags & TokenBaseFlag_PreprocessorBody))
580
+ if (!(token->flags & TokenBaseFlag_PreprocessorBody) ||
581
+ token->kind == TokenBaseKind_Preprocessor)
575
582
{
576
583
break ;
577
584
}
@@ -592,6 +599,122 @@ F4_Index_SkipSoftTokens(F4_Index_ParseCtx *ctx, b32 preproc)
592
599
}
593
600
}
594
601
602
+ internal void
603
+ F4_Index_SkipOpTokens (F4_Index_ParseCtx *ctx)
604
+ {
605
+ int paren_nest = 0 ;
606
+ for (;!ctx->done ;)
607
+ {
608
+ Token *token = token_it_read (&ctx->it );
609
+ if (token->kind == TokenBaseKind_ParentheticalOpen)
610
+ {
611
+ paren_nest += 1 ;
612
+ }
613
+ else if (token->kind == TokenBaseKind_ParentheticalClose)
614
+ {
615
+ paren_nest -= 1 ;
616
+ if (paren_nest < 0 )
617
+ {
618
+ paren_nest = 0 ;
619
+ }
620
+ }
621
+ else if (token->kind != TokenBaseKind_Operator && paren_nest == 0 )
622
+ {
623
+ break ;
624
+ }
625
+ F4_Index_ParseCtx_Inc (ctx, F4_Index_TokenSkipFlag_SkipWhitespace);
626
+ }
627
+ }
628
+
629
+ function b32
630
+ F4_Index_ParsePattern (F4_Index_ParseCtx *ctx, char *fmt, ...)
631
+ {
632
+ b32 parsed = 1 ;
633
+
634
+ F4_Index_ParseCtx ctx_restore = *ctx;
635
+ F4_Index_TokenSkipFlags flags = F4_Index_TokenSkipFlag_SkipWhitespace;
636
+
637
+ va_list args;
638
+ va_start (args, fmt);
639
+ for (int i = 0 ; fmt[i];)
640
+ {
641
+ if (fmt[i] == ' %' )
642
+ {
643
+ switch (fmt[i+1 ])
644
+ {
645
+ case ' t' :
646
+ {
647
+ char *cstring = va_arg (args, char *);
648
+ String8 string = SCu8 ((u8 *)cstring, cstring_length (cstring));
649
+ parsed = parsed && F4_Index_RequireToken (ctx, string, flags);
650
+ }break ;
651
+
652
+ case ' k' :
653
+ {
654
+ Token_Base_Kind kind = va_arg (args, Token_Base_Kind);
655
+ Token **output_token = va_arg (args, Token **);
656
+ parsed = parsed && F4_Index_RequireTokenKind (ctx, kind, output_token, flags);
657
+ }break ;
658
+
659
+ case ' b' :
660
+ {
661
+ i16 kind = va_arg (args, i16 );
662
+ Token **output_token = va_arg (args, Token **);
663
+ parsed = parsed && F4_Index_RequireTokenSubKind (ctx, kind, output_token, flags);
664
+ }break ;
665
+
666
+ case ' n' :
667
+ {
668
+ F4_Index_NoteKind kind = va_arg (args, F4_Index_NoteKind);
669
+ F4_Index_Note **output_note = va_arg (args, F4_Index_Note **);
670
+ Token *token = 0 ;
671
+ parsed = parsed && F4_Index_RequireTokenKind (ctx, TokenBaseKind_Identifier, &token, flags);
672
+ parsed = parsed && !!token;
673
+ if (parsed)
674
+ {
675
+ String8 token_string = F4_Index_StringFromToken (ctx, token);
676
+ F4_Index_Note *note = F4_Index_LookupNote (token_string, 0 );
677
+ if (note && note->kind == kind)
678
+ {
679
+ *output_note = note;
680
+ parsed = 1 ;
681
+ }
682
+ else
683
+ {
684
+ parsed = 0 ;
685
+ }
686
+ }
687
+ }break ;
688
+
689
+ case ' s' :
690
+ {
691
+ F4_Index_SkipSoftTokens (ctx, 0 );
692
+ }break ;
693
+
694
+ case ' o' :
695
+ {
696
+ F4_Index_SkipOpTokens (ctx);
697
+ }break ;
698
+
699
+ default : break ;
700
+ }
701
+ i += 1 ;
702
+ }
703
+ else
704
+ {
705
+ i += 1 ;
706
+ }
707
+ }
708
+
709
+ va_end (args);
710
+
711
+ if (parsed == 0 )
712
+ {
713
+ *ctx = ctx_restore;
714
+ }
715
+ return parsed;
716
+ }
717
+
595
718
internal void
596
719
F4_Index_Tick (Application_Links *app)
597
720
{
0 commit comments