llparse
Version:
Compile incremental parsers to C code
64 lines • 2.52 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.MatchSequence = void 0;
const constants_1 = require("../constants");
class MatchSequence {
transform;
constructor(transform) {
this.transform = transform;
}
static buildGlobals(out) {
out.push('enum llparse_match_status_e {');
out.push(` ${constants_1.SEQUENCE_COMPLETE},`);
out.push(` ${constants_1.SEQUENCE_PAUSE},`);
out.push(` ${constants_1.SEQUENCE_MISMATCH}`);
out.push('};');
out.push('typedef enum llparse_match_status_e llparse_match_status_t;');
out.push('');
out.push('struct llparse_match_s {');
out.push(' llparse_match_status_t status;');
out.push(' const unsigned char* current;');
out.push('};');
out.push('typedef struct llparse_match_s llparse_match_t;');
}
getName() {
return `llparse__match_sequence_${this.transform.ref.name}`;
}
build(ctx, out) {
out.push(`static llparse_match_t ${this.getName()}(`);
out.push(` ${ctx.prefix}_t* s, const unsigned char* p,`);
out.push(' const unsigned char* endp,');
out.push(' const unsigned char* seq, uint32_t seq_len) {');
// Vars
out.push(' uint32_t index;');
out.push(' llparse_match_t res;');
out.push('');
// Body
out.push(' index = s->_index;');
out.push(' for (; p != endp; p++) {');
out.push(' unsigned char current;');
out.push('');
out.push(` current = ${this.transform.build(ctx, '*p')};`);
out.push(' if (current == seq[index]) {');
out.push(' if (++index == seq_len) {');
out.push(` res.status = ${constants_1.SEQUENCE_COMPLETE};`);
out.push(' goto reset;');
out.push(' }');
out.push(' } else {');
out.push(` res.status = ${constants_1.SEQUENCE_MISMATCH};`);
out.push(' goto reset;');
out.push(' }');
out.push(' }');
out.push(' s->_index = index;');
out.push(` res.status = ${constants_1.SEQUENCE_PAUSE};`);
out.push(' res.current = p;');
out.push(' return res;');
out.push('reset:');
out.push(' s->_index = 0;');
out.push(' res.current = p;');
out.push(' return res;');
out.push('}');
}
}
exports.MatchSequence = MatchSequence;
//# sourceMappingURL=match-sequence.js.map
;