Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

125 lines
2.1 KiB
C++

// FieldMap.h
// Copyright 2018/8/3 Robin.Rowe@cinepaint.org
// License MIT open source
#ifndef FieldMap_h
#define FieldMap_h
#include <map>
#include <string_view>
using namespace std;
template <class T>
struct string_view_compare
{ bool operator() (const T& x, const T& y) const
{ return x.compare(y)<0;
} };
class FieldMap
{ char* p;
std::string_view empty;
// std::map<std::string_view,std::string_view,string_view_compare<std::string_view> > m;
std::map<unsigned,std::string_view> m;
std::string_view StripFieldname(std::string_view text) const
{ if(text.empty())
{ return text;
}
auto offset = text.find(": ");
if(offset == text.npos)
{ return text;
}
text.remove_prefix(offset+2);
return text;
}
public:
FieldMap()
{ p = nullptr;
}
void Clear()
{ p=0;
m.clear();
}
void Set(char* data)
{ p = data;
}
std::string_view& Find(int key)
{ auto it = m.find(key);
if(it == m.end())
{ return empty;
}
return it->second;
}
const std::string_view& Find(int key) const
{ auto it = m.find(key);
if(it == m.end())
{ return empty;
}
return it->second;
}
std::string_view& operator[](int key)
{ return Find(key);
}
std::string_view operator[](int key) const
{ return Find(key);
}
bool AdvancePast(const char* text)
{ char* seek = strstr(p,text);
if(!seek)
{ return false;
}
p = seek + 2;
return true;
}
char* SkipWhitespace()
{ while(isspace(*p))
{ p++;
}
return p;
}
char* Find(char c)
{ return strchr(p,c);
}
bool IsInvalid(unsigned i) const
{ return m.size()<=i;
}
string_view GetFieldData(unsigned i)
{ if(IsInvalid(i))
{ return empty;
}
return m[i];
}
#if 0
string_view GetFieldData(unsigned i) const
{ if(IsInvalid(i))
{ return empty;
}
return m[i];
}
#endif
string_view operator[](unsigned i)
{ return StripFieldname(GetFieldData(i));
}
char* Parse(const char* fieldName,unsigned i)
{
if(IsInvalid(i))
{ return 0;
}
char* found = strstr(p,fieldName);
if(!found)
{ return 0;
}
m[i] = found;
p = found + 1;
char* ends = strchr(p,'\n');
if(ends)
{ *ends= 0;
p = ends + 1;
}
return found;
}
};
#endif