Skip to content

Parse wire

Todas as funções ficam no namespace wire.


Compara duas strings C por igualdade.

bool a = wire::nameEq("help", cmd.name);
bool nameEq(const char* a, const char* b)

O(n) no comprimento das strings.


Retorna o intervalo [a, b) sem espaços em branco no início ou no fim de s[0..n).

void trimView(const char* s, size_t n, size_t& a, size_t& b)

O(n).


Divide s[0..n) em segmentos no delimitador delim, sem dividir dentro de parênteses aninhados ou strings entre aspas "...".

bool splitTopLevel(const char* s, size_t n, char delim,
std::vector<std::pair<size_t, size_t>>& ranges)
std::vector<std::pair<size_t, size_t>> ranges;
wire::splitTopLevel("a;b;c", 5, ';', ranges);
// ranges: [0,1), [2,3), [4,5)

O(n).


Localiza o ) de fechamento que corresponde ao ( em openIdx, respeitando strings e aninhamento.

bool findMatchingClose(const char* s, size_t openIdx, size_t n,
size_t& closeIdx)

O(n) a partir de openIdx.


Remove aspas ao redor e desfaz escapes de \\ e \" em out. Tokens sem aspas são copiados após trim, como estão.

bool unquoteField(const char* src, size_t len, char* out, size_t outCap)
char buf[wire::kArgCap];
wire::unquoteField("\"hello \\\"world\\\"\"", 18, buf, sizeof(buf));
// buf == "hello \"world\""

O(len).


Copia um token bruto para cmd.argv[idx] após unquoteField.

bool copyTokenToArgv(Command& cmd, int idx, const char* src, size_t len)

Retorna false se idx estiver fora do intervalo ou o token exceder kArgCap.

O(len).


Retorna true se s for um inteiro decimal, opcionalmente negativo (ex.: 42, -7).

bool tokenIsPlainInteger(const char* s)

O(n).


Retorna true se s for um identificador C válido ([a-zA-Z_][a-zA-Z0-9_]*).

bool tokenIsPlainIdentifier(const char* s)

O(n).


Retorna true se s precisar de aspas na serialização (não for inteiro nem identificador puro).

bool tokenNeedsQuotes(const char* s)

O(n).


Converte uma string em float. Retorna false para entrada nula, vazia ou inválida.

bool parseFloat(const char* s, float& out)
float v;
wire::parseFloat("3.14", v); // v == 3.14f

O(n).


Converte uma string em int na base 10. Retorna false para entrada nula, vazia ou inválida.

bool parseInt(const char* s, int& out)

O(n).


Faz parse de um segmento wire nome(modo,role,...) (ponto e vírgula opcional) em um Command.

bool parseSegment(const char* seg, size_t segLen, Command& out)
wire::Command cmd;
wire::parseSegment("help(s,r)", 9, cmd);
// cmd.name == "help", cmd.mode == 's', cmd.role == 'r'

O(segLen).


Faz parse de uma mensagem completa com um ou mais comandos separados por ;.

bool parseMessage(const char* msg, std::vector<Command>& out)
std::vector<wire::Command> commands;
wire::parseMessage("help(s,r);param_list(s,r);", commands);
// commands.size() == 2

Retorna false se msg for nulo ou algum segmento for inválido.

O(|msg|).


Extrai T, C, B, j de um comando header parseado (mode == 'h', pelo menos 6 entradas em argv).

bool parseListHeader(const Command& cmd, ListHeader& hdr)
// param_list(h,s,5,1,1,0);
wire::ListHeader hdr;
wire::parseListHeader(cmd, hdr);
// hdr.T == 5, hdr.C == 1, hdr.B == 1, hdr.j == 0

O(1).


Normaliza o nome de um comando para minúsculas para busca case-insensitive.

std::string commandKeyLower(const char* name)
std::string key = wire::commandKeyLower("Param_List");
// key == "param_list"

O(n).