File: include.xs

package info (click to toggle)
libconvert-binary-c-perl 0.74-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 9,100 kB
  • ctags: 21,416
  • sloc: ansic: 63,666; perl: 18,582; yacc: 2,143; makefile: 44
file content (97 lines) | stat: -rw-r--r-- 2,270 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
################################################################################
#
# $Project: /Convert-Binary-C $
# $Author: mhx $
# $Date: 2009/03/15 04:10:43 +0100 $
# $Revision: 7 $
# $Source: /xsubs/include.xs $
#
################################################################################
#
# Copyright (c) 2002-2009 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);