Skip to content

Instantly share code, notes, and snippets.

Connor Lane Smith cls

  • Oxford Nanopore
  • Berkshire, UK
View GitHub Profile
cls / lsln.c
Last active Nov 25, 2018
Resolve a symlink step by step, printing each link in the chain
View lsln.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
static char *getlink(const char *);
static void panic(const char *);
cls / sample-list.lisp
Last active May 25, 2018
Reservoir sampling over a list in Common Lisp
View sample-list.lisp
(defun sample-list (items &optional (size 1))
(let ((sample (make-array size :fill-pointer 0)))
(loop for item in items
for enum from 1
if (<= enum size)
do (vector-push item sample)
do (let ((rand (random enum)))
(when (< rand size)
(setf (aref sample rand) item)))
cls / derivative.sml
Created May 12, 2018
Derivative of a function in Standard ML, using Real.nextAfter
View derivative.sml
fun derivative (f : real -> real) (x : real) : real =
let val pos = Real.nextAfter (x, Real.posInf)
val neg = Real.nextAfter (x, Real.negInf)
(f pos - f neg) / (pos - neg)
cls / braille.c
Last active Jun 24, 2018
Conversion from ASCII to Braille Computer Notation (UK)
View braille.c
#include <stdio.h>
static const unsigned char braille[0x100] = {
0x40, 0x7c, 0x48, 0x70, 0x78, 0x68, 0x6f, 0x44, 0x58, 0x5c, 0x54, 0x56, 0x42, 0x64, 0x72, 0x4c,
0x7f, 0x61, 0x63, 0x69, 0x79, 0x71, 0x6b, 0x7b, 0x73, 0x6a, 0x52, 0x46, 0x66, 0x76, 0x74, 0x62,
0x00, 0x3c, 0x08, 0x30, 0x38, 0x28, 0x2f, 0x04, 0x18, 0x1c, 0x14, 0x16, 0x02, 0x24, 0x32, 0x0c,
0x3f, 0x21, 0x23, 0x29, 0x39, 0x31, 0x2b, 0x3b, 0x33, 0x2a, 0x12, 0x06, 0x26, 0x36, 0x34, 0x22,
0x6e, 0x41, 0x43, 0x49, 0x59, 0x51, 0x4b, 0x5b, 0x53, 0x4a, 0x5a, 0x45, 0x47, 0x4d, 0x5d, 0x55,
0x4f, 0x5f, 0x57, 0x4e, 0x5e, 0x65, 0x67, 0x7a, 0x6d, 0x7d, 0x75, 0x77, 0x50, 0x7e, 0x60, 0x6c,
0x2e, 0x01, 0x03, 0x09, 0x19, 0x11, 0x0b, 0x1b, 0x13, 0x0a, 0x1a, 0x05, 0x07, 0x0d, 0x1d, 0x15,
cls / mk_idmap.sml
Last active Apr 9, 2018
Higher-order relabelling function, ported from OCaml to Standard ML
View mk_idmap.sml
exception NotFound
fun mk_idmap (mk_id : unit -> 'b) : ''a list -> ''a -> 'b =
(fn (x, acc) =>
let val new_id = mk_id () in
fn id => if id = x then new_id else acc id
(fn _ => raise NotFound)
cls /
Created Mar 25, 2018
Execute sed substitution expression over files in a git tree
pattern="$(printf "%s" "$expr" | sed -n 's/^s\/\(\([^\\\/]\|\\.\)*\)\/\([^\\\/]\|\\.\)*\/g\?$/\1/p')"
if [ -z "$pattern" ]
printf "usage: git sed s/lhs/rhs/[g] [file...]\n" > /dev/stderr
cls / row_align.c
Last active Mar 18, 2018
Translate raw two-dimensional bitmap into word-aligned rows
View row_align.c
#include <stdint.h>
#include <string.h>
row_align(uint8_t *dst, const uint8_t *src, const size_t width_in_bits, const size_t height)
const size_t width_in_whole_bytes = width_in_bits / 8;
if (width_in_bits % 32 == 0) { // word-aligned
memcpy(dst, src, width_in_whole_bytes * height);
cls / count-dna.cpp
Last active Mar 9, 2018
Efficient counting of DNA bases and codons
View count-dna.cpp
#include <array>
enum Base { A, C, T, G };
constexpr Base base(char c)
return static_cast<Base>((c >> 1) & 0b11);
static_assert(base('A') == Base::A);
cls / functional-templates.hpp
Last active Mar 9, 2018
Type-level linked lists, with map, filter, and foldr
View functional-templates.hpp
#include <type_traits>
namespace type_list {
class nil {};
template<class Head, class Tail>
class cons {};
// map f [] = []
cls / base64.hpp
Last active Feb 13, 2019
Straightforward constexpr Base64 block encoding in C++14
View base64.hpp
#include <array>
#include <tuple>
constexpr std::array<char, 4> base64(uint8_t octet0, uint8_t octet1, uint8_t octet2)
constexpr std::array<char, 64> table = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
You can’t perform that action at this time.