libcruft-util/uri.cpp.rl

105 lines
2.7 KiB
Plaintext
Raw Normal View History

2015-02-11 16:18:18 +11:00
/*
2019-03-19 16:00:44 +11:00
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
2015-02-11 16:18:18 +11:00
*
* Copyright 2015 Danny Robson <danny@nerdcruft.net>
*/
2015-02-09 17:43:24 +11:00
#include "uri.hpp"
#include <cruft/util/debug/assert.hpp>
2015-02-09 17:43:24 +11:00
#include <algorithm>
#include <iostream>
2018-05-03 18:32:08 +10:00
// We generate some really old style C code via ragel here, so we have to
// disable some noisy warnings (doubly so given -Werror)
#pragma GCC diagnostic ignored "-Wold-style-cast"
using cruft::uri;
2015-02-09 17:43:24 +11:00
2017-12-26 17:33:06 +11:00
///////////////////////////////////////////////////////////////////////////////
2015-02-09 17:43:24 +11:00
%%{
machine impl;
2015-02-09 17:43:24 +11:00
2015-02-11 16:41:35 +11:00
action trace { if (0) std::cerr << *p; }
2015-02-09 17:43:24 +11:00
action success {__success = true; }
action failure {__success = false; }
action scheme_begin { starts[SCHEME] = p; }
action scheme_end { CHECK (starts[SCHEME]); m_views[SCHEME] = { starts[SCHEME], p }; }
action hier_begin { ; }
action hier_end { ; }
action user_begin { starts[USER] = p; }
action user_end { CHECK (starts[USER]); m_views[USER] = { starts[USER], p }; }
action host_begin { starts[HOST] = p; }
action host_end { CHECK (starts[HOST]); m_views[HOST] = { starts[HOST], p }; }
action port_begin { starts[PORT] = p; }
action port_end { CHECK (starts[PORT]); m_views[PORT] = { starts[PORT], p }; }
2015-02-09 17:43:24 +11:00
action authority_begin { ; }
action authority_end { ; }
2015-02-09 17:43:24 +11:00
action path_begin { starts[PATH] = p; }
action path_end { CHECK (starts[PATH]); m_views[PATH] = { starts[PATH], p }; }
2015-02-09 17:43:24 +11:00
action query_begin { starts[QUERY] = p; }
action query_end { CHECK (starts[QUERY]); m_views[QUERY] = { starts[QUERY], p }; }
action fragment_begin { starts[FRAGMENT] = p; }
action fragment_end { CHECK (starts[FRAGMENT]); m_views[FRAGMENT] = { starts[FRAGMENT], p }; }
2015-02-09 17:43:24 +11:00
action uri_begin {}
action uri_end {}
include rfc3986 'rfc3986.rl';
impl := URI >uri_begin %uri_end
2015-02-09 17:43:24 +11:00
%success
$!failure
$trace;
write data;
}%%
///////////////////////////////////////////////////////////////////////////////
#include <fmt/format.h>
//-----------------------------------------------------------------------------
void
cruft::uri::parse (void)
{
char const *starts[NUM_COMPONENTS] = {};
m_views = {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
};
2015-02-09 17:43:24 +11:00
const char *p = m_value.data ();
const char *pe = m_value.data () + m_value.size ();
const char *eof = pe;
bool __success = false;
int cs;
%%write init;
%%write exec;
if (!__success)
throw parse_error (fmt::format ("invalid uri '{}'", m_value));
2021-12-13 16:55:01 +11:00
}