summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authoralbert-github <albert.tests@gmail.com>2019-12-11 19:14:29 (GMT)
committeralbert-github <albert.tests@gmail.com>2019-12-11 19:14:29 (GMT)
commit1a5bbadb43b2d30e338d26a0d495b60e2b12f704 (patch)
tree36fe86281370507e9ba4706b5edcfd31dc8c8116 /src
parent2ed458302d43a6385c310c685fa4174818f0b67e (diff)
downloadDoxygen-1a5bbadb43b2d30e338d26a0d495b60e2b12f704.zip
Doxygen-1a5bbadb43b2d30e338d26a0d495b60e2b12f704.tar.gz
Doxygen-1a5bbadb43b2d30e338d26a0d495b60e2b12f704.tar.bz2
issue #7436 Incorrect handling of block comments in VHDL
The search for `/*` or /*!` ended at the last `*/` in a file and thus skipping other intermediate block end and new starts. Also the intermediate code was lost see as comment. The filter pattern used was incorrect and should have been `<"/*" (~["*"])* "*" ("*" | ~["*","/"] (~["*"])* "*")* "/">` (thanks to https://javacc.org/contrib/C.jj). Here also the space plus one or more `*` at the end beginning of the line are still incorporated as well as multiple `*` before the colosing `*/` this is also filtered.
Diffstat (limited to 'src')
-rw-r--r--src/growbuf.h1
-rw-r--r--src/vhdljjparser.cpp35
-rw-r--r--src/vhdljjparser.h2
3 files changed, 36 insertions, 2 deletions
diff --git a/src/growbuf.h b/src/growbuf.h
index 4c49dce..bf6d74e 100644
--- a/src/growbuf.h
+++ b/src/growbuf.h
@@ -47,6 +47,7 @@ class GrowBuf
}
const char *get() { return str; }
int getPos() const { return pos; }
+ void setPos(const int newPos) { pos = newPos; }
char at(int i) const { return str[i]; }
private:
char *str;
diff --git a/src/vhdljjparser.cpp b/src/vhdljjparser.cpp
index 8b7ebf6..4848a3e 100644
--- a/src/vhdljjparser.cpp
+++ b/src/vhdljjparser.cpp
@@ -29,6 +29,7 @@
#include "arguments.h"
#include "types.h"
#include "VhdlParserIF.h"
+#include "growbuf.h"
using namespace vhdl::parser;
using namespace std;
@@ -169,7 +170,7 @@ void VhdlParser::lineCount(const char* text)
{
for (const char* c=text ; *c ; ++c )
{
- yyLineNr += (*c == '\n') ;
+ if (*c == '\n') yyLineNr++;
}
}
@@ -744,3 +745,35 @@ const char *getVhdlFileName(void)
{
return vhdlFileName;
}
+
+QCString filter2008VhdlComment(const char *s)
+{
+ GrowBuf growBuf;
+ const char *p=s+3; // skip /*!
+ char c,pc='\0';
+ while (*p == ' ' || *p == '\t') p++;
+ while ((c=*p++))
+ {
+ growBuf.addChar(c);
+ if (c == '\n')
+ {
+ // special handling of space followed by * at beginning of line
+ while (*p == ' ' || *p == '\t') p++;
+ while (*p == '*') p++;
+ // special attention in case character at end is /
+ if (*p == '/') p++;
+ }
+ }
+ // special attention in case */ at end of last line
+ int len = growBuf.getPos();
+ if (growBuf.at(len-1) == '/' && growBuf.at(len-2) == '*')
+ {
+ len -= 2;
+ while (growBuf.at(len-1) == '*') len--;
+ c = growBuf.at(len-1);
+ while ((c = growBuf.at(len-1)) == ' ' || c == '\t') len--;
+ growBuf.setPos(len);
+ }
+ growBuf.addChar(0);
+ return growBuf.get();
+}
diff --git a/src/vhdljjparser.h b/src/vhdljjparser.h
index 53eb0be..f6cd17d 100644
--- a/src/vhdljjparser.h
+++ b/src/vhdljjparser.h
@@ -83,5 +83,5 @@ void vhdlscanFreeScanner();
const QList<VhdlConfNode>& getVhdlConfiguration();
const std::vector<std::shared_ptr<Entry> >&getVhdlInstList();
-
+QCString filter2008VhdlComment(const char *s);
#endif