mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-08 20:28:30 +00:00
Make numerous improvements
- Python static hello world now 1.8mb - Python static fully loaded now 10mb - Python HTTPS client now uses MbedTLS - Python REPL now completes import stmts - Increase stack size for Python for now - Begin synthesizing posixpath and ntpath - Restore Python \N{UNICODE NAME} support - Restore Python NFKD symbol normalization - Add optimized code path for Intel SHA-NI - Get more Python unit tests passing faster - Get Python help() pagination working on NT - Python hashlib now supports MbedTLS PBKDF2 - Make memcpy/memmove/memcmp/bcmp/etc. faster - Add Mersenne Twister and Vigna to LIBC_RAND - Provide privileged __printf() for error code - Fix zipos opendir() so that it reports ENOTDIR - Add basic chmod() implementation for Windows NT - Add Cosmo's best functions to Python cosmo module - Pin function trace indent depth to that of caller - Show memory diagram on invalid access in MODE=dbg - Differentiate stack overflow on crash in MODE=dbg - Add stb_truetype and tools for analyzing font files - Upgrade to UNICODE 13 and reduce its binary footprint - COMPILE.COM now logs resource usage of build commands - Start implementing basic poll() support on bare metal - Set getauxval(AT_EXECFN) to GetModuleFileName() on NT - Add descriptions to strerror() in non-TINY build modes - Add COUNTBRANCH() macro to help with micro-optimizations - Make error / backtrace / asan / memory code more unbreakable - Add fast perfect C implementation of μ-Law and a-Law audio codecs - Make strtol() functions consistent with other libc implementations - Improve Linenoise implementation (see also github.com/jart/bestline) - COMPILE.COM now suppresses stdout/stderr of successful build commands
This commit is contained in:
parent
fa7b4f5bd1
commit
39bf41f4eb
806 changed files with 77494 additions and 63859 deletions
|
@ -7,8 +7,10 @@
|
|||
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
||||
╚─────────────────────────────────────────────────────────────────*/
|
||||
#endif
|
||||
#include "libc/log/backtrace.internal.h"
|
||||
#include "libc/log/log.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/runtime/symbols.internal.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
|
|
@ -51,6 +51,7 @@ EXAMPLES_DIRECTDEPS = \
|
|||
LIBC_NT_NTDLL \
|
||||
LIBC_NT_USER32 \
|
||||
LIBC_NT_WS2_32 \
|
||||
LIBC_NT_ADVAPI32 \
|
||||
LIBC_OHMYPLUS \
|
||||
LIBC_RAND \
|
||||
LIBC_RUNTIME \
|
||||
|
@ -131,6 +132,8 @@ o/$(MODE)/examples/nesemu1.com.dbg: \
|
|||
$(APE)
|
||||
@$(APELINK)
|
||||
|
||||
o/$(MODE)/examples/nesemu1.o: QUOTA += -M512m
|
||||
|
||||
o/$(MODE)/examples/loader.elf: \
|
||||
o/$(MODE)/examples/loader.o \
|
||||
examples/loader.lds
|
||||
|
|
|
@ -14,7 +14,9 @@
|
|||
#include "libc/log/check.h"
|
||||
#include "libc/log/log.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/nexgen32e/x86feature.h"
|
||||
#include "libc/nt/runtime.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/rand/xorshift.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
|
@ -94,14 +96,6 @@ uint64_t knuth(void) {
|
|||
return a | b << 32;
|
||||
}
|
||||
|
||||
uint64_t vigna(void) {
|
||||
static uint64_t x;
|
||||
uint64_t z = (x += 0x9e3779b97f4a7c15);
|
||||
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
|
||||
z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
|
||||
return z ^ (z >> 31);
|
||||
}
|
||||
|
||||
uint64_t rngset64(void) {
|
||||
static unsigned i;
|
||||
static uint64_t s;
|
||||
|
@ -130,66 +124,97 @@ uint64_t libc(void) {
|
|||
return x;
|
||||
}
|
||||
|
||||
uint64_t kernel(void) {
|
||||
uint64_t GetRandom(void) {
|
||||
uint64_t x;
|
||||
CHECK_EQ(8, getrandom(&x, 8, GRND_NORDRND));
|
||||
CHECK_EQ(8, getrandom(&x, 8, 0));
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t hardware(void) {
|
||||
uint64_t x;
|
||||
CHECK_EQ(8, getrandom(&x, 8, GRND_NOSYSTEM));
|
||||
uint32_t python(void) {
|
||||
#define K 0 // 624 /* wut */
|
||||
#define N 624
|
||||
#define M 397
|
||||
static int index;
|
||||
static char once;
|
||||
static uint32_t mt[N];
|
||||
static const uint32_t mag01[2] = {0, 0x9908b0dfu};
|
||||
uint32_t y;
|
||||
int kk;
|
||||
if (!once) {
|
||||
char *sp;
|
||||
ssize_t rc;
|
||||
uint32_t i, j, k, s[K];
|
||||
mt[0] = 19650218;
|
||||
for (i = 1; i < N; i++) {
|
||||
mt[i] = (1812433253u * (mt[i - 1] ^ (mt[i - 1] >> 30)) + i);
|
||||
}
|
||||
if (K) {
|
||||
for (sp = (char *)s, i = 0; i < sizeof(s); i += rc) {
|
||||
if ((rc = getrandom(sp + i, sizeof(s) - i, 0)) == -1) {
|
||||
if (errno != EINTR) abort();
|
||||
}
|
||||
}
|
||||
for (i = 1, j = 0, k = MAX(N, K); k; k--) {
|
||||
mt[i] =
|
||||
(mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >> 30)) * 1664525u)) + s[j] + j;
|
||||
if (++i >= N) mt[0] = mt[N - 1], i = 1;
|
||||
if (++j >= K) j = 0;
|
||||
}
|
||||
for (k = N - 1; k; k--) {
|
||||
mt[i] = (mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >> 30)) * 1566083941u)) - i;
|
||||
if (++i >= N) mt[0] = mt[N - 1], i = 1;
|
||||
}
|
||||
mt[0] = 0x80000000;
|
||||
explicit_bzero(s, sizeof(s));
|
||||
}
|
||||
once = 1;
|
||||
}
|
||||
if (index >= N) {
|
||||
for (kk = 0; kk < N - M; kk++) {
|
||||
y = (mt[kk] & 0x80000000u) | (mt[kk + 1] & 0x7fffffff);
|
||||
mt[kk] = mt[kk + M] ^ (y >> 1) ^ mag01[y & 1];
|
||||
}
|
||||
for (; kk < N - 1; kk++) {
|
||||
y = (mt[kk] & 0x80000000u) | (mt[kk + 1] & 0x7fffffff);
|
||||
mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 1];
|
||||
}
|
||||
y = (mt[N - 1] & 0x80000000u) | (mt[0] & 0x7fffffffu);
|
||||
mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ mag01[y & 1];
|
||||
index = 0;
|
||||
}
|
||||
y = mt[index++];
|
||||
y ^= y >> 11;
|
||||
y ^= (y << 7) & 0x9d2c5680u;
|
||||
y ^= (y << 15) & 0xefc60000u;
|
||||
y ^= y >> 18;
|
||||
return y;
|
||||
#undef M
|
||||
#undef N
|
||||
#undef K
|
||||
}
|
||||
|
||||
uint64_t pythonx2(void) {
|
||||
uint64_t x = python();
|
||||
x <<= 32;
|
||||
x |= python();
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t rdrnd(void) {
|
||||
char cf;
|
||||
int i = 0;
|
||||
uint64_t x;
|
||||
CHECK(X86_HAVE(RDRND));
|
||||
for (;;) {
|
||||
asm volatile(CFLAG_ASM("rdrand\t%1")
|
||||
: CFLAG_CONSTRAINT(cf), "=r"(x)
|
||||
: /* no inputs */
|
||||
: "cc");
|
||||
if (cf) return x;
|
||||
if (++i < 10) continue;
|
||||
asm volatile("pause");
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t rdseed(void) {
|
||||
char cf;
|
||||
int i = 0;
|
||||
uint64_t x;
|
||||
CHECK(X86_HAVE(RDSEED));
|
||||
for (;;) {
|
||||
asm volatile(CFLAG_ASM("rdseed\t%1")
|
||||
: CFLAG_CONSTRAINT(cf), "=r"(x)
|
||||
: /* no inputs */
|
||||
: "cc");
|
||||
if (cf) return x;
|
||||
if (++i < 10) continue;
|
||||
asm volatile("pause");
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
const struct Function {
|
||||
const char *s;
|
||||
uint64_t (*f)(void);
|
||||
} kFunctions[] = {
|
||||
{"ape", ape}, //
|
||||
{"hardware", hardware}, //
|
||||
{"getrandom", GetRandom}, //
|
||||
{"inc", inc}, //
|
||||
{"kernel", kernel}, //
|
||||
{"knuth", knuth}, //
|
||||
{"libc", libc}, //
|
||||
{"moby", moby}, //
|
||||
{"mt19937", _mt19937}, //
|
||||
{"python", pythonx2}, //
|
||||
{"rand64", rand64}, //
|
||||
{"rdrand", rdrnd}, //
|
||||
{"rdrnd", rdrnd}, //
|
||||
{"rdrand", rdrand}, //
|
||||
{"rdrnd", rdrand}, //
|
||||
{"rdseed", rdseed}, //
|
||||
{"rngset64", rngset64}, //
|
||||
{"unixv6", unixv6}, //
|
||||
|
@ -224,7 +249,7 @@ int main(int argc, char *argv[]) {
|
|||
break;
|
||||
case 'c':
|
||||
case 'n':
|
||||
count = strtoul(optarg, 0, 0);
|
||||
count = sizetol(optarg, 1024);
|
||||
break;
|
||||
case 'h':
|
||||
PrintUsage(stdout, EXIT_SUCCESS);
|
||||
|
|
|
@ -7,8 +7,10 @@
|
|||
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
||||
╚─────────────────────────────────────────────────────────────────*/
|
||||
#endif
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/log/log.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/nt/process.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
|
@ -70,6 +72,8 @@ int main(int argc, char *argv[], char **envp) {
|
|||
unsigned long *auxp;
|
||||
char fmt[64], **env;
|
||||
struct AuxiliaryValue *auxinfo;
|
||||
uint32_t varlen;
|
||||
char16_t var[PATH_MAX];
|
||||
printf("\nArguments:\n");
|
||||
for (i = 0; i < __argc; ++i) {
|
||||
printf(" ☼ %s\n", argv[i]);
|
||||
|
|
|
@ -10,11 +10,13 @@
|
|||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/struct/stat.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/fmt/conv.h"
|
||||
#include "libc/fmt/fmt.h"
|
||||
#include "libc/log/check.h"
|
||||
#include "libc/log/log.h"
|
||||
#include "libc/runtime/gc.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/sysv/consts/s.h"
|
||||
#include "libc/x/x.h"
|
||||
|
||||
/**
|
||||
|
@ -23,16 +25,45 @@
|
|||
* This demonstrates the more powerful aspects of the printf() DSL.
|
||||
*/
|
||||
|
||||
bool numeric;
|
||||
|
||||
const char *DescribeFileType(unsigned mode) {
|
||||
switch (mode & S_IFMT) {
|
||||
case S_IFIFO:
|
||||
return "S_IFIFO"; /* pipe */
|
||||
case S_IFCHR:
|
||||
return "S_IFCHR"; /* character device */
|
||||
case S_IFDIR:
|
||||
return "S_IFDIR"; /* directory */
|
||||
case S_IFBLK:
|
||||
return "S_IFBLK"; /* block device */
|
||||
case S_IFREG:
|
||||
return "S_IFREG"; /* regular file */
|
||||
case S_IFLNK:
|
||||
return "S_IFLNK"; /* symbolic link */
|
||||
case S_IFSOCK:
|
||||
return "S_IFSOCK"; /* socket */
|
||||
default:
|
||||
return "wut";
|
||||
}
|
||||
}
|
||||
|
||||
void PrintFileMetadata(const char *pathname, struct stat *st) {
|
||||
int fd;
|
||||
printf("\n%s:", pathname);
|
||||
CHECK_NE(-1, stat(pathname, st));
|
||||
if (numeric) {
|
||||
fd = atoi(pathname);
|
||||
CHECK_NE(-1, fstat(fd, st), "fd=%d", fd);
|
||||
} else {
|
||||
CHECK_NE(-1, stat(pathname, st), "pathname=%s", pathname);
|
||||
}
|
||||
printf("\n"
|
||||
"%-32s%,ld\n"
|
||||
"%-32s%,ld\n"
|
||||
"%-32s%#lx\n"
|
||||
"%-32s%#lx\n"
|
||||
"%-32s%ld\n"
|
||||
"%-32s%#o\n"
|
||||
"%-32s%#o (%s)\n"
|
||||
"%-32s%d\n"
|
||||
"%-32s%d\n"
|
||||
"%-32s%d\n"
|
||||
|
@ -46,10 +77,11 @@ void PrintFileMetadata(const char *pathname, struct stat *st) {
|
|||
"bytes in file", st->st_size, "physical bytes", st->st_blocks * 512,
|
||||
"device id w/ file", st->st_dev, "inode", st->st_ino,
|
||||
"hard link count", st->st_nlink, "mode / permissions", st->st_mode,
|
||||
"owner id", st->st_uid, "group id", st->st_gid, "flags", st->st_flags,
|
||||
"gen", st->st_gen, "device id (if special)", st->st_rdev, "block size",
|
||||
st->st_blksize, "access time", _gc(xiso8601(&st->st_atim)),
|
||||
"modified time", _gc(xiso8601(&st->st_mtim)), "c[omplicated]time",
|
||||
DescribeFileType(st->st_mode), "owner id", st->st_uid, "group id",
|
||||
st->st_gid, "flags", st->st_flags, "gen", st->st_gen,
|
||||
"device id (if special)", st->st_rdev, "block size", st->st_blksize,
|
||||
"access time", _gc(xiso8601(&st->st_atim)), "modified time",
|
||||
_gc(xiso8601(&st->st_mtim)), "c[omplicated]time",
|
||||
_gc(xiso8601(&st->st_ctim)), "birthtime",
|
||||
_gc(xiso8601(&st->st_birthtim)));
|
||||
}
|
||||
|
@ -58,7 +90,11 @@ int main(int argc, char *argv[]) {
|
|||
size_t i;
|
||||
struct stat st;
|
||||
for (i = 1; i < argc; ++i) {
|
||||
PrintFileMetadata(argv[i], &st);
|
||||
if (!strcmp(argv[i], "-n")) {
|
||||
numeric = true;
|
||||
} else {
|
||||
PrintFileMetadata(argv[i], &st);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -5745,7 +5745,7 @@ retry:
|
|||
linenoiseSetFreeHintsCallback(free);
|
||||
linenoiseSetHintsCallback(ShellHint);
|
||||
linenoiseSetCompletionCallback(ShellCompletion);
|
||||
if ((p = ezlinenoise("$ ", "unbourne"))) {
|
||||
if ((p = linenoiseWithHistory("$ ", "unbourne"))) {
|
||||
nr = min(strlen(p), IBUFSIZ - 2);
|
||||
memcpy(buf, p, nr);
|
||||
buf[nr++] = '\n';
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue