223 lines
5.9 KiB
C++
223 lines
5.9 KiB
C++
#include "JString.h"
|
|
#include "Exception.h"
|
|
|
|
namespace coreutils {
|
|
|
|
std::ostream &operator<<(std::ostream &os, const JString::Proxy &proxy) {
|
|
ZString tempkey = proxy.key;
|
|
ZString temp = proxy.jstring.find(tempkey);
|
|
os << temp;
|
|
return os;
|
|
}
|
|
|
|
JString::JString() : MString("{}") {}
|
|
|
|
void JString::set(ZString &path, ZString &value) {
|
|
reset();
|
|
if(locate(path)) {
|
|
push();
|
|
if(ifNext("\"")) {
|
|
ZString old = getTokenExclude("\"");
|
|
pop();
|
|
remove(offset(), old.getLength() + 2);
|
|
MString key;
|
|
if(value.startsWith("["))
|
|
key << value;
|
|
else if(value.startsWith("{"))
|
|
key << value;
|
|
else
|
|
key << "\"" << value << "\"";
|
|
insert(key, offset());
|
|
} else {
|
|
pop();
|
|
throw coreutils::Exception("Fix me to accept integer type.");
|
|
}
|
|
} else {
|
|
// std::cout << "[" << unparsed() << "] >" << value << "<" << std::endl;
|
|
MString key;
|
|
if(notfirst)
|
|
key << ",";
|
|
// TODO: The value added must be parsed down to remove all whitespace.
|
|
if(value.startsWith("["))
|
|
key << "\"" << path << "\":" << value;
|
|
else if(value.startsWith("{"))
|
|
key << "\"" << path << "\":" << value;
|
|
else
|
|
key << "\"" << path << "\":" << "\"" << value << "\"";
|
|
insert(key, offset());
|
|
}
|
|
}
|
|
|
|
ZString JString::find(ZString path) {
|
|
reset();
|
|
if(locate(path)) {
|
|
if(ifNext("\""))
|
|
return getTokenExclude("\"");
|
|
// TODO: Handle numbers that are not in double quotes.
|
|
|
|
else if(startsWith("["))
|
|
return getContainer();
|
|
|
|
else if(startsWith("{"))
|
|
return getContainer();
|
|
}
|
|
return ZString();
|
|
}
|
|
|
|
bool JString::locate(ZString path) {
|
|
// std::cout << "path locate: " << path << std::endl;
|
|
path.getTokenExclude("[.");
|
|
notfirst = false;
|
|
if(ifNext("{")) {
|
|
while(startsWith("\"")) {
|
|
notfirst = true;
|
|
ZString label;
|
|
ZString value;
|
|
if(ifNext("\"")) {
|
|
label = getTokenExclude("\"");
|
|
ifNext("\"");
|
|
} else
|
|
throw coreutils::Exception("Labels must be contained in double quotes.");
|
|
if(ifNext(":")) {
|
|
// std::cout << "path: (" << path.parsed() << ") (" << label << ") " << (label == path.parsed()) << std::endl;
|
|
if(label == path.parsed()) {
|
|
if(path.unparsed() == "") {
|
|
// std::cout << "found cursor: " << unparsed() << std::endl;
|
|
return true;
|
|
}
|
|
if(path.ifNext("."))
|
|
return locate(path.unparsed());
|
|
if(path.ifNext("[")) {
|
|
int index = path.asInteger();
|
|
if(!path.ifNext("]"))
|
|
throw coreutils::Exception("expecting ] after index value in array selector.");
|
|
if(ifNext("[")) {
|
|
while(index > 0) {
|
|
getContainer();
|
|
if(!ifNext(","))
|
|
throw coreutils::Exception("expecting comma to seperate array elements.");
|
|
--index;
|
|
}
|
|
return true;
|
|
} else
|
|
throw coreutils::Exception("Path is expecting an array for selector value.");
|
|
if(path.eod())
|
|
return false;
|
|
else if(path.ifNext("."))
|
|
return locate(path.unparsed());
|
|
throw coreutils::Exception("expecting '.' in path.");
|
|
}
|
|
}
|
|
// std::cout << "+++" << unparsed() << std::endl;
|
|
if(startsWith("\"")) {
|
|
getContainer();
|
|
} else if(startsWith("[")) {
|
|
getContainer();
|
|
} else if(startsWith("{")) {
|
|
getContainer();
|
|
} else {
|
|
throw coreutils::Exception("Unrecognized data type.");
|
|
}
|
|
ifNext(",");
|
|
} else
|
|
throw coreutils::Exception("Expected colon after label.");
|
|
}
|
|
} else if(ifNext("[")) {
|
|
ZString label = path[0].getTokenExclude("[");
|
|
path.ifNext("[");
|
|
ZString key = path[0].getTokenExclude("=");
|
|
path.ifNext("=");
|
|
ZString value = path[0].getTokenExclude("]");
|
|
while(!ifNext("]")) {
|
|
push();
|
|
ZString check = find(key);
|
|
pop();
|
|
if(check.equals(value)) {
|
|
return locate(label);
|
|
} else {
|
|
getContainer();
|
|
ifNext(",");
|
|
}
|
|
}
|
|
}
|
|
// std::cout << "not found cursor: " << unparsed() << std::endl;
|
|
return false;
|
|
}
|
|
|
|
JString & JString::operator=(coreutils:: ZString value) {
|
|
setSize(value.getLength());
|
|
memcpy(data, value.getData(), value.getLength());
|
|
removeWhitespace();
|
|
return *this;
|
|
}
|
|
|
|
void JString::removeWhitespace() {
|
|
reset();
|
|
while(!eod()) {
|
|
if(*cursor == ' ')
|
|
remove(1);
|
|
else if(*cursor == '\r')
|
|
remove(1);
|
|
else if(*cursor == '\t')
|
|
remove(1);
|
|
else if(*cursor == '\n')
|
|
remove(1);
|
|
else if(startsWith("\""))
|
|
getContainer();
|
|
else
|
|
++cursor;
|
|
}
|
|
reset();
|
|
}
|
|
|
|
MString JString::pretty() {
|
|
MString output;
|
|
reset();
|
|
char ch;
|
|
int index = 0;
|
|
while(!eod()) {
|
|
ch = nextChar();
|
|
if(ch == '{') {
|
|
index += 3;
|
|
output << ch << '\n';
|
|
for(int ix = 0; ix < index; ++ix)
|
|
output << ' ';
|
|
}
|
|
else if(ch == '[') {
|
|
index += 3;
|
|
output << ch << '\n';
|
|
for(int ix = 0; ix < index; ++ix)
|
|
output << ' ';
|
|
}
|
|
else if(ch == ':') {
|
|
output << ": ";
|
|
}
|
|
else if(ch == '}') {
|
|
index -= 3;
|
|
output << '\n';
|
|
for(int ix = 0; ix < index; ++ix)
|
|
output << ' ';
|
|
output << ch;
|
|
}
|
|
else if(ch == ']') {
|
|
index -= 3;
|
|
output << '\n';
|
|
for(int ix = 0; ix < index; ++ix)
|
|
output << ' ';
|
|
output << ch;
|
|
}
|
|
else if(ch == ',') {
|
|
output << ch << '\n';
|
|
for(int ix = 0; ix < index; ++ix)
|
|
output << ' ';
|
|
}
|
|
else
|
|
output << ch;
|
|
}
|
|
return output;
|
|
}
|
|
|
|
void JString::changed(ZString key, ZString value) {}
|
|
|
|
}
|