From 31b7b0efb14064cb675eb4bb8f1302661ea98e3b Mon Sep 17 00:00:00 2001
From: Max Smolens <max.smolens@kitware.com>
Date: Wed, 24 Feb 2016 18:11:56 -0500
Subject: [PATCH] python: Update wrapping tool to support multiple hierarchy
 and hint files

To keep the argument parsing code simple, each hierarchy and hint file has to be
specified using a dedicated --types.

This change is backwards compatible. Deprecated members and functions are marked
with "XXX DEPRECATED".

Co-authored-by: Jean-Christophe Fillion-Robin <jchris.fillionr@kitware.com>
Co-authored-by: Max Smolens <max.smolens@kitware.com>
---
 Wrapping/Tools/vtkParseHierarchy.c | 74 ++++++++++++++++++++++--------
 Wrapping/Tools/vtkParseHierarchy.h | 11 ++++-
 Wrapping/Tools/vtkParseJava.c      |  5 +-
 Wrapping/Tools/vtkParseJavaBeans.c |  5 +-
 Wrapping/Tools/vtkParseMain.c      | 68 ++++++++++++++++++---------
 Wrapping/Tools/vtkParseMain.h      | 15 +++---
 Wrapping/Tools/vtkParseMerge.c     | 52 +++++++++++----------
 Wrapping/Tools/vtkParseMerge.h     |  3 +-
 Wrapping/Tools/vtkWrap.c           |  2 +-
 Wrapping/Tools/vtkWrapJava.c       |  5 +-
 Wrapping/Tools/vtkWrapPython.c     |  5 +-
 Wrapping/Tools/vtkWrapPythonInit.c |  3 +-
 Wrapping/Tools/vtkWrapTcl.c        |  5 +-
 13 files changed, 167 insertions(+), 86 deletions(-)

diff --git a/Wrapping/Tools/vtkParseHierarchy.c b/Wrapping/Tools/vtkParseHierarchy.c
index e4053455f05..0a22bd46219 100644
--- a/Wrapping/Tools/vtkParseHierarchy.c
+++ b/Wrapping/Tools/vtkParseHierarchy.c
@@ -102,6 +102,10 @@ static void sort_hierarchy_entries(HierarchyInfo *info)
         &compare_hierarchy_entries);
 }
 
+/* forward declaration */
+static int vtkParseHierarchy_ReadFileIntoInfo(
+  HierarchyInfo* info, const char *filename);
+
 /* Find an entry with a binary search */
 HierarchyEntry *vtkParseHierarchy_FindEntry(
   const HierarchyInfo *info, const char *classname)
@@ -153,13 +157,53 @@ HierarchyEntry *vtkParseHierarchy_FindEntry(
   return entry;
 }
 
-
-/* read a hierarchy file into a HeirarchyInfo struct, or return NULL */
+/* read a hierarchy file into a HeirarchyInfo struct, or return NULL
+ * XXX DEPRECATED; use vtkParseHierarchy_ReadFiles
+ */
 HierarchyInfo *vtkParseHierarchy_ReadFile(const char *filename)
+{
+  char *fn = (char *)filename;
+  return vtkParseHierarchy_ReadFiles(1, &fn);
+}
+
+/* read hierarchy files into a HierarchyInfo struct, or return NULL */
+HierarchyInfo *vtkParseHierarchy_ReadFiles(int n, char **filenames)
 {
   HierarchyInfo *info;
+  int currentFile = 0;
+
+  info = (HierarchyInfo *)malloc(sizeof(HierarchyInfo));
+  info->MaxNumberOfEntries = 500;
+  info->NumberOfEntries = 0;
+  info->Entries =
+    (HierarchyEntry *)malloc(info->MaxNumberOfEntries*sizeof(HierarchyEntry));
+  info->Strings = (StringCache *)malloc(sizeof(StringCache));
+  vtkParse_InitStringCache(info->Strings);
+
+  for (currentFile = 0; currentFile < n; currentFile++)
+    {
+    if (!vtkParseHierarchy_ReadFileIntoInfo(info, filenames[currentFile]))
+      {
+      vtkParseHierarchy_Free(info);
+      info = NULL;
+      break;
+      }
+    }
+
+  if (info)
+    {
+    sort_hierarchy_entries(info);
+    }
+
+  return info;
+}
+
+/* read hierarchy file into a HierarchyInfo struct, return 1 if success */
+static int vtkParseHierarchy_ReadFileIntoInfo(
+  HierarchyInfo* info, const char *filename)
+{
   HierarchyEntry *entry;
-  int maxClasses = 500;
+
   FILE *fp;
   char *line;
   char *cp;
@@ -168,22 +212,17 @@ HierarchyInfo *vtkParseHierarchy_ReadFile(const char *filename)
   size_t i, j, n, m;
   unsigned int bits, pointers;
   static const char *delims = ">,=";
+  int success = 1;
 
   fp = fopen(filename, "r");
 
   if (fp == NULL)
     {
-    return NULL;
+    return 0;
     }
 
   line = (char *)malloc(maxlen);
 
-  info = (HierarchyInfo *)malloc(sizeof(HierarchyInfo));
-  info->NumberOfEntries = 0;
-  info->Entries = (HierarchyEntry *)malloc(maxClasses*sizeof(HierarchyEntry));
-  info->Strings = (StringCache *)malloc(sizeof(StringCache));
-  vtkParse_InitStringCache(info->Strings);
-
   while (fgets(line, (int)maxlen, fp))
     {
     n = strlen(line);
@@ -208,11 +247,11 @@ HierarchyInfo *vtkParseHierarchy_ReadFile(const char *filename)
       continue;
       }
 
-    if (info->NumberOfEntries == maxClasses)
+    if (info->NumberOfEntries == info->MaxNumberOfEntries)
       {
-      maxClasses *= 2;
+      info->MaxNumberOfEntries *= 2;
       info->Entries = (HierarchyEntry *)realloc(
-        info->Entries, sizeof(HierarchyEntry)*maxClasses*2);
+        info->Entries, sizeof(HierarchyEntry)*info->MaxNumberOfEntries);
       }
 
     entry = &info->Entries[info->NumberOfEntries++];
@@ -523,17 +562,12 @@ HierarchyInfo *vtkParseHierarchy_ReadFile(const char *filename)
 
   if (!feof(fp))
     {
-    vtkParseHierarchy_Free(info);
-    info = NULL;
-    }
-  else
-    {
-    sort_hierarchy_entries(info);
+    success = 0;
     }
 
   fclose(fp);
 
-  return info;
+  return success;
 }
 
 /* free a HierarchyInfo struct */
diff --git a/Wrapping/Tools/vtkParseHierarchy.h b/Wrapping/Tools/vtkParseHierarchy.h
index 6edef615f31..e194f7cb207 100644
--- a/Wrapping/Tools/vtkParseHierarchy.h
+++ b/Wrapping/Tools/vtkParseHierarchy.h
@@ -69,6 +69,7 @@ typedef struct _HierarchyEntry
  */
 typedef struct _HierarchyInfo
 {
+  int             MaxNumberOfEntries;
   int             NumberOfEntries;
   HierarchyEntry *Entries;
   StringCache    *Strings;
@@ -79,10 +80,16 @@ extern "C" {
 #endif
 
 /**
- * Read a hierarchy file into a HeirarchyInfo struct, or return NULL
- */
+* Read a hierarchy file into a HeirarchyInfo struct, or return NULL
+* XXX DEPRECATED; use vtkParseHierarchy_ReadFiles
+*/
 HierarchyInfo *vtkParseHierarchy_ReadFile(const char *filename);
 
+/**
+ * Read hierarchy files into a HierarchyInfo struct, or return NULL
+ */
+HierarchyInfo *vtkParseHierarchy_ReadFiles(int n, char **filenames);
+
 /**
  * Free a HierarchyInfo struct
  */
diff --git a/Wrapping/Tools/vtkParseJava.c b/Wrapping/Tools/vtkParseJava.c
index 41a6b94e5c1..f59c9cea506 100644
--- a/Wrapping/Tools/vtkParseJava.c
+++ b/Wrapping/Tools/vtkParseJava.c
@@ -859,9 +859,10 @@ int main(int argc, char *argv[])
     }
 
   /* get the hierarchy info for accurate typing */
-  if (options->HierarchyFileName)
+  if (options->HierarchyFileNames)
     {
-    hierarchyInfo = vtkParseHierarchy_ReadFile(options->HierarchyFileName);
+    hierarchyInfo = vtkParseHierarchy_ReadFiles(
+      options->NumberOfHierarchyFileNames, options->HierarchyFileNames);
     if (hierarchyInfo)
       {
       /* resolve using declarations within the header files */
diff --git a/Wrapping/Tools/vtkParseJavaBeans.c b/Wrapping/Tools/vtkParseJavaBeans.c
index 6fb49a72c06..e2e92479c46 100644
--- a/Wrapping/Tools/vtkParseJavaBeans.c
+++ b/Wrapping/Tools/vtkParseJavaBeans.c
@@ -682,9 +682,10 @@ void vtkParseOutput(FILE *fp, FileInfo *file_info)
   options = vtkParse_GetCommandLineOptions();
 
   /* get the hierarchy info for accurate typing */
-  if (options->HierarchyFileName)
+  if (options->HierarchyFileNames)
     {
-    hierarchyInfo = vtkParseHierarchy_ReadFile(options->HierarchyFileName);
+    hierarchyInfo = vtkParseHierarchy_ReadFiles(
+      options->NumberOfHierarchyFileNames, options->HierarchyFileNames);
     }
 
   fprintf(fp,"// java wrapper for %s object\n//\n",data->Name);
diff --git a/Wrapping/Tools/vtkParseMain.c b/Wrapping/Tools/vtkParseMain.c
index a41c7f070f2..b9063ce3aea 100644
--- a/Wrapping/Tools/vtkParseMain.c
+++ b/Wrapping/Tools/vtkParseMain.c
@@ -267,7 +267,10 @@ static int parse_check_options(int argc, char *argv[], int multi)
   options.InputFileName = NULL;
   options.OutputFileName = NULL;
   options.HierarchyFileName = 0;
-  options.HintFileName = 0;
+  options.NumberOfHierarchyFileNames = 0;
+  options.HierarchyFileNames = NULL;
+  options.NumberOfHintFileNames = 0;
+  options.HintFileNames = NULL;
 
   for (i = 1; i < argc; i++)
     {
@@ -336,7 +339,16 @@ static int parse_check_options(int argc, char *argv[], int multi)
         {
         return -1;
         }
-      options.HintFileName = argv[i];
+      if (options.NumberOfHintFileNames == 0)
+        {
+        options.HintFileNames = (char **)malloc(sizeof(char *));
+        }
+      else if ((options.NumberOfHintFileNames & (options.NumberOfHintFileNames - 1)) == 0)
+        {
+        options.HintFileNames = (char **)realloc(
+          options.HintFileNames, 2 * options.NumberOfHintFileNames*sizeof(char *));
+        }
+      options.HintFileNames[options.NumberOfHintFileNames++] = argv[i];
       }
     else if (!multi && strcmp(argv[i], "--types") == 0)
       {
@@ -345,7 +357,17 @@ static int parse_check_options(int argc, char *argv[], int multi)
         {
         return -1;
         }
-      options.HierarchyFileName = argv[i];
+      if (options.NumberOfHierarchyFileNames == 0)
+        {
+        options.HierarchyFileNames = (char **)malloc(sizeof(char *));
+        options.HierarchyFileName = argv[i]; // legacy
+        }
+      else if ((options.NumberOfHierarchyFileNames & (options.NumberOfHierarchyFileNames - 1)) == 0)
+        {
+        options.HierarchyFileNames = (char **)realloc(
+          options.HierarchyFileNames, 2*options.NumberOfHierarchyFileNames*sizeof(char *));
+        }
+      options.HierarchyFileNames[options.NumberOfHierarchyFileNames++] = argv[i];
       }
     else if (strcmp(argv[i], "--vtkobject") == 0 ||
              strcmp(argv[i], "--special") == 0 ||
@@ -373,6 +395,9 @@ FileInfo *vtkParse_Main(int argc, char *argv[])
   int expected_files;
   FILE *ifile;
   FILE *hfile = 0;
+  int nhfiles;
+  int ihfiles;
+  const char *hfilename;
   FileInfo *data;
   StringCache strings;
   int argn;
@@ -423,32 +448,17 @@ FileInfo *vtkParse_Main(int argc, char *argv[])
   /* free the expanded args */
   free(args);
 
-  /* open the hint file, if given on the command line */
-  if (options.HintFileName && options.HintFileName[0] != '\0')
-    {
-    if (!(hfile = fopen(options.HintFileName, "r")))
-      {
-      fprintf(stderr, "Error opening hint file %s\n", options.HintFileName);
-      fclose(ifile);
-      exit(1);
-      }
-    }
-
   /* make sure than an output file was given on the command line */
   if (options.OutputFileName == NULL)
     {
     fprintf(stderr, "No output file was specified\n");
     fclose(ifile);
-    if (hfile)
-      {
-      fclose(hfile);
-      }
     exit(1);
     }
 
   /* if a hierarchy is was given, then BTX/ETX can be ignored */
   vtkParse_SetIgnoreBTX(0);
-  if (options.HierarchyFileName)
+  if (options.HierarchyFileNames)
     {
     vtkParse_SetIgnoreBTX(1);
     }
@@ -461,10 +471,24 @@ FileInfo *vtkParse_Main(int argc, char *argv[])
     exit(1);
     }
 
-  /* fill in some blanks by using the hints file */
-  if (hfile)
+  /* open and parse each hint file, if given on the command line */
+  nhfiles = options.NumberOfHintFileNames;
+  for (ihfiles = 0; ihfiles < nhfiles; ihfiles++)
     {
-    vtkParse_ReadHints(data, hfile, stderr);
+    hfilename = options.HintFileNames[ihfiles];
+    if (hfilename && hfilename[0] != '\0')
+      {
+      if (!(hfile = fopen(hfilename, "r")))
+        {
+        fprintf(stderr, "Error opening hint file %s\n", hfilename);
+        fclose(ifile);
+        vtkParse_FreeFile(data);
+        exit(1);
+        }
+
+      /* fill in some blanks by using the hints file */
+      vtkParse_ReadHints(data, hfile, stderr);
+      }
     }
 
   if (data->MainClass)
diff --git a/Wrapping/Tools/vtkParseMain.h b/Wrapping/Tools/vtkParseMain.h
index 4362fb8004b..847b155914e 100644
--- a/Wrapping/Tools/vtkParseMain.h
+++ b/Wrapping/Tools/vtkParseMain.h
@@ -51,12 +51,15 @@
  */
 typedef struct _OptionInfo
 {
-  int           NumberOfFiles;     /* the total number of file arguments */
-  char        **Files;             /* all of the file arguments */
-  char         *InputFileName;     /* the first file argument */
-  char         *OutputFileName;    /* the second file, or the "-o" file */
-  char         *HintFileName;      /* the file preceded by "--hints" */
-  char         *HierarchyFileName; /* the file preceded by "--types" */
+  int           NumberOfFiles;      /* the total number of file arguments */
+  char        **Files;              /* all of the file arguments */
+  char         *InputFileName;      /* the first file argument */
+  char         *OutputFileName;     /* the second file, or the "-o" file */
+  int           NumberOfHintFileNames; /* the total number of hints arguments */
+  char        **HintFileNames;      /* all of the hints arguments */
+  char         *HierarchyFileName;  /* the file preceded by "--types" XXX DEPRECATED */
+  int           NumberOfHierarchyFileNames; /* the total number of types argument */
+  char        **HierarchyFileNames; /* the file preceded by "--types" */
 } OptionInfo;
 
 #ifdef __cplusplus
diff --git a/Wrapping/Tools/vtkParseMerge.c b/Wrapping/Tools/vtkParseMerge.c
index f8494a33929..8fe55bdf92a 100644
--- a/Wrapping/Tools/vtkParseMerge.c
+++ b/Wrapping/Tools/vtkParseMerge.c
@@ -518,7 +518,8 @@ int vtkParseMerge_Merge(
  * superclasses to "merge" */
 void vtkParseMerge_MergeHelper(
   FileInfo *finfo, const NamespaceInfo *data, const HierarchyInfo *hinfo,
-  const char *classname, FILE *hintfile, MergeInfo *info, ClassInfo *merge)
+  const char *classname, int nhintfiles, char **hintfiles, MergeInfo *info,
+  ClassInfo *merge)
 {
   FILE *fp = NULL;
   ClassInfo *cinfo = NULL;
@@ -532,6 +533,9 @@ void vtkParseMerge_MergeHelper(
   const char *filename;
   int i, j, n, m;
   int recurse;
+  FILE *hintfile = NULL;
+  int ihintfiles = 0;
+  const char *hintfilename = NULL;
 
   /* Note: this method does not deal with scoping yet.
    * "classname" might be a scoped name, in which case the
@@ -597,7 +601,6 @@ void vtkParseMerge_MergeHelper(
     header = entry->HeaderFile;
     if (!header)
       {
-      if (hintfile) { fclose(hintfile); }
       fprintf(stderr, "Null header file for class %s!\n", classname);
       exit(1);
       }
@@ -605,7 +608,6 @@ void vtkParseMerge_MergeHelper(
     filename = vtkParse_FindIncludeFile(header);
     if (!filename)
       {
-      if (hintfile) { fclose(hintfile); }
       fprintf(stderr, "Couldn't locate header file %s\n", header);
       exit(1);
       }
@@ -613,7 +615,6 @@ void vtkParseMerge_MergeHelper(
     fp = fopen(filename, "r");
     if (!fp)
       {
-      if (hintfile) { fclose(hintfile); }
       fprintf(stderr, "Couldn't open header file %s\n", header);
       exit(1);
       }
@@ -623,14 +624,27 @@ void vtkParseMerge_MergeHelper(
 
     if (!finfo)
       {
-      if (hintfile) { fclose(hintfile); }
       exit(1);
       }
 
-    if (hintfile)
+    if (nhintfiles > 0 && hintfiles)
       {
-      rewind(hintfile);
-      vtkParse_ReadHints(finfo, hintfile, stderr);
+      for (ihintfiles = 0; ihintfiles < nhintfiles; ihintfiles++)
+        {
+        hintfilename = hintfiles[ihintfiles];
+        if (hintfilename && hintfilename[0] != '\0')
+          {
+          if (!(hintfile = fopen(hintfilename, "r")))
+            {
+            fprintf(stderr, "Error opening hint file %s\n", hintfilename);
+            vtkParse_FreeFile(finfo);
+            exit(1);
+            }
+
+          vtkParse_ReadHints(finfo, hintfile, stderr);
+          fclose(hintfile);
+          }
+        }
       }
 
     data = finfo->Contents;
@@ -709,7 +723,7 @@ void vtkParseMerge_MergeHelper(
       for (i = 0; i < n; i++)
         {
         vtkParseMerge_MergeHelper(finfo, data, hinfo, cinfo->SuperClasses[i],
-                                  hintfile, info, merge);
+                                  nhintfiles, hintfiles, info, merge);
         }
       }
     }
@@ -725,7 +739,6 @@ void vtkParseMerge_MergeHelper(
 MergeInfo *vtkParseMerge_MergeSuperClasses(
   FileInfo *finfo, NamespaceInfo *data, ClassInfo *classInfo)
 {
-  FILE *hintfile = NULL;
   HierarchyInfo *hinfo = NULL;
   MergeInfo *info = NULL;
   OptionInfo *oinfo = NULL;
@@ -733,14 +746,10 @@ MergeInfo *vtkParseMerge_MergeSuperClasses(
 
   oinfo = vtkParse_GetCommandLineOptions();
 
-  if (oinfo->HierarchyFileName)
+  if (oinfo->HierarchyFileNames)
     {
-    hinfo = vtkParseHierarchy_ReadFile(oinfo->HierarchyFileName);
-
-    if (oinfo->HintFileName)
-      {
-      hintfile = fopen(oinfo->HintFileName, "r");
-      }
+    hinfo = vtkParseHierarchy_ReadFiles(
+      oinfo->NumberOfHierarchyFileNames, oinfo->HierarchyFileNames);
 
     info = vtkParseMerge_CreateMergeInfo(classInfo);
 
@@ -749,12 +758,9 @@ MergeInfo *vtkParseMerge_MergeSuperClasses(
       {
       vtkParseMerge_MergeHelper(finfo, data, hinfo,
                                 classInfo->SuperClasses[i],
-                                hintfile, info, classInfo);
-      }
-
-    if (hintfile)
-      {
-      fclose(hintfile);
+                                oinfo->NumberOfHintFileNames,
+                                oinfo->HintFileNames,
+                                info, classInfo);
       }
     }
 
diff --git a/Wrapping/Tools/vtkParseMerge.h b/Wrapping/Tools/vtkParseMerge.h
index 8e5d1bdb30b..0f84950917b 100644
--- a/Wrapping/Tools/vtkParseMerge.h
+++ b/Wrapping/Tools/vtkParseMerge.h
@@ -72,7 +72,8 @@ void vtkParseMerge_FreeMergeInfo(MergeInfo *info);
  */
 void vtkParseMerge_MergeHelper(
   FileInfo *finfo, const NamespaceInfo *data, const HierarchyInfo *hinfo,
-  const char *classname, FILE *hintfile, MergeInfo *info, ClassInfo *merge);
+  const char *classname, int nhintfiles, char **hintfiles, MergeInfo *info,
+  ClassInfo *merge);
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/Wrapping/Tools/vtkWrap.c b/Wrapping/Tools/vtkWrap.c
index bc49119ff16..39c9a6485c7 100644
--- a/Wrapping/Tools/vtkWrap.c
+++ b/Wrapping/Tools/vtkWrap.c
@@ -871,7 +871,7 @@ void vtkWrap_ApplyUsingDeclarations(
       {
       vtkParseMerge_MergeHelper(
         finfo, finfo->Contents, hinfo, data->SuperClasses[i],
-        NULL, NULL, data);
+        0, NULL, NULL, data);
       }
     }
 }
diff --git a/Wrapping/Tools/vtkWrapJava.c b/Wrapping/Tools/vtkWrapJava.c
index 8f974b48319..90311027d44 100644
--- a/Wrapping/Tools/vtkWrapJava.c
+++ b/Wrapping/Tools/vtkWrapJava.c
@@ -1274,9 +1274,10 @@ int main(int argc, char *argv[])
     }
 
   /* get the hierarchy info for accurate typing */
-  if (options->HierarchyFileName)
+  if (options->HierarchyFileNames)
     {
-    hierarchyInfo = vtkParseHierarchy_ReadFile(options->HierarchyFileName);
+    hierarchyInfo = vtkParseHierarchy_ReadFiles(
+      options->NumberOfHierarchyFileNames, options->HierarchyFileNames);
     if (hierarchyInfo)
       {
       /* resolve using declarations within the header files */
diff --git a/Wrapping/Tools/vtkWrapPython.c b/Wrapping/Tools/vtkWrapPython.c
index af31c25a946..f27ffe0d223 100644
--- a/Wrapping/Tools/vtkWrapPython.c
+++ b/Wrapping/Tools/vtkWrapPython.c
@@ -315,9 +315,10 @@ int main(int argc, char *argv[])
     }
 
   /* get the hierarchy info for accurate typing */
-  if (options->HierarchyFileName)
+  if (options->HierarchyFileNames)
     {
-    hinfo = vtkParseHierarchy_ReadFile(options->HierarchyFileName);
+    hinfo = vtkParseHierarchy_ReadFiles(
+      options->NumberOfHierarchyFileNames, options->HierarchyFileNames);
     }
 
   /* get the filename without the extension */
diff --git a/Wrapping/Tools/vtkWrapPythonInit.c b/Wrapping/Tools/vtkWrapPythonInit.c
index 0debb4e73d6..9750ae4e434 100644
--- a/Wrapping/Tools/vtkWrapPythonInit.c
+++ b/Wrapping/Tools/vtkWrapPythonInit.c
@@ -169,7 +169,8 @@ int main(int argc,char *argv[])
     }
 
   /* extra functions, types, etc. for the CommonCore module */
-  if (strcmp(libName, "vtkCommonCorePython") == 0)
+  if (strcmp(libName, "vtkCommonCorePython") == 0 ||
+    strcmp(libName, "vtkCommonKitPython") == 0)
     {
     files[numFiles] = strdup("PyVTKExtras");
     numFiles++;
diff --git a/Wrapping/Tools/vtkWrapTcl.c b/Wrapping/Tools/vtkWrapTcl.c
index 53d077bf550..0522d4d5b88 100644
--- a/Wrapping/Tools/vtkWrapTcl.c
+++ b/Wrapping/Tools/vtkWrapTcl.c
@@ -1119,9 +1119,10 @@ int main(int argc, char *argv[])
     }
 
   /* get the hierarchy info for accurate typing */
-  if (options->HierarchyFileName)
+  if (options->HierarchyFileNames)
     {
-    hierarchyInfo = vtkParseHierarchy_ReadFile(options->HierarchyFileName);
+    hierarchyInfo = vtkParseHierarchy_ReadFiles(
+      options->NumberOfHierarchyFileNames, options->HierarchyFileNames);
     if (hierarchyInfo)
       {
       /* resolve using declarations within the header files */
-- 
GitLab