1717#include "vstring.h"
1818#include "htable.h"
1919#include "fname.h"
20+ #include "ptrarray.h"
2021
2122#include <string.h> /* strerror */
2223#include <stdlib.h> /* exit */
@@ -707,17 +708,37 @@ static void printVersion(void)
707708 exit (0 );
708709}
709710
711+ static void deleteInputSpec (void * data )
712+ {
713+ struct inputSpec * inputSpec = data ;
714+ if (inputSpec -> tempFileName )
715+ {
716+ remove (inputSpec -> tempFileName );
717+ eFree (inputSpec -> tempFileName );
718+ }
719+ eFree (data );
720+ }
721+
722+ static void addInputSpec (ptrArray * inputSpecs , const char * name )
723+ {
724+ struct inputSpec * i = eMalloc (sizeof (struct inputSpec ));
725+
726+ i -> tagFileName = name ;
727+ i -> tempFileName = NULL ;
728+
729+ ptrArrayAdd (inputSpecs , i );
730+ }
731+
710732extern int main (int argc , char * * argv )
711733{
712734 int i ;
713735 int ignore_prefix = 0 ;
714736
715737 tagPrintOptions printOpts ;
716738 readOptions readOpts ;
717- struct inputSpec inputSpec = {
718- .tagFileName = "tags" ,
719- .tempFileName = NULL ,
720- };
739+
740+ ptrArray * inputSpecs = ptrArrayNew (deleteInputSpec );
741+
721742 struct actionSpec actionSpec = {
722743 .action = ACTION_NONE ,
723744 .name = NULL ,
@@ -801,7 +822,7 @@ extern int main (int argc, char **argv)
801822 else if (strcmp (optname , "tag - file ") == 0 )
802823 {
803824 if (i + 1 < argc )
804- inputSpec . tagFileName = argv [++ i ];
825+ addInputSpec ( inputSpecs , argv [++ i ]) ;
805826 else
806827 printUsage (stderr , 1 );
807828 }
@@ -934,11 +955,12 @@ extern int main (int argc, char **argv)
934955 case 't' :
935956 if (arg [j + 1 ] != '\0' )
936957 {
937- inputSpec .tagFileName = arg + j + 1 ;
938- j += strlen (inputSpec .tagFileName );
958+ const char * tname = arg + j + 1 ;
959+ addInputSpec (inputSpecs , tname );
960+ j += strlen (tname );
939961 }
940962 else if (i + 1 < argc )
941- inputSpec . tagFileName = argv [++ i ];
963+ addInputSpec ( inputSpecs , argv [++ i ]) ;
942964 else
943965 printUsage (stderr , 1 );
944966 break ;
@@ -1010,22 +1032,38 @@ extern int main (int argc, char **argv)
10101032 exit (1 );
10111033 }
10121034
1013- if (actionSpec .action & ACTION_LIST_PTAGS )
1035+ if (ptrArrayIsEmpty (inputSpecs ))
1036+ addInputSpec (inputSpecs , "tags" );
1037+
1038+ for (unsigned int i = 0 ; i < ptrArrayCount (inputSpecs ); i ++ )
10141039 {
1015- if (actionSpec .canonicalizing )
1016- actionSpec .canon .ptags = true;
1017- listTags (& inputSpec , 1 , & printOpts ,
1018- actionSpec .canonicalizing ? & actionSpec .canon : NULL );
1019- if (actionSpec .canonicalizing )
1020- actionSpec .canon .ptags = false;
1040+ struct inputSpec * inputSpec = ptrArrayItem (inputSpecs , i );
1041+
1042+ if (actionSpec .action & ACTION_LIST_PTAGS )
1043+ {
1044+ if (actionSpec .canonicalizing )
1045+ actionSpec .canon .ptags = true;
1046+ listTags (inputSpec , 1 , & printOpts ,
1047+ actionSpec .canonicalizing ? & actionSpec .canon : NULL );
1048+ if (actionSpec .canonicalizing )
1049+ actionSpec .canon .ptags = false;
1050+ }
1051+
1052+ if (actionSpec .action & ACTION_FIND )
1053+ findTag (inputSpec , actionSpec .name , & readOpts , & printOpts ,
1054+ actionSpec .canonicalizing ? & actionSpec .canon : NULL );
1055+ else if (actionSpec .action & ACTION_LIST )
1056+ listTags (inputSpec , 0 , & printOpts ,
1057+ actionSpec .canonicalizing ? & actionSpec .canon : NULL );
1058+
1059+ if (actionSpec .canon .cacheTable )
1060+ {
1061+ canonFnameCacheTableDelete (actionSpec .canon .cacheTable );
1062+ actionSpec .canon .cacheTable = NULL ;
1063+ }
10211064 }
10221065
1023- if (actionSpec .action & ACTION_FIND )
1024- findTag (& inputSpec , actionSpec .name , & readOpts , & printOpts ,
1025- actionSpec .canonicalizing ? & actionSpec .canon : NULL );
1026- else if (actionSpec .action & ACTION_LIST )
1027- listTags (& inputSpec , 0 , & printOpts ,
1028- actionSpec .canonicalizing ? & actionSpec .canon : NULL );
1066+ ptrArrayDelete (inputSpecs );
10291067
10301068#ifdef READTAGS_DSL
10311069 if (Qualifier )
@@ -1036,13 +1074,5 @@ extern int main (int argc, char **argv)
10361074 f_destroy (Formatter );
10371075#endif
10381076
1039- if (actionSpec .canon .cacheTable )
1040- canonFnameCacheTableDelete (actionSpec .canon .cacheTable );
1041-
1042- if (inputSpec .tempFileName )
1043- {
1044- remove (inputSpec .tempFileName );
1045- eFree (inputSpec .tempFileName );
1046- }
10471077 return 0 ;
10481078}
0 commit comments