This page lists many small programs that I have written for my
daily needs. I have gathered them here in the hope that someone
else might find them useful or interesting.
RECENT CHANGES AND COMMENTS
- Mar 2014: Neatroff now reports the bounding box of \w
argument via bbllx, bblly, bburx and bbury number registers
(added while working on neateqn).
- Feb 2014: Uploaded version 0.9 of ft2tf, which allows specifying
distinct horizontal and vertical DPIs.
- Feb 2014: I hope to prepare a preliminary version of neateqn
in a few weeks. Neateqn is an eqn preprocessor for
neatroff that addresses some of the shortcomings and problems
of the eqn preprocessor of the original troff.
- Jan 2014: Added a script to fetch, compile
and set up neatroff and neatpost. Read its comments
for more information.
- Jan 2014: Added a new command to fbpdf to set the default zoom
level. Also, fbdjvu now supports rotation.
- Nov 2013: I have revised neatroff's font description format.
While remaining backward compatible with the original troff,
neatroff now supports lines starting with the token "char"
to define characters and lines starting with "kern" to define
kerning pairs; mktrfn has also been updated to use the new
- Nov 2013: A new program has been added to tdq to import Arpabet
pronunciations after converting them to IPA.
- Oct 2013: Added .char, .chop and .fspecial requests to neatroff.
- Sep 2013: After about two years, I have merged fbpad's 256 color
palette. Now the bold
branch is almost identical to the master branch and is removed.
- Aug 2013: When a program is specified via command line
arguments, fbpad starts the given program, disables terminal
switching commands, and exits when the program finishes.
I have also merged the scrolling history patch from the bold
branch and uploaded version 0.8 of ft2tf, which supports
full-width characters and emboldening fonts.
- Jul 2013: Now I use neatroff and neatpost for typesetting.
- Apr 2013: A command was added to fbpdf to override
page numbers; useful especially for documents that start with
- Mar 2013: I included Jörg Reinhard's patch to support mousewheel
in fbvnc. I also included a patch to move the viewing
screen for large VNC framebuffers.
- Feb 2013: I added fbvis to view images on the framebuffer.
- Feb 2013: When paused, minmad and fbff now close the OSS device
to permit other programs to open it.
- Feb 2013: Fullwidth characters are now handled correctly in
fbpad; Felix Janda tested the changes and prepared a preliminary patch.
- Jan 2013: Many of my framebuffer programs define a FB_VAL() macro
as an alias for fb_val() function.
The macro can be redefined for speed (should help especially
fbpdf, fbvis and cnoor). On 32-bit RGB framebuffers, for instance,
it can be redefined as "(((r) << 16) | ((g) << 8) | (b))".
I no longer use X11.
- fbpad, a small linux framebuffer
virtual terminal. It manages many terminals through single-letter tags.
It uses tinyfont font files; the ft2tf program
converts common font formats to tinyfont
(for testing, you can try courier regular,
italic and bold tinyfonts).
Here's a screenshot with Ubuntu monospaced.
has a nice but out of date introduction.
- fbpdf, a linux framebuffer pdf
viewer using mupdf library.
It can also use libpoppler and can view djvu files via libdjvulibre.
- fbvis is a framebuffer image viewer;
includes stbi and
and does not depend on external image libraries.
- fbff, a ffmpeg-based linux
framebuffer media player. The libmpeg3 branch uses libmpeg3 instead
- fbvnc, a small framebuffer vnc viewer;
Jörg Reinhard added german keyboard support, available
SliTaz uses this
- cnoor to read the holy Quran on
Many of the programs in this page can be compiled with neat*
(using neatcc.c wrapper for neatcc, neatlibc and neatld)
or with neatcc and musllibc/dietlibc.
- neatcc is a small ARM/X86(_64) C compiler;
here's a brief introduction and
here's its small testsuite
- neatld is a simple ARM/X86(_64) static linker
- neatas is an ARM assembler; note
that neatcc does not need an assembler, as it generates machine code directly
- neatlibc is a very small ARM/X86(_64) libc
written mainly to bootstrap neat*; I wish to find the time to clean it up
and implement its missing functions
- a simple elf core file backtrace viewer (my gdb replacement)
- elfloc to find elf symbols around a virtual address
I prepare almost all of my documents with these programs.
- my troff clone neatroff
and its postscript postprocessor neatpost;
neatroff extends the original troff with
utf-8 text encoding, named environments,
long register and macro names, changing text color,
arbitrary font ligatures and pairwise kerning,
bidirectional text rendering, and keshideh line adjustment;
here's a brief introduction.
It can use troff's macros and preprocessors
and the output device created by the mktrfn program.
Right-to-left rendering is implemented
in its dir branch as described here.
This script fetches, compiles and sets up neatroff
and neatpost (see the included comments for more information).
- here's the port of plan9 troff (troff, tr2ps,
eqn, tbl, pic, and grap) to linux; it also includes my small refer clone.
Its dir branch holds my right-to-left text support patch.
- I wrote mktrfn to create neatroff font description
files from AFM, OTF and TTF files
- ctxt to write formatted documents (including
- nref manages document references; it can be used as
a troff preprocessor
- bib2ref converts bibtex files to refer databases and
ref2bib does the reverse
- my mailx clone, a fast and simple mail client
- my pop3 client; appends mails to
different mbox files based on the specified rules (uses polarssl)
- my smtp client (uses polarssl)
- mailpg, my mail pager
- tdq, a fast dictionary lookup program (xdxf and stardict
files can be imported)
- pdftxt uses mupdf to extract text from pdf files;
prefixes each line with its page number for searching
- rangi to detect colored graph motifs;
more information available here
- minmad to play mp3 files using oss/libmad
(the alsa branch uses alsa)
- minmix is a small OSS mixer;
here's an older version for alsa
- llx reads commands from standard input and executes
them in parallel with an optional maximum concurrent processes limit
- my repeat after me typing exercise
- my small utf-8 unix fmt(1) clone (not completely compatible though)
- ethcat is my tcpdump/tcpreplay replacement
- my simple socks v5 server (no tcp bind)
- dc16, a trivial stack-based calculator supporting
0x1f style hex numbers; handy when doing hex calculations
- I started rope (a python refactoring library)
in 2006; I do not use python anymore, however.
- my simple hex file viewer
I am Ali Gholami Rudi (ali at rudi dot ir).
Hosted by tuxfamily.org.