// Tests SWIG's handling of varargs (function varargs, not preprocessor varargs).
// The default behavior is to simply ignore the varargs.
%module varargs

// Default handling of varargs

%inline %{
char *test(const char *fmt, ...) {
  return (char *) fmt;
}

struct VarargConstructor {
  char *str;
  VarargConstructor(const char *fmt, ...) {
    str = new char[strlen(fmt) + 1];
    strcpy(str, fmt);
  }
};
%}

// %varargs support

%varargs(int mode = 0) test_def;
%varargs(int mode = 0) Foo::Foo;
%varargs(int mode = 0) Foo::statictest(const char*fmt, ...);
%varargs(2, int mode = 0) test_plenty(const char*fmt, ...);

%inline %{
const char *test_def(const char *fmt, ...) {
  return fmt;
}

class Foo {
public:
    char *str;
    Foo() {
        str = NULL;
    }
    Foo(const char *fmt, ...) {
        str = new char[strlen(fmt) + 1];
        strcpy(str, fmt);
    }
    ~Foo() {
        delete [] str;
    }
    char *test(const char *fmt, ...) {
        return (char *) fmt;
    }
    static char *statictest(const char *fmt, ...) {
        return (char *) fmt;
    }
};

const char *test_plenty(const char *fmt, ...) {
  return fmt;
}
%}
