mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-21 10:00:30 +00:00
Get Cosmopolitan into releasable state
A new rollup tool now exists for flattening out the headers in a way that works better for our purposes than cpp. A lot of the API clutter has been removed. APIs that aren't a sure thing in terms of general recommendation are now marked internal. There's now a smoke test for the amalgamation archive and gigantic header file. So we can now guarantee you can use this project on the easiest difficulty setting without the gigantic repository. A website is being created, which is currently a work in progress: https://justine.storage.googleapis.com/cosmopolitan/index.html
This commit is contained in:
parent
dba7552c1e
commit
ea0b5d9d1c
775 changed files with 6864 additions and 3963 deletions
|
@ -12,7 +12,7 @@ void *bsearch(const void *, const void *, size_t, size_t,
|
|||
void *bsearch_r(const void *, const void *, size_t, size_t,
|
||||
int cmp(const void *, const void *, void *), void *)
|
||||
paramsnonnull((1, 2, 5)) nothrow nosideeffect;
|
||||
void djbsort(size_t n, int32_t[n]);
|
||||
void djbsort(int32_t *, size_t);
|
||||
void qsort(void *, size_t, size_t, int (*)(const void *, const void *))
|
||||
paramsnonnull();
|
||||
void qsort_r(void *, size_t, size_t,
|
||||
|
@ -43,72 +43,14 @@ char16_t *concatstr16(const char16_t *, ...) nullterminated()
|
|||
wchar_t *concatwcs(const wchar_t *, ...) nullterminated()
|
||||
paramsnonnull() __algalloc;
|
||||
|
||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
│ cosmopolitan § algorithms » containers ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
|
||||
struct critbit0 {
|
||||
void *root;
|
||||
size_t count;
|
||||
};
|
||||
|
||||
bool critbit0_contains(struct critbit0 *, const char *) nothrow nosideeffect
|
||||
paramsnonnull();
|
||||
bool critbit0_insert(struct critbit0 *, const char *) paramsnonnull();
|
||||
bool critbit0_delete(struct critbit0 *, const char *) nothrow paramsnonnull();
|
||||
void critbit0_clear(struct critbit0 *) nothrow paramsnonnull();
|
||||
char *critbit0_get(struct critbit0 *, const char *);
|
||||
intptr_t critbit0_allprefixed(struct critbit0 *, const char *,
|
||||
intptr_t (*)(const char *, void *), void *)
|
||||
paramsnonnull((1, 2, 3)) nothrow;
|
||||
bool critbit0_emplace(struct critbit0 *, char *, size_t) paramsnonnull();
|
||||
|
||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
│ cosmopolitan § algorithms » comparators ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
|
||||
int cmpsb(/*const signed char[1]*/ const void *, const void *)
|
||||
paramsnonnull() nothrow nocallback nosideeffect;
|
||||
int cmpub(/*const unsigned char[1]*/ const void *, const void *)
|
||||
paramsnonnull() nothrow nocallback nosideeffect;
|
||||
int cmpsw(/*const signed short[1]*/ const void *, const void *)
|
||||
paramsnonnull() nothrow nocallback nosideeffect;
|
||||
int cmpuw(/*const unsigned short[1]*/ const void *, const void *)
|
||||
paramsnonnull() nothrow nocallback nosideeffect;
|
||||
int cmpsl(/*const signed int[1]*/ const void *, const void *)
|
||||
paramsnonnull() nothrow nocallback nosideeffect;
|
||||
int cmpul(/*const unsigned int[1]*/ const void *, const void *)
|
||||
paramsnonnull() nothrow nocallback nosideeffect;
|
||||
int cmpsq(/*const signed long[1]*/ const void *, const void *)
|
||||
paramsnonnull() nothrow nocallback nosideeffect;
|
||||
int cmpuq(/*const unsigned long[1]*/ const void *, const void *)
|
||||
paramsnonnull() nothrow nocallback nosideeffect;
|
||||
|
||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
│ cosmopolitan § algorithms » generics ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
|
||||
#if __STDC_VERSION__ + 0 >= 201112
|
||||
|
||||
#define memmem(haystack, haystacklen, needle, needlelen) \
|
||||
_Generic(*(haystack), wchar_t \
|
||||
: wmemmem, char16_t \
|
||||
: memmem16, default \
|
||||
: memmem)(haystack, haystacklen, needle, needlelen)
|
||||
|
||||
#define replacestr(s, needle, replacement) \
|
||||
_Generic(*(s), wchar_t \
|
||||
: replacewcs, char16_t \
|
||||
: replacestr16, default \
|
||||
: replacestr)(s, needle, replacement)
|
||||
|
||||
#define concatstr(s, ...) \
|
||||
_Generic(*(s), wchar_t \
|
||||
: concatwcs, char16_t \
|
||||
: concatstr16, default \
|
||||
: concatstr)(s, __VA_ARGS__)
|
||||
|
||||
#endif /* C11 */
|
||||
int cmpsb(const void *, const void *);
|
||||
int cmpub(const void *, const void *);
|
||||
int cmpsw(const void *, const void *);
|
||||
int cmpuw(const void *, const void *);
|
||||
int cmpsl(const void *, const void *);
|
||||
int cmpul(const void *, const void *);
|
||||
int cmpsq(const void *, const void *);
|
||||
int cmpuq(const void *, const void *);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
|
|
|
@ -28,20 +28,20 @@
|
|||
|
||||
#define append(ARRAYLIST, ITEM) concat((ARRAYLIST), (ITEM), 1)
|
||||
|
||||
#define concat(ARRAYLIST, ITEM, COUNT) \
|
||||
({ \
|
||||
autotype(ARRAYLIST) List = (ARRAYLIST); \
|
||||
autotype(&List->p[0]) Item = (ITEM); \
|
||||
size_t SizE = sizeof(*Item); \
|
||||
size_t Count = (COUNT); \
|
||||
size_t Idx = List->i; \
|
||||
if (Idx + Count < List->n || grow(&List->p, &List->n, SizE, Count)) { \
|
||||
memcpy(&List->p[Idx], Item, SizE *Count); \
|
||||
atomic_store(&List->i, Idx + Count); \
|
||||
} else { \
|
||||
Idx = -1UL; \
|
||||
} \
|
||||
(ssize_t)(Idx); \
|
||||
#define concat(ARRAYLIST, ITEM, COUNT) \
|
||||
({ \
|
||||
autotype(ARRAYLIST) List = (ARRAYLIST); \
|
||||
autotype(&List->p[0]) Item = (ITEM); \
|
||||
size_t SizE = sizeof(*Item); \
|
||||
size_t Count = (COUNT); \
|
||||
size_t Idx = List->i; \
|
||||
if (Idx + Count < List->n || __grow(&List->p, &List->n, SizE, Count)) { \
|
||||
memcpy(&List->p[Idx], Item, SizE *Count); \
|
||||
atomic_store(&List->i, Idx + Count); \
|
||||
} else { \
|
||||
Idx = -1UL; \
|
||||
} \
|
||||
(ssize_t)(Idx); \
|
||||
})
|
||||
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
@ -10,26 +10,26 @@ COSMOPOLITAN_C_START_
|
|||
#define APPEND(LIST_P, LIST_I, LIST_N, ITEM) \
|
||||
CONCAT(LIST_P, LIST_I, LIST_N, ITEM, 1)
|
||||
|
||||
#define CONCAT(LIST_P, LIST_I, LIST_N, ITEM, COUNT) \
|
||||
({ \
|
||||
autotype(LIST_P) ListP = (LIST_P); \
|
||||
autotype(LIST_I) ListI = (LIST_I); \
|
||||
autotype(LIST_N) ListN = (LIST_N); \
|
||||
typeof(&(*ListP)[0]) Item = (ITEM); \
|
||||
size_t SizE = sizeof(*Item); \
|
||||
size_t Count = (COUNT); \
|
||||
ssize_t Entry = -1; \
|
||||
/* NOTE: We use `<` to guarantee one additional slot */ \
|
||||
/* grow() will memset(0) extended memory, thus */ \
|
||||
/* you get a nul-terminator for free sometimes */ \
|
||||
/* the exception is if you list.i=0 and re-use */ \
|
||||
/* so you need concat(...); list.p[list.i++]=0 */ \
|
||||
if (*ListI + Count < *ListN || grow(ListP, ListN, SizE, Count)) { \
|
||||
memcpy(&(*ListP)[*ListI], Item, (SizE) * (Count)); \
|
||||
Entry = *ListI; \
|
||||
*ListI += Count; /* happens after copy in case signal */ \
|
||||
} \
|
||||
Entry; \
|
||||
#define CONCAT(LIST_P, LIST_I, LIST_N, ITEM, COUNT) \
|
||||
({ \
|
||||
autotype(LIST_P) ListP = (LIST_P); \
|
||||
autotype(LIST_I) ListI = (LIST_I); \
|
||||
autotype(LIST_N) ListN = (LIST_N); \
|
||||
typeof(&(*ListP)[0]) Item = (ITEM); \
|
||||
size_t SizE = sizeof(*Item); \
|
||||
size_t Count = (COUNT); \
|
||||
ssize_t Entry = -1; \
|
||||
/* NOTE: We use `<` to guarantee one additional slot */ \
|
||||
/* grow() will memset(0) extended memory, thus */ \
|
||||
/* you get a nul-terminator for free sometimes */ \
|
||||
/* the exception is if you list.i=0 and re-use */ \
|
||||
/* so you need concat(...); list.p[list.i++]=0 */ \
|
||||
if (*ListI + Count < *ListN || __grow(ListP, ListN, SizE, Count)) { \
|
||||
memcpy(&(*ListP)[*ListI], Item, (SizE) * (Count)); \
|
||||
Entry = *ListI; \
|
||||
*ListI += Count; /* happens after copy in case signal */ \
|
||||
} \
|
||||
Entry; \
|
||||
})
|
||||
|
||||
COSMOPOLITAN_C_END_
|
|
@ -3,13 +3,8 @@
|
|||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
/**
|
||||
* Floor binary search of low 32-bits of 64-bit array items.
|
||||
*
|
||||
* This is well-suited to NexGen-32e, requiring less than 32 bytes of
|
||||
* code. It's particularly useful for frozen maps, requiring less effort
|
||||
* and memory than a perfect hash table.
|
||||
*/
|
||||
/* TODO: DELETE */
|
||||
|
||||
forceinline int32_t bisectcarleft(const int32_t (*cons)[2], size_t count,
|
||||
const int32_t key) {
|
||||
size_t left = 0;
|
|
@ -1,27 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_ALG_BISECTLEFT_H_
|
||||
#define COSMOPOLITAN_LIBC_ALG_BISECTLEFT_H_
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
forceinline size_t bisectleft(const void *key, const void *base, size_t count,
|
||||
size_t sz, int cmp(const void *, const void *)) {
|
||||
size_t m, l, r;
|
||||
l = 0;
|
||||
r = count;
|
||||
while (l < r) {
|
||||
m = (l + r) >> 1;
|
||||
if (cmp((char *)base + m * sz, key) < 0) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
r = m;
|
||||
}
|
||||
}
|
||||
if (l && (l == count || cmp((char *)base + l * sz, key) > 0)) {
|
||||
l--;
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_ALG_BISECTLEFT_H_ */
|
|
@ -1,26 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_ALG_BISECTRIGHT_H_
|
||||
#define COSMOPOLITAN_LIBC_ALG_BISECTRIGHT_H_
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
forceinline size_t bisectright(const void *key, const void *base, size_t count,
|
||||
size_t sz, int cmp(const void *, const void *)) {
|
||||
size_t left = 0;
|
||||
size_t right = count;
|
||||
while (left < right) {
|
||||
size_t m = (right + right) >> 1;
|
||||
if (cmp((char *)base + m * sz, key) > 0) {
|
||||
right = m + 1;
|
||||
} else {
|
||||
right = m;
|
||||
}
|
||||
}
|
||||
if (right && (right == count || cmp((char *)base + right * sz, key) > 0)) {
|
||||
right--;
|
||||
}
|
||||
return right;
|
||||
}
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_ALG_BISECTRIGHT_H_ */
|
|
@ -18,7 +18,7 @@
|
|||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/bisect.h"
|
||||
#include "libc/alg/bisect.internal.h"
|
||||
|
||||
/**
|
||||
* Searches sorted array for exact item in logarithmic time.
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/bisect.h"
|
||||
#include "libc/alg/bisect.internal.h"
|
||||
|
||||
/**
|
||||
* Searches sorted array for exact item in logarithmic time.
|
||||
|
|
27
libc/alg/critbit0.h
Normal file
27
libc/alg/critbit0.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_ALG_CRITBIT0_H_
|
||||
#define COSMOPOLITAN_LIBC_ALG_CRITBIT0_H_
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
│ cosmopolitan § data structures » critical bit tree (for c strings) ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
|
||||
struct critbit0 {
|
||||
void *root;
|
||||
size_t count;
|
||||
};
|
||||
|
||||
bool critbit0_contains(struct critbit0 *, const char *) nothrow nosideeffect
|
||||
paramsnonnull();
|
||||
bool critbit0_insert(struct critbit0 *, const char *) paramsnonnull();
|
||||
bool critbit0_delete(struct critbit0 *, const char *) nothrow paramsnonnull();
|
||||
void critbit0_clear(struct critbit0 *) nothrow paramsnonnull();
|
||||
char *critbit0_get(struct critbit0 *, const char *);
|
||||
intptr_t critbit0_allprefixed(struct critbit0 *, const char *,
|
||||
intptr_t (*)(const char *, void *), void *)
|
||||
paramsnonnull((1, 2, 3)) nothrow;
|
||||
bool critbit0_emplace(struct critbit0 *, char *, size_t) paramsnonnull();
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_ALG_CRITBIT0_H_ */
|
|
@ -17,7 +17,7 @@
|
|||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/critbit0.h"
|
||||
#include "libc/alg/internal.h"
|
||||
#include "libc/str/str.h"
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/critbit0.h"
|
||||
#include "libc/alg/internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/critbit0.h"
|
||||
#include "libc/alg/internal.h"
|
||||
#include "libc/str/str.h"
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/critbit0.h"
|
||||
#include "libc/alg/internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/str/str.h"
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/critbit0.h"
|
||||
#include "libc/alg/internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/str/str.h"
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/critbit0.h"
|
||||
#include "libc/alg/internal.h"
|
||||
#include "libc/str/str.h"
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/critbit0.h"
|
||||
#include "libc/alg/internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/str/str.h"
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_ALG_INSERTIONSORT_H_
|
||||
#define COSMOPOLITAN_LIBC_ALG_INSERTIONSORT_H_
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
|
||||
#define siftbackwards(C, X, V, i) \
|
||||
do { \
|
||||
autotype(V) V_ = (V); \
|
||||
for (autotype(i) j = (i); j && C(&V_[j - 1], &V_[j]) > 0; --j) { \
|
||||
X(&V_[j - 1], &V_[j]); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* Tiny in-place quadratic sorting algorithm.
|
||||
*
|
||||
* The only advantage to insertion sort is saving on code size when
|
||||
* there's a strong level of certainty the array won't have more than
|
||||
* sixteen items. Sometimes Insertion Sort is favored for sorting data
|
||||
* that's almost sorted. SmoothSort should be a better choice (see
|
||||
* qsort()) since it has that advantage and a linearithmic worst-case.
|
||||
*/
|
||||
#endif
|
||||
#define INSERTIONSORT(C, X, A, n) \
|
||||
do { \
|
||||
autotype(A) A_ = (A); \
|
||||
autotype(n) n_ = (n); \
|
||||
for (autotype(n) i = 1; i < n_; ++i) { \
|
||||
siftbackwards(C, X, A_, i); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_ALG_INSERTIONSORT_H_ */
|
|
@ -18,8 +18,8 @@
|
|||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/arraylist2.h"
|
||||
#include "libc/bits/safemacros.h"
|
||||
#include "libc/alg/arraylist2.internal.h"
|
||||
#include "libc/bits/safemacros.internal.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
|
||||
|
|
|
@ -18,14 +18,15 @@
|
|||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/alg/arraylist2.h"
|
||||
#include "libc/bits/safemacros.h"
|
||||
#include "libc/alg/arraylist2.internal.h"
|
||||
#include "libc/bits/safemacros.internal.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
|
||||
#undef strlen
|
||||
#undef replacestr
|
||||
#define replacestr replacestr16
|
||||
#define memmem memmem16
|
||||
#define char char16_t
|
||||
#define strlen strlen16
|
||||
#include "libc/alg/replacestr.c"
|
||||
|
|
|
@ -3,16 +3,14 @@
|
|||
#include "libc/bits/xchg.h"
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* Reverses array.
|
||||
*
|
||||
* @param ARRAY is a typed array or a pointer to one
|
||||
* @param ARRAY is a typed array or a pointer to one
|
||||
* @param COUNT is the number of items
|
||||
* @return pointer to start of array
|
||||
* @see ARRAYLEN()
|
||||
*/
|
||||
#endif
|
||||
#define reverse(ARRAY, COUNT) \
|
||||
({ \
|
||||
autotype(&(ARRAY)[0]) Array = (ARRAY); \
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
#include "libc/bits/xchg.h"
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* Fisher-Yates shuffle.
|
||||
*
|
||||
|
@ -12,7 +11,6 @@
|
|||
* @param n is the number of items in A
|
||||
* @see ARRAYLEN()
|
||||
*/
|
||||
#endif
|
||||
#define shuffle(R, A, n) \
|
||||
do { \
|
||||
autotype(A) Array = (A); \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue