IOANNIS PETSIS Systems · Languages
──────────────────────────────────────────────────────────────────────
I build programming language infrastructure and full-stack systems — from multi-tier pattern matching engines to production web applications.
- libsnobol4 — A high-performance SNOBOL4 string-processing engine in C with computed-goto dispatch, 11-tier search acceleration (pattern fusion, SIMD NFA, DFA automaton, trie, BMH), required-byte prefilter, batch all-matches API, and lean ~8 ns/call single-literal search. Pattern matching, template substitution, captures, associative tables, sparse arrays, and a stable PHP binding (generators, lazy SplitIterator).
- jobscout — Local-first job search in Python: one command pulls postings from public boards (LinkedIn's guest API, StepStone, XING, stellenanzeigen.de, karriere.at, jobs.ch, Arbeitnow, HN Who is hiring), scores them with a transparent rule engine, dedupes across sources, and writes a markdown digest. No API keys, no metered calls.
- Ask me about compilers, language runtimes, search engines, Laravel web apps, or local-first Python tooling.
| Languages | |
|---|---|
|
|
|
| Frameworks & Tools | |
|---|---|
|
|
|
|
|
|
A high-performance SNOBOL4 string-processing engine in C — a PCRE alternative with 11-tier search acceleration (fused concat-pattern automaton, SIMD NFA, DFA automaton, trie), required-byte prefilter, batch + lean tokenize APIs, and computed-goto dispatch. Now stable at v1.0.1.
SNOBOL4 VM v1.0.1
──────────────────────────────────────────────────────────────────────
dispatch computed-goto (15–30% over switch)
search 11 tiers — fusion · SIMD NFA · DFA · search-VM ·
trie · bitmap · BMH · prefix · literal ·
SPAN/BREAK · required-byte prefilter
| Feature | Detail |
|---|---|
| Dispatch | Computed-goto opcode dispatch (15-30% faster). MSVC switch fallback. PGO build targets (LTO+profile). |
| Search Acceleration | 11-tier pipeline: fused concat-pattern automaton (Tier 10, no VM) → SIMD NFA → DFA automaton → search-VM → alt-literals trie → bitmap → BMH prefix → literal-only → SPAN/BREAK scan + required-byte prefilter |
| Batch & Tokenize API | snobol_pattern_search_batch() / stateful ..._batch_ex() — single-pass all-matches with flat capture/output arrays. snobol_pattern_search_next() — ~8 ns/call lean single-literal search (memchr/memmem). |
| Data Types | Associative tables, sparse integer-keyed arrays (snobol_array_*), numeric/comparison functions (snobol_text_eq/lt/gt) |
| Platforms | macOS ARM64/Intel, Linux AArch64/x86-64/ARMv7/RISC-V, Windows x86-64 |
| Bindings | PHP (stable) — generators, lazy SplitIterator, flat results, capture-as-offsets, metrics opt-in, DFA/trie/SIMD/fusion caching |
| Pattern Engine | Backtracking VM with computed-goto dispatch, catastrophic backtracking protection, trail-based compact choice stack (arena allocator, undo-log replay), UTF-8 with full BMP case folding |
| Template Substitution | Compiled C VM instructions — captures, formatting, table lookups |
| Quality Gates | 90%+ core & PHP coverage with Codecov gate, CodeQL, ASan+UBSan/valgrind leak-checked CI |
| CI | Native runners: macOS ARM64/x86-64, Linux AArch64/x86-64/ARMv7/RISC-V, Windows x86-64. ASan+UBSan. PGO. |
| Distro | Homebrew (macOS), PIE (PHP), GitHub Releases |
// One-shot convenience API snobol_match_result_t *r = snobol_match( "'abc' ARB 'def'", 15, "xyz abc def xyz", 15, 0 );
A local-first job search tool: jobscout scan pulls postings from public endpoints (LinkedIn's guest API, StepStone, XING, stellenanzeigen.de, karriere.at, jobs.ch, Arbeitnow, Berlin Startup Jobs, HN Who is hiring), scores them against your preferences with a deterministic rule engine, dedupes across sources, and jobscout digest writes a markdown report. The same core drives a native desktop window (pywebview: WKWebView, WebView2, Qt) and PyInstaller bundles built on five native runners. No API keys, no accounts, no metered calls — preferences, postings and digests stay in ~/.jobscout/.