Skip to content

Commit

Permalink
Merge pull request #315 from mmd-osm/patch/cleanup7
Browse files Browse the repository at this point in the history
Less C-style string handling in XML parser
  • Loading branch information
mmd-osm authored Nov 26, 2023
2 parents 7b01aaf + 6a383d0 commit 35206ad
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 93 deletions.
42 changes: 20 additions & 22 deletions include/cgimap/api06/changeset_upload/changeset_input_format.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,16 @@
#include <libxml/parser.h>
#include <fmt/core.h>

#include <algorithm>
#include <cassert>
#include <cstdint>
#include <cstring>
#include <functional>
#include <map>
#include <memory>
#include <optional>
#include <sstream>
#include <string>
#include <string_view>
#include <utility>

#include "parsers/saxparser.hpp"

namespace api06 {



class ChangesetXMLParser : private xmlpp::SaxParser {

public:
Expand All @@ -48,19 +42,21 @@ namespace api06 {

protected:

void on_start_element(const char *element, const char **attrs) override {
void on_start_element(const char *elem, const char **attrs) override {

const std::string_view element(elem);

switch (m_context) {
case context::root:
if (!std::strcmp(element, "osm"))
if (element == "osm")
m_context = context::top;
else
throw xml_error{ "Unknown top-level element, expecting osm" };

break;

case context::top:
if (!std::strcmp(element, "changeset")) {
if (element == "changeset") {
m_context = context::in_changeset;
changeset_element_found = true;
}
Expand All @@ -69,7 +65,7 @@ namespace api06 {
break;

case context::in_changeset:
if (!std::strcmp(element, "tag")) {
if (element == "tag") {
m_context = context::in_tag;
add_tag(attrs);
}
Expand All @@ -83,24 +79,26 @@ namespace api06 {
}
}

void on_end_element(const char *element) override {
void on_end_element(const char *elem) override {

const std::string_view element(elem);

switch (m_context) {
case context::root:
assert(false);
break;
case context::top:
assert(!std::strcmp(element, "osm"));
assert(element == "osm");
m_context = context::root;
if (!changeset_element_found)
throw xml_error{ "Cannot parse valid changeset from xml string. XML doesn't contain an osm/changeset element" };
break;
case context::in_changeset:
assert(!std::strcmp(element, "changeset"));
assert(element == "changeset");
m_context = context::top;
break;
case context::in_tag:
assert(!std::strcmp(element, "tag"));
assert(element == "tag");
m_context = context::in_changeset;
}
}
Expand Down Expand Up @@ -149,12 +147,12 @@ namespace api06 {
std::optional<std::string> k;
std::optional<std::string> v;

check_attributes(attrs, [&k, &v](const char *name, const char *value) {
check_attributes(attrs, [&k, &v](std::string_view name, std::string && value) {

if (name[0] == 'k' && name[1] == 0) {
k = value;
} else if (name[0] == 'v' && name[1] == 0) {
v = value;
if (name == "k") {
k = std::move(value);
} else if (name == "v") {
v = std::move(value);
}
});

Expand Down
4 changes: 2 additions & 2 deletions include/cgimap/api06/changeset_upload/node.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class Node : public OSMObject {

double lon() const { return *m_lon; }

void set_lat(const char *lat) {
void set_lat(const std::string &lat) {

double _lat = -200.0;

Expand All @@ -35,7 +35,7 @@ class Node : public OSMObject {
set_lat(_lat);
}

void set_lon(const char *lon) {
void set_lon(const std::string &lon) {

double _lon = -200.0;

Expand Down
Loading

0 comments on commit 35206ad

Please sign in to comment.