improve AcceptBaseParser parsing algorithm

remove AcceptParser - not needed now, AcceptBaseParser can prepare a table now
This commit is contained in:
2022-02-02 17:58:27 +01:00
parent d0d2cfb22c
commit 75daf37bbd
10 changed files with 230 additions and 207 deletions

View File

@@ -5,7 +5,7 @@
*/
/*
* Copyright (c) 2008-2018, Tomasz Sowa
* Copyright (c) 2008-2022, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,44 +32,64 @@
*
*/
#ifndef headerfile_winix_core_acceptbaseparser
#define headerfile_winix_core_acceptbaseparser
#ifndef headerfile_winix_utils_acceptbaseparser
#define headerfile_winix_utils_acceptbaseparser
#include <string>
#include "core/winixbase.h"
#include "core/header.h"
namespace Winix
{
// sample (you must create your own class derived from this one):
// object.parse(L" text/html ; , ; q = 45, application / xhtml+xml ; q = 0.4 , application/xml ; q = 0.9 , */* ; q = 0.8 ");
class AcceptBaseParser : public WinixBase
class AcceptBaseParser
{
public:
static size_t constexpr MAX_NAME_LENGTH = 64;
static size_t constexpr MAX_PARAM_LENGTH = 32;
static size_t constexpr MAX_PARAM_VALUE_LENGTH = 32;
AcceptBaseParser();
virtual ~AcceptBaseParser();
/*
*
*
*
*
*/
// sample:
// object.parse(L" text/html , text/* ; q = 45, application / xhtml+xml ; q = 0.4 ; limit = 1 , application/xml ; charset = UTF-8 ; q = 0.9 , */* ; q = 0.8 ");
void parse(const wchar_t * str);
void parse(const std::wstring & str);
void parse(const wchar_t * str, std::vector<HeaderValue> & header_values, size_t max_len, bool clear_header_values = true);
void parse(const std::wstring & str, std::vector<HeaderValue> & header_values, size_t max_len, bool clear_header_values = true);
private:
virtual void init() {} ;
virtual void Param(const std::wstring & param, double q) = 0;
bool IsWhite(int c);
void skip_white();
bool is_delimiter(wchar_t c, wchar_t delimiter);
bool is_delimiter(wchar_t c, wchar_t delimiter1, wchar_t delimiter2, wchar_t delimiter3);
void read_token(std::wstring & token, size_t max_len, wchar_t delimiter1, wchar_t delimiter2 = 0, wchar_t delimiter3 = 0);
void read_name();
void read_parameter();
void ReadQ();
void SkipParam();
void read_loop(std::vector<HeaderValue> * header_values, size_t max_len);
void read(const wchar_t * str, std::vector<HeaderValue> * header_values, size_t max_len);
virtual void init() {} ;
virtual void parsed_name(const std::wstring & name) {};
virtual void parsed_param(const std::wstring & param, const std::wstring & param_value) {};
virtual void parsed_name_q(const std::wstring & name, double q) {};
const wchar_t * text;
std::wstring name;
std::wstring param;
std::wstring param_value;
double q;
};