The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
################################################################################
#
# Copyright (c) 2002-2015 Marcus Holland-Moritz. All rights reserved.
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
################################################################################


################################################################################
#
#   METHOD: Include / Define / Assert
#
#   WRITTEN BY: Marcus Holland-Moritz             ON: Mar 2002
#   CHANGED BY:                                   ON:
#
################################################################################

void
CBC::Include(...)
  ALIAS:
    Define = 1
    Assert = 2

  PREINIT:
    CBC_METHOD_VAR;
    LinkedList list;
    int hasRval;
    SV *rval, *inval;

  PPCODE:
    switch (ix)
    {
      case 1:  /* Define */
        CBC_METHOD_SET("Define");
        list = THIS->cfg.defines;
        break;
      case 2:  /* Assert */
        CBC_METHOD_SET("Assert");
        list = THIS->cfg.assertions;
        break;
      default: /* Include */
        CBC_METHOD_SET("Include");
        list = THIS->cfg.includes;
        break;
    }

    CT_DEBUG_METHOD;

    hasRval = GIMME_V != G_VOID && items <= 1;

    if (GIMME_V == G_VOID && items <= 1)
    {
      WARN_VOID_CONTEXT;
      XSRETURN_EMPTY;
    }

    if (items > 1 && !SvROK(ST(1)))
    {
      int i;
      inval = NULL;

      for (i = 1; i < items; i++)
      {
        if (SvROK(ST(i)))
          Perl_croak(aTHX_ "Argument %d to %s must not be a reference", i, method);

        LL_push(list, string_new_fromSV(aTHX_ ST(i)));
      }
    }
    else
    {
      if (items > 2)
        Perl_croak(aTHX_ "Invalid number of arguments to %s", method);

      inval = items == 2 ? ST(1) : NULL;
    }

    if (inval != NULL || hasRval)
      handle_string_list(aTHX_ method, list, inval, hasRval ? &rval : NULL);

    if (hasRval)
      ST(0) = sv_2mortal(rval);

    reset_preprocessor(&THIS->cpi);

    XSRETURN(1);