Skip to content

Instantly share code, notes, and snippets.

@mcejp
mcejp / ring_buffer.c
Created December 6, 2023 10:59
Ring buffer with Array + two indices mod 2N
// Background: https://www.snellman.net/blog/archive/2016-12-13-ring-buffers/
// Variant with indices modulo 2*capacity as suggested by dizzy57 and Aristotle Pagaltzis
size_t read;
size_t write;
mask(val) { return val % array.capacity; }
wrap(val) { return val % (array.capacity * 2); }
inc(index) { return wrap(index + 1); }
push(val) { assert(!full()); array[mask(write)] = val; write = inc(write); }
@mcejp
mcejp / CMakeLists.txt
Created November 4, 2023 09:54
Custom Python step in CMake build
macro(cmake_path_ABSOLUTE_PATH VARIABLE_NAME)
if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20.0")
cmake_path(ABSOLUTE_PATH ${VARIABLE_NAME})
else()
# polyfill for CMake < 3.20
get_filename_component(${VARIABLE_NAME} ${${VARIABLE_NAME}} ABSOLUTE)
endif()
endmacro()
function(my_build_step SOURCE OUTPUT)
@mcejp
mcejp / bsod.php
Created September 14, 2023 12:51
BSOD-style error page in PHP
<!doctype html>
<html>
<head>
<style>
html {
font-size: 1.2em;
}
body {
@mcejp
mcejp / _README.md
Last active February 6, 2024 20:33
My baseline setup for Python package projects
@mcejp
mcejp / saveregister.S
Created July 30, 2023 10:28
Saving registers on Aarch64 in a core-dump-ready format
.macro saveregister
// Registers are saved in the following order (see also: user_regs_struct):
// x0 x1 ... x28 x29 x30 SP PC PSTATE
// at: -110 -108 ... -30 -28 -20 -18 -10 -08 (hex) with respect to SP-at-entry
// Start by saving these:
// [sp, #-0x40] <== x26; x27
// [sp, #-0x30] <== x28; x29
stp x26, x27, [sp, #-0x40]
stp x28, x29, [sp, #-0x30]
/* Copyright (c) 2005-2007, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
@mcejp
mcejp / serve.sh
Created May 22, 2023 20:51
Jekyll in Podman
#!/bin/sh
set -ex
podman start -ia jekyll || podman run -it \
--name jekyll \
--volume=$PWD:/srv/jekyll \
--env JEKYLL_ENV=production \
--env JEKYLL_ROOTLESS=1 \
-p 4000:4000 \
docker.io/jekyll/jekyll:4.1.0 \
#!/bin/bash
if [[ $# -ne 1 ]] ; then
echo 'usage: make_release.sh RELEASE'
echo ' example: ./make-release.sh 2022.06'
exit 1
fi
set -e
@mcejp
mcejp / line_writer.py
Created May 1, 2023 12:09
Pattern: line writer with indentation
class LineWriter:
def __init__(self, f, indent=0):
self._f = f
self._indent = indent
def indented(self) -> "LineSink":
return LineSink(self._f, self._indent + 1)
def write_line(self, s=None):
if s is not None:
@mcejp
mcejp / FileEmbed.cmake
Last active January 26, 2023 10:36
CMake function to convert a binary file into a C++ header embedding the data as std::span<uint8_t>
# Adapted from original:
# https://jonathanhamberg.com/post/cmake-file-embedding/
# https://gitlab.com/jhamberg/cmake-examples/-/blob/master/cmake/FileEmbed.cmake
function(FileEmbed_Add input output c_name)
add_custom_command(
OUTPUT ${output}
COMMAND ${CMAKE_COMMAND}
-DRUN_FILE_EMBED_GENERATE=1
-DINPUT_FILE=${input}