/* -----------------------------------------------------------------------------
 * std_string.i
 *
 * SWIG typemaps for std::string
 * ----------------------------------------------------------------------------- */

%{
#include <string>
%}

namespace std {
    %naturalvar string;
  

    %insert(closprefix) %{ (declare (hide <std-string>)) %}
    %nodefault string;
    %rename("std-string") string;
    class string {
      public:
	~string() {}
    };
    %extend string {
      char *str;
    }
    %{
      #define std_string_str_get(s) ((char *)((s)->c_str()))
      #define std_string_str_set(s,v) (s->assign((char *)(v)))
    %}

    %typemap(typecheck) string = char *;
    %typemap(typecheck) const string & = char *;

    %typemap(in) string (char * tempptr) {
      if ($input == C_SCHEME_FALSE) {
	$1.resize(0);
      } else { 
	if (!C_swig_is_string ($input)) {
	  swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, 
		     "Argument #$argnum is not a string");
	}
	tempptr = SWIG_MakeString($input);
	$1.assign(tempptr);
	if (tempptr) SWIG_free(tempptr);
      }
    }

    %typemap(in) const string& ($*1_ltype temp, char *tempptr) {

      if ($input == C_SCHEME_FALSE) {
	temp.resize(0);
	$1 = &temp;
      } else { 
	if (!C_swig_is_string ($input)) {
	  swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, 
		     "Argument #$argnum is not a string");
	}
	tempptr = SWIG_MakeString($input);
	temp.assign(tempptr);
	if (tempptr) SWIG_free(tempptr);
	$1 = &temp;
      }
    }

    %typemap(out) string { 
      int size = $1.size();
      C_word *space = C_alloc (C_SIZEOF_STRING (size));
      $result = C_string (&space, size, (char *) $1.c_str());
    }

    %typemap(out) const string& { 
      int size = $1->size();
      C_word *space = C_alloc (C_SIZEOF_STRING (size));
      $result = C_string (&space, size, (char *) $1->c_str());
    }

    %typemap(varin) string {
      if ($input == C_SCHEME_FALSE) {
	$1.resize(0);
      } else { 
        char *tempptr;
	if (!C_swig_is_string ($input)) {
	  swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, 
		     "Argument #$argnum is not a string");
   	}
	tempptr = SWIG_MakeString($input);
	$1.assign(tempptr);
	if (tempptr) SWIG_free(tempptr);
      }
    }

    %typemap(varout) string { 
      int size = $1.size();
      C_word *space = C_alloc (C_SIZEOF_STRING (size));
      $result = C_string (&space, size, (char *) $1.c_str());
    }
}