/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at http://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
/* <DESC>
 * This is a simple example showing how a program on a non-ASCII platform
 * would invoke callbacks to do its own codeset conversions instead of
 * using the built-in iconv functions in libcurl.
 * </DESC>
 */
/*

   The IBM-1047 EBCDIC codeset is used for this example but the code
   would be similar for other non-ASCII codesets.

   Three callback functions are created below:
        my_conv_from_ascii_to_ebcdic,
        my_conv_from_ebcdic_to_ascii, and
        my_conv_from_utf8_to_ebcdic

   The "platform_xxx" calls represent platform-specific conversion routines.

 */

#include <stdio.h>
#include <curl/curl.h>

CURLcode my_conv_from_ascii_to_ebcdic(char *buffer, size_t length)
{
    char *tempptrin, *tempptrout;
    size_t bytes = length;
    int rc;
    tempptrin = tempptrout = buffer;
    rc = platform_a2e(&tempptrin, &bytes, &tempptrout, &bytes);
    if (rc == PLATFORM_CONV_OK) {
      return(CURLE_OK);
    } else {
      return(CURLE_CONV_FAILED);
    }
}

CURLcode my_conv_from_ebcdic_to_ascii(char *buffer, size_t length)
{
    char *tempptrin, *tempptrout;
    size_t bytes = length;
    int rc;
    tempptrin = tempptrout = buffer;
    rc = platform_e2a(&tempptrin, &bytes, &tempptrout, &bytes);
    if (rc == PLATFORM_CONV_OK) {
      return(CURLE_OK);
    } else {
      return(CURLE_CONV_FAILED);
    }
}

CURLcode my_conv_from_utf8_to_ebcdic(char *buffer, size_t length)
{
    char *tempptrin, *tempptrout;
    size_t bytes = length;
    int rc;
    tempptrin = tempptrout = buffer;
    rc = platform_u2e(&tempptrin, &bytes, &tempptrout, &bytes);
    if (rc == PLATFORM_CONV_OK) {
      return(CURLE_OK);
    } else {
      return(CURLE_CONV_FAILED);
    }
}

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");

    /* use platform-specific functions for codeset conversions */
    curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION,
                     my_conv_from_ascii_to_ebcdic);
    curl_easy_setopt(curl, CURLOPT_CONV_TO_NETWORK_FUNCTION,
                     my_conv_from_ebcdic_to_ascii);
    curl_easy_setopt(curl, CURLOPT_CONV_FROM_UTF8_FUNCTION,
                     my_conv_from_utf8_to_ebcdic);

    res = curl_easy_perform(curl);

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}
