summaryrefslogtreecommitdiffstats
path: root/src/fortranscanner.l
diff options
context:
space:
mode:
authoralbert-github <albert.tests@gmail.com>2013-09-07 14:03:07 (GMT)
committeralbert-github <albert.tests@gmail.com>2013-09-07 14:03:07 (GMT)
commit2e03209d4579b239ce5abe59c8cd2a0fe7086ea0 (patch)
treebfba203c1497f8fa843f9b83553c86b998eccc70 /src/fortranscanner.l
parent48676b42611b981c1845c7426f22422b9d94cb13 (diff)
downloadDoxygen-2e03209d4579b239ce5abe59c8cd2a0fe7086ea0.zip
Doxygen-2e03209d4579b239ce5abe59c8cd2a0fe7086ea0.tar.gz
Doxygen-2e03209d4579b239ce5abe59c8cd2a0fe7086ea0.tar.bz2
Bug 707685 - Fortran: error message when missing last EOL
In case the original buffer in either fixed or free format code does not contain an EOL as last character, add it.
Diffstat (limited to 'src/fortranscanner.l')
-rwxr-xr-x[-rw-r--r--]src/fortranscanner.l32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
index c6b47d3..6d64cb9 100644..100755
--- a/src/fortranscanner.l
+++ b/src/fortranscanner.l
@@ -1366,7 +1366,7 @@ static const char* prepassFixedForm(const char* contents)
int prevLineLength=0;
int prevLineAmpOrExclIndex=-1;
bool emptyLabel=TRUE;
- int newContentsSize = strlen(contents)+2; // \000 and one spare character (to avoid reallocation)
+ int newContentsSize = strlen(contents)+3; // \000, \n (when necessary) and one spare character (to avoid reallocation)
char* newContents = (char*)malloc(newContentsSize);
for(int i=0, j=0;;i++,j++) {
@@ -1390,6 +1390,14 @@ static const char* prepassFixedForm(const char* contents)
break;
case '\000':
newContents[j]='\000';
+ newContentsSize = strlen(newContents);
+ if (newContents[newContentsSize - 1] != '\n')
+ {
+ // to be on the safe side
+ newContents = (char*)realloc(newContents, newContentsSize+2);
+ newContents[newContentsSize] = '\n';
+ newContents[newContentsSize + 1] = '\000';
+ }
return newContents;
case 'C':
case 'c':
@@ -1425,6 +1433,15 @@ static const char* prepassFixedForm(const char* contents)
break;
}
}
+
+ newContentsSize = strlen(newContents);
+ if (newContents[newContentsSize - 1] != '\n')
+ {
+ // to be on the safe side
+ newContents = (char*)realloc(newContents, newContentsSize+2);
+ newContents[newContentsSize] = '\n';
+ newContents[newContentsSize + 1] = '\000';
+ }
return newContents;
}
@@ -2228,6 +2245,7 @@ level--;
static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
{
+ char *tmpBuf = NULL;
initParser();
defaultProtection = Public;
@@ -2258,6 +2276,14 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
//clock_t end=clock();
//printf("CPU time used=%f\n", ((double) (end-start))/CLOCKS_PER_SEC);
}
+ else if (inputString[strlen(fileBuf)-1] != '\n')
+ {
+ tmpBuf = (char *)malloc(strlen(fileBuf)+2);
+ strcpy(tmpBuf,fileBuf);
+ tmpBuf[strlen(fileBuf)]= '\n';
+ tmpBuf[strlen(fileBuf)+1]= '\000';
+ inputString = tmpBuf;
+ }
yyLineNr= 1 ;
yyFileName = fileName;
@@ -2291,6 +2317,10 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
rt->program.resize(0);
delete current; current=0;
moduleProcedures.clear();
+ if (tmpBuf) {
+ free((char*)tmpBuf);
+ inputString=NULL;
+ }
if (isFixedForm) {
free((char*)inputString);
inputString=NULL;