@@ -60,6 +60,9 @@ struct actionSpec {
60
60
const char * name ; /* for ACTION_FIND */
61
61
bool canonicalizing ;
62
62
struct canonWorkArea canon ;
63
+ ptrArray * tagEntryArray ;
64
+ void (* walkerfn ) (const tagEntry * , void * );
65
+ void * dataForWalkerFn ;
63
66
};
64
67
65
68
static const char * ProgramName ;
@@ -179,10 +182,7 @@ static void walkTags (tagFile *const file, tagEntry *first_entry,
179
182
void (* actionfn ) (const tagEntry * , void * ), void * data ,
180
183
struct actionSpec * actionSpec )
181
184
{
182
- ptrArray * a = NULL ;
183
-
184
- if (Sorter )
185
- a = ptrArrayNew ((ptrArrayDeleteFunc )freeCopiedTag );
185
+ ptrArray * a = actionSpec -> tagEntryArray ;
186
186
187
187
do
188
188
{
@@ -230,14 +230,8 @@ static void walkTags (tagFile *const file, tagEntry *first_entry,
230
230
231
231
if (a )
232
232
{
233
- ptrArraySort (a , compareTagEntry );
234
- unsigned int count = ptrArrayCount (a );
235
- for (unsigned int i = 0 ; i < count ; i ++ )
236
- {
237
- tagEntry * e = ptrArrayItem (a , i );
238
- (* actionfn ) (e , data );
239
- }
240
- ptrArrayDelete (a );
233
+ actionSpec -> walkerfn = actionfn ;
234
+ actionSpec -> dataForWalkerFn = data ;
241
235
}
242
236
}
243
237
#else
@@ -687,6 +681,9 @@ extern int main (int argc, char **argv)
687
681
.ptags = false,
688
682
/* .absoluteOnly = false, */
689
683
},
684
+ .tagEntryArray = NULL ,
685
+ .walkerfn = NULL ,
686
+ .dataForWalkerFn = NULL ,
690
687
};
691
688
692
689
ProgramName = argv [0 ];
@@ -967,6 +964,11 @@ extern int main (int argc, char **argv)
967
964
exit (1 );
968
965
}
969
966
967
+ #ifdef READTAGS_DSL
968
+ if (Sorter )
969
+ actionSpec .tagEntryArray = ptrArrayNew ((ptrArrayDeleteFunc )freeCopiedTag );
970
+ #endif
971
+
970
972
if (actionSpec .action & ACTION_LIST_PTAGS )
971
973
{
972
974
if (actionSpec .canonicalizing )
@@ -981,6 +983,22 @@ extern int main (int argc, char **argv)
981
983
else if (actionSpec .action & ACTION_LIST )
982
984
listTags (& inputSpec , false, & printOpts , & actionSpec );
983
985
986
+ if (actionSpec .tagEntryArray )
987
+ {
988
+ #ifdef READTAGS_DSL
989
+ if (Sorter )
990
+ ptrArraySort (actionSpec .tagEntryArray , compareTagEntry );
991
+ #endif
992
+
993
+ const size_t entry_count = ptrArrayCount (actionSpec .tagEntryArray );
994
+ for (unsigned int i = 0 ; i < entry_count ; i ++ )
995
+ {
996
+ tagEntry * e = ptrArrayItem (actionSpec .tagEntryArray , i );
997
+ actionSpec .walkerfn (e , actionSpec .dataForWalkerFn );
998
+ }
999
+ ptrArrayDelete (actionSpec .tagEntryArray );
1000
+ }
1001
+
984
1002
#ifdef READTAGS_DSL
985
1003
if (Qualifier )
986
1004
q_destroy (Qualifier );
0 commit comments