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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
MLib — Useful Standard Library Extensions
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MLib is a collection of various headers and libraries that I find useful
in a large enough number of my personal C projects. This includes for
example: common datastructures, useful non-POSIX APIs, and 21st-century
strings.
This does not aim to be a LibC replacement, but rather a supplimentary
library. It is a C23 library with no plans to support older standards.
The headers as of now are:
• alloc.h — allocators and memory allocation functions
• bitset.h — bitset implementation
• dynarr.h — dynamic array implementation
• errors.h — err.h-inspired diagnostics functions
• macros.h — miscellaneous utility macros (MIN/MAX/lengthof/etc.)
• mbio.h — multibyte file I/O
• mbstring.h — multibyte-strings
• optparse.h — option parsing functions
• rune.h — inttypes.h but for runes
• unicode/prop.h — unicode character properties
• unicode/string.h — unicode string functions
BUILD INSTRUCTIONS:
To build Mlib you need to have a C23 conforming C compiler. Simply
bootstrap the build system and run it:
$ cc -o make make.c
$ ./make
To build with optimizations enabled, use the -r flag:
$ ./make -r
DISCLAIMER:
This library is developed for use by me (the author). You are free
to use this code for whatever you’d like, but do be warned that
breaking changes may (and will) occur at any moment with no prior
warning. Additionally, be warned that I do not care about whether or
not you think the API is well-designed or human-friendly. If you
have an issue with the code here, fix it — you are a programmer are
you not?
DOCUMENTATION:
All headers, types, functions, etc. are documented in the manual
pages found in the man/ subdirectory. You can install these globally
to your system by running the following:
$ ./make manstall
Some important manuals are:
• mlib(7) — overview of the MLib library
• ⟨header-name⟩.h(3) — overview of the ⟨header-name⟩.h header
FEATURES:
The following is a non-exhaustive list of features.
• alloc.h
• Arena allocator
• realloc() wrapper with overflow checking
• realloc() wrapper with overflow checking that crashes on failure
• bitset.h
• Bitset implementation and operations
• dynarr.h
• Dynamic-array implementation and operations
• Macros for iterating forwards and backwards
• errors.h
• Functions for getting and setting the program name
• Functions for printing diagnostics and optionally crashing with
strerror() support
• Generate usage strings
• macros.h
• MIN()/MAX()/CLAMP()
• Better assertion macro
• More readable strcmp()/memcmp()/etc. wrappers for equality checking
• Static array length macro
• mbio.h
• Read individual runes from files
• mbstring.h
• Encode and decode runes
• Iterate over UTF-8 codepoints
• Count UTF-8 codepoints
• UTF-8 validation
• Various string.h analogues with UTF-8 support
• Random utility macros and -constants
• optparse.h
• Thread-safe (non-global) UTF-8-aware option parsing with
support for short- and long options
• rune.h
• Format string macros for the printf() and scanf() families of
functions
• Macro for defining rune constants
• Useful rune-related constants
• unicode/prop.h
• Functions for getting Unicode character properties for runes
• Properties related to case-mapping are context-aware (via a
context-struct argument)
• unicode/string.h
• Iteration and counting of graphemes and words in a string
• Unicode-aware case-mapping of strings with truncation checking
• Case-mapping supports optional language-specific quirks for
Azeri, German, Lithuanian, and Turkish.
PLANNED FEATURES:
• Line- and sentence segmentation (unicode/string.h)
• String casefolding (unicode/string.h)
• String collation (unicode/string.h)
• Unicode normalization (unicode/string.h)
BUGS:
• Unicode Name Aliases (Name_Alias property) is not supported
• Unihan properties are not supported (e.g. Unicode_Radical_Stroke)
• Casemapping is not fully up-to-spec
|