/*
 * ====================================================================
 *    Licensed to the Apache Software Foundation (ASF) under one
 *    or more contributor license agreements.  See the NOTICE file
 *    distributed with this work for additional information
 *    regarding copyright ownership.  The ASF licenses this file
 *    to you under the Apache License, Version 2.0 (the
 *    "License"); you may not use this file except in compliance
 *    with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing,
 *    software distributed under the License is distributed on an
 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *    KIND, either express or implied.  See the License for the
 *    specific language governing permissions and limitations
 *    under the License.
 * ====================================================================
 *
 * apr.swg: This is a child file of svn_types.swg, and should not be
 *   included directly.  This file should contain typemaps that deal
 *   with APR functionality, not involving any parts of Subversion.
 */

/* -----------------------------------------------------------------------
   Create perl5 typemaps for long long datatypes
   PERL-FIXME: These typemaps are decidedly odd.  They convert long long
     values to strings before returning them.  This behaviour is either
     wrong, or needful of a comment explaining it.
*/
#ifdef SWIGPERL
%typemap(out) long long {
    char temp[30];
    sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) $1);
    %append_output(sv_2mortal(newSVpv(temp, 0)));
}

%typemap(out) unsigned long long {
    char temp[30];
    sprintf(temp, "%" APR_UINT64_T_FMT, (apr_uint64_t) $1);
    %append_output(sv_2mortal(newSVpv(temp, 0)));
}

%typemap(in, numinputs=0) long long *OUTPUT (apr_int64_t temp)
    "$1 = &temp;";
%typemap(argout) long long *OUTPUT {
  char temp[30];
  sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t)*($1));
  %append_output(sv_2mortal(newSVpv(temp, 0)));
}

%typemap(in, numinputs=0) unsigned long long *OUTPUT (apr_uint64_t temp)
    "$1 = &temp;";
%typemap(argout) unsigned long long *OUTPUT {
  char temp[30];
  sprintf(temp, "%" APR_UINT64_T_FMT, (apr_uint64_t)*($1));
  %append_output(sv_2mortal(newSVpv(temp, 0)));
}
#endif

/* -----------------------------------------------------------------------
 * APR datatypes (from apr.h)
 */

/* Integers for which sizeof(type) <= sizeof(long) */
%apply long { apr_int16_t, apr_int32_t, apr_ssize_t }
%apply unsigned long { apr_byte_t, apr_uint16_t, apr_uint32_t, apr_size_t }
%apply unsigned long *OUTPUT { apr_uint32_t *, apr_size_t * }

/* If sizeof(apr_off_t) > sizeof(apr_int64_t), apr_off_t will get truncated
 * to a 64-bit integer */
%apply long long { apr_off_t, apr_int64_t }
%apply long long *OUTPUT { apr_int64_t * };
%apply unsigned long long { apr_uint64_t }

/* -----------------------------------------------------------------------
   apr_time_t
*/

/* Define the time type (rather than picking up all of apr_time.h) */
typedef apr_int64_t apr_time_t;

/* For apr_time_ansi_put().
   We guess, because only the system C compiler can successfully parse
   system headers if they incorporate weird include paths
   (e.g. /usr/lib/gcc-lib/plat/ver/include). */
typedef apr_int32_t time_t;

/* -----------------------------------------------------------------------
   Input of apr_file_t *
*/

#ifdef SWIGPYTHON
%typemap(in) apr_file_t * {
  $1 = svn_swig_py_make_file($input, _global_pool);
  if (!$1) SWIG_fail;
}
#endif

#ifdef SWIGPERL
%typemap(in) apr_file_t * {
  $1 = svn_swig_pl_make_file($input, _global_pool);
}
#endif

#ifdef SWIGRUBY
%typemap(in) apr_file_t * {
  $1 = svn_swig_rb_make_file($input, _global_pool);
}
#endif

/* -----------------------------------------------------------------------
   Output of apr_file_t *
   ... is currently being handled by the standard OUTPARAM code in
   svn_types.swg, but should probably be more comfortably translated to
   scripting language concepts.
*/
