aboutsummaryrefslogtreecommitdiff
path: root/src/pj_wkt1_parser.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-12-17 19:30:34 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-12-17 20:01:05 +0100
commit898b8595276779cd8613e0c4b267181a76acecab (patch)
treeff1bfd55bd1919ca28ffb335470d0f901d0de09c /src/pj_wkt1_parser.cpp
parentdcb58eb624f87fad1362bfc593b274f84fa44889 (diff)
downloadPROJ-898b8595276779cd8613e0c4b267181a76acecab.tar.gz
PROJ-898b8595276779cd8613e0c4b267181a76acecab.zip
Add WKT2 grammar validation
Diffstat (limited to 'src/pj_wkt1_parser.cpp')
-rw-r--r--src/pj_wkt1_parser.cpp48
1 files changed, 10 insertions, 38 deletions
diff --git a/src/pj_wkt1_parser.cpp b/src/pj_wkt1_parser.cpp
index 7ddd595a..cdeb6b87 100644
--- a/src/pj_wkt1_parser.cpp
+++ b/src/pj_wkt1_parser.cpp
@@ -36,6 +36,7 @@
#include <string>
#include "pj_wkt1_parser.h"
+#include "pj_wkt_parser.hpp"
using namespace NS_PROJ::internal;
@@ -43,44 +44,12 @@ using namespace NS_PROJ::internal;
// ---------------------------------------------------------------------------
-struct pj_wkt1_parse_context {
- const char *pszInput = nullptr;
- const char *pszLastSuccess = nullptr;
- const char *pszNext = nullptr;
- std::string errorMsg{};
-
- pj_wkt1_parse_context() = default;
- pj_wkt1_parse_context(const pj_wkt1_parse_context &) = delete;
- pj_wkt1_parse_context &operator=(const pj_wkt1_parse_context &) = delete;
-};
+struct pj_wkt1_parse_context : public pj_wkt_parse_context {};
// ---------------------------------------------------------------------------
void pj_wkt1_error(pj_wkt1_parse_context *context, const char *msg) {
- context->errorMsg = "Parsing error : ";
- context->errorMsg += msg;
- context->errorMsg += ". Error occurred around:\n";
-
- std::string ctxtMsg;
- const int n = static_cast<int>(context->pszLastSuccess - context->pszInput);
- int start_i = std::max(0, n - 40);
- for (int i = start_i; i < n + 40 && context->pszInput[i]; i++) {
- if (context->pszInput[i] == '\r' || context->pszInput[i] == '\n') {
- if (i > n) {
- break;
- } else {
- ctxtMsg.clear();
- start_i = i + 1;
- }
- } else {
- ctxtMsg += context->pszInput[i];
- }
- }
- context->errorMsg += ctxtMsg;
- context->errorMsg += '\n';
- for (int i = start_i; i < n; i++)
- context->errorMsg += ' ';
- context->errorMsg += '^';
+ pj_wkt_error(context, msg);
}
// ---------------------------------------------------------------------------
@@ -141,10 +110,13 @@ int pj_wkt1_lex(YYSTYPE * /*pNode */, pj_wkt1_parse_context *context) {
/* -------------------------------------------------------------------- */
/* Recognize node names. */
/* -------------------------------------------------------------------- */
- for (i = 0; i < sizeof(tokens) / sizeof(tokens[0]); i++) {
- if (ci_starts_with(pszInput, tokens[i].pszToken)) {
- context->pszNext = pszInput + strlen(tokens[i].pszToken);
- return tokens[i].nTokenVal;
+ if (isalpha(*pszInput)) {
+ for (i = 0; i < sizeof(tokens) / sizeof(tokens[0]); i++) {
+ if (ci_starts_with(pszInput, tokens[i].pszToken) &&
+ !isalpha(pszInput[strlen(tokens[i].pszToken)])) {
+ context->pszNext = pszInput + strlen(tokens[i].pszToken);
+ return tokens[i].nTokenVal;
+ }
}
}