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