bastd/README.md
2025-02-08 07:28:11 +00:00

4.4 KiB

Bravely Arranged Standard Library

bastd is my own custom standard library for C, made to aid in the development of games, 3D software, 2D development tools and more.

It strays heavily from what is supported in the lackluster C standard library and aims to be a sufficient and even superior replacement.

bastd's design goals include:

  • Simplifying the build system
  • Providing a full framework for Graphical and Console Applications
  • Giving clear errors and debugging tools to the Programmer
  • Making C a more "tolerable" language

bastd's features include:

  • No header files. They cause more harm than good in my opinion, and I prefer a single translation unit in my builds. You just include bastd.c at the top of your main C file and you start writing code.
  • Memory Allocators. These include the Arena Allocator, which groups allocations into a single lifetime for a certain region of code (i.e. a frame), and a Buddy Allocator, which is our general-purpose allocator in place of malloc, that has the benefit of making the region of memory allocated to more explicit.
  • A Length-Based String Type. By adding one variable to accompany a char *, almost all operations upon strings become infinitely easier. Said operations are included by default.
  • Generic data-structures. The premier one is the Dynamic Array, which brings the power of C++'s std::vector to C. There is also a HashMap, which is implemented as a 4-ary hash-trie.
  • A I/O system that supports both standard input/output and file input/output. It's built on a basic buffer type that you can flush to output data. This buffer type also acts as a string builder, by letting you append data to the buffer, then compile it to a string type.
  • A multi-threaded job system. You can also just use the operating system's primitives.
  • A Randomness API. Not really sure what else there is to say, really.
  • A simple GUI initialization system that gets you a window with immediate-mode input and a Direct3D11 (Win32) / OpenGL (Linux) context. The context given can either be given to a rendering library (sokol_gfx.h is first-class) or you can raw-dog a renderer if you're feeling bold enough.
  • A simple immediate mode GUI with support for custom widgets.
  • An audio library. Windows implementation uses WASAPI, Linux uses ALSA.
  • A 3D Math API with supports for Vectors and Matricies using SIMD.

  • implemented
  • planned

The only currently supported platform is Windows, though once the APIs are finished, a Linux and FreeBSD port are planned.

Why C?

Cuz I like C. It's the closest "high-level" language to assembly, so I have maximum control. It is really simple, which in some ways is to its detriment. Almost all OS libraries, Graphics libraries, Audio libraries, etc. are written in C.

C is great. Don't let anyone tell you it's not.

Examples

You can change the build script to any of the examples. Once built, you should step through each example in a debugger in order to see how the programs work.

Setup

Download the latest release whenever you want to start a new project.

All of your code is going to go in the root of this folder, and all the bastd code has been kept in the bastd folder. FOr convenience, the bastd.c file, which includes all other C files in the folder, stays in the top level directory, so you can easily include the file.

So, open main.c and have a scroll through it to see some example code. Then, delete everything in the file and enter this basic skeleton:

#include "bastd.c"

CALLBACK Error
start(Slice_S8 args, Buffer stdin, Buffer stdout)
{
	return Error_success;
}

Now, you can compile the program with build.bat or build.sh to get an executable.

Note that since you make a new copy of bastd for every project, the library is completely vendored and you can modify it however you'd like.

LICENSE

bastd is licensed under the 3-clause BSD license. See LICENSE.md.