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