LCOV - code coverage report
Current view: top level - swig/java - add_javadoc.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 157 166 94.6 %
Date: 2025-01-18 12:42:00 Functions: 4 4 100.0 %

          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             : }

Generated by: LCOV version 1.14