Mercurial > molko
annotate extern/libcompat/README.md @ 299:648f5f949afb
core: implement stackable states
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 11 Apr 2021 16:41:34 +0200 |
parents | f978fa0137ce |
children |
rev | line source |
---|---|
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 libcompat |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 ========= |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 This project contains several polyfill for various C extensions that are not |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 part of C standard or POSIX. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 For example, it contains various functions such as: |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 - pledge: privileges separation from OpenBSD (no-op on other systems), |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 - reallocarray/recallocarray: safe alternative to realloc for arrays from |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 OpenBSD, |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 - strlcpy/strlcat: safer alternatives to strncpy/strncat from OpenBSD, |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 - strsep: better alternative to strtok from 4.4BSD. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 Requirements |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 ------------ |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 - C compiler, |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 - POSIX conformant system (ar, make, sh, rm, tr, touch). |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 Usage |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 ----- |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 The easiest way to use libcompat is to copy the directory content into your |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 project and to adapt files you need. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 Every routine (or group of routines) is implemented into an individual file |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 plus tested with a test file. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 Example with strlcpy: |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 - libcompat/strlcpy.c |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 - libcompat/test-strlcpy.c |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 Then, the build process create the following output files, example with |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 strlcpy: |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 - libcompat/strlcpy.t: output of the compiler command, usually empty on |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 success. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 - libcompat/strlcpy.h: a header file containing `#define COMPAT_HAVE_STRLCPY` |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 if the test succeed. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 - libcompat/strlcpy.o: object file containing fallback implementation or |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 nothing if the component is available in the host system. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 Finally, when you want to use one of the extension, you'll have to import the |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 header file where it's supposed to be declared (unless this header file is not |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 portable) and you also must include libcompat/compat.h. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 Example with strlcpy: |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 #include <string.h> |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 #include "libcompat/compat.h" |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 ### Wrapper script |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 The convenient script libcompat/compile.sh will try co compile the test and |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 will either compile the polyfill or a dummy empty file instead. It should be |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 invoked with the canonical filename (without extension). |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 It also read `CC`, `CFLAGS` and `LDFLAGS` environment variable which are all |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 optional. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 Example of use: |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 ./libcompat/compile.sh strlcpy |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 CC="clang" CFLAGS="-O2" ./libcompat/compile.sh strlcat |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 ### Makefile |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 The included Makefile can be used as boilerplate into your project and create a |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 libcompat.a archive ready to use. Simply adapt macros in the Makefile for your |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 own use. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 Licenses |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 -------- |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 Polyfill code are licensed per their authors and must be checked individually. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 See headers in the libcompat directory. |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 Author |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 ------ |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 David Demelier <markand@malikania.fr> |