Line data Source code
1 :
2 : /******************************************************************************
3 : * Project: GDAL/OGR Java bindings
4 : * Purpose: Add javadoc located in a special file into generated SWIG Java files
5 : * Author: Even Rouault <even dot rouault at spatialys.com>
6 : *
7 : *******************************************************************************
8 : * Copyright (c) 2009, Even Rouault <even dot rouault at spatialys.com>
9 : *
10 : * SPDX-License-Identifier: MIT
11 : *******************************************************************************/
12 :
13 : /* NOTE : this is really a quick and very dirty hack to put the javadoc contained */
14 : /* in a special formatted file, javadoc.java, into the SWIG generated java files */
15 : /* This program leaks memory and would crash easily on unexpected inputs */
16 :
17 : #include <stdio.h>
18 : #include <stdlib.h>
19 : #include <string.h>
20 :
21 : #define TRUE 1
22 : #define FALSE 0
23 :
24 : typedef struct
25 : {
26 : char* methodName;
27 : char* compactMethodName;
28 : char* javadoc;
29 : int bUsed;
30 : int bHide;
31 : } JavaDocInstance;
32 :
33 5437 : char* stripline(char* pszBuf)
34 : {
35 5437 : int i = 0;
36 10935 : while(pszBuf[i] == ' ' && pszBuf[i] != 0)
37 5498 : i ++;
38 5437 : memmove(pszBuf, pszBuf + i, strlen(pszBuf) - i + 1);
39 :
40 5437 : i = strlen(pszBuf) - 1;
41 13942 : while(i > 0 && (pszBuf[i] == '{' || pszBuf[i] == '\n' || pszBuf[i] == ' '))
42 : {
43 8505 : pszBuf[i] = 0;
44 8505 : i--;
45 : }
46 :
47 5437 : return pszBuf;
48 : }
49 :
50 : /* Remove argument names from function prototype, so that we used the */
51 : /* argument names from javadoc.java instead of the ones provided by default by the */
52 : /* bindings */
53 3649 : char* removeargnames(char* pszBuf)
54 : {
55 3649 : if (strstr(pszBuf, "="))
56 : {
57 733 : *strstr(pszBuf, "=") = 0;
58 733 : stripline(pszBuf);
59 : }
60 :
61 3649 : if (strstr(pszBuf, "(") == NULL)
62 878 : return pszBuf;
63 :
64 : //fprintf(stderr, "%s\n", pszBuf);
65 :
66 2771 : if (strstr(pszBuf, "{"))
67 : {
68 6 : *strstr(pszBuf, "{") = 0;
69 6 : stripline(pszBuf);
70 : }
71 : else
72 : {
73 2765 : int i = strstr(pszBuf, ")") - pszBuf - 1;
74 2765 : char* lastOK = strstr(pszBuf, ")");
75 2788 : while(i>0 && pszBuf[i] == ' ')
76 23 : i --;
77 47299 : while(i>0)
78 : {
79 47299 : if (pszBuf[i] == '(')
80 858 : break;
81 46441 : if (pszBuf[i] == ' ' || pszBuf[i] == ']')
82 : {
83 5789 : if (pszBuf[i] == ' ')
84 5789 : memmove(pszBuf + i + 1, lastOK, strlen(lastOK) + 1);
85 : else
86 0 : memmove(pszBuf + i, lastOK, strlen(lastOK) + 1);
87 48965 : while(pszBuf[i] != ',' && pszBuf[i] != '(')
88 43176 : i --;
89 5789 : if (pszBuf[i] == ',')
90 3882 : lastOK = pszBuf + i;
91 : else
92 1907 : break;
93 : }
94 44534 : i --;
95 : }
96 2765 : i = strstr(pszBuf, "(") - pszBuf;
97 55354 : while(pszBuf[i])
98 : {
99 52589 : if (pszBuf[i] == ' ')
100 9910 : memmove(pszBuf + i, pszBuf + i + 1, strlen(pszBuf + i + 1) + 1);
101 : else
102 42679 : i++;
103 : }
104 : }
105 : //fprintf(stderr, "after : %s\n", pszBuf);
106 2771 : return pszBuf;
107 : }
108 :
109 2708 : static void ignore_ret(char* x)
110 : {
111 : (void)x;
112 2708 : }
113 :
114 1 : int main(int argc, char* argv[])
115 : {
116 1 : const char* patch_filename = argv[1];
117 :
118 1 : FILE* fSrc = fopen(patch_filename, "rt");
119 1 : if( fSrc == NULL )
120 : {
121 0 : fprintf(stderr, "Cannot open %s\n", patch_filename);
122 0 : return 1;
123 : }
124 : FILE* fDst;
125 1 : JavaDocInstance* instances = (JavaDocInstance*)calloc(sizeof(JavaDocInstance), 3000);
126 1 : int nInstances = 0;
127 : char szLine[1024];
128 : char szClass[256];
129 : char javadoc[16384];
130 1 : szClass[0] = 0;
131 57 : while(fgets(szLine, 1023, fSrc))
132 : {
133 56 : if (strstr(szLine, "/**") == NULL) continue;
134 22 : begin:
135 896 : strcpy(javadoc, szLine);
136 9387 : while(fgets(szLine, 1023, fSrc))
137 : {
138 9387 : strcat(javadoc, szLine);
139 9387 : if (strstr(szLine, "*/"))
140 896 : break;
141 : }
142 2919 : while(fgets(szLine, 1023, fSrc))
143 : {
144 2918 : if (szLine[0] == 10)
145 1079 : continue;
146 1839 : else if (strstr(szLine, "*") == NULL)
147 : {
148 944 : instances[nInstances].javadoc = strdup(javadoc);
149 :
150 944 : char* pszLine = szLine;
151 944 : if (strncmp(pszLine, "@hide ", 6) == 0)
152 : {
153 41 : instances[nInstances].bHide = 1;
154 41 : pszLine += 6;
155 : }
156 : else
157 903 : instances[nInstances].bHide = 0;
158 :
159 944 : instances[nInstances].methodName = strdup(stripline(pszLine));
160 944 : instances[nInstances].compactMethodName = strdup(removeargnames(stripline(pszLine)));
161 944 : nInstances++;
162 : }
163 : else
164 895 : break;
165 : }
166 896 : if (strstr(szLine, "/**") != NULL)
167 874 : goto begin;
168 : }
169 : //fprintf(stderr, "nInstances=%d\n", nInstances);
170 1 : fclose(fSrc);
171 :
172 : int i;
173 94 : for(i=3;i<argc;i++)
174 : {
175 93 : if( strstr(argv[i], "AsyncReader.java") )
176 : {
177 0 : fprintf(stderr, "Skipping %s\n", argv[i]);
178 0 : continue;
179 : }
180 93 : fSrc = fopen(argv[i], "rt");
181 93 : if (fSrc == NULL)
182 : {
183 0 : fprintf(stderr, "Cannot open %s\n", argv[i]);
184 0 : continue;
185 : }
186 : char szDstName[1024];
187 93 : sprintf(szDstName, "%s/%s", argv[2], argv[i]);
188 93 : fDst = fopen(szDstName, "wt");
189 93 : if (fDst == NULL)
190 : {
191 0 : fprintf(stderr, "Cannot write %s\n", szDstName);
192 0 : continue;
193 : }
194 93 : szClass[0] = 0;
195 : char szPackage[256];
196 93 : szPackage[0] = 0;
197 :
198 12918 : while(fgets(szLine, 1023, fSrc))
199 : {
200 : char szMethodName[2048];
201 12825 : char* szOriLine = strdup(szLine);
202 12825 : if (strstr(szLine, "package"))
203 : {
204 93 : strcpy(szPackage, szLine);
205 : }
206 12732 : else if (strstr(szLine, "public class") || strstr(szLine, "public interface"))
207 : {
208 85 : strcpy(szClass, stripline(szLine));
209 85 : if (strstr(szClass, "extends"))
210 : {
211 11 : *strstr(szClass, "extends") = 0;
212 11 : stripline(szClass);
213 : }
214 85 : if (strstr(szClass, "implements"))
215 : {
216 9 : *strstr(szClass, "implements") = 0;
217 9 : stripline(szClass);
218 : }
219 85 : if (strstr(szLine, "Driver"))
220 : {
221 2 : if (strstr(szPackage, "org.gdal.gdal"))
222 1 : strcpy(szLine, "public class org.gdal.gdal.Driver");
223 : else
224 1 : strcpy(szLine, "public class org.gdal.ogr.Driver");
225 2 : strcpy(szClass, szLine);
226 : }
227 : }
228 12825 : if (strstr(szLine, "synchronized "))
229 : {
230 60 : char* c = strstr(szLine, "synchronized ");
231 60 : *c = 0;
232 60 : memmove(c, c + 13, strlen(c + 13) + 1);
233 : }
234 12825 : if (strstr(szLine, "public") && !strstr(szLine, "native"))
235 2796 : {
236 2796 : if (strchr(szLine, '(') && !strchr(szLine,')'))
237 : {
238 6 : strcpy(szMethodName, szLine);
239 : do
240 : {
241 6 : ignore_ret(fgets(szLine, 1023, fSrc));
242 6 : strcpy(szMethodName + strlen(szMethodName) - 1, szLine);
243 6 : } while (!strchr(szMethodName,')'));
244 6 : strcpy(szLine, szMethodName);
245 6 : free(szOriLine);
246 6 : szOriLine = strdup(szMethodName);
247 : //fprintf(stderr, "%s\n", szOriLine);
248 : }
249 2796 : if (strchr(szLine, '(') || strchr(szLine, '='))
250 2705 : sprintf(szMethodName, "%s:%s", szClass, removeargnames(stripline(szLine)));
251 : else
252 91 : strcpy(szMethodName, szClass);
253 : //fprintf(stderr, "%s\n", szMethodName);
254 : int j;
255 2206080 : for(j=0;j<nInstances;j++)
256 : {
257 2204210 : if (strcmp(instances[j].compactMethodName, szMethodName) == 0)
258 : {
259 929 : instances[j].bUsed = TRUE;
260 :
261 : //fprintf(stderr, "found match for %s\n", szMethodName);
262 929 : if (instances[j].bHide)
263 : {
264 39 : if (strstr(szLine, "final static") == NULL)
265 : {
266 : do
267 : {
268 74 : ignore_ret(fgets(szLine, 1023, fSrc));
269 74 : } while (!strchr(szLine,'}'));
270 : }
271 39 : break;
272 : }
273 :
274 890 : fprintf(fDst, "%s", instances[j].javadoc);
275 890 : if (strchr(szMethodName, '('))
276 : {
277 743 : fprintf(fDst, "%s;\n", strchr(instances[j].methodName, ':')+1);
278 743 : int nBrackets = 0;
279 743 : int bFoundOpen = FALSE;
280 743 : strcpy(szLine, szOriLine);
281 : do
282 : {
283 : int j;
284 128117 : for(j=0;szLine[j];j++)
285 : {
286 125489 : if (szLine[j] == '{')
287 : {
288 793 : bFoundOpen = TRUE;
289 793 : nBrackets ++;
290 : }
291 124696 : else if (szLine[j] == '}')
292 : {
293 793 : nBrackets --;
294 : }
295 : }
296 2628 : ignore_ret(fgets(szLine, 1023, fSrc));
297 2628 : } while(bFoundOpen == FALSE || nBrackets > 0);
298 : }
299 : else
300 147 : fprintf(fDst, "%s", szOriLine);
301 890 : break;
302 : }
303 : }
304 2796 : if (j == nInstances)
305 : {
306 1867 : if (strstr(szOriLine, "public") && (strstr(szOriLine, "getCPtr") || strstr(szOriLine, "long cPtr")))
307 21 : {
308 21 : char* c = strstr(szOriLine, "public");
309 21 : *c = 0;
310 21 : fprintf(fDst, "%s private %s", szOriLine, c + 6);
311 : }
312 : else
313 1846 : fprintf(fDst, "%s", szOriLine);
314 : }
315 : }
316 : else
317 10029 : fprintf(fDst, "%s", szOriLine);
318 12825 : free(szOriLine);
319 : }
320 :
321 93 : fclose(fSrc);
322 93 : fclose(fDst);
323 : }
324 :
325 : int j;
326 945 : for(j=0;j<nInstances;j++)
327 : {
328 944 : if (!instances[j].bUsed)
329 21 : fprintf(stderr, "WARNING: did not find occurrence of %s\n", instances[j].methodName);
330 : }
331 :
332 1 : return 0;
333 : }
|