/* Dependency generator for Makefile fragments.
   Copyright (C) 2000-2026 Free Software Foundation, Inc.
   Contributed by Zack Weinberg, Mar 2000

This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.

 In other words, you are welcome to use, share and improve this program.
 You are forbidden to forbid anyone else to use, share and improve
 what you give them.   Help stamp out software-hoarding!  */

#include "config.h"
#include "system.h"
#include "mkdeps.h"
#include "internal.h"

/* Not set up to just include std::vector et al, here's a simple
   implementation.  */

/* Keep this structure local to this file, so clients don't find it
   easy to start making assumptions.  */
class mkdeps
{
public:
  /* T has trivial cctor & dtor.  */
  template <typename T>
  class vec
  {
  private:
    T *ary;
    unsigned num;
    unsigned alloc;

  public:
    vec ()
      : ary (NULL), num (0), alloc (0)
      {}
    ~vec ()
      {
	XDELETEVEC (ary);
      }

  public:
    unsigned size () const
    {
      return num;
    }
    const T &operator[] (unsigned ix) const
    {
      return ary[ix];
    }
    T &operator[] (unsigned ix)
    {
      return ary[ix];
    }
    void push (const T &elt)
    {
      if (num == alloc)
	{
	  alloc = alloc ? alloc * 2 : 16;
	  ary = XRESIZEVEC (T, ary, alloc);
	}
      ary[num++] = elt;
    }
  };
  struct velt
  {
    const char *str;
    size_t len;
  };

  mkdeps ()
    : primary_output (NULL), module_name (NULL), cmi_name (NULL),
      is_header_unit (false), is_exported (false), quote_lwm (0),
      first_phony_dep (1)
  {
  }
  ~mkdeps ()
  {
    unsigned int i;

    for (i = targets.size (); i--;)
      free (const_cast <char *> (targets[i]));
    free (const_cast <char *> (primary_output));
    for (i = fdeps_targets.size (); i--;)
      free (const_cast <char *> (fdeps_targets[i]));
    for (i = deps.size (); i--;)
      free (const_cast <char *> (deps[i]));
    for (i = vpath.size (); i--;)
      XDELETEVEC (vpath[i].str);
    for (i = modules.size (); i--;)
      XDELETEVEC (modules[i]);
    XDELETEVEC (module_name);
    free (const_cast <char *> (cmi_name));
  }

public:
  vec<const char *> targets;
  vec<const char *> deps;
  const char * primary_output;
  vec<const char *> fdeps_targets;
  vec<velt> vpath;
  vec<const char *> modules;

public:
  const char *module_name;
  const char *cmi_name;
  bool is_header_unit;
  bool is_exported;
  unsigned short quote_lwm;
  unsigned int first_phony_dep;
};

/* Apply Make quoting to STR, TRAIL.  Note that it's not possible to
   quote all such characters - e.g. \n, %, *, ?, [, \ (in some
   contexts), and ~ are not properly handled.  It isn't possible to
   get this right in any current version of Make.  (??? Still true?
   Old comment referred to 3.76.1.)  */

static const char *
munge (const char *str, const char *trail = nullptr)
{
  static unsigned alloc;
  static char *buf;
  unsigned dst = 0;

  for (; str; str = trail, trail = nullptr)
    {
      unsigned slashes = 0;
      char c;
      for (const char *probe = str; (c = *probe++);)
	{
	  if (alloc < dst + 4 + slashes)
	    {
	      alloc = alloc * 2 + 32;
	      buf = XRESIZEVEC (char, buf, alloc);
	    }

	  switch (c)
	    {
	    case '\\':
	      slashes++;
	      break;

	    case '$':
	      buf[dst++] = '$';
	      goto def;

	    case ' ':
	    case '\t':
	      /* GNU make uses a weird quoting scheme for white space.
		 A space or tab preceded by 2N+1 backslashes
		 represents N backslashes followed by space; a space
		 or tab preceded by 2N backslashes represents N
		 backslashes at the end of a file name; and
		 backslashes in other contexts should not be
		 doubled.  */
	      while (slashes--)
		buf[dst++] = '\\';
	      /* FALLTHROUGH  */

	    case '#':
	      buf[dst++] = '\\';
	      /* FALLTHROUGH  */

	    default:
	    def:
	      slashes = 0;
	      break;
	    }

	  buf[dst++] = c;
	}
    }

  buf[dst] = 0;
  return buf;
}

/* If T begins with any of the partial pathnames listed in d->vpathv,
   then advance T to point beyond that pathname.  */
static const char *
apply_vpath (class mkdeps *d, const char *t)
{
  if (unsigned len = d->vpath.size ())
    for (unsigned i = len; i--;)
      {
	if (!filename_ncmp (d->vpath[i].str, t, d->vpath[i].len))
	  {
	    const char *p = t + d->vpath[i].len;
	    if (!IS_DIR_SEPARATOR (*p))
	      goto not_this_one;

	    /* Do not simplify $(vpath)/../whatever.  ??? Might not
	       be necessary. */
	    if (p[1] == '.' && p[2] == '.' && IS_DIR_SEPARATOR (p[3]))
	      goto not_this_one;

	    /* found a match */
	    t = t + d->vpath[i].len + 1;
	    break;
	  }
      not_this_one:;
      }

  /* Remove leading ./ in any case.  */
  while (t[0] == '.' && IS_DIR_SEPARATOR (t[1]))
    {
      t += 2;
      /* If we removed a leading ./, then also remove any /s after the
	 first.  */
      while (IS_DIR_SEPARATOR (t[0]))
	++t;
    }

  return t;
}

/* Public routines.  */

class mkdeps *
deps_init (void)
{
  return new mkdeps ();
}

void
deps_free (class mkdeps *d)
{
  delete d;
}

/* Adds a target T.  We make a copy, so it need not be a permanent
   string.  QUOTE is true if the string should be quoted.  */
void
deps_add_target (class mkdeps *d, const char *t, int quote)
{
  t = xstrdup (apply_vpath (d, t));

  if (!quote)
    {
      /* Sometimes unquoted items are added after quoted ones.
	 Swap out the lowest quoted.  */
      if (d->quote_lwm != d->targets.size ())
	{
	  const char *lowest = d->targets[d->quote_lwm];
	  d->targets[d->quote_lwm] = t;
	  t = lowest;
	}
      d->quote_lwm++;
    }

  d->targets.push (t);
}

/* Sets the default target if none has been given already.  An empty
   string as the default target in interpreted as stdin.  The string
   is quoted for MAKE.  */
void
deps_add_default_target (class mkdeps *d, const char *tgt)
{
  /* Only if we have no targets.  */
  if (d->targets.size ())
    return;

  if (tgt[0] == '\0')
    d->targets.push (xstrdup ("-"));
  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);
    }
}

/* Adds a target O.  We make a copy, so it need not be a permanent
   string.

   This is the target associated with the rule that (in a C++ modules build)
   compiles the source that is being scanned for dynamic dependencies.  It is
   used to associate the structured dependency information with that rule as
   needed.  */
void
fdeps_add_target (struct mkdeps *d, const char *o, bool is_primary)
{
  o = apply_vpath (d, o);
  if (is_primary)
    {
      if (d->primary_output)
	d->fdeps_targets.push (d->primary_output);
      d->primary_output = xstrdup (o);
    }
  else
    d->fdeps_targets.push (xstrdup (o));
}

void
deps_add_dep (class mkdeps *d, const char *t)
{
  if (*t)
    {
      t = apply_vpath (d, t);

      d->deps.push (xstrdup (t));
    }
  /* When called first with "", remember we should
     emit for -MP all dependencies rather than just
     second and following dependency.  See PR105412.  */
  else if (d->deps.size () == 0)
    d->first_phony_dep = 0;
}

void
deps_add_vpath (class mkdeps *d, const char *vpath)
{
  const char *elem, *p;

  for (elem = vpath; *elem; elem = p)
    {
      for (p = elem; *p && *p != ':'; p++)
	continue;
      mkdeps::velt elt;
      elt.len = p - elem;
      char *str = XNEWVEC (char, elt.len + 1);
      elt.str = str;
      memcpy (str, elem, elt.len);
      str[elt.len] = '\0';
      if (*p == ':')
	p++;

      d->vpath.push (elt);
    }
}

/* Add a new module target (there can only be one).  M is the module
   name.   */

void
deps_add_module_target (struct mkdeps *d, const char *m,
			const char *cmi, bool is_header_unit, bool is_exported)
{
  gcc_assert (!d->module_name);

  d->module_name = xstrdup (m);
  d->is_header_unit = is_header_unit;
  d->is_exported = is_exported;
  d->cmi_name = xstrdup (cmi);
}

/* Add a new module dependency.  M is the module name.  */

void
deps_add_module_dep (struct mkdeps *d, const char *m)
{
  d->modules.push (xstrdup (m));
}

/* Write NAME, with a leading space to FP, a Makefile.  Advance COL as
   appropriate, wrap at COLMAX, returning new column number.  Iff
   QUOTE apply quoting.  Append TRAIL.  */

static unsigned
make_write_name (const char *name, FILE *fp, unsigned col, unsigned colmax,
		 bool quote = true, const char *trail = NULL)
{
  if (quote)
    name = munge (name, trail);
  unsigned size = strlen (name);

  if (col)
    {
      if (colmax && col + size> colmax)
	{
	  fputs (" \\\n", fp);
	  col = 0;
	}
      col++;
      fputs (" ", fp);
    }

  col += size;
  fputs (name, fp);

  return col;
}

/* Write all the names in VEC via make_write_name.  */

static unsigned
make_write_vec (const mkdeps::vec<const char *> &vec, FILE *fp,
		unsigned col, unsigned colmax, unsigned quote_lwm = 0,
		const char *trail = NULL)
{
  for (unsigned ix = 0; ix != vec.size (); ix++)
    col = make_write_name (vec[ix], fp, col, colmax, ix >= quote_lwm, trail);
  return col;
}

/* Write the dependencies to a Makefile.  */

static void
make_write (const cpp_reader *pfile, FILE *fp, unsigned int colmax)
{
  const mkdeps *d = pfile->deps;

  unsigned column = 0;
  if (colmax && colmax < 34)
    colmax = 34;

  /* Write out C++ modules information if no other `-fdeps-format=`
     option is given. */
  cpp_fdeps_format fdeps_format = CPP_OPTION (pfile, deps.fdeps_format);
  bool write_make_modules_deps = (fdeps_format == FDEPS_FMT_NONE
				  && CPP_OPTION (pfile, deps.modules));

  if (d->deps.size ())
    {
      column = make_write_vec (d->targets, fp, 0, colmax, d->quote_lwm);
      if (write_make_modules_deps && d->cmi_name)
	column = make_write_name (d->cmi_name, fp, column, colmax);
      fputs (":", fp);
      column++;
      make_write_vec (d->deps, fp, column, colmax);
      fputs ("\n", fp);
      if (CPP_OPTION (pfile, deps.phony_targets))
	for (unsigned i = d->first_phony_dep; i < d->deps.size (); i++)
	  fprintf (fp, "%s:\n", munge (d->deps[i]));
    }

  if (!write_make_modules_deps)
    return;

  if (d->modules.size ())
    {
      column = make_write_vec (d->targets, fp, 0, colmax, d->quote_lwm);
      if (d->cmi_name)
	column = make_write_name (d->cmi_name, fp, column, colmax);
      fputs (":", fp);
      column++;
      column = make_write_vec (d->modules, fp, column, colmax, 0, ".c++-module");
      fputs ("\n", fp);
    }

  if (d->module_name)
    {
      if (d->cmi_name)
	{
	  /* module-name : cmi-name */
	  column = make_write_name (d->module_name, fp, 0, colmax,
				    true, ".c++-module");
	  const char *module_basename = nullptr;
	  if (d->is_header_unit)
	    {
	      /* Also emit a target for the include name, so for #include
		 <iostream> you'd make iostream.c++-header-unit, regardless of
		 what actual directory iostream lives in.  We reconstruct the
		 include name by skipping the directory where we found it.  */
	      auto *dir = _cpp_get_file_dir (pfile->main_file);
	      gcc_assert (!strncmp (d->module_name, dir->name, dir->len));
	      module_basename = (d->module_name + dir->len + 1);
	      column = make_write_name (module_basename, fp, column, colmax,
					true, ".c++-header-unit");
	    }
	  fputs (":", fp);
	  column++;
	  column = make_write_name (d->cmi_name, fp, column, colmax);
	  fputs ("\n", fp);

	  column = fprintf (fp, ".PHONY:");
	  column = make_write_name (d->module_name, fp, column, colmax,
				    true, ".c++-module");
	  if (module_basename)
	    column = make_write_name (module_basename, fp, column, colmax,
				      true, ".c++-header-unit");
	  fputs ("\n", fp);
	}

      if (d->cmi_name && !d->is_header_unit)
	{
	  /* An order-only dependency.
	      cmi-name :| first-target
	     We can probably drop this this in favour of Make-4.3's grouped
	      targets '&:'  */
	  column = make_write_name (d->cmi_name, fp, 0, colmax);
	  fputs (":|", fp);
	  column++;
	  column = make_write_name (d->targets[0], fp, column, colmax);
	  fputs ("\n", fp);
	}
    }

  if (d->modules.size ())
    {
      column = fprintf (fp, "CXX_IMPORTS +=");
      make_write_vec (d->modules, fp, column, colmax, 0, ".c++-module");
      fputs ("\n", fp);
    }
}

/* Write out dependencies according to the selected format (which is
   only Make at the moment).  */
/* Really we should be opening fp here.  */

void
deps_write (const cpp_reader *pfile, FILE *fp, unsigned int colmax)
{
  make_write (pfile, fp, colmax);
}

/* Write out a a filepath for P1689R5 output.  */

static void
p1689r5_write_filepath (const char *name, FILE *fp)
{
  if (cpp_valid_utf8_p (name, strlen (name)))
    {
      fputc ('"', fp);
      for (const char* c = name; *c; c++)
	{
	  // Escape control characters.
	  if (ISCNTRL (*c))
	    fprintf (fp, "\\u%04x", *c);
	  // JSON escape characters.
	  else if (*c == '"' || *c == '\\')
	    {
	      fputc ('\\', fp);
	      fputc (*c, fp);
	    }
	  // Everything else.
	  else
	    fputc (*c, fp);
	}
      fputc ('"', fp);
    }
  else
    {
      // TODO: print an error
    }
}

/* Write a JSON array from a `vec` for P1689R5 output.

   In P1689R5, all array values are filepaths.  */

static void
p1689r5_write_vec (const mkdeps::vec<const char *> &vec, FILE *fp)
{
  for (unsigned ix = 0; ix != vec.size (); ix++)
    {
      p1689r5_write_filepath (vec[ix], fp);
      if (ix < vec.size () - 1)
	fputc (',', fp);
      fputc ('\n', fp);
    }
}

/* Write out the P1689R5 format using the module dependency tracking
   information gathered while scanning and/or compiling.

   Ideally this (and the above `p1689r5_` functions) would use `gcc/json.h`,
   but since this is `libcpp`, we cannot use `gcc/` code.

  TODO: move `json.h` to libiberty.  */

void
deps_write_p1689r5 (const struct mkdeps *d, FILE *fp)
{
  fputs ("{\n", fp);

  fputs ("\"rules\": [\n", fp);
  fputs ("{\n", fp);

  if (d->primary_output)
    {
      fputs ("\"primary-output\": ", fp);
      p1689r5_write_filepath (d->primary_output, fp);
      fputs (",\n", fp);
    }

  if (d->fdeps_targets.size ())
    {
      fputs ("\"outputs\": [\n", fp);
      p1689r5_write_vec (d->fdeps_targets, fp);
      fputs ("],\n", fp);
    }

  if (d->module_name)
    {
      fputs ("\"provides\": [\n", fp);
      fputs ("{\n", fp);

      fputs ("\"logical-name\": ", fp);
      p1689r5_write_filepath (d->module_name, fp);
      fputs (",\n", fp);

      fprintf (fp, "\"is-interface\": %s\n", d->is_exported ? "true" : "false");

      // TODO: header-unit information

      fputs ("}\n", fp);
      fputs ("],\n", fp);
    }

  fputs ("\"requires\": [\n", fp);
  for (size_t i = 0; i < d->modules.size (); i++)
    {
      if (i != 0)
	fputs (",\n", fp);
      fputs ("{\n", fp);

      fputs ("\"logical-name\": ", fp);
      p1689r5_write_filepath (d->modules[i], fp);
      fputs ("\n", fp);

      // TODO: header-unit information

      fputs ("}\n", fp);
    }
  fputs ("]\n", fp);

  fputs ("}\n", fp);

  fputs ("],\n", fp);

  fputs ("\"version\": 0,\n", fp);
  fputs ("\"revision\": 0\n", fp);

  fputs ("}\n", fp);
}

/* Write out a deps buffer to a file, in a form that can be read back
   with deps_restore.  Returns nonzero on error, in which case the
   error number will be in errno.  */

int
deps_save (class mkdeps *deps, FILE *f)
{
  unsigned int i;
  size_t size;

  /* The cppreader structure contains makefile dependences.  Write out this
     structure.  */

  /* The number of dependences.  */
  size = deps->deps.size ();
  if (fwrite (&size, sizeof (size), 1, f) != 1)
    return -1;

  /* The length of each dependence followed by the string.  */
  for (i = 0; i < deps->deps.size (); i++)
    {
      size = strlen (deps->deps[i]);
      if (fwrite (&size, sizeof (size), 1, f) != 1)
	return -1;
      if (fwrite (deps->deps[i], size, 1, f) != 1)
	return -1;
    }

  return 0;
}

/* Read back dependency information written with deps_save into
   the deps sizefer.  The third argument may be NULL, in which case
   the dependency information is just skipped, or it may be a filename,
   in which case that filename is skipped.  */

int
deps_restore (class mkdeps *deps, FILE *fd, const char *self)
{
  size_t size;
  char *buf = NULL;
  size_t buf_size = 0;

  /* Number of dependences.  */
  if (fread (&size, sizeof (size), 1, fd) != 1)
    return -1;

  /* The length of each dependence string, followed by the string.  */
  for (unsigned i = size; i--;)
    {
      /* Read in # bytes in string.  */
      if (fread (&size, sizeof (size), 1, fd) != 1)
	return -1;

      if (size >= buf_size)
	{
	  buf_size = size + 512;
	  buf = XRESIZEVEC (char, buf, buf_size);
	}
      if (fread (buf, 1, size, fd) != size)
	{
	  XDELETEVEC (buf);
	  return -1;
	}
      buf[size] = 0;

      /* Generate makefile dependencies from .pch if -nopch-deps.  */
      if (self != NULL && filename_cmp (buf, self) != 0)
        deps_add_dep (deps, buf);
    }

  XDELETEVEC (buf);
  return 0;
}
