1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _
3*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| |
4*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___
6*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker *
8*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker *
10*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker *
14*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker *
18*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker *
21*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker *
23*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker #include <stdio.h>
25*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h>
26*6236dae4SAndroid Build Coastguard Worker
27*6236dae4SAndroid Build Coastguard Worker /*
28*6236dae4SAndroid Build Coastguard Worker * Use this tool to generate an updated table for the Curl_getn_scheme_handler
29*6236dae4SAndroid Build Coastguard Worker * function in url.c.
30*6236dae4SAndroid Build Coastguard Worker */
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard Worker struct detail {
33*6236dae4SAndroid Build Coastguard Worker const char *n;
34*6236dae4SAndroid Build Coastguard Worker const char *ifdef;
35*6236dae4SAndroid Build Coastguard Worker };
36*6236dae4SAndroid Build Coastguard Worker
37*6236dae4SAndroid Build Coastguard Worker static const struct detail scheme[] = {
38*6236dae4SAndroid Build Coastguard Worker {"dict", "#ifndef CURL_DISABLE_DICT" },
39*6236dae4SAndroid Build Coastguard Worker {"file", "#ifndef CURL_DISABLE_FILE" },
40*6236dae4SAndroid Build Coastguard Worker {"ftp", "#ifndef CURL_DISABLE_FTP" },
41*6236dae4SAndroid Build Coastguard Worker {"ftps", "#if defined(USE_SSL) && !defined(CURL_DISABLE_FTP)" },
42*6236dae4SAndroid Build Coastguard Worker {"gopher", "#ifndef CURL_DISABLE_GOPHER" },
43*6236dae4SAndroid Build Coastguard Worker {"gophers", "#if defined(USE_SSL) && !defined(CURL_DISABLE_GOPHER)" },
44*6236dae4SAndroid Build Coastguard Worker {"http", "#ifndef CURL_DISABLE_HTTP" },
45*6236dae4SAndroid Build Coastguard Worker {"https", "#if defined(USE_SSL) && !defined(CURL_DISABLE_HTTP)" },
46*6236dae4SAndroid Build Coastguard Worker {"imap", "#ifndef CURL_DISABLE_IMAP" },
47*6236dae4SAndroid Build Coastguard Worker {"imaps", "#if defined(USE_SSL) && !defined(CURL_DISABLE_IMAP)" },
48*6236dae4SAndroid Build Coastguard Worker {"ldap", "#ifndef CURL_DISABLE_LDAP" },
49*6236dae4SAndroid Build Coastguard Worker {"ldaps", "#if !defined(CURL_DISABLE_LDAP) && \\\n"
50*6236dae4SAndroid Build Coastguard Worker " !defined(CURL_DISABLE_LDAPS) && \\\n"
51*6236dae4SAndroid Build Coastguard Worker " ((defined(USE_OPENLDAP) && defined(USE_SSL)) || \\\n"
52*6236dae4SAndroid Build Coastguard Worker " (!defined(USE_OPENLDAP) && defined(HAVE_LDAP_SSL)))" },
53*6236dae4SAndroid Build Coastguard Worker {"mqtt", "#ifndef CURL_DISABLE_MQTT" },
54*6236dae4SAndroid Build Coastguard Worker {"pop3", "#ifndef CURL_DISABLE_POP3" },
55*6236dae4SAndroid Build Coastguard Worker {"pop3s", "#if defined(USE_SSL) && !defined(CURL_DISABLE_POP3)" },
56*6236dae4SAndroid Build Coastguard Worker {"rtmp", "#ifdef USE_LIBRTMP" },
57*6236dae4SAndroid Build Coastguard Worker {"rtmpt", "#ifdef USE_LIBRTMP" },
58*6236dae4SAndroid Build Coastguard Worker {"rtmpe", "#ifdef USE_LIBRTMP" },
59*6236dae4SAndroid Build Coastguard Worker {"rtmpte", "#ifdef USE_LIBRTMP" },
60*6236dae4SAndroid Build Coastguard Worker {"rtmps", "#ifdef USE_LIBRTMP" },
61*6236dae4SAndroid Build Coastguard Worker {"rtmpts", "#ifdef USE_LIBRTMP" },
62*6236dae4SAndroid Build Coastguard Worker {"rtsp", "#ifndef CURL_DISABLE_RTSP" },
63*6236dae4SAndroid Build Coastguard Worker {"scp", "#if defined(USE_SSH) && !defined(USE_WOLFSSH)" },
64*6236dae4SAndroid Build Coastguard Worker {"sftp", "#if defined(USE_SSH)" },
65*6236dae4SAndroid Build Coastguard Worker {"smb", "#if !defined(CURL_DISABLE_SMB) && \\\n"
66*6236dae4SAndroid Build Coastguard Worker " defined(USE_CURL_NTLM_CORE) && (SIZEOF_CURL_OFF_T > 4)" },
67*6236dae4SAndroid Build Coastguard Worker {"smbs", "#if defined(USE_SSL) && !defined(CURL_DISABLE_SMB) && \\\n"
68*6236dae4SAndroid Build Coastguard Worker " defined(USE_CURL_NTLM_CORE) && (SIZEOF_CURL_OFF_T > 4)" },
69*6236dae4SAndroid Build Coastguard Worker {"smtp", "#ifndef CURL_DISABLE_SMTP" },
70*6236dae4SAndroid Build Coastguard Worker {"smtps", "#if defined(USE_SSL) && !defined(CURL_DISABLE_SMTP)" },
71*6236dae4SAndroid Build Coastguard Worker {"telnet", "#ifndef CURL_DISABLE_TELNET" },
72*6236dae4SAndroid Build Coastguard Worker {"tftp", "#ifndef CURL_DISABLE_TFTP" },
73*6236dae4SAndroid Build Coastguard Worker {"ws",
74*6236dae4SAndroid Build Coastguard Worker "#if !defined(CURL_DISABLE_WEBSOCKETS) && !defined(CURL_DISABLE_HTTP)" },
75*6236dae4SAndroid Build Coastguard Worker {"wss", "#if !defined(CURL_DISABLE_WEBSOCKETS) && \\\n"
76*6236dae4SAndroid Build Coastguard Worker " defined(USE_SSL) && !defined(CURL_DISABLE_HTTP)" },
77*6236dae4SAndroid Build Coastguard Worker { NULL, NULL }
78*6236dae4SAndroid Build Coastguard Worker };
79*6236dae4SAndroid Build Coastguard Worker
calc(const char * s,int add,int shift)80*6236dae4SAndroid Build Coastguard Worker unsigned int calc(const char *s, int add, int shift)
81*6236dae4SAndroid Build Coastguard Worker {
82*6236dae4SAndroid Build Coastguard Worker const char *so = s;
83*6236dae4SAndroid Build Coastguard Worker unsigned int c = add;
84*6236dae4SAndroid Build Coastguard Worker while(*s) {
85*6236dae4SAndroid Build Coastguard Worker c <<= shift;
86*6236dae4SAndroid Build Coastguard Worker c += *s;
87*6236dae4SAndroid Build Coastguard Worker s++;
88*6236dae4SAndroid Build Coastguard Worker }
89*6236dae4SAndroid Build Coastguard Worker return c;
90*6236dae4SAndroid Build Coastguard Worker }
91*6236dae4SAndroid Build Coastguard Worker
92*6236dae4SAndroid Build Coastguard Worker unsigned int num[100];
93*6236dae4SAndroid Build Coastguard Worker unsigned int ix[100];
94*6236dae4SAndroid Build Coastguard Worker
showtable(int try,int init,int shift)95*6236dae4SAndroid Build Coastguard Worker static void showtable(int try, int init, int shift)
96*6236dae4SAndroid Build Coastguard Worker {
97*6236dae4SAndroid Build Coastguard Worker int nulls = 0;
98*6236dae4SAndroid Build Coastguard Worker int i;
99*6236dae4SAndroid Build Coastguard Worker for(i = 0; scheme[i].n; ++i)
100*6236dae4SAndroid Build Coastguard Worker num[i] = calc(scheme[i].n, init, shift);
101*6236dae4SAndroid Build Coastguard Worker for(i = 0; scheme[i].n; ++i)
102*6236dae4SAndroid Build Coastguard Worker ix[i] = num[i] % try;
103*6236dae4SAndroid Build Coastguard Worker printf("/*\n"
104*6236dae4SAndroid Build Coastguard Worker " unsigned int c = %d\n"
105*6236dae4SAndroid Build Coastguard Worker " while(l) {\n"
106*6236dae4SAndroid Build Coastguard Worker " c <<= %d;\n"
107*6236dae4SAndroid Build Coastguard Worker " c += Curl_raw_tolower(*s);\n"
108*6236dae4SAndroid Build Coastguard Worker " s++;\n"
109*6236dae4SAndroid Build Coastguard Worker " l--;\n"
110*6236dae4SAndroid Build Coastguard Worker " }\n"
111*6236dae4SAndroid Build Coastguard Worker "*/\n", init, shift);
112*6236dae4SAndroid Build Coastguard Worker
113*6236dae4SAndroid Build Coastguard Worker printf(" static const struct Curl_handler * const protocols[%d] = {", try);
114*6236dae4SAndroid Build Coastguard Worker
115*6236dae4SAndroid Build Coastguard Worker /* generate table */
116*6236dae4SAndroid Build Coastguard Worker for(i = 0; i < try; i++) {
117*6236dae4SAndroid Build Coastguard Worker int match = 0;
118*6236dae4SAndroid Build Coastguard Worker int j;
119*6236dae4SAndroid Build Coastguard Worker for(j = 0; scheme[j].n; j++) {
120*6236dae4SAndroid Build Coastguard Worker if(ix[j] == i) {
121*6236dae4SAndroid Build Coastguard Worker printf("\n");
122*6236dae4SAndroid Build Coastguard Worker printf("%s\n", scheme[j].ifdef);
123*6236dae4SAndroid Build Coastguard Worker printf(" &Curl_handler_%s,\n", scheme[j].n);
124*6236dae4SAndroid Build Coastguard Worker printf("#else\n NULL,\n");
125*6236dae4SAndroid Build Coastguard Worker printf("#endif");
126*6236dae4SAndroid Build Coastguard Worker match = 1;
127*6236dae4SAndroid Build Coastguard Worker nulls = 0;
128*6236dae4SAndroid Build Coastguard Worker break;
129*6236dae4SAndroid Build Coastguard Worker }
130*6236dae4SAndroid Build Coastguard Worker }
131*6236dae4SAndroid Build Coastguard Worker if(!match) {
132*6236dae4SAndroid Build Coastguard Worker if(!nulls || (nulls > 10)) {
133*6236dae4SAndroid Build Coastguard Worker printf("\n ");
134*6236dae4SAndroid Build Coastguard Worker nulls = 0;
135*6236dae4SAndroid Build Coastguard Worker }
136*6236dae4SAndroid Build Coastguard Worker printf(" NULL,", nulls);
137*6236dae4SAndroid Build Coastguard Worker nulls++;
138*6236dae4SAndroid Build Coastguard Worker }
139*6236dae4SAndroid Build Coastguard Worker }
140*6236dae4SAndroid Build Coastguard Worker printf("\n };\n");
141*6236dae4SAndroid Build Coastguard Worker }
142*6236dae4SAndroid Build Coastguard Worker
main(void)143*6236dae4SAndroid Build Coastguard Worker int main(void)
144*6236dae4SAndroid Build Coastguard Worker {
145*6236dae4SAndroid Build Coastguard Worker int i;
146*6236dae4SAndroid Build Coastguard Worker int try;
147*6236dae4SAndroid Build Coastguard Worker int besttry = 9999;
148*6236dae4SAndroid Build Coastguard Worker int bestadd = 0;
149*6236dae4SAndroid Build Coastguard Worker int bestshift = 0;
150*6236dae4SAndroid Build Coastguard Worker int add;
151*6236dae4SAndroid Build Coastguard Worker int shift;
152*6236dae4SAndroid Build Coastguard Worker for(shift = 0; shift < 8; shift++) {
153*6236dae4SAndroid Build Coastguard Worker for(add = 0; add < 999; add++) {
154*6236dae4SAndroid Build Coastguard Worker for(i = 0; scheme[i].n; ++i) {
155*6236dae4SAndroid Build Coastguard Worker unsigned int v = calc(scheme[i].n, add, shift);
156*6236dae4SAndroid Build Coastguard Worker int j;
157*6236dae4SAndroid Build Coastguard Worker int badcombo = 0;
158*6236dae4SAndroid Build Coastguard Worker for(j = 0; j < i; j++) {
159*6236dae4SAndroid Build Coastguard Worker
160*6236dae4SAndroid Build Coastguard Worker if(num[j] == v) {
161*6236dae4SAndroid Build Coastguard Worker /*
162*6236dae4SAndroid Build Coastguard Worker printf("NOPE: %u is a dupe (%s and %s)\n",
163*6236dae4SAndroid Build Coastguard Worker v, scheme[i], scheme[j]);
164*6236dae4SAndroid Build Coastguard Worker */
165*6236dae4SAndroid Build Coastguard Worker badcombo = 1;
166*6236dae4SAndroid Build Coastguard Worker break;
167*6236dae4SAndroid Build Coastguard Worker }
168*6236dae4SAndroid Build Coastguard Worker }
169*6236dae4SAndroid Build Coastguard Worker if(badcombo)
170*6236dae4SAndroid Build Coastguard Worker break;
171*6236dae4SAndroid Build Coastguard Worker num[i] = v;
172*6236dae4SAndroid Build Coastguard Worker }
173*6236dae4SAndroid Build Coastguard Worker #if 0
174*6236dae4SAndroid Build Coastguard Worker for(i = 0; scheme[i].n; ++i) {
175*6236dae4SAndroid Build Coastguard Worker printf("%u - %s\n", num[i], scheme[i].n);
176*6236dae4SAndroid Build Coastguard Worker }
177*6236dae4SAndroid Build Coastguard Worker #endif
178*6236dae4SAndroid Build Coastguard Worker /* try different remainders to find smallest possible table */
179*6236dae4SAndroid Build Coastguard Worker for(try = 28; try < 199; try++) {
180*6236dae4SAndroid Build Coastguard Worker int good = 1;
181*6236dae4SAndroid Build Coastguard Worker for(i = 0; scheme[i].n; ++i) {
182*6236dae4SAndroid Build Coastguard Worker ix[i] = num[i] % try;
183*6236dae4SAndroid Build Coastguard Worker }
184*6236dae4SAndroid Build Coastguard Worker /* check for dupes */
185*6236dae4SAndroid Build Coastguard Worker for(i = 0; scheme[i].n && good; ++i) {
186*6236dae4SAndroid Build Coastguard Worker int j;
187*6236dae4SAndroid Build Coastguard Worker for(j = 0; j < i; j++) {
188*6236dae4SAndroid Build Coastguard Worker if(ix[j] == ix[i]) {
189*6236dae4SAndroid Build Coastguard Worker good = 0;
190*6236dae4SAndroid Build Coastguard Worker break;
191*6236dae4SAndroid Build Coastguard Worker }
192*6236dae4SAndroid Build Coastguard Worker }
193*6236dae4SAndroid Build Coastguard Worker }
194*6236dae4SAndroid Build Coastguard Worker if(good) {
195*6236dae4SAndroid Build Coastguard Worker if(try < besttry) {
196*6236dae4SAndroid Build Coastguard Worker besttry = try;
197*6236dae4SAndroid Build Coastguard Worker bestadd = add;
198*6236dae4SAndroid Build Coastguard Worker bestshift = shift;
199*6236dae4SAndroid Build Coastguard Worker }
200*6236dae4SAndroid Build Coastguard Worker break;
201*6236dae4SAndroid Build Coastguard Worker }
202*6236dae4SAndroid Build Coastguard Worker }
203*6236dae4SAndroid Build Coastguard Worker }
204*6236dae4SAndroid Build Coastguard Worker }
205*6236dae4SAndroid Build Coastguard Worker
206*6236dae4SAndroid Build Coastguard Worker showtable(besttry, bestadd, bestshift);
207*6236dae4SAndroid Build Coastguard Worker }
208