aboutsummaryrefslogtreecommitdiffhomepage
path: root/DEVELOPMENT.md
blob: 3fc22682bfcc13ec07d62266a981cb390bb211f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# MIDIMonster development guide

This document serves as a reference for contributors interested in the low-level implementation
of the MIDIMonster. It is currently a work in progress and will be extended as problems come
up and need solving ;)

## Basics

All rules are meant as guidelines. There may be situations where they need to be applied
in spirit rather than by the letter.

### Architectural guidelines

* Change in functionality or behaviour requires a change in documentation.
* There is more honor in deleting code than there is in adding code.
	* Corollary: Code is a liability, not an asset.
	* But: Benchmark the naive implementation before optimizing prematurely.
* The `master` branch must build successfully. Test breaking changes in a branch.
* Commit messages should be in the imperative voice ("When applied, this commit will: ").
* The working language for this repository is english.
* External dependencies are only acceptable when necessary and available from package repositories.
	* Note that external dependencies make OS portability complicated

### Code style

* Tabs for indentations, spaces for word separation
* Lines may not end in spaces or tabs
* There should be no two consecutive spaces (or spaces intermixed with tabs)
* There should be no two consecutive newlines
* All symbol names in `snake_case` except where mandated by external interfaces
* When possible, prefix symbol names with their "namespace" (ie. the relevant section or module name)
* Variables should be appropriately named for what they do
	* The name length should be (positively) correlated with usage
	* Loop counters may be one-character letters
		* Prefer to name unsigned loop counters `u` and signed ones `i`
* Place comments above the section they are commenting on
	* Use inline comments sparingly
* Do not omit '{}' brackets, even if optional (e.g. single-statement conditional bodies)
* Opening braces stay on the same line as the condition

#### C specific

* Prefer lazy designated initializers to `memset()`
* Avoid `atoi()`/`itoa()`, use `strto[u]l[l]()` and `snprintf()`
* Avoid unsafe functions without explicit bounds parameters (eg. `strcat()`). 

# Repository layout

* Keep the root directory as clean as possible
	* Files that are not related directly to the MIDIMonster implementation go into the `assets/` directory
* Prefer vendor-neutral names for configuration files where necessary

# Build pipeline

* The primary build pipeline is `make`

# Architecture

* If there is significant potential for sharing functionality between backends, consider implementing it in `libmmbackend`

# Debugging