xref: /aosp_15_r20/external/curl/scripts/schemetable.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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