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 zero-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 160