mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-06 18:00:28 +00:00
Add fixes performance and static web server
This commit is contained in:
parent
b6793d42d5
commit
c45e46f871
108 changed files with 2927 additions and 819 deletions
|
@ -15,8 +15,8 @@
|
|||
* of the UNIX operation system signalled the end of modernity. Windows
|
||||
* timestamps are living proof.
|
||||
*/
|
||||
#define MODERNITYSECONDS 11644473600
|
||||
#define HECTONANOSECONDS 10000000
|
||||
#define MODERNITYSECONDS 11644473600ull
|
||||
#define HECTONANOSECONDS 10000000ull
|
||||
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
@ -46,12 +46,13 @@ long strtol(const char *, char **, int)
|
|||
│ cosmopolitan § conversion » time ─╬─│┼
|
||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||
|
||||
struct timespec filetimetotimespec(struct NtFileTime);
|
||||
struct NtFileTime timespectofiletime(struct timespec);
|
||||
struct NtFileTime timetofiletime(int64_t) nothrow pureconst;
|
||||
int64_t DosDateTimeToUnix(unsigned, unsigned);
|
||||
struct timespec FileTimeToTimeSpec(struct NtFileTime);
|
||||
struct NtFileTime TimeSpecToFileTime(struct timespec);
|
||||
struct NtFileTime TimeToFileTime(int64_t) nothrow pureconst;
|
||||
int64_t filetimetotime(struct NtFileTime) nothrow pureconst;
|
||||
void filetimetotimeval(struct timeval *, struct NtFileTime) nothrow;
|
||||
struct NtFileTime timevaltofiletime(const struct timeval *) nosideeffect;
|
||||
void FileTimeToTimeVal(struct timeval *, struct NtFileTime) nothrow;
|
||||
struct NtFileTime TimeValToFileTime(const struct timeval *) nosideeffect;
|
||||
long convertmicros(const struct timeval *, long) paramsnonnull() nosideeffect;
|
||||
|
||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||
|
|
|
@ -52,6 +52,7 @@ $(LIBC_CONV_A).pkg: \
|
|||
$(LIBC_CONV_A_OBJS) \
|
||||
$(foreach x,$(LIBC_CONV_A_DIRECTDEPS),$($(x)_A).pkg)
|
||||
|
||||
o/$(MODE)/libc/conv/dosdatetimetounix.o \
|
||||
o/$(MODE)/libc/conv/itoa64radix10.greg.o \
|
||||
o/$(MODE)/libc/conv/timetofiletime.o \
|
||||
o/$(MODE)/libc/conv/filetimetotime.o \
|
||||
|
|
43
libc/conv/dosdatetimetounix.c
Normal file
43
libc/conv/dosdatetimetounix.c
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ This program is free software; you can redistribute it and/or modify │
|
||||
│ it under the terms of the GNU General Public License as published by │
|
||||
│ the Free Software Foundation; version 2 of the License. │
|
||||
│ │
|
||||
│ This program is distributed in the hope that it will be useful, but │
|
||||
│ WITHOUT ANY WARRANTY; without even the implied warranty of │
|
||||
│ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU │
|
||||
│ General Public License for more details. │
|
||||
│ │
|
||||
│ You should have received a copy of the GNU General Public License │
|
||||
│ along with this program; if not, write to the Free Software │
|
||||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/conv/conv.h"
|
||||
#include "libc/macros.h"
|
||||
#include "libc/time/time.h"
|
||||
|
||||
/**
|
||||
* Converts MS-DOS timestamp to UNIX.
|
||||
*
|
||||
* @note type signature supports dates greater than 2100
|
||||
* @see PKZIP, FAT
|
||||
*/
|
||||
int64_t DosDateTimeToUnix(unsigned date, unsigned time) {
|
||||
unsigned weekday, year, month, day, hour, minute, second, yday, leap;
|
||||
year = ((date & 0xfffffe00) >> 9) + 1980 - 1900;
|
||||
month = MAX(1, MIN(12, (date & 0x01e0) >> 5));
|
||||
day = (date & 0x001f) ? (date & 0x001f) - 1 : 0;
|
||||
hour = (time & 0x0000f800) >> 11;
|
||||
minute = (time & 0x000007e0) >> 5;
|
||||
second = (time & 0x0000001f) << 1;
|
||||
leap = year % 4 == 0 && (year % 100 || year % 400 == 0);
|
||||
yday = day + kMonthYearDay[leap][month - 1];
|
||||
return second + minute * 60 + hour * 3600 + yday * 86400 +
|
||||
(year - 70) * 31536000ull + ((year - 69) / 4) * 86400ull -
|
||||
((year - 1) / 100) * 86400ull + ((year + 299) / 400) * 86400ull;
|
||||
}
|
|
@ -24,11 +24,11 @@
|
|||
/**
|
||||
* Converts Windows COBOL timestamp to UNIX epoch in nanoseconds.
|
||||
*/
|
||||
struct timespec filetimetotimespec(struct NtFileTime ft) {
|
||||
struct timespec FileTimeToTimeSpec(struct NtFileTime ft) {
|
||||
uint64_t x;
|
||||
x = ft.dwHighDateTime;
|
||||
x <<= 32;
|
||||
x |= ft.dwLowDateTime;
|
||||
x -= MODERNITYSECONDS;
|
||||
return (struct timespec){x / HECTONANOSECONDS, x % HECTONANOSECONDS * 100};
|
||||
return (struct timespec){x / HECTONANOSECONDS - MODERNITYSECONDS,
|
||||
x % HECTONANOSECONDS * 100};
|
||||
}
|
||||
|
|
|
@ -22,9 +22,11 @@
|
|||
#include "libc/conv/conv.h"
|
||||
#include "libc/nt/struct/filetime.h"
|
||||
|
||||
void filetimetotimeval(struct timeval *tv, struct NtFileTime ft) {
|
||||
uint64_t t = (uint64_t)ft.dwHighDateTime << 32 | ft.dwLowDateTime;
|
||||
uint64_t x = t - MODERNITYSECONDS * HECTONANOSECONDS;
|
||||
tv->tv_sec = x / HECTONANOSECONDS;
|
||||
void FileTimeToTimeVal(struct timeval *tv, struct NtFileTime ft) {
|
||||
uint64_t x;
|
||||
x = ft.dwHighDateTime;
|
||||
x <<= 32;
|
||||
x |= ft.dwLowDateTime;
|
||||
tv->tv_sec = x / HECTONANOSECONDS - MODERNITYSECONDS;
|
||||
tv->tv_usec = x % HECTONANOSECONDS / 10;
|
||||
}
|
||||
|
|
25
libc/conv/kmonthyearday.c
Normal file
25
libc/conv/kmonthyearday.c
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ This program is free software; you can redistribute it and/or modify │
|
||||
│ it under the terms of the GNU General Public License as published by │
|
||||
│ the Free Software Foundation; version 2 of the License. │
|
||||
│ │
|
||||
│ This program is distributed in the hope that it will be useful, but │
|
||||
│ WITHOUT ANY WARRANTY; without even the implied warranty of │
|
||||
│ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU │
|
||||
│ General Public License for more details. │
|
||||
│ │
|
||||
│ You should have received a copy of the GNU General Public License │
|
||||
│ along with this program; if not, write to the Free Software │
|
||||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/time/time.h"
|
||||
|
||||
const unsigned short kMonthYearDay[2][12] = {
|
||||
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},
|
||||
{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335},
|
||||
};
|
|
@ -25,7 +25,7 @@
|
|||
/**
|
||||
* Converts UNIX nanosecond timestamp to Windows COBOL timestamp.
|
||||
*/
|
||||
struct NtFileTime timespectofiletime(struct timespec ts) {
|
||||
struct NtFileTime TimeSpecToFileTime(struct timespec ts) {
|
||||
uint64_t x;
|
||||
x = MODERNITYSECONDS;
|
||||
x += ts.tv_sec * HECTONANOSECONDS;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include "libc/conv/conv.h"
|
||||
#include "libc/nt/struct/filetime.h"
|
||||
|
||||
struct NtFileTime timetofiletime(int64_t t) {
|
||||
struct NtFileTime TimeToFileTime(int64_t t) {
|
||||
uint64_t t2 = (t + MODERNITYSECONDS) * HECTONANOSECONDS;
|
||||
return (struct NtFileTime){(uint32_t)t2, (uint32_t)(t2 >> 32)};
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include "libc/nt/struct/filetime.h"
|
||||
#include "libc/time/time.h"
|
||||
|
||||
struct NtFileTime timevaltofiletime(const struct timeval *tv) {
|
||||
struct NtFileTime TimeValToFileTime(const struct timeval *tv) {
|
||||
uint64_t t2 = tv->tv_sec * HECTONANOSECONDS + tv->tv_usec * 10 +
|
||||
MODERNITYSECONDS * HECTONANOSECONDS;
|
||||
return (struct NtFileTime){(uint32_t)t2, (uint32_t)(t2 >> 32)};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue