      * Curl simple URL request
      *
     h DFTACTGRP(*NO) ACTGRP(*NEW)
     h OPTION(*NOSHOWCPY)
     h BNDDIR('CURL')
      *
      **************************************************************************
      *                                  _   _ ____  _
      *  Project                     ___| | | |  _ \| |
      *                             / __| | | | |_) | |
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
      * Copyright (C) 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 https://curl.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.
      *
      * SPDX-License-Identifier: curl
      *
      **************************************************************************
      *
      /include H,CURL.INC
      *
      * Simple example to request the URL given as command line parameter and
      * output its response.
      *
     d                 pi
     d url                          120
      *
     d urllen          s             10u 0                                      URL length
      *
      **************************************************************************
      *
     c                   eval      urllen = trimmed_length(url: %len(url))
      *
      * Do the curl stuff.
      *
     c                   callp     curl_global_init(CURL_GLOBAL_ALL)
     c                   callp     main
     c                   callp     curl_global_cleanup()
     c                   seton                                            lr    Exit
      *
      **************************************************************************
      * Main procedure: do the curl job.
      **************************************************************************
      *
     p main            b
     d main            pi
      *
     d h               s               *                                        Easy handle
     d result          s                   like(CURLcode)                       Curl return code
     d                                     inz(CURLE_OUT_OF_MEMORY)
     d errmsgp         s               *                                        Error string pointer
     d response        s             52                                         For error display
      *
      * Create and fill curl handle.
      *
     c                   eval      h = curl_easy_init()
     c                   if        h <> *NULL
     c                   callp     curl_easy_setopt_ccsid(h: CURLOPT_URL:
     c                               %subst(url: 1: urllen): 0)
     c                   callp     curl_easy_setopt_long(h:
     c                               CURLOPT_FOLLOWLOCATION: 1)
      *
      * Perform the request.
      *
     c                   eval      result = curl_easy_perform(h)
     c                   callp     curl_easy_cleanup(h)                         Release handle
     c                   endif
      *
      * Check for error and report if some.
      *
     c                   if        result <> CURLE_OK
     c                   eval      errmsgp = curl_easy_strerror_ccsid(result: 0)
     c                   eval      response = %str(errmsgp)
     c                   dsply                   response
     c                   endif
     p main            e
      *
      **************************************************************************
      * Get the length of right-trimmed string
      **************************************************************************
      *
     p trimmed_length  b
     d trimmed_length  pi            10u 0
     d  string                   999999    const options(*varsize)
     d  length                       10u 0 value
      *
     d len             s             10u 0
      *
     c                   eval      len = %scan(X'00': string: 1: length)        Limit 0-terminated
     c                   if        len = 0
     c                   eval      len = length + 1
     c                   endif
     c                   if        len <= 1
     c                   return    0
     c                   endif
     c                   return    %checkr(' ': string: len - 1)                Trim right
     p trimmed_length  e
