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: 2024-11-21 22:18:42 Functions: 4 4 100.0 %

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

Generated by: LCOV version 1.14