/****************************************************************************** * $Id: add_javadoc.c f070adf64950cae1c6cc86b104ba835c29df06b1 2016-08-28 06:06:11Z Kurt Schwehr $ * * Project: GDAL/OGR Java bindings * Purpose: Add javadoc located in a special file into generated SWIG Java files * Author: Even Rouault * ******************************************************************************* * Copyright (c) 2009, Even Rouault * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *******************************************************************************/ /* NOTE : this is really a quick and very dirty hack to put the javadoc contained */ /* in a special formatted file, javadoc.java, into the SWIG generated java files */ /* This program leaks memory and would crash easily on unexpected inputs */ #include #include #include #define TRUE 1 #define FALSE 0 typedef struct { char* methodName; char* compactMethodName; char* javadoc; int bUsed; int bHide; } JavaDocInstance; char* stripline(char* pszBuf) { int i = 0; while(pszBuf[i] == ' ' && pszBuf[i] != 0) i ++; memmove(pszBuf, pszBuf + i, strlen(pszBuf) - i + 1); i = strlen(pszBuf) - 1; while(i > 0 && (pszBuf[i] == '{' || pszBuf[i] == '\n' || pszBuf[i] == ' ')) { pszBuf[i] = 0; i--; } return pszBuf; } /* Remove argument names from function prototype, so that we used the */ /* argument names from javadoc.java instead of the ones provided by default by the */ /* bindings */ char* removeargnames(char* pszBuf) { if (strstr(pszBuf, "=")) { *strstr(pszBuf, "=") = 0; stripline(pszBuf); } if (strstr(pszBuf, "(") == NULL) return pszBuf; //fprintf(stderr, "%s\n", pszBuf); if (strstr(pszBuf, "{")) { *strstr(pszBuf, "{") = 0; stripline(pszBuf); } else { int i = strstr(pszBuf, ")") - pszBuf - 1; char* lastOK = strstr(pszBuf, ")"); while(i>0 && pszBuf[i] == ' ') i --; while(i>0) { if (pszBuf[i] == '(') break; if (pszBuf[i] == ' ' || pszBuf[i] == ']') { if (pszBuf[i] == ' ') memmove(pszBuf + i + 1, lastOK, strlen(lastOK) + 1); else memmove(pszBuf + i, lastOK, strlen(lastOK) + 1); while(pszBuf[i] != ',' && pszBuf[i] != '(') i --; if (pszBuf[i] == ',') lastOK = pszBuf + i; else break; } i --; } i = strstr(pszBuf, "(") - pszBuf; while(pszBuf[i]) { if (pszBuf[i] == ' ') memmove(pszBuf + i, pszBuf + i + 1, strlen(pszBuf + i + 1) + 1); else i++; } } //fprintf(stderr, "after : %s\n", pszBuf); return pszBuf; } int main(int argc, char* argv[]) { const char* patch_filename = argv[1]; FILE* fSrc = fopen(patch_filename, "rt"); FILE* fDst; JavaDocInstance* instances = (JavaDocInstance*)calloc(sizeof(JavaDocInstance), 3000); int nInstances = 0; char szLine[256]; char szClass[256]; char javadoc[16384]; szClass[0] = 0; while(fgets(szLine, 255, fSrc)) { if (strstr(szLine, "/**") == NULL) continue; begin: strcpy(javadoc, szLine); while(fgets(szLine, 255, fSrc)) { strcat(javadoc, szLine); if (strstr(szLine, "*/")) break; } while(fgets(szLine, 255, fSrc)) { if (szLine[0] == 10) continue; else if (strstr(szLine, "*") == NULL) { instances[nInstances].javadoc = strdup(javadoc); char* pszLine = szLine; if (strncmp(pszLine, "@hide ", 6) == 0) { instances[nInstances].bHide = 1; pszLine += 6; } else instances[nInstances].bHide = 0; instances[nInstances].methodName = strdup(stripline(pszLine)); instances[nInstances].compactMethodName = strdup(removeargnames(stripline(pszLine))); nInstances++; } else break; } if (strstr(szLine, "/**") != NULL) goto begin; } //fprintf(stderr, "nInstances=%d\n", nInstances); fclose(fSrc); int i; for(i=3;i 0); } else fprintf(fDst, "%s", szOriLine); break; } } if (j == nInstances) { if (strstr(szOriLine, "public") && (strstr(szOriLine, "getCPtr") || strstr(szOriLine, "long cPtr"))) { char* c = strstr(szOriLine, "public"); *c = 0; fprintf(fDst, "%s private %s", szOriLine, c + 6); } else fprintf(fDst, "%s", szOriLine); } } else fprintf(fDst, "%s", szOriLine); free(szOriLine); } fclose(fSrc); fclose(fDst); } int j; for(j=0;j