Jordan Savant // Software Engineer

Welcome! I'm Jordan Savant a Software Engineer

This is my website. It mostly contains my write ups on algorithms, data structures and programming topics. Feel free to explore. Almost all code is written by myself, but some is for reference only so make sure before copying directly.

Below you will find a list of topics, updates and projects I have found interesting. I have tried to keep performance, privacy and accessibility first in mind as you peruse the site.

Photo of Jordan Savant

A little about myself: I have been developing since a kid, starting with the TI-Basic on calculators. I fell in love and never looked back and have been programming, developing, and engineering software ever since.

I have worked for free, as a contractor for websites and applications, for SaaS companies and now a great agency. And through it all programming has been my favorite part. I lead a team of bright devs that keep me on my toes and continue to grow with our ever changing field. Go ahead and check out the great work at Lifeblue. On the side I explore game development as a hobby, some available on steam at excompute.com.

EX Compute - Indie Game Development

EX Compute is my sister site where my game development projects are showcased and released. It includes titles primarily published on Steam and iOS. Check out the official EX Compute website.

EX Compute Logo

DOOM Fire Graphics

I found this great read on implementing the DOOM fire graphics using a basic array of colors. Its a nice breakdown by FABIEN SANGLARD who is another programmer: https://fabiensanglard.net/doom_fire_psx/

I've done a full implementation breakdown in C++ and SDL in a YouTube video.

vCard - Phone Contact Card VCF Format

The other day I had to get a listing of contacts from my phone and was able to get it exported as a VCF file through the iOS share options. I needed it as raw text so into the editor it went. This is the format of the VCF Contact List:

BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//iPhone OS 16.6.1//EN
N:Doe;John;;;
FN:John Doe
ORG:Landscaping;
TEL;type=CELL;type=VOICE;type=pref:(555) 555-5555
item1.ADR;type=HOME;type=pref:;;123 Fake St.;Dallas;TX;75000;United States
item1.X-ABADR:us
ADR;type=HOME:;;123 Fake St.;Dallas;TX;75000;United States
END:VCARD
BEGIN:VCARD
...
END:VCARD
BEGIN:VCARD
...
END:VCARD

Thankfully this format was relatively simple and I brewed up a basic php script to extract a set of contacts under the same ORG.

<?php
// get file contents from a file name passed in as an argument
$file = $argv[1] ?? null;
$contents = file_get_contents($file);

// using multi-line regex group VCARDs as text blocks in an array and loop them
if (preg_match_all('/BEGIN:VCARD.*?END:VCARD/s', $contents, $matches)) {
    foreach ($matches[0] as $match) {
        // filtering goes here, this example removes any VCARD that
        // didnt have "FOORBAR ORG" in its contents
        if (preg_match('/FOOBAR ORG/i', $match)) {
            print_r($match);
        }
    }
}

I then piped the script output into an inverted ack-search which filtered the output to fields I wanted to see.

$ php vdfextract.php Contacts.vcf | ack -v '(PRODID|BEGIN|END|VERSION|;;;)'

Three.js 2D-3D Render

I made a Mod for Oblivion

I made a MOD for the Elder Scrolls IV: Oblivion.

Screenshot of Firmament Mod in Game Play

It was an exercise I did to experience the Bethesda Creation Kit tools of the early 2000s. In it I explored their purpose-built scripting language "Papyrus" and created a lore friendly mod for the community called "The Firmament."

Have you ever looked upon the stars of Tamriel and wondered at their wanderings? Have you ever scoured the constellations for your sign and to know if they are looking back at you? This mod is for you.

That's the catchline anyway.
I really enjoyed making this MOD and realized that it would pretty portable to Skyrim if I wanted.

The TES Construction Kit was really solid and well built and its no wonder such an incredible modding community has emerged around their titles. After the initial setup phase and trying to understand some conceptual elements, scripting and overall process, I was able to produce this Mod in about two days time.

One amazing quality of it is how the entirety of the Mod essentially sits on top of the core game, and you can overwrite any property of the game with a Mod, like pushing content onto a stack. This makes modifying everything in the game simpler and allows for fixing a variety of issues that plagued the original release.

Anyways, if you have a copy of Oblivion installed, head on over to the Nexus Mod link below and add The Firmament to your playthrough!

Modding > Basic Scripting
Modding > Making an Oblivion Mod Part 1
Modding > Making an Oblivion Mod Part 2
The Firmament on Nexus Mod Manager

Play Online Game - Destroy Neo-Corporate Mass

Fly through space and shoot cool geometric objects in this (Desktop) space shooter sim! I built it with Three.js

All 3D rendering is done with Three.js, camera controls ported from other projects. Art by yours truly.

Play Destroy Neo-Corporate Mass fullscreen with sound

DOOM Level Development Guide - From WADs to Playing

/book/modding/doom/anatomy_of_a_doom_level_part_1_wad_structure.md
/book/modding/doom/anatomy_of_a_doom_level_part_2_creating_a_doom_level.md

I have written a deep dive into the DOOM level structure from binary formats of the WAD files to making a comprehensive and playable DOOM II level. This is an area that was overdue for a writeup so explore those pages as you can!

HEXADEATHIMAL Map Layout

Reflections on Trusting Trust by Ken Thomson - August, 1984

Ken Thomson is a bit of a legend. Here is an eloquent and simple paper he wrote summarizing his 1983 Turing Award lecture titled "Reflections on Trusting Trust".

PDF Link to Reflections on Trusting Trust by Ken Thomson - August, 1984

In the paper he demonstrates infecting the C compiler with a Trojan Horse that unwrites itself from the source code of the compiler while remaining in the binary version. This binary compiler then can infect any C compiled source code with a Trojan Horse of its own, all while leaving any original source code completely clean.

The moral of the story being: If you didn't write it, you can't trust it.

Is this sane to do in the modern world of software engineering? No. But its an interesting reflection in a world where millions of eyes comb open source code for vulnerabilities, which gives us an incredible defense against attacks (see the recent PHP ZLIB exploit attempt that was caught on GitHub), but it also gives us a false sense of security about what is actually running on our machines, servers and remote controls.

Introducing NCMySQL, an ncurses explorer and client for MySQL databases written in C

https://github.com/jordansavant/ncmysql

With the death of many great MySQL GUI clients such as SequelPro and the bloat of others I needed a replacement visual client for MySQL connections. I felt like it would be a great way to harness the experience working with ncurses and C to utilize the MySQL C API Library and create a basic TUI for working with it.

This project is completely open source and I encourage others with interest and experience to lend a hand.

Text user interface for ncmysql

New Video is Up! Bubblesorting in ADA

I have always been interested in the idea of ADA but never put my hands to it. I fell in love with strongly-typed languages after spending years in web development with loosely type langauges. So I wanted to explore ADA to see how extreme typing played out and how cumbersome or powerful it was. My small code was only to reproduce a BubbleSort on an Integer list, and I hope to do more with ADA soon.

Ada Programming - Implementing a Bubble Sort with Arrays and Procedures Video Thumbnail for New Video is Up! Bubblesorting in ADA
with Ada.Text_IO; use Ada.Text_IO;

procedure Bubble_Sort is
    type Index is range 1 .. 5; -- lower bound can be anything
    type Int_Array is array (Index) of Integer;
    type Int_Array2 is array (Natural range <>) of Integer;
    Arr : Int_Array := (1, 6, 4, 6, 8);
    Arr2 : Int_Array2 := (7, 1, 4, 5, 6, 1, 2, 1);
begin
    Put_Line ("Sort it");

    for I in Index loop
        Put (Integer'Image (Arr (I)));
    end loop;
    New_Line;

    for I in Arr2'Range loop
        Put (Integer'Image (Arr2 (I)));
    end loop;
end Bubble_Sort;

Python # Doom Engine

https://github.com/jordansavant/doomengine.python

This is a work in progress 3D reimplementation and exploration of the original DOOM engine. I am using Python as the main language. I explore 2D to 3D visualization techniques, raycasting, WAD file formats and 3D rendering engines.

Python DOOM Engine Rendering

Closures in C with GCC and Nested Functions

While doing some game developmeng on a C project I wanted to incorporate lambda functions into algorithm processing. You can see in several of my algorithm examples that I enjoy the use of functional programming to significantly reduce the complexity or performance issues that arrive out of processing the result of data using heap-allocated memory.

Combining GCC's extension support for nested functions and function pointers we can recreate the concept of a closure in C given that we have an environment that supports Executable Stacks!

Closures in C? Nested Function pointers with GCC, execstack and GDB debugging Video Thumbnail for Closures in C with GCC and Nested Functions

Elevator Simulator in Go

https://github.com/jordansavant/elevators.go

Multi-threaded, as is standard in Go, each elevator, person and floor operate as their own threaded state machines. Elevators, even when brought down to a simulated program have a decently complicated set of states and rules for operating. Namely, tasking an elevator for efficiency is not a simple challenge.

I utilized the RPC protocol to allow for the simulation to run in separated from a client. Clients could add passengers to the simulation and display it as either CLI text or a 2D graphics viewport.

Golang Elevator 2D Client Golang Elevator Terminal Output