      * Curl get in memory and count HTML tags
      *
     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
      *
      * Example to request the URL given as command line parameter and count
      * HTML tags in its response.
      *
     d                 pi
     d url                          120
      *
     d countdata       ds                  qualified based(###dummyptr)         User data type
     d  tagcount                     10u 0                                      Tag counter
     d  tagopen                        n                                        Possible opening tag
      *
     d urllen          s             10u 0                                      URL length
      *
      **************************************************************************

        urllen = trimmed_length(url: %len(url));

        // Do the curl stuff.

        curl_global_init(CURL_GLOBAL_ALL);
        main();
        curl_global_cleanup();
        *inlr = *on;            // 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
     d counter         ds                  likeds(countdata)                    HTML tag counter

        counter.tagcount = 0;
        counter.tagopen = *off;

            // Create and fill curl handle.

        h = curl_easy_init();
        if h <> *NULL;
            curl_easy_setopt_ccsid(h: CURLOPT_URL: %subst(url: 1: urllen): 0);
            curl_easy_setopt(h: CURLOPT_FOLLOWLOCATION: 1);
            curl_easy_setopt(h: CURLOPT_WRITEFUNCTION: %paddr(in_data_cb));
            curl_easy_setopt(h: CURLOPT_WRITEDATA: %addr(counter));

            // Perform the request.

            result = curl_easy_perform(h);
            curl_easy_cleanup(h);       // Release handle
        endif;

        // Check for error and report if some.

        if result <> CURLE_OK;
            errmsgp = curl_easy_strerror_ccsid(result: 0);
            response = %str(errmsgp);
            dsply '' '*EXT' response;
        else;
            // Display the tag count.

            response = 'Tag count: ' + %char(counter.tagcount);
            dsply '' '*EXT' response;
        endif;
     p main            e
      *
      **************************************************************************
      * Data input callback procedure.
      **************************************************************************
      *
     p in_data_cb      b
     d in_data_cb      pi            10u 0
     d  ptr                            *   value                                Input data pointer
     d  size                         10u 0 value                                Data element size
     d  nmemb                        10u 0 value                                Data element count
     d  userdata                       *   value                                User data pointer
      *
     d counter         ds                  likeds(countdata) based(userdata)    HTML tag counter
     d ebcdata         s               *                                        EBCDIC data pointer
     d chars           s              1    based(ebcdata) dim(1000000)
     d i               s             10u 0                                      Character position
      *
        size = size * nmemb;                                   // The size in bytes.
        ebcdata = curl_to_ccsid(%str(ptr: size): 0);           // Convert to EBCDIC.
        i = 1;
        dow i <= size;
            if counter.tagopen;                                // Did we see '<' ?
                counter.tagopen = *off;
                if chars(i) <> '/';                            // Reject closing tag.
                    counter.tagcount = counter.tagcount + 1;   // Count this tag.
                endif;
            else;
                i = %scan('<': %str(ebcdata): i);              // Search next possible tag.
                if i = 0;
                    leave;
                endif;
                counter.tagopen = *on;                         // Found one: flag it.
            endif;
            i = i + 1;
        enddo;
        curl_free(ebcdata);
        return size;
     p in_data_cb      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
      *
        len = %scan(X'00': string: 1: length); // Limit to zero-terminated string
        if len = 0;
            len = length + 1;
        endif;
        if len <= 1;
            return 0;
        endif;
        return %checkr(' ': string: len - 1);  // Trim right
     p trimmed_length  e
