quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

INMEMORY (6812B)


      1       * Curl get in memory and count HTML tags
      2       *
      3      h DFTACTGRP(*NO) ACTGRP(*NEW)
      4      h OPTION(*NOSHOWCPY)
      5      h BNDDIR('CURL')
      6       *
      7       **************************************************************************
      8       *                                  _   _ ____  _
      9       *  Project                     ___| | | |  _ \| |
     10       *                             / __| | | | |_) | |
     11       *                            | (__| |_| |  _ <| |___
     12       *                             \___|\___/|_| \_\_____|
     13       *
     14       * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
     15       *
     16       * This software is licensed as described in the file COPYING, which
     17       * you should have received as part of this distribution. The terms
     18       * are also available at https://curl.se/docs/copyright.html.
     19       *
     20       * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     21       * copies of the Software, and permit persons to whom the Software is
     22       * furnished to do so, under the terms of the COPYING file.
     23       *
     24       * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
     25       * ANY KIND, either express or implied.
     26       *
     27       * SPDX-License-Identifier: curl
     28       *
     29       **************************************************************************
     30       *
     31       /include H,CURL.INC
     32       *
     33       * Example to request the URL given as command line parameter and count
     34       * HTML tags in its response.
     35       *
     36      d                 pi
     37      d url                          120
     38       *
     39      d countdata       ds                  qualified based(###dummyptr)         User data type
     40      d  tagcount                     10u 0                                      Tag counter
     41      d  tagopen                        n                                        Possible opening tag
     42       *
     43      d urllen          s             10u 0                                      URL length
     44       *
     45       **************************************************************************
     46 
     47         urllen = trimmed_length(url: %len(url));
     48 
     49         // Do the curl stuff.
     50 
     51         curl_global_init(CURL_GLOBAL_ALL);
     52         main();
     53         curl_global_cleanup();
     54         *inlr = *on;            // Exit
     55       *
     56       **************************************************************************
     57       * Main procedure: do the curl job.
     58       **************************************************************************
     59       *
     60      p main            b
     61      d main            pi
     62       *
     63      d h               s               *                                        Easy handle
     64      d result          s                   like(CURLcode)                       Curl return code
     65      d                                     inz(CURLE_OUT_OF_MEMORY)
     66      d errmsgp         s               *                                        Error string pointer
     67      d response        s             52                                         For error display
     68      d counter         ds                  likeds(countdata)                    HTML tag counter
     69 
     70         counter.tagcount = 0;
     71         counter.tagopen = *off;
     72 
     73             // Create and fill curl handle.
     74 
     75         h = curl_easy_init();
     76         if h <> *NULL;
     77             curl_easy_setopt_ccsid(h: CURLOPT_URL: %subst(url: 1: urllen): 0);
     78             curl_easy_setopt(h: CURLOPT_FOLLOWLOCATION: 1);
     79             curl_easy_setopt(h: CURLOPT_WRITEFUNCTION: %paddr(in_data_cb));
     80             curl_easy_setopt(h: CURLOPT_WRITEDATA: %addr(counter));
     81 
     82             // Perform the request.
     83 
     84             result = curl_easy_perform(h);
     85             curl_easy_cleanup(h);       // Release handle
     86         endif;
     87 
     88         // Check for error and report if some.
     89 
     90         if result <> CURLE_OK;
     91             errmsgp = curl_easy_strerror_ccsid(result: 0);
     92             response = %str(errmsgp);
     93             dsply '' '*EXT' response;
     94         else;
     95             // Display the tag count.
     96 
     97             response = 'Tag count: ' + %char(counter.tagcount);
     98             dsply '' '*EXT' response;
     99         endif;
    100      p main            e
    101       *
    102       **************************************************************************
    103       * Data input callback procedure.
    104       **************************************************************************
    105       *
    106      p in_data_cb      b
    107      d in_data_cb      pi            10u 0
    108      d  ptr                            *   value                                Input data pointer
    109      d  size                         10u 0 value                                Data element size
    110      d  nmemb                        10u 0 value                                Data element count
    111      d  userdata                       *   value                                User data pointer
    112       *
    113      d counter         ds                  likeds(countdata) based(userdata)    HTML tag counter
    114      d ebcdata         s               *                                        EBCDIC data pointer
    115      d chars           s              1    based(ebcdata) dim(1000000)
    116      d i               s             10u 0                                      Character position
    117       *
    118         size = size * nmemb;                                   // The size in bytes.
    119         ebcdata = curl_to_ccsid(%str(ptr: size): 0);           // Convert to EBCDIC.
    120         i = 1;
    121         dow i <= size;
    122             if counter.tagopen;                                // Did we see '<' ?
    123                 counter.tagopen = *off;
    124                 if chars(i) <> '/';                            // Reject closing tag.
    125                     counter.tagcount = counter.tagcount + 1;   // Count this tag.
    126                 endif;
    127             else;
    128                 i = %scan('<': %str(ebcdata): i);              // Search next possible tag.
    129                 if i = 0;
    130                     leave;
    131                 endif;
    132                 counter.tagopen = *on;                         // Found one: flag it.
    133             endif;
    134             i = i + 1;
    135         enddo;
    136         curl_free(ebcdata);
    137         return size;
    138      p in_data_cb      e
    139       *
    140       **************************************************************************
    141       * Get the length of right-trimmed string
    142       **************************************************************************
    143       *
    144      p trimmed_length  b
    145      d trimmed_length  pi            10u 0
    146      d  string                   999999    const options(*varsize)
    147      d  length                       10u 0 value
    148       *
    149      d len             s             10u 0
    150       *
    151         len = %scan(X'00': string: 1: length); // Limit to null-terminated string
    152         if len = 0;
    153             len = length + 1;
    154         endif;
    155         if len <= 1;
    156             return 0;
    157         endif;
    158         return %checkr(' ': string: len - 1);  // Trim right
    159      p trimmed_length  e