parent
058ab23fa2
commit
2d550978b8
@ -0,0 +1,82 @@ |
||||
#include <fmt/core.h> |
||||
#include <string_view> |
||||
#include <charconv> |
||||
#include "dbc.hpp" |
||||
#include <SFML/Graphics.hpp> |
||||
|
||||
using namespace fmt; |
||||
|
||||
%%{ |
||||
machine foo; |
||||
|
||||
action tstart { |
||||
start = fpc; |
||||
} |
||||
|
||||
action number { |
||||
auto [ptr, ec] = std::from_chars(start, fpc, value); |
||||
dbc::check(ec == std::errc(), "error in number parsing"); |
||||
println("NUM: {}", value); |
||||
} |
||||
|
||||
action color24b { |
||||
println("color24b"); |
||||
} |
||||
|
||||
action bg { fgcolor = false; } |
||||
action fg { fgcolor = true; } |
||||
|
||||
action any { |
||||
println("ANY: {}:{}", int(fc), fc); |
||||
} |
||||
|
||||
action red { color.r = value; } |
||||
action blue { color.g = value; } |
||||
action green { color.b = value; } |
||||
|
||||
action start { value = 0; } |
||||
|
||||
action end { |
||||
println("fg? {}, sf:Color: {},{},{},{}", fgcolor, color.r, color.g, color.b, color.a); |
||||
} |
||||
|
||||
start = 0x1B "["; |
||||
fg = "38;" %fg; |
||||
bg = "48;" %bg; |
||||
reset = ("39" | "49"); |
||||
num = digit+ >tstart %number; |
||||
color256 = "5;"; |
||||
color24b = "2;"; |
||||
|
||||
ansi = ( |
||||
start %start |
||||
( |
||||
reset | |
||||
(fg|bg) color24b num %red ";" num %blue ";" num %green %color24b |
||||
) "m" %end |
||||
); |
||||
|
||||
other = (any+ @any -- 0x1B)*; |
||||
|
||||
main := (other :> ansi)**; |
||||
}%% |
||||
|
||||
%% write data; |
||||
|
||||
bool parse_ansi(std::string_view codes) { |
||||
const char *start = NULL; |
||||
int cs = 0; |
||||
uint8_t value = 0; |
||||
const char *p = codes.data(); |
||||
const char *pe = p + codes.size(); |
||||
const char *eof = pe; |
||||
bool fgcolor = false; |
||||
sf::Color color; |
||||
|
||||
%% write init; |
||||
%% write exec; |
||||
|
||||
print("PROCESSED {} CHARS of {}: {}", p - codes.data(), codes.size(), p); |
||||
|
||||
return true; |
||||
} |
@ -0,0 +1,97 @@ |
||||
#include <fmt/core.h> |
||||
#include <string_view> |
||||
#include <charconv> |
||||
#include "dbc.hpp" |
||||
|
||||
using namespace fmt; |
||||
|
||||
%%{ |
||||
machine ansi_parser; |
||||
|
||||
action tstart { |
||||
start = fpc; |
||||
} |
||||
|
||||
action number { |
||||
auto [ptr, ec] = std::from_chars(start, fpc, value); |
||||
dbc::check(ec == std::errc(), "error in number parsing"); |
||||
println("NUM: {}", value); |
||||
} |
||||
|
||||
action color256 { |
||||
println("COLOR256"); |
||||
} |
||||
|
||||
action color24b { |
||||
println("COLOR24B"); |
||||
} |
||||
|
||||
action colorSingle { |
||||
println("SINGLE"); |
||||
} |
||||
|
||||
action colorBasic { |
||||
println("BASIC"); |
||||
} |
||||
|
||||
action bg { |
||||
println("BG"); |
||||
} |
||||
|
||||
action fg { |
||||
println("FG"); |
||||
} |
||||
|
||||
action any { |
||||
println("ANY: {}:{}", int(fc), fc); |
||||
} |
||||
|
||||
action start { |
||||
println("START"); |
||||
} |
||||
|
||||
action end { |
||||
println("END"); |
||||
} |
||||
|
||||
ESC = 0x1B; |
||||
start = ESC "["; |
||||
fg = "38;" %fg; |
||||
bg = "48;" %bg; |
||||
color256 = "5;" %color256; |
||||
color24b = "2;" %color24b; |
||||
num = (digit+) >tstart %number; |
||||
|
||||
ansi := |* |
||||
start => start; |
||||
(fg|bg) color256 num ";" num => { println("256 doit"); }; |
||||
(fg|bg) color24b num ";" num ";" num => { println("24b doit"); }; |
||||
num ";" num => colorBasic; |
||||
num => colorSingle; |
||||
"m" => { fgoto main; }; |
||||
*|; |
||||
|
||||
main := (any @any -- ESC)* ESC @{ fhold; fgoto ansi; }; |
||||
|
||||
}%% |
||||
|
||||
%% write data; |
||||
|
||||
bool parse_ansi(std::string_view codes) { |
||||
const char *start = NULL; |
||||
int cs = 0; |
||||
size_t value = 0; |
||||
const char *p = codes.data(); |
||||
const char *pe = p + codes.size(); |
||||
const char *eof = pe; |
||||
const char *ts = p; |
||||
const char *te = p; |
||||
int act = 0; |
||||
|
||||
%% write init; |
||||
%% write exec; |
||||
|
||||
print("PROCESSED {} CHARS of {}", p - codes.data(), codes.size()); |
||||
|
||||
return true; |
||||
} |
Loading…
Reference in new issue