Skip to content
Snippets Groups Projects
Commit a61047aa authored by David Gobbi's avatar David Gobbi Committed by Ben Boeckel
Browse files

Some simplifications to vtkParse depends tracking

parent 0ee7507d
No related merge requests found
......@@ -3,6 +3,8 @@
// SPDX-License-Identifier: BSD-3-Clause
#include "vtkParseDependencyTracking.h"
#include "vtkParseData.h"
#include "vtkParseString.h"
#include "vtkParseSystem.h"
#include <stdio.h>
......@@ -11,11 +13,13 @@
typedef struct DependencyTracking_
{
char* Target;
char** Dependencies;
size_t NumberOfDependencies;
size_t DependenciesCapacity;
StringCache Strings;
const char* Target;
const char** Dependencies;
int NumberOfDependencies;
} DependencyTracking;
// dependency tracking is done globally
DependencyTracking DepTracker;
void vtkParse_InitDependencyTracking(const char* target)
......@@ -25,62 +29,28 @@ void vtkParse_InitDependencyTracking(const char* target)
return;
}
DepTracker.Target = strdup(target);
vtkParse_InitStringCache(&DepTracker.Strings);
DepTracker.Target = vtkParse_CacheString(&DepTracker.Strings, target, strlen(target));
DepTracker.Dependencies = NULL;
DepTracker.NumberOfDependencies = 0;
DepTracker.DependenciesCapacity = 0;
}
void vtkParse_AddFileDependency(const char* dep)
{
size_t newSize = DepTracker.NumberOfDependencies + 1;
if (!DepTracker.Target)
{
return;
}
if (newSize + 1 >= DepTracker.DependenciesCapacity)
{
char** newDeps = NULL;
/* Allocate 2 for the first call. */
size_t newCapacity =
DepTracker.DependenciesCapacity ? (DepTracker.DependenciesCapacity << 1) : 2;
size_t i;
newDeps = (char**)realloc(DepTracker.Dependencies, newCapacity * sizeof(char*));
if (!newDeps)
{
fprintf(stderr, "error: out of memory (DepTracker.Dependencies @ %zu)", newCapacity);
return;
}
/* Initialize new memory. */
for (i = DepTracker.NumberOfDependencies; i < newCapacity; ++i)
{
newDeps[i] = NULL;
}
DepTracker.Dependencies = newDeps;
DepTracker.DependenciesCapacity = newCapacity;
}
DepTracker.Dependencies[DepTracker.NumberOfDependencies] = strdup(dep);
if (!DepTracker.Dependencies[DepTracker.NumberOfDependencies])
{
fprintf(stderr, "error: out of memory (DepTracker.Dependencies[%zu] = %s)",
DepTracker.NumberOfDependencies, dep);
return;
}
++DepTracker.NumberOfDependencies;
vtkParse_AddStringToArray(&DepTracker.Dependencies, &DepTracker.NumberOfDependencies,
vtkParse_CacheString(&DepTracker.Strings, dep, strlen(dep)));
}
static void write_path(FILE* fout, const char* path)
{
const char* c;
c = path;
while (*c)
for (c = path; *c != '\0'; ++c)
{
if (*c == ':')
{
......@@ -94,22 +64,22 @@ static void write_path(FILE* fout, const char* path)
{
fputc(*c, fout);
}
++c;
}
}
static void write_line(FILE* fout, const char* target, const char* input)
static void write_line(FILE* fout, const char* target, const char* dep)
{
// format: "target: dependency\n" (escape ':' and ' ' in filenames)
write_path(fout, target);
fprintf(fout, ": ");
write_path(fout, input);
write_path(fout, dep);
fputc('\n', fout);
}
int vtkParse_DependencyTrackingWrite(const char* fname)
{
FILE* fout = NULL;
char** input;
int i;
if (!DepTracker.Target)
{
......@@ -122,16 +92,12 @@ int vtkParse_DependencyTrackingWrite(const char* fname)
return 1;
}
input = DepTracker.Dependencies;
if (input)
for (i = 0; i < DepTracker.NumberOfDependencies; ++i)
{
while (*input)
{
write_line(fout, DepTracker.Target, *input);
++input;
}
write_line(fout, DepTracker.Target, DepTracker.Dependencies[i]);
}
else
if (DepTracker.NumberOfDependencies == 0)
{
write_line(fout, DepTracker.Target, "");
}
......@@ -143,27 +109,14 @@ int vtkParse_DependencyTrackingWrite(const char* fname)
void vtkParse_FinalizeDependencyTracking(void)
{
char** input;
if (!DepTracker.Target)
{
return;
}
input = DepTracker.Dependencies;
if (input)
{
while (*input)
{
free(*input);
++input;
}
}
free(DepTracker.Dependencies);
DepTracker.Dependencies = NULL;
DepTracker.NumberOfDependencies = 0;
DepTracker.DependenciesCapacity = 0;
free(DepTracker.Target);
DepTracker.Target = NULL;
vtkParse_FreeStringCache(&DepTracker.Strings);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment