xref: /curl/packages/OS400/rpg-examples/INMEMORY (revision 7c142d05)
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