#include "config.h"
#include "system.h"
#include "mkdeps.h"
struct deps
{
const char **targetv;
unsigned int ntargets;
unsigned int targets_size;
const char **depv;
unsigned int ndeps;
unsigned int deps_size;
};
static const char *munge PARAMS ((const char *));
static const char *
munge (filename)
const char *filename;
{
int len;
const char *p, *q;
char *dst, *buffer;
for (p = filename, len = 0; *p; p++, len++)
{
switch (*p)
{
case ' ':
case '\t':
for (q = p - 1; filename <= q && *q == '\\'; q--)
len++;
len++;
break;
case '$':
len++;
break;
}
}
buffer = xmalloc (len + 1);
for (p = filename, dst = buffer; *p; p++, dst++)
{
switch (*p)
{
case ' ':
case '\t':
for (q = p - 1; filename <= q && *q == '\\'; q--)
*dst++ = '\\';
*dst++ = '\\';
break;
case '$':
*dst++ = '$';
break;
default:
;
}
*dst = *p;
}
*dst = '\0';
return buffer;
}
struct deps *
deps_init ()
{
struct deps *d = (struct deps *) xmalloc (sizeof (struct deps));
d->targetv = 0;
d->depv = 0;
d->ntargets = 0;
d->targets_size = 0;
d->ndeps = 0;
d->deps_size = 0;
return d;
}
void
deps_free (d)
struct deps *d;
{
unsigned int i;
if (d->targetv)
{
for (i = 0; i < d->ntargets; i++)
free ((PTR) d->targetv[i]);
free (d->targetv);
}
if (d->depv)
{
for (i = 0; i < d->ndeps; i++)
free ((PTR) d->depv[i]);
free (d->depv);
}
free (d);
}
void
deps_add_target (d, t, quote)
struct deps *d;
const char *t;
int quote;
{
if (d->ntargets == d->targets_size)
{
d->targets_size = d->targets_size * 2 + 4;
d->targetv = (const char **) xrealloc (d->targetv,
d->targets_size * sizeof (const char *));
}
if (quote)
t = munge (t);
else
t = xstrdup (t);
d->targetv[d->ntargets++] = t;
}
void
deps_add_default_target (d, tgt)
struct deps *d;
const char *tgt;
{
if (d->ntargets)
return;
if (tgt[0] == '\0')
deps_add_target (d, "-", 1);
else
{
#ifndef TARGET_OBJECT_SUFFIX
# define TARGET_OBJECT_SUFFIX ".o"
#endif
const char *start = lbasename (tgt);
char *o = (char *) alloca (strlen (start) + strlen (TARGET_OBJECT_SUFFIX) + 1);
char *suffix;
strcpy (o, start);
suffix = strrchr (o, '.');
if (!suffix)
suffix = o + strlen (o);
strcpy (suffix, TARGET_OBJECT_SUFFIX);
deps_add_target (d, o, 1);
}
}
void
deps_add_dep (d, t)
struct deps *d;
const char *t;
{
t = munge (t);
if (d->ndeps == d->deps_size)
{
d->deps_size = d->deps_size * 2 + 8;
d->depv = (const char **)
xrealloc (d->depv, d->deps_size * sizeof (const char *));
}
d->depv[d->ndeps++] = t;
}
void
deps_write (d, fp, colmax)
const struct deps *d;
FILE *fp;
unsigned int colmax;
{
unsigned int size, i, column;
column = 0;
if (colmax && colmax < 34)
colmax = 34;
for (i = 0; i < d->ntargets; i++)
{
size = strlen (d->targetv[i]);
column += size;
if (colmax && column > colmax)
{
fputs (" \\\n ", fp);
column = 1 + size;
}
if (i)
{
putc (' ', fp);
column++;
}
fputs (d->targetv[i], fp);
}
putc (':', fp);
putc (' ', fp);
column += 2;
for (i = 0; i < d->ndeps; i++)
{
size = strlen (d->depv[i]);
column += size;
if (colmax && column > colmax)
{
fputs (" \\\n ", fp);
column = 1 + size;
}
if (i)
{
putc (' ', fp);
column++;
}
fputs (d->depv[i], fp);
}
putc ('\n', fp);
}
void
deps_phony_targets (d, fp)
const struct deps *d;
FILE *fp;
{
unsigned int i;
for (i = 1; i < d->ndeps; i++)
{
putc ('\n', fp);
fputs (d->depv[i], fp);
putc (':', fp);
putc ('\n', fp);
}
}