/* API for GNU Make dynamic objects.
Copyright (C) 2013-2025 Free Software Foundation, Inc.
This file is part of GNU Make.

GNU Make 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 of the License, or (at your option) any later
version.

GNU Make 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.  If not, see <https://www.gnu.org/licenses/>.  */

#include "makeint.h"

#include "dep.h"
#include "filedef.h"
#include "variable.h"

/* Allocate a buffer in our context, so we can free it.  */
char *
gmk_alloc (unsigned int len)
{
  return xmalloc (len);
}

/* Free a buffer returned by gmk_expand().  */
void
gmk_free (char *s)
{
  free (s);
}

/* Evaluate a buffer as make syntax.
   Ideally eval_buffer() will take const char *, but not yet.  */
void
gmk_eval (const char *buffer, const gmk_floc *gfloc)
{
  /* Preserve existing variable buffer context.  */
  char *pbuf;
  size_t plen;
  char *s;
  floc fl;
  floc *flp;

  if (gfloc)
    {
      fl.filenm = gfloc->filenm;
      fl.lineno = gfloc->lineno;
      fl.offset = 0;
      flp = &fl;
    }
  else
    flp = NULL;

  install_variable_buffer (&pbuf, &plen);

  s = xstrdup (buffer);
  eval_buffer (s, flp);
  free (s);

  restore_variable_buffer (pbuf, plen);
}

/* Expand a string and return an allocated buffer.
   Caller must call gmk_free() with this buffer.  */
char *
gmk_expand (const char *ref)
{
  return allocated_expand_string (ref);
}

/* Register a function to be called from makefiles.  */
void
gmk_add_function (const char *name, gmk_func_ptr func,
                  unsigned int min, unsigned int max, unsigned int flags)
{
  define_new_function (reading_file, name, min, max, flags, func);
}
