#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);
}
}