File: std_string.i

package info (click to toggle)
swig 4.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 46,232 kB
  • sloc: cpp: 54,631; ansic: 29,122; java: 17,530; python: 12,505; cs: 10,369; ruby: 7,232; yacc: 6,477; makefile: 5,965; javascript: 5,520; sh: 5,415; perl: 4,187; php: 3,693; ml: 2,187; lisp: 2,056; tcl: 1,991; xml: 115
file content (90 lines) | stat: -rw-r--r-- 1,994 bytes parent folder | download | duplicates (2)
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
%{
#include <string>
%}

%fragment("SwigStrInOut", "header") {
class SwigStrInOut {
  std::string str_;
  char* ptr_;
  size_t len_;
public:
  void init(char* ptr) {
    ptr_ = ptr;
    if (ptr_) {
      str_ = ptr_;
      len_ = str_.length();
    }
  }

  std::string* str() { return &str_; }

  ~SwigStrInOut() {
    if (ptr_) {
      memcpy(ptr_, str_.c_str(), len_);
      ptr_[len_] = '\0';
    }
  }
};
}

%fragment("include_string", "cxxheader") %{
#include <string>
%}

namespace std {

// use "const string &" typemaps for wrapping member strings
%naturalvar string;

class string;

%typemap(ctype) string, const string & "const char *"
%typemap(ctype) string * "char *"
%typemap(ctype) string & "char *"

%typemap(in) string %{
  if ($input)
    $1 = $input;
%}

%typemap(in) const string & (std::string temp) %{
  if ($input)
    temp = $input;
  $1 = &temp;
%}

%typemap(in, fragment="SwigStrInOut") string * (SwigStrInOut temp), string & (SwigStrInOut temp) %{
  temp.init($input);
  $1 = temp.str();
%}

// Note that we don't support strings with embedded NULs, as there is no way to
// return their length to C code anyhow.
%typemap(out) string %{
  $result = strdup(cppresult.c_str());
%}

%typemap(out) const string &, string *, string & %{
  $result = strdup(cppresult->c_str());
%}

// This is required to warn about clashes between the overloaded functions
// taking strings and raw pointers in the generated wrappers.
%typemap(typecheck) string, const string &, string *, string & = char *;


// Define typemaps for wrapping strings back into std::string in C++ wrappers
// and accepting strings directly.

%typemap(cxxintype, fragment="include_string") string, const string & "std::string const&"

%typemap(cxxin) string, const string & "$1.c_str()"

%typemap(cxxouttype, fragment="include_string") string, const string & "std::string"

%typemap(cxxout, noblock="1") string, const string & %{
  $result = std::string($cresult);
  free(const_cast<char*>($cresult));
%}

}