From e557058ac859691fb21a91d5e9281e9fc9e6b165 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Mon, 10 Oct 2022 17:52:41 -0700 Subject: [PATCH] Improve cosmo's conformance to libc-test This change addresses various open source compatibility issues, so that we pass 313/411 of the tests in https://github.com/jart/libc-test where earlier today we were passing about 30/411 of them, due to header toil. Please note that Glibc only passes 341/411 so 313 today is pretty good! - Make the conformance of libc/isystem/ headers nearly perfect - Import more of the remaining math library routines from Musl - Fix inconsistencies with type signatures of calls like umask - Write tests for getpriority/setpriority which work great now - conform to `struct sockaddr *` on remaining socket functions - Import a bunch of uninteresting stdlib functions e.g. rand48 - Introduce readdir_r, scandir, pthread_kill, sigsetjmp, etc.. Follow the instructions in our `tool/scripts/cosmocc` toolchain to run these tests yourself. You use `make CC=cosmocc` on the test repository --- Makefile | 2 +- build/bootstrap/make.com | Bin 530870 -> 497450 bytes examples/greenbean.c | 2 +- libc/calls/calls.h | 21 +- libc/calls/cfsetispeed.c | 2 +- libc/calls/cfsetospeed.c | 2 +- libc/calls/faccessat.c | 2 +- libc/calls/getpriority-nt.c | 77 +++- libc/calls/getpriority.c | 50 ++- libc/calls/kntprioritycombos.c | 56 --- libc/calls/kntprioritycombos.internal.h | 18 - libc/calls/lseek.c | 2 +- libc/calls/nice.c | 1 + libc/calls/posix_fadvise.c | 2 +- libc/calls/sched_setaffinity.c | 3 +- libc/calls/setfsgid.c | 4 +- libc/calls/setfsuid.c | 4 +- libc/calls/setgid.c | 4 +- libc/calls/setpriority-nt.c | 77 ++-- libc/calls/setpriority.c | 30 +- libc/calls/setuid.c | 4 +- libc/calls/sigaltstack.c | 7 +- libc/calls/struct/dirent.h | 5 + libc/calls/syscall-nt.internal.h | 5 +- libc/calls/termios.h | 4 +- libc/calls/tkill.c | 4 + libc/calls/truncate.c | 2 +- libc/calls/umask.c | 4 +- libc/calls/weirdtypes.h | 4 +- libc/dns/dns.h | 2 +- libc/dns/freeaddrinfo.c | 3 +- libc/dns/resolvedns.c | 3 +- libc/dns/resolvednsreverse.c | 3 +- libc/fmt/atoi.c | 1 + libc/fmt/strtoul.c | 10 +- libc/imag.h | 6 + libc/intrin/describeflags.internal.h | 2 + .../describewhichprio.c} | 18 +- libc/intrin/pthread_setspecific.c | 2 +- libc/isystem/arpa/inet.h | 4 + libc/isystem/complex.h | 2 +- libc/isystem/dirent.h | 1 + libc/isystem/fcntl.h | 4 + libc/isystem/ftw.h | 6 + libc/isystem/glob.h | 4 + libc/isystem/inttypes.h | 2 + libc/isystem/langinfo.h | 1 + libc/isystem/libgen.h | 4 + libc/isystem/limits.h | 2 +- libc/isystem/netinet/in.h | 2 + libc/isystem/netinet/tcp.h | 6 + libc/isystem/netinet/udp.h | 4 + libc/isystem/poll.h | 1 + libc/isystem/pthread.h | 2 + libc/isystem/sched.h | 1 + libc/isystem/signal.h | 1 + libc/isystem/spawn.h | 5 + libc/isystem/stdint.h | 1 + libc/isystem/stdio.h | 4 +- libc/isystem/stdlib.h | 12 +- libc/isystem/strings.h | 3 + libc/isystem/sys/socket.h | 1 + libc/isystem/sys/statvfs.h | 1 + libc/isystem/sys/time.h | 4 +- libc/isystem/sys/times.h | 1 + libc/isystem/sys/types.h | 3 +- libc/isystem/sys/uio.h | 1 + libc/isystem/sys/un.h | 2 + libc/isystem/sys/wait.h | 2 + libc/isystem/termios.h | 1 + libc/isystem/tgmath.h | 21 +- libc/isystem/time.h | 1 + libc/isystem/unistd.h | 4 + libc/isystem/wchar.h | 2 + libc/isystem/wctype.h | 2 + libc/limits.h | 53 ++- libc/literal.h | 8 + libc/log/oncrash.c | 1 + libc/math.h | 20 +- libc/nexgen32e/longjmp.S | 2 +- libc/nexgen32e/setjmp.S | 2 +- .../rintf.S => runtime/__sigsetjmp_tail.c} | 47 +- libc/runtime/daemon.c | 56 +++ libc/runtime/enable_tls.c | 6 + libc/runtime/fenv.S | 119 +++++ libc/runtime/fenv.h | 10 +- libc/runtime/runtime.h | 4 + libc/runtime/sigsetjmp.S | 49 +++ libc/runtime/sysconf.h | 148 ++++++- libc/sock/accept4.c | 6 +- libc/sock/bind.c | 5 +- libc/sock/connect.c | 5 +- libc/sock/getpeername.c | 5 +- libc/sock/getsockname.c | 5 +- libc/sock/recvfrom.c | 9 +- libc/sock/sendto.c | 5 +- libc/sock/sock.h | 7 - libc/sock/struct/msghdr.h | 7 +- libc/sock/struct/sockaddr.h | 8 + libc/{tinymath/expm1.S => stdio/alphasort.c} | 19 +- libc/stdio/dirstream.c | 37 ++ libc/stdio/fgets_unlocked.c | 4 +- libc/stdio/rand.h | 2 +- libc/stdio/rewind.c | 5 +- libc/stdio/scandir.c | 78 ++++ libc/stdio/spawn.h | 2 +- libc/stdio/srand.c | 4 +- .../{tinymath/scalb.S => stdio/versionsort.c} | 21 +- libc/str/locale.h | 2 + libc/str/str.h | 1 + libc/str/strcasecmp_l.c | 24 + libc/str/strlcat.c | 63 ++- libc/str/strncasecmp_l.c | 24 + libc/str/toascii.c | 23 + libc/sysv/consts.sh | 1 - libc/sysv/consts/NZERO.s | 2 - libc/sysv/consts/_posix.h | 1 + libc/sysv/consts/inet6.h | 6 + libc/sysv/consts/prio.h | 2 - libc/thread/posixthread.internal.h | 19 +- libc/thread/pthread_cancel.c | 6 +- libc/thread/pthread_equal.c | 5 +- libc/thread/pthread_exit.c | 5 +- libc/thread/pthread_kill.c | 43 ++ libc/thread/pthread_self.c | 8 +- .../pthread_setcancelstate.c} | 71 ++- .../pthread_setcanceltype.c} | 73 ++-- ...{pthread_main.c => pthread_setschedprio.c} | 18 +- libc/thread/thread.h | 14 +- libc/tinymath/__cexp.c | 1 - libc/tinymath/atan.c | 2 +- libc/tinymath/atan2.c | 157 ++++++- libc/tinymath/atanf.c | 2 +- libc/tinymath/expm1.c | 238 ++++++++++ libc/tinymath/floor.c | 65 +++ libc/tinymath/floorf.c | 61 +++ libc/tinymath/fmod.c | 2 +- libc/tinymath/hypot.c | 116 ++++- libc/tinymath/hypotf.c | 88 ++-- libc/tinymath/hypotl.c | 121 ++++-- libc/tinymath/j0.c | 409 ++++++++++++++++++ libc/tinymath/j0f.c | 347 +++++++++++++++ libc/tinymath/j1.c | 396 +++++++++++++++++ libc/tinymath/j1f.c | 343 +++++++++++++++ libc/tinymath/jn.c | 314 ++++++++++++++ libc/tinymath/jnf.c | 235 ++++++++++ libc/tinymath/kernel.internal.h | 2 - libc/tinymath/lgamma.c | 2 +- libc/tinymath/lgammaf.c | 2 +- libc/tinymath/powf.c | 2 +- libc/tinymath/rint.S | 67 --- libc/tinymath/rint.c | 59 +++ libc/tinymath/rintf.c | 61 +++ libc/tinymath/round.S | 68 --- libc/tinymath/round.c | 69 +++ libc/tinymath/roundf.S | 66 --- libc/tinymath/roundf.c | 70 +++ libc/tinymath/scalb.c | 70 +++ libc/tinymath/signgam.c | 2 +- libc/tinymath/tanf.S | 28 -- libc/tinymath/tanf.c | 99 +++++ net/turfwar/turfwar.c | 25 +- test/libc/calls/getpriority_test.c | 88 ++++ test/libc/calls/pledge_test.c | 11 +- test/libc/calls/poll_test.c | 2 +- test/libc/fmt/atoi_test.c | 16 +- test/libc/log/backtrace.c | 3 +- test/libc/mem/malloc_test.c | 45 +- test/libc/runtime/sigsetjmp_test.c | 56 +++ test/libc/sock/nointernet_test.c | 9 +- test/libc/sock/sendfile_test.c | 12 +- test/libc/sock/setsockopt_test.c | 2 +- test/libc/sock/socket_test.c | 12 +- test/libc/sock/unix_test.c | 2 +- test/libc/stdio/fgets_test.c | 15 +- test/tool/net/redbean_test.c | 2 +- third_party/dlmalloc/locks.inc | 2 +- third_party/getopt/getopt.h | 20 +- third_party/getopt/getsubopt.c | 91 ++++ third_party/lua/lunix.c | 28 +- third_party/make/job.c | 4 +- third_party/musl/crypt.h | 2 + third_party/musl/lockf.c | 68 +++ third_party/musl/rand48.c | 101 +++++ third_party/musl/rand48.h | 18 + tool/build/lib/syscall.c | 7 +- tool/build/runitd.c | 8 +- tool/net/echo.c | 17 +- tool/net/redbean.c | 9 +- 189 files changed, 5091 insertions(+), 884 deletions(-) delete mode 100644 libc/calls/kntprioritycombos.c mode change 100644 => 100755 libc/calls/kntprioritycombos.internal.h create mode 100644 libc/imag.h rename libc/{calls/getsetpriority-nt.c => intrin/describewhichprio.c} (80%) create mode 100644 libc/isystem/ftw.h create mode 100644 libc/isystem/glob.h create mode 100644 libc/isystem/libgen.h create mode 100644 libc/isystem/netinet/tcp.h create mode 100644 libc/isystem/netinet/udp.h create mode 100644 libc/isystem/spawn.h rename libc/{tinymath/rintf.S => runtime/__sigsetjmp_tail.c} (69%) create mode 100644 libc/runtime/daemon.c create mode 100644 libc/runtime/fenv.S create mode 100644 libc/runtime/sigsetjmp.S rename libc/{tinymath/expm1.S => stdio/alphasort.c} (79%) create mode 100644 libc/stdio/scandir.c rename libc/{tinymath/scalb.S => stdio/versionsort.c} (77%) create mode 100644 libc/str/strcasecmp_l.c create mode 100644 libc/str/strncasecmp_l.c create mode 100644 libc/str/toascii.c delete mode 100644 libc/sysv/consts/NZERO.s create mode 100644 libc/sysv/consts/inet6.h create mode 100644 libc/thread/pthread_kill.c rename libc/{tinymath/floorf.S => thread/pthread_setcancelstate.c} (61%) rename libc/{tinymath/floor.S => thread/pthread_setcanceltype.c} (61%) rename libc/thread/{pthread_main.c => pthread_setschedprio.c} (81%) create mode 100644 libc/tinymath/expm1.c create mode 100644 libc/tinymath/floor.c create mode 100644 libc/tinymath/floorf.c create mode 100644 libc/tinymath/j0.c create mode 100644 libc/tinymath/j0f.c create mode 100644 libc/tinymath/j1.c create mode 100644 libc/tinymath/j1f.c create mode 100644 libc/tinymath/jn.c create mode 100644 libc/tinymath/jnf.c delete mode 100644 libc/tinymath/rint.S create mode 100644 libc/tinymath/rint.c create mode 100644 libc/tinymath/rintf.c delete mode 100644 libc/tinymath/round.S create mode 100644 libc/tinymath/round.c delete mode 100644 libc/tinymath/roundf.S create mode 100644 libc/tinymath/roundf.c create mode 100644 libc/tinymath/scalb.c delete mode 100644 libc/tinymath/tanf.S create mode 100644 libc/tinymath/tanf.c create mode 100644 test/libc/calls/getpriority_test.c create mode 100644 test/libc/runtime/sigsetjmp_test.c create mode 100644 third_party/getopt/getsubopt.c create mode 100644 third_party/musl/lockf.c create mode 100644 third_party/musl/rand48.c create mode 100644 third_party/musl/rand48.h diff --git a/Makefile b/Makefile index f73541285..9f277030c 100644 --- a/Makefile +++ b/Makefile @@ -309,7 +309,7 @@ COSMOPOLITAN_OBJECTS = \ THIRD_PARTY_GDTOA \ THIRD_PARTY_REGEX \ LIBC_THREAD \ - THIRD_PARTY_NSYNC_MALLOC \ + THIRD_PARTY_NSYNC_MEM \ LIBC_MEM \ THIRD_PARTY_DLMALLOC \ LIBC_RUNTIME \ diff --git a/build/bootstrap/make.com b/build/bootstrap/make.com index ce4a3b23eed45734bba82ae70bcc6da02a240ffb..a9ded9870bd25edda743d842d878af3d8b2826b9 100755 GIT binary patch delta 289596 zcma%k349dA68CJf6B3dz;fRDIkU)TNNg^PG5ZHm;Fbf+Aaw7;nFd|+kyMPBw@^)7l z$Cc=acs}t)@xTK}g5)5O1q2QFR1S}T3bQPif+3vy{i|nl@ZS5r-xq)GOm|mzS65e8 zS5;RJo4-i;@RM%E>4|+(Mvm-b>C>8P@i+XroK7bFx#`ne-y5ml!%cKuKH2bGiD*iG z?(&$}6#3Wcbj(AuJ}qq=LArVi$*AGWq=riharhYe3L{^mdAdeE7Zd5e+$ zA}VsfDJC=Hmf0CYhRn`g^A_#8`Qwg5GHz*EY4|WBrOl1(tkv;VZ3~3% zR*oCTZS2i{qb%B|Q91qY;WFaKD=AGQ)|bTTD=zDc;&hJF<2b#V)8}$}Ka;L$QLU!l zy}Gx4`BFjVk!Pzb68M6W6hIY}CZTpgS-zMzxxjDhU_xqN;v+)~vT9u!-rdfm0@W5> z5NnHbwsBudd?czKAkIj)KdHcb#2Hl-YUujN=FG~{XzuFy4b>G-_tsz5K4|q&yQmWG z(Ps}nTbUU`A(w$dEjilKJyfuvfaem>;itzg6qImvtvI2_!B*X?FAJt_J(IN+(cK5F z>n)^I7Q{z#Tw#H`?uyW(^5n7fbS|@UV+LBReYW!1x@YyTI4+voI9%WkYCEG-M~#c& zxP>yR92$@&m^$=&FUrD6C5vM$j549R;)snOci}K^*C$T;eI$T6AYs{m6UU`=P%a0Vjgu=Qg ztxH_DHiQ*nPCajo(#FNT(ynnJ1WkX)?vi+G>jVo+QN_XWquMnNvvF8}a>tMA(3EWe zQ`>Pspo?}cKDBkqxNt77b!js&VcFr2;x_qyD{Opf88>y-9%-{Qa!i^9b$V$D!k4np z-NF@5m6Siksp6E$V!mCuWLFL-UyED&pfNkR0e^*|kVC1pDu<-+8hV8=B@W+!8qs|v z&gl^AZJfzi@hH3Q5X#35z>8-ZwI(lqix}dHzGmy(iMHOy#6< z?i`l6%yBo_d%8G>>A2_)#spt;DEh2B#M$B;?cs#>_t=%|cIBc&vF(zS@1&yNsE)(; zQR|QZ#ESl)WDESVg3h7ieI0t162~}{>kj3j-VvP;7VYbSV;f1Gx=V^V3?xjFk{}gT z6I#I;5lB;+YaZJCvM>ci1_-g@T@?e&DL?pgbnB#Q1w6R0Ug zN|5^Qk(B%-F;r=HS0x4C(EdtzQj+G6jk9OfEE#TBJEYlFM_RO0bU762&Mk|ReCF0t z4%P*?w5?bY!LU3dDZlEYuVWyg8oPT(Qm}#zU%XSh*tYus4F$H$klnvCy&nzvT6BMo z6WpJns;JsHcZ10pn?sB)cwf-QwCg>1abDKlDN8#@>YNgLMp4iAjc zzHisPO=e|vb-~R-cMq`OxGyfX`#nK^$^>bXx%H(42d6|Tlg(<^G|A`0*nLxeN|2OZ zgHFYAlKb~_nWszcYj5EyIIwZ4{&_AZ^}SRTh&(TC$gFhl2G9KXm-MNmT&m}Xpv7os zD-s!!auh_WN#hJYt>D1s<-=dh<)-UT_vX2|HRhXot&befCHT#~HsV==|7-Zd<1yMl z)9!9xa&DBBlQxuW96}Fw&TE&Wv^Krwb3qtj1=w4v;ghcsWWZjnEq zjMYBrl{w}v73+LjFOFMenI)s@3dykNJ^tN!qW^<&^92u%>mC&h2{~fscgEwS~uI>APc6%y)%Vt=1RHu2YgGZ3rGLo_psVrFyS%+|wqt zRlO<76|M4RV`4agmo}(;CEf~hLc)@S>C-B>LL0W}d~h9q=iFjRjeqQq7|bM%s`%+B zyzNL?WSUvFesl!|H^kltOb)uwllm2Df(ljPe}f`?uCu_B|$&gsWC znmBPAAzWZp2AXHYaAJ9iks7)fDL+3CzZRfhQb^ef{{zeY2EUxC5anI*R*3)nd^Fyo zv4@p#XaSH;q?ste`$>6vb7CXjr4r5zxE@>~Nb(0Vwh|J-euly$Z1Hrl0KfGSuHNol z<^sh?O73ctRCI;*U1z4K{Dh_V$T>6Tt#o~3RZi%=*}L;lLD4g;HkZ;|K|9$uPF{&= z)$NN}jRZ;c)?Q>HSnz7VTk`WC&SW|QSDqN3%T>@0t$!WKa}_B>s?SF8T=~Y6kPw8a z{?@Cg0x2hWdbZ=Za>_H{`ZmEqG2!&bn&8&TZ2?G`2B4`4kmRj?dlTRt1V?!W+@YMt zj}7OP?;g!`-yf}|E_Y!I8v|pgEZsbO2H$c2gzMY>tF}+ zg6$+fN5ls4i7Vdt*2d{?uQy>`O^)F7Llf}x?`!CLZY_SE9&F;Em!k#Wwn}iZ-l@QB zH2Ve+YRug6cm#Dhhq{zi{)ZQ$IEN}lLj*)G;;?UK?k=Mq%gJJ>u`64U_{H%s!?3!d$GV|IkF8Op)A zdQS|ktrWrQaNGsuHuj2 zb-k&C1RTj&nUe(TcCf^SxiOrY{G=xe!s-e908Kxmi{q?n&U_S#?oh}T zr6f|dN$|D-fq?UnFwO^8@qKT^xe?_tK-rk^FKPI(Q@|XgGfL|6Xkl|JPo*<@ z6cYM9ThM@-vmS7I|F0rR3cQ4O z`U8_imKH~8oib8{avJ)iiELdwT^zNx>Ya%8W3i0CMt(Uc$yFR7h#m|gIS3&xVl7DC zBZB7=O6|%|SQL#)VV(-z&#sQrzZ;>wn$bC8%Lr{tMsk-aX@cE-?3_dSv7p$Yjs--9 zzC(j9TW`_MWpt1hN9*q)DfyP0YOt@UUC_MCU&9dnc(uXFVm=cvrL=K4lmq1*3AH*x zZNhB~dCzKwd&nFgr^hbK1_<;$lybwKc6*4+4rB2Vw z?+I(S7arz32L$hwE1^)~a??Op8$W;ZY;XVo9KLxG4rL9o2Q@O}OEZ{-CXa2@4waPz zI-@3&AnqDdMHv=hzbsi4nv5ts1oCXrT=F-eZ$2$b5k7$qi@ zu*L)JSgVC7<~+Lv&rL`=d<7<3=7G#3f%Pz1Bz4U}+PkxA1@|1h6bKKo&0OfqN1_!; zS;Mw=-zIvfId2RHgS}E{<^tJB8=8;2;e8Vq_zg|FbAH8M0kL%%zwVqL^6_xC_VeG+ z3;x_W-!*1^jTa&gnAS=A3z$1nQb+4=90DV|bMB#boas00QSaOt-lNX8A@*rpB7X=I zY3BF>pTRqmw1)+l{HXXj6LdoTCll!Xn@4xPYuLvIV&}^ z`dl^>|NT_VC_D%%Uk5XTZDBM?>#=DW0w8mDix;{D3M>GPL9z; zQzvtbP7Z&8P6isC)I8nT$rCL*nU78;h1D3NDb`X_xRX2Q2HH|5wVKGOIpc?-y*!Ms zaRS6!cupNUcxVi^#Kt+vgzk0#g56jt2X8?Y)ywv`Rh=Qo$}4wR&{Qoo6^W+w>znX% zX)}KQoe%A!9{R`E$fqId5hdWiduS>Tjy5JB{|EH0@SPlt**{mpf>NGpNJ?-sXYBY) z5H6;ww@Fl$KRba{$-q`3-U&ShEO-jg>I^sr4og+PMS2f7$1%CiS(THJfs#71R?l2a zjIe{|{`g?1p1!VQGwX@DcX1Jn$&0^?#Ma(wrwP;d{q5Rk!xH7N=yxxV21KoMJd8ej z$-sekFTLyj97At%C}?SUE32{xwN_)NX59^`)xUU#hPPevSxhw%DWbay%_cqw0BhFx z=w-WVEFognk70Kbn~0Nd+#j%7xr&uC4SK@32#)qFHRoPxzEQ3$xJEl{H8%8rf*e+L z=rZ=`HTyBrVQ$AS=`aQ(Fx{#e3JiK28SZhK(IE-i|5U6F<%Sh2xq@j{Pot(9Z$^`I z#To8PA!lpR?T2+!gB``H^a?&21(hLlJh1T13yJQlCQ*3NzqEZlA1y&9I$Il3)$=Cy zn$7&*@XSIPv&J;6;sbbZp^Y_aHW65X?wk$d!Hb+ThIAEAXLRMxS%W@U4m8*2kpsD! z3z-f7auN#*~7Yy|r_$6*__ zt0U8hxY@<}hVRg{-?BVH+mmH!`*awn4}gN5^vU08T}GtzPVJ8t{QPzBApIFbbgaXi zkZ$odkgMmvv}<>baLS|XFrKN{ zq+LYcu9C9WD-w0Zi#up%abe#%2ZGX{pI=F&#Tz-|YI;Q==l*aRW@H~;X;mD8HfGbN zWUrHpf3U$EfMWLP+a@mfn$Z#P;PhVNa;Jka#$mOLo#5EypFYw2I@$9`dR1o{3ECXr9Ra#SN5SumwH6NMH?Y_{sDM* zLnQOlSOsgHJI7&VGcW`NnNRi2n$JVC#fB_ zmlJRWEeEU++iDW5etjRw2qiN3G$=USs$Co1NuG8$+d>?^`(O=VV`26o!Cp(mhN323 z9}AOgJA`&)TYo&u+R8Kip)W#nq=(r3)~*dieTVX{!KD0X!UR(~g7z8b5RmX^I5TM~ zlk_Db)7HDwB9Xa@vao6p6U(4!a^*Tuq@B-ic*usr0g@s4tZ9Pet~-Y@yK_e7fzE7SunV>ytV*E# z;y1)zYBu`I+^Qvu9b>(y=YR#I#377RQimS-1|EEM8xdOfPc?x9k1mb^SBIPrDSSCV;Urj^ z;9DNjvtSC*3SI}I(H<&2<|_7`22SU* zBe+>J1MmC|T-`ZWNj?jn!ALbpicipx{u(wgS|KRc=dA~JetsXp;xEA80dNTEn9CU6 z^JG`7-hk`{$aSc#0y}65r5~Ht&GWAUYzu5gL%amuVCG|D`_VX4*gR%H8dRJ}hWlgD z`sVGLWbK;Nk)h?y0Hk4{rx7{d8l^p9?JOrXH@y`EE?Xbo2SD5nNLLJ}W%2NfaAD5I zipAD+nn`SI)Du8Il|M6zgkv2t1KI^_SE~u$1k(xQz2#ku_m6bYdJ!9=!Sp+dNT@DF z4TXQLGpb{c2#lv=Om%sZKAohG%18TSv_ZB(@~t&!V&)c{Hn92VgQTP|+c@xVm^)=0 zBuew9mx5^vj6gokDJcD}l>-`Lb?0y?@5@f|$y^l|up4(%Ne!B;2AgQ9#XNUH()XeE3GL$47{zTs~ zr@GPU({zSRUSPX&Rp`z?3N*ojZ69GQ_yr-PCSQ1%MDh{mI8e0VVeN<9^oUV?o*&me z5trZ@ZwO?4my;93SMytfwn@uwbA2}^GfVo#X0=wYrC4^{BV_sUy*tq+$nS? z4$cF71Bw?#ujX^`4sS+%#o`CYa{5y|&jtDbw1AyB zId8>iC&zV`EAls^#sM5l%&BfUtR%nfCn65?$vLUe(v@D@zl(*tv-syIuD+U1x2jWI zgO!8sy0*d^{!5ezo|AyDuQs`)!ru}E&sS7i>7}B`&#%C5Au@tVHT;u!H`VYf=^^|1 z`QakaIEkGI&#A6qnWo?=5htZB<~fE|mT$#R`s;IeU^eh-GHJR$TeEcM%KrpKXAJZa zfQnf=ojHV*_kK`C9r{8F4xtLaDYRwEyPKP5;8uW>8f*n1u>bZzEEkxMcRyc=SCSci z{&T$1U~2fU@Ma2-Hsa^kQ8^Iw^UpVxzsAaYqMXrIxr!rqyYhn_fdjpdghC|;TdjeQ z3kSSfwv;Rn`!y6=tH0UNOq!BIIpa|NawwO;brv#$9;hNC=&E~{X%&AL-dmhZ7Zlg? zM~_6|(6LpuapFbYfxX_{4;@3{uW!e^fAFfA+pn|JMEI{2{!e6zPDNvx7=ED2R%j3FxKr3D?wv~QSLe`(JAdruupD;}~v`^MS=BgRsTXDPI;cB;Vb7m=nS+ zNTy23=i!f`vBou6;2tsC#TWP^24UT8kC3vqyH07n9J&AC8n9%xL4yk{0o_GqC)6&7 za=e1&|Ir%L3u9{rihN^3g(Z|b2nR_7TH|FY-&j*kA-!>dOk@)!Zl69A<4F(I*7G9{ zM``;UV`O7(O_qvIy@X+_{P9Ck+1~9Ya^AR-qT7U;T_iJqaD|DE71d8py)Yqvn_+kZ}>*#Zq63W3x+pyC&kOu}Lc5^B@Qs;T*Ooa&;tt z0RznKi+H%S$0jHVN`AVm&Z+N6dn`xg|6d+!U_o@Xb#sg$@CD^V&mPGFOT% zH&jLg2y-u-C2lHO;7Am3T8t_Mv2p zMO%?E(SpO)Yv!;#UX(HuXWOQTNHZVRN-B#E|FQEoX@g{{bq7qYdSgVyso<+M?MayH z7l@o^>4)U9{s$Z**ptk?((x2xD`s~EW>&lhE_I+z;h6~mHuAW05N*Eu!kp-vEsopHowoXzJ?HIo;J zVD%37HRg^$t`J+Sug6SN!)koWO;EO$0c|7MiINMOlKm(-vnko1lH(~Uv&vRVXEznQ zC^?`h`5+~eo04lO*`_I3Oi3)*aK{QI&ow2Vr{vM5JQPbU;lIfHbnv$uMM2gdYTn@D?dQoV`9ITzQm6H2<%Ca^>TkEiMLfckY-e7FW zeI`X{YaT|q2>{UY7qq^;#iof(F4)W1Ezb)N-Bchrw-*RMR_2gMbUh%sPok0^|JNj- zxRvC-oU-gkymbR0`fLQWYELalHD#~8>t()6Q3nAkJhck-u+lIllk=ga zOSJWOj}~8eiM&xe+2$gYG>LLxf6FR`^Z*HPFFs`7ua5U$k95~}!csNxCFPx35$|l);3Z#&Lg+^>z#_i0 zR&=l6Os=o32Hv+ayy=|ES#DQXB;ahA2=7qp^>-e?R*8{Z)MJ5pnBYAf%0?0ZHjzUc_$Bo;ZZC`>f_W z8i}f{TsSjg?mgO}g*~Ef9)&o#YVF~*-DOEqR#Zxg>m}toQQ2oxb~u#0byn4tpxRQb z@JQG}fvP&}g|-qAWEMQIRyn(=O6pr9nIK8?Hd>WGQGb_y>>>%*{lpgz#ELr9yp4j# z1c7W-ba$P=B9T5t=tli&6c4Z&}dH{!vmt|Y7Jx_G-dNws~Hui7@|+mwK)98~_Q zScjcoA0AD5&5jg?06F0h*D1MIl)ys3sTewNA>{PB6@;Y&K-;?8d~q3tD>iU!lXnQ# zUC69NENuqx-DOki;9OM>ms5DOtPgBPTkzb4wlOJE)tQ7ySJFa)z&LjO-|%{ql-EYQ zdZDhpsD{-fC{uUox7ObWc8=H#2eB#3SJFt?$&WS}IlJacc zUT-l+A~r+VT&dVL8Z$V8RSOIOyfI4E1uRxnhH3-(=vngHDhUH-%ji!dpoCWQ^l6}1 zp=P;nV1zkWd+5H=vN<=GTa_S%Dm}Yhe<0F-UwmuHUqxCFVn3%Nv_+|s{MNJ-!qMT& z`$#P5jyK6Sbz>;;tr<~V#V#au5p%_)1zW+>r%lEp&Zyx_zJ}!>WJ*=XQluC}*d)%_ z91FW)&$KAGDn3GCnLKT#g=2v|p~S0GsXKnn=P}&f4s}4Ud1yILeINz@FZbK_vN-++ z_BKsvM5wmpy*UAbnS#K?}d+&VtMiU2wuT!oU|1`ESSEO-=0FOWs~FEeac0Jq zSx{I$?*TYK-QR}vzvs~y{Gi7~)VC{#LJz6hoZ|up(1pBGQqS5k)_sEqvoX{`m{Hy;j9Z-0xv&b z22hX?^Zho*6=JgC{V3vq001b|hhpDJo?naBMn9M$hZ6sqLKNC*_q~<|c+T$oGA$${ zaJ1wKwtApYb`dqmQPV1xY6e1yg{Xn;Ln=B;q{;I=lU5fZX$rr|QLFM-`O|g_xg!tU zWbkdpXMoao+--1~a+wSl$UR2Fal13?8Oc7Fi%wut@cJHbui^ceEKZV?S_hm}RVP#O zlq$QjOR3WD`Uit_wkBUrYbmSR$?Gp_Z#>jdPB-HA?aIIH%5Iyo6LD=>KP?^RP>xA` zA<&0(X9ii`UThedl@MnoVraj&5<;rP)mne-UNUv6gVCyOuVktY?yz}IJ6qN8?|y+{ zgF}Qhl~{i1%n}yw6z7H=G$lmq(tXtygeW}#%;6d0^?IypqZ~b!j@*I5No-VWH!d)B z7%7$vKqc6O%aK{y6|5LaoHiN9y}Jy7*iU%scJKz-?3o9`<#&SSRI0tbc&NIk4KxE(!+VFE%GwLdGYkT?_)})+lzLRBrRaO@|g-^KD`a_#!MU5;EC>R zy1}w!80cN8?7lVByqsPh3SDX?RUL0fy_cZGmRWCA&P&;^Q@P-Kk8ru~NIK*w!PT_` zMIG}a?br<+>f;IO*c9w)p_uu!*8z^}@d(%5K+ z%3vi`X621*$qNXFayeY;Ff^N9z$w^OQYR-BKHl5Zsos73y1OP#QXh|o4@bWpRm4zD zU_83Px%(3}pskvm_!&fwWk1$%(Mh@@P)O0=ferm(wqmRG`GF3>`@g zD9PV%Byfc@gDL(N4v7G znUpKCiHr_YP}sbrmr(wAnl3HiWlq6nwIo5BpDk6LfMMlJ!$9=T^Ef!mz@S zDWSON4$5_&)HinL4QBw1x&f2OlYbvnT)2h&Rb*d_A*>o3rU$wHDzdMQoZ;ad+Et94 zd7UJ60(96N;7+Ah%G$LgMY^vtU5Xr=plw{z@vcMSR}_{{CTCC9ff^tCQ4Dyz7xk(f z3-1`yCmI~ht}IBnme!ttnNc4~Yzmozt@2|rau&~ z$E*G`iZN2bD4{6`YzFJX{R5G_Ws({G+?|S70w`+GHml=|jwIVc65NY85u%;s9{n;L z%c9T*VPMg}g$YH$QsKy9u~e&ecA1vWa(B#{DY~ygy}JZZyZbucuHlW8Il&XeTX{N` zIQm>lSVogRMs{?)KIbg73ZG9$b~*N7WPhtGC(T-hD=G5kH)FI3u3r7S!CHncG5r(x zpp-QhYC#)D%7{N-@_A<|9yfC7jtk{3Fmh|9`x5V77sDYyYv_Y`Qjr}+ zP;lHSbvVfVPRdTqMZuE62w`0z-FE=Ik!VAPIzC1FdTA#)8qlHYU=@nT|IZb70tX-{ z9N2QzH7&Y5MqvW=dulr4`A6*Ty`gfMhNo^LqUh~sH^2J<6pW&oabo#j)a5P6u)D9a zXD<}9HEQUJ9)s=#5x|EcD}jBk^(LJV`|^exDU$+5)TLm9>$Bx_?Xzb#nz&CJb^h@ zr$tNI(-N@Ied7@ldRz3W2&qbsb{((Qx-PfK#tFf6F?@r}eJaVWT(B$O*_Cg~>rUFi zBcmKjLA2dx?jR|-308!vDCiIZ-@P)4bEc}fNmwqO-3=+i3)N7tprb}tJ0}v{U4RSz z3hx!IyFBc(H%V%4w4-mGJ@mCB>!4j2S1rmlW-}H!_$&i_W)JNGLF`$T4q;s71i!fk z)ZhX)p+pSrw9o(Ek+pqETWUng&P{kEBD2!2Sbu0xS0;I}NPYt>?(wyAhf)O34@kH} zF@k3wd+FhfaffCL-j9(&j3`i_?TS}d?A7IRP*ee!{vZm2LFAZLCKx%h3EX`$B6!k9dDRd&66@e;xXU#Jc+iF}Q145k+UYgB(|NqBY8`?IV0& zwc^sS96DP(^{zyBD90J^8>hYecx;Ykvq|6g8y(i~$@AGwj;ybjVYTRXWqI^H&vZJ^6b!T{63P)H zTt}ZC7ddja(>!vJ>jx?1*QbI8!M#?cF3k7j4$$U4(M=XE5faCxs_O}c33~>MK~(%o zB?RGtS71~jGT2i`(?QHriI+UnaoBpxx&|oR6|N-FH_l{-0-nvk1$e=I6)<5Z!<*EA z&s;0b&wv60<$6YfWIAupy6^}OZSj$=j-;&fkF;@Q)j!hCk#$~hZ%0*>3hq)Zc12&g z7x_Xj&w{^ey8~vUqi?mO{6gxx0~+$aX(WvV?<|Ztd^~6=D4yVpgX^2;spI+3-{BF+ zs#-RQG^Vrqr>rTX0T#=spbgBuw^9^d*dbn|6UZRUY|shZl74FoA<<;R0z7yKqt2`h z><3ZFmNR^Ah?THKaRK`*t?>H}5#QLf=YG5?wH#Tyt4r2BY~cbuv4Is7LrJxl?b~bo zVG`t(_sk?GxCcWIn}+at*_CT>n3U2|D*I_%E>}Wt!Ih!{!@bwC`Aa)lh#AT3w=g2Fx_Rq)6H{FWcu=>Mu z$#I<$>_!fz%mW3uHw&|9#boBOa`o0HQMr;*PFPThxL4aG_mGVn#ZA5_=9q)%?nD!tJv*3N1sd1)`X6`loO^hr>qokE8^?l?fgX0pnmk0kAmgk)#>m*Dmjc$0kW&nQ zJ?k&?fbK;hI9SGEFfrx(C}lSFjp7;CiZ6)D_ggIzZqjUSH43FPjr%mz=frrce#JKCTo$++ag-MDVM!Cjm-H(XFrB`WpOD#}GV{WDyph+9^0LBt zbY>w6o2QwST6f*AZe1MNNqA}q0Fjv+L3DWo38K?lJn7CsM`{JUH=7%c|Lux7tw0pY zb7@4@v}jp`zoYdCl;ruINNZzv*F=ch*r60C+KMQ836dHY4L-s`X<~827`u-}Iv3Ja z9`7xfNr!LA(BPb=a=YmwI8anNN|CsoY^s)gW3Na#*U{XvXpnVe+H9voIY@iB++uxV zMe08sBW?4By`A_O?ca<*|$bCnh`+qHqcm`A(bVlPp%T`%Ki za~DiF?zxcuqmiEA4w{2SY>Eoy%Y&Sg3op-h-d1?oDR>ahZSau8_h1Oz1;-NOD-hsg z^whix^xuv`BWq3r!G3`|K#8ymS}a@{G1|3(W+iguAPDiH| z7Ua#T*5-LSXpee&n?Bdpc~TrdPax5;!*2NH$#Ve*K8v%bkl?rBZu}q9&RmNeG)3kK zBI^QryzbNlZ>Na+`)d8X{f4AuFahUKU*Cx1byr%r0|z9Wc_Jd-!yqm6JzeJ54`b6C(h4Gq#Aig31epXG50K4e-J zP={W*1XvJ|(_d}@TdWQ}Mg^qg=!Go`ZrCFr>SW_%21TcmFgQusR!4zM%BF+tv8I7N ze6{p|y_ZO~zHdzmi~%)g$;D_~%%EE8&_M`{fu^LV8Y_Ofnf7$P(=VhF`&e7h%{(vg z4ES;}wpBIf3LaKL-jdw20at0ZBoDyDrW_Vy4qJsS@x3V(v!67k-(g}y1;&l&HDrcB zV<#l-${ysrZbnW3F|k~+ln zD3%O%z1iW@{`FM<*xwik#ov}{|9)z+dZwCrhi_9pr89rWSaUuBOmGZI z8Az->jH54_btF&hg2^O&>B-m8`9_C9d#R#5xbz5h$W41Z=*TmoO2y2 zf8<%%i)!LecmUOSpcg#5UYgdJ8}$A$J$zh15-Ki1mUu9UZW(xIZKe z+cql*PJcg-<8msghS7-NnN5%?w3s#LfSHWr9!K9xk`fJZkJSKA0lEb9AAE)}|8vQV z`8|D+tM@+)>BTrma&M#M!#O*!dp*Y5`S~xb9o+Q?6VagmOYlIS-0kpryJBD@c<9c| zSy_M3!5l+fttuVPM-U0*h6Bhfz7XIP$U^!9AZ5`;`oS%8Xpa7g2wGegsClE;n zg5>n@rV`S%Sjp-xkT=Sn#(J_*aVaXIit_;Mc7xW#ATNkOa1k^52*g%DllW$X z3)GN=Zu$y{!F=HSz)Q3TsL_GX0Sa@Q=EtgRqIF_b7)$7L4>dLN{1u+ot6 zel55r!74@X62aZDd@w|7Sk5U@FB7A+!(T_Pdnpr;gKJ* z6v1>tTN`tu+111y=b{k~{0)9HE3*zeCA%7D&ichULsC|yoV9~NE9q1@!S$QUX3S@o zLQK+2-_;fFHIZ4C${%%M)ph4bpr6djaMxgR)_^@W&Kzzl_yw&P>EeDVm5Maevq`dV zT*%!ZFPp1e5tR#Q<2wYkOY^JAmoU=H)!PwZJwS5vgK?A2RAvD}nU&N?;Rwz-mc9t! z-k#)ch<2UTU;YuhxPqWbejS>C4IIY9*pKwKM)7~<%hF4**(?x>ku`*ZPXu?{Yb3qzLi^?@osRu4R!{tl`ky0-? zL+0iVWM8+KVPpR8OpUfG%vw96tz6wP0rtploO2-Z8oSiXS?0Abeq!z|)3I5SWz~vr z(Ia9{E$ADH2c5Atvn$%X7i~J!9JnaWx662vcgSy!ERk&V*IuA0+u1IZqCNe*==zoGdqXr8L~RwpN@OX7shE56O# zt$#lpLyFm1GZymJo%7xjLX8Elt&BQBx7MbpPD7{fOKQc-|I zFNBaMX6N(=A38f_JQ`^mW4gmb zoizeu#jR^w*8OR5uAn2U*98RbI!Dkj@zthoqBfLA<&iK#JL~!TYq7$a1g=9}YbP8y=bDpA*VCU_qRz8aG;+G)<0^B*A32#H0ou3~E z@$4SC#^CHkM0F{9sxC*-B3CX--<^aovqRXI17=8o@rga# zznV0YEkmpD)XVZ%I97rCO32ko|AC#=%bID3+rr9Zr`>$u;xiXw^h4NyZLe>SRBx@ zmC8A0Fv|r>+&EvZDYL#n88S}aH-RQRV=J8r8Q85u^mR_`3NL2c$inm;HWwn zN}Sou2yNkXnni5ZxFyS+z9AP8@41x8%-BJ$PXTl*rJG2KKwSz-g2}`+Kv&pJ*8`yj z#9%=s=vQk)q20|6C>*=^wlT0ru($6v+}^~po9sr#mlo*TICB}BT^PMUlVAFGUZt6}ZlAP6lXE@?Q?eu6}{sw$} zV@2>y3wbqVGUT~?w8=RM=eY@bCoEgA%@8Po?rem7uOe<$5#Y&5fp#$@RSc%Q#xhDXiPX zY%HmLl%b>qoM3Lo+xj!Z88*JK0?j5axGsD>si5UTfqb!W+Qu~rauOI%Ij>CJD=Ob& zH;Lb8hGBVC%FelhC{e*pelv$}NQJ%XIOdl>gUm6iIm4GvpPpG710g4PkJ6y$S0j3^ z&|dXNq(gb25?hSmNkiRY_zwEsY$iQh@Z=Fcs{99N1m7%7S4Vh5vf%w1)%_7zkPx~* z-KO535gz`P0T@156-$c6V5#vBqoQOwB)O{+7Db5cn3SR_;0;&K=+UF_Ric@supcIT zRDLX=?IuLK9Te4Dl?)LlT1tMjsID}t@hAR>MsE#b%!pmeo{I-kFMIR$ih`{cM`rHp zFrGR4|{3hprklJ?chJ=(WH z#3596-iRSx+F39DTKn_mP94kYqQPJ}Tk*);tsI8vCPYVSsjqaDt-qs=;x7-jLooO- zBnX0hPT2Pe${fLz1(!q{NZ2k*2-g{K9s%8v|6QjR+<@`p*mE+%ZmFXkACc47$QjO3z8Po?Z!Bt{w6@j?&)>R!6x-0NQ-5k8`IWxf@2}315i`zqFm>RU z=?EBG-3go?`W}3p5}?yqOfuW(r(j>A`!%BSZ=9;1g9i?-{V}(*wd3q&WrU?%{gW=V z-WouDmOT3#Mo_eaRSjQgVC^;TF52tcTFHou&7l2d{*O{tV&vm7xN-wy3TjK}F$~gY zex5WJ_iz)AWQW7-G~`K}UCdqz&Nuc>Ts(!(hE!F&nVmLv5!HiRf|SOh`5kZ8tX}Ve zft(ZY@(#U>!Hc_2##r&luf{aZsd7-(4^U9D?;6xk^^$AscC7l@%`( zaW3>_)(p1pLWZESVwF%4na!{Lm4^5nn#<hjC0Kzs3e~OIy%w>8OIYmsj~2Rd z=%DblODWV8{3eSDO8E;T`2a!yWWsLKUjLXN<4^n?&1FR!VIHvi0$(wSQAm^^imBEr zGqSz>ufImiu;^mgQWQOB|47fyJ8+<`OWNo7yCWTeowLAdi=U~;rm-1p6_Yh zZ$|e43NZl3x_^U9g7uPE1fZBHRc1rO3=E?_;KJ>~_7&}jc{w4w6cFLE?()2|0#Xl@Wkpjo|I{SwVtgf%tUd_3Nqvm6KytZGPs z({lz;ark^he^IGKI4%}rz|W=tv$h4KcV>dIyiZd9oB0vmSk8UUgfNtg2MLS8=$Q5J zE+8$!{cCF6-$Vr8BwJ7AUqN1h64_#kRUh?dO!SUAcDCgmNG-?Wh%>Bz_{SyzCKNaX zXOsRZKJlm|1@_^+v7DJBMW-^NwKnT|wyA|Lf7VQFkF+DYwUO&mqMQpdcLzIYi`Pwv zs4myGt?NmbvIWmmU`i%1=u^lLRLkky67h7(rBGt~G{n4aCs9Ss(EhEBd^5AJ;JFR2 z2#ysz1KA6XuIR!e7Uw!LF_Lk8h$_s`F1*=eK@Liks=|GRg?rZ(9ybftD%|RV3j2{h z8HO3Icp;X3ay~M?)W;YZ@GMQ9hm3dhOd|tU^yI~WTrMdZF}PKIpc1-9ifY?okHNLR z`?Sa28Yw&F91f*8w*v^p7$S(&UUfP~DgjI3Pv-2Y1Z=^1WejORdY9oWs;kivqz~SH z!$}lK{tmt?$#k?v7^+A4ssELKC&itecH!LdggzPbkC*{vYz7mh=$%i(-t2xl?t`=vec&8O!084P$TAtHxEX!I%cd5m@F4^f~91vnc< zl#FS?I}y!>M}!pV7)bq&>Z1kkU?X)LDU{*P366HQ=}77FD&tJOwE=Mwc_RexRj?{* zpEBU(Gf0A@X@k%q)e=`BHi%qe5rbI7yjTMJ9?^_Ar{ec9nrUkb|0p zi-9U#^%u6VX)jRL&>WOePzBy;xB-%`EqQEhU5`k7UXsKVgf#hsnfBETqSQXg7el3i zU3meE3$Y!pI+)-G^&OCh#Ck!r4p){gMcV45{`?eDfBN$_JX~X;pseiwmyp0uqg>@z z5rI!oOs&O)5y{Y3_$Tlh7(x?haHHNI-z8&bvj)w{4&Q&$jiAUFTxT=7-2Rs^qmtc*rcjC> zr2S{y$58%*QQlqXR|8ab0SG8HBPl2peiHn2ZR$01$8L0;k{vKG*Tx{M2Xd_@KwRtk z@K3bZ^*!Yxjdb_A0vQ zh%Uyfjud8SKn9)yOepcLE=H>$S*Ff?)!dM4ixJ)h98W_EP;l0bZaS-sDe-MeKr5wj z;5RanFXC(SelKOsV+(+P`vL0oiIfC=H7*3eutYxz^|p_qUAO65GQdbSz+$QPz=L9T z`g^0@n+U8Q1r9C7i!U3( z7x5dsJ&BX3Wz%8zh)5i(0#C`etr&Vusn-6Zq#oP*5!=*YJTSuW9ihH#Jm5P5fv-Ss zujPHz%@m{E|4}#jL-bBDkw9z@S+Xcj0RhM(d9VleFWk7dve3i84`BZ0sd_9yr+)-O zsR^8?h2uU&19mL}TIv%?h$=p=A41F6Sc*_=IPk+-EMj|?#}VUX=j1GcC+Ly(`n_9d z2u&Z9fO>_oRv2UDQ>jtYL72cUe3avFGQz{Ae<*QZ$3{kpr0;9-f8X1Lz)@^6I4(J( zPXL-2-9RR?n>#T?v8?w6k#FeRU`GAOfEyIhunx~beS!~w{LU~t?y(p?fFxX33Ol3s zrxNiip%tOe*2L&WdmukmYV_e>gIgXveY4i;lg_dswDEy{$vpx(@)OvoA!7wk7c)`* zK;{9_IJB+c@Rcvbw_tWwl-PvLUDIryBhEhfcTnKm3F0GPH75FY?gdOcKKosGsmHQY z4yd}{)k%o;06iWtm10Vy;_y~BO_37jrF?= z1wc4b+}Z5Um(VDT%K=sd_=HaaaCQE`{?MHU5>277$L0>M4_S$M~4t1P;ndWlK9=xy!pHH zD8gc{40_?}wkfRNbZErh+1FwEM#`!YJUIjbsmhLW3KYlK>rxIO>N?uE!{7TQb#j9z zohR5$W3StUE&XlE8PR?GSJ8b�kmu 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 literal 530870 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

2x@<2+ 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

!-$}HQ=JT0;O~-IBDJY24(se3 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 z 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

MsL7;GCnd*Pxb&gz<~J8S0O>%6^R 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

!lUuG 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 B`8fap diff --git a/examples/greenbean.c b/examples/greenbean.c index fb76e253a..4cfe8d871 100644 --- a/examples/greenbean.c +++ b/examples/greenbean.c @@ -137,7 +137,7 @@ void *Worker(void *id) { setsockopt(server, SOL_TCP, TCP_QUICKACK, &yes, sizeof(yes)); errno = 0; - if (bind(server, &addr, sizeof(addr)) == -1) { + if (bind(server, (struct sockaddr *)&addr, sizeof(addr)) == -1) { kprintf("%s() failed %m\n", "socket"); goto CloseWorker; } diff --git a/libc/calls/calls.h b/libc/calls/calls.h index 2604a1c54..0c192cf3b 100644 --- a/libc/calls/calls.h +++ b/libc/calls/calls.h @@ -85,7 +85,7 @@ int execve(const char *, char *const[], char *const[]); int execvp(const char *, char *const[]); int execvpe(const char *, char *const[], char *const[]); int fexecve(int, char *const[], char *const[]); -int faccessat(int, const char *, int, uint32_t); +int faccessat(int, const char *, int, int); int fadvise(int, uint64_t, uint64_t, int); int fchdir(int); int fchmod(int, uint32_t) dontthrow; @@ -95,6 +95,7 @@ int fchownat(int, const char *, uint32_t, uint32_t, int); int fcntl(int, int, ...); int fdatasync(int); int flock(int, int); +int lockf(int, int, int64_t); int fork(void); int fsync(int); int ftruncate(int, int64_t); @@ -148,7 +149,7 @@ int pipe(int[hasatleast 2]); int pipe2(int[hasatleast 2], int); int pivot_root(const char *, const char *); int pledge(const char *, const char *); -int posix_fadvise(int, uint64_t, uint64_t, int); +int posix_fadvise(int, int64_t, int64_t, int); int posix_madvise(void *, uint64_t, int); int prctl(int, ...); int raise(int); @@ -162,10 +163,10 @@ int sched_yield(void); int seccomp(unsigned, unsigned, void *); int setegid(uint32_t); int seteuid(uint32_t); -int setfsgid(int); -int setfsuid(int); -int setgid(int); -int setgroups(size_t size, const uint32_t list[]); +int setfsgid(unsigned); +int setfsuid(unsigned); +int setgid(unsigned); +int setgroups(size_t, const uint32_t[]); int setpgid(int, int); int setpgrp(void); int setpriority(int, unsigned, int); @@ -174,7 +175,7 @@ int setresgid(uint32_t, uint32_t, uint32_t); int setresuid(uint32_t, uint32_t, uint32_t); int setreuid(uint32_t, uint32_t); int setsid(void); -int setuid(int); +int setuid(unsigned); int sigignore(int); int siginterrupt(int, int); int symlink(const char *, const char *); @@ -187,9 +188,9 @@ int tgkill(int, int, int); int tkill(int, int); int tmpfd(void); int touch(const char *, uint32_t); -int truncate(const char *, uint64_t); +int truncate(const char *, int64_t); int ttyname_r(int, char *, size_t); -int umask(int); +unsigned umask(unsigned); int unlink(const char *); int unlink_s(const char **); int unlinkat(int, const char *, int); @@ -204,7 +205,7 @@ long ptrace(int, ...); ssize_t copy_file_range(int, long *, int, long *, size_t, uint32_t); ssize_t copyfd(int, int64_t *, int, int64_t *, size_t, uint32_t); ssize_t getfiledescriptorsize(int); -ssize_t lseek(int, int64_t, unsigned); +ssize_t lseek(int, int64_t, int); ssize_t pread(int, void *, size_t, int64_t); ssize_t pwrite(int, const void *, size_t, int64_t); ssize_t read(int, void *, size_t); diff --git a/libc/calls/cfsetispeed.c b/libc/calls/cfsetispeed.c index 6e249b428..9662e3922 100644 --- a/libc/calls/cfsetispeed.c +++ b/libc/calls/cfsetispeed.c @@ -19,7 +19,7 @@ #include "libc/calls/termios.h" #include "libc/sysv/errfuns.h" -int cfsetispeed(struct termios *t, int speed) { +int cfsetispeed(struct termios *t, unsigned speed) { if (speed) { if (CBAUD) { if (speed & ~CBAUD) return einval(); diff --git a/libc/calls/cfsetospeed.c b/libc/calls/cfsetospeed.c index e996ec1ac..a6ea81adc 100644 --- a/libc/calls/cfsetospeed.c +++ b/libc/calls/cfsetospeed.c @@ -20,7 +20,7 @@ #include "libc/sysv/consts/termios.h" #include "libc/sysv/errfuns.h" -int cfsetospeed(struct termios *t, int speed) { +int cfsetospeed(struct termios *t, unsigned speed) { if (CBAUD) { if (!(speed & ~CBAUD)) { t->c_cflag &= ~CBAUD; diff --git a/libc/calls/faccessat.c b/libc/calls/faccessat.c index 2f8d0d9c7..e71759960 100644 --- a/libc/calls/faccessat.c +++ b/libc/calls/faccessat.c @@ -48,7 +48,7 @@ * @note on Linux `flags` is only supported on Linux 5.8+ * @asyncsignalsafe */ -int faccessat(int dirfd, const char *path, int amode, uint32_t flags) { +int faccessat(int dirfd, const char *path, int amode, int flags) { int e, rc; struct ZiposUri zipname; if (!path || (IsAsan() && !__asan_is_valid(path, 1))) { diff --git a/libc/calls/getpriority-nt.c b/libc/calls/getpriority-nt.c index 5bd4a2b98..885f465a3 100644 --- a/libc/calls/getpriority-nt.c +++ b/libc/calls/getpriority-nt.c @@ -16,28 +16,67 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/calls/kntprioritycombos.internal.h" +#include "libc/calls/calls.h" +#include "libc/calls/internal.h" +#include "libc/calls/struct/fd.internal.h" +#include "libc/calls/syscall-nt.internal.h" #include "libc/calls/syscall_support-nt.internal.h" -#include "libc/nexgen32e/ffs.h" +#include "libc/nt/enum/processaccess.h" +#include "libc/nt/enum/processcreationflags.h" #include "libc/nt/process.h" #include "libc/nt/runtime.h" -#include "libc/nt/thread.h" -#include "libc/runtime/runtime.h" +#include "libc/sysv/consts/prio.h" +#include "libc/sysv/errfuns.h" -textwindows int sys_getpriority_nt(int ignored) { - size_t i; - uint32_t tier, lg2tier, wut; - if ((tier = GetPriorityClass(GetCurrentProcess())) != 0 && - (wut = GetThreadPriority(GetCurrentThread())) != -1u) { - lg2tier = ffs(tier); - for (i = 0; i < kNtPriorityCombosLen; ++i) { - if (kNtPriorityCombos[i].lg2tier == lg2tier && - kNtPriorityCombos[i].wut == wut) { - return kNtPriorityCombos[i].nice; - } - } - abort(); - } else { - return __winerr(); +textwindows int sys_getpriority_nt(int which, unsigned pid) { + int rc; + uint32_t tier; + int64_t h, closeme = -1; + + if (which != PRIO_PROCESS) { + return einval(); } + + if (!pid || pid == getpid()) { + h = GetCurrentProcess(); + } else if (__isfdkind(pid, kFdProcess)) { + h = g_fds.p[pid].handle; + } else { + h = OpenProcess(kNtProcessQueryInformation, false, pid); + if (!h) return __winerr(); + closeme = h; + } + + if ((tier = GetPriorityClass(h))) { + switch (tier) { + case kNtRealtimePriorityClass: + rc = -16; + break; + case kNtHighPriorityClass: + rc = -10; + break; + case kNtAboveNormalPriorityClass: + rc = -5; + break; + case kNtNormalPriorityClass: + rc = 0; + break; + case kNtBelowNormalPriorityClass: + rc = 5; + break; + case kNtIdlePriorityClass: + rc = 15; + break; + default: + notpossible; + } + } else { + rc = __winerr(); + } + + if (closeme != -1) { + CloseHandle(closeme); + } + + return rc; } diff --git a/libc/calls/getpriority.c b/libc/calls/getpriority.c index 1fcfca741..7ab066298 100644 --- a/libc/calls/getpriority.c +++ b/libc/calls/getpriority.c @@ -17,10 +17,13 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" -#include "libc/intrin/strace.internal.h" #include "libc/calls/syscall-nt.internal.h" -#include "libc/calls/syscall-sysv.internal.h" #include "libc/dce.h" +#include "libc/errno.h" +#include "libc/intrin/asmflag.h" +#include "libc/intrin/describeflags.internal.h" +#include "libc/intrin/strace.internal.h" +#include "libc/limits.h" /** * Returns nice value of thing. @@ -29,20 +32,47 @@ * to clear `errno` beforehand and see if it changed, in order to truly * determine if an error happened. * - * @param which can be PRIO_PROCESS, PRIO_PGRP, PRIO_USER + * On Windows, there's only six priority classes. We define them as -16 + * (realtime), -10 (high), -5 (above), 0 (normal), 5 (below), 15 (idle) + * which are the only values that'll roundtrip getpriority/setpriority. + * + * @param which can be one of: + * - `PRIO_PROCESS` is supported universally + * - `PRIO_PGRP` is supported on unix + * - `PRIO_USER` is supported on unix * @param who is the pid, pgid, or uid (0 means current) * @return value ∈ [-NZERO,NZERO) or -1 w/ errno - * @see setpriority(), nice() + * @raise EINVAL if `which` was invalid or unsupported + * @raise EPERM if access to process was denied + * @raise ESRCH if no such process existed + * @see setpriority() */ -int getpriority(int which, unsigned who) { +privileged int getpriority(int which, unsigned who) { int rc; - if (!IsWindows()) { - if ((rc = sys_getpriority(which, who)) != -1) { - rc = 20 - rc; + char cf; + if (IsLinux()) { + asm volatile("syscall" + : "=a"(rc) + : "0"(140), "D"(which), "S"(who) + : "rcx", "r11", "memory"); + if (rc >= 0) { + rc = NZERO - rc; + } else { + errno = -rc; + rc = -1; + } + } else if (IsBsd()) { + asm volatile(CFLAG_ASM("syscall") + : CFLAG_CONSTRAINT(cf), "=a"(rc) + : "1"((IsXnu() ? 0x2000000 : 0) | 100), "D"(which), "S"(who) + : "rcx", "rdx", "r8", "r9", "r10", "r11", "memory"); + if (cf) { + errno = rc; + rc = -1; } } else { - rc = sys_getsetpriority_nt(which, who, 0, sys_getpriority_nt); + rc = sys_getpriority_nt(which, who); } - STRACE("getpriority(%d, %u) → %d% m", which, who, rc); + STRACE("getpriority(%s, %u) → %d% m", DescribeWhichPrio(which), who, rc); return rc; } diff --git a/libc/calls/kntprioritycombos.c b/libc/calls/kntprioritycombos.c deleted file mode 100644 index 374745238..000000000 --- a/libc/calls/kntprioritycombos.c +++ /dev/null @@ -1,56 +0,0 @@ -/*-*- 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 │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/intrin/bits.h" -#include "libc/calls/kntprioritycombos.internal.h" -#include "libc/limits.h" -#include "libc/macros.internal.h" -#include "libc/nexgen32e/ffs.h" -#include "libc/nt/enum/processcreationflags.h" -#include "libc/nt/enum/threadpriority.h" - -hidden const struct NtPriorityCombo kNtPriorityCombos[] = { - {-20, ffs(kNtHighPriorityClass), kNtThreadPriorityHighest, 15}, - {-18, ffs(kNtHighPriorityClass), kNtThreadPriorityTimeCritical, 15}, - {-17, ffs(kNtNormalPriorityClass), kNtThreadPriorityTimeCritical, 15}, - {-15, ffs(kNtIdlePriorityClass), kNtThreadPriorityTimeCritical, 15}, - {-13, ffs(kNtHighPriorityClass), kNtThreadPriorityAboveNormal, 14}, - {-11, ffs(kNtHighPriorityClass), kNtThreadPriorityNormal, 13}, - {-9, ffs(kNtHighPriorityClass), kNtThreadPriorityBelowNormal, 12}, - {-7, ffs(kNtNormalPriorityClass), kNtThreadPriorityHighest, 11}, - {-5, ffs(kNtHighPriorityClass), kNtThreadPriorityLowest, 11}, - {-3, ffs(kNtNormalPriorityClass), kNtThreadPriorityAboveNormal, 10}, - {-1, ffs(kNtNormalPriorityClass), kNtThreadPriorityHighest, 9}, - {0, ffs(kNtNormalPriorityClass), kNtThreadPriorityNormal, 9}, - {1, ffs(kNtNormalPriorityClass), kNtThreadPriorityAboveNormal, 8}, - {2, ffs(kNtNormalPriorityClass), kNtThreadPriorityBelowNormal, 8}, - {3, ffs(kNtNormalPriorityClass), kNtThreadPriorityNormal, 7}, - {4, ffs(kNtNormalPriorityClass), kNtThreadPriorityLowest, 7}, - {5, ffs(kNtIdlePriorityClass), kNtThreadPriorityHighest, 6}, - {6, ffs(kNtNormalPriorityClass), kNtThreadPriorityBelowNormal, 6}, - {7, ffs(kNtIdlePriorityClass), kNtThreadPriorityAboveNormal, 5}, - {9, ffs(kNtNormalPriorityClass), kNtThreadPriorityLowest, 5}, - {11, ffs(kNtIdlePriorityClass), kNtThreadPriorityNormal, 4}, - {13, ffs(kNtIdlePriorityClass), kNtThreadPriorityBelowNormal, 3}, - {15, ffs(kNtIdlePriorityClass), kNtThreadPriorityLowest, 2}, - {17, ffs(kNtHighPriorityClass), kNtThreadPriorityIdle, 1}, - {18, ffs(kNtNormalPriorityClass), kNtThreadPriorityIdle, 1}, - {19, ffs(kNtIdlePriorityClass), kNtThreadPriorityIdle, 1}, -}; - -hidden const unsigned kNtPriorityCombosLen = ARRAYLEN(kNtPriorityCombos); diff --git a/libc/calls/kntprioritycombos.internal.h b/libc/calls/kntprioritycombos.internal.h old mode 100644 new mode 100755 index 147ab867f..e69de29bb --- a/libc/calls/kntprioritycombos.internal.h +++ b/libc/calls/kntprioritycombos.internal.h @@ -1,18 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_CALLS_KNTPRIORITYCOMBOS_H_ -#define COSMOPOLITAN_LIBC_CALLS_KNTPRIORITYCOMBOS_H_ -#if !(__ASSEMBLER__ + __LINKER__ + 0) -COSMOPOLITAN_C_START_ - -struct NtPriorityCombo { - int8_t nice; /* sorted by this */ - int8_t lg2tier; - int8_t wut; - int8_t prio; -}; - -hidden extern const unsigned kNtPriorityCombosLen; -hidden extern const struct NtPriorityCombo kNtPriorityCombos[]; - -COSMOPOLITAN_C_END_ -#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#endif /* COSMOPOLITAN_LIBC_CALLS_KNTPRIORITYCOMBOS_H_ */ diff --git a/libc/calls/lseek.c b/libc/calls/lseek.c index bd004d19f..19d4fda31 100644 --- a/libc/calls/lseek.c +++ b/libc/calls/lseek.c @@ -74,7 +74,7 @@ * @threadsafe * @vforksafe */ -int64_t lseek(int fd, int64_t offset, unsigned whence) { +int64_t lseek(int fd, int64_t offset, int whence) { int64_t rc; if (fd < g_fds.n && g_fds.p[fd].kind == kFdZip) { rc = _weaken(__zipos_lseek)( diff --git a/libc/calls/nice.c b/libc/calls/nice.c index b113ec37f..4f01aff2c 100644 --- a/libc/calls/nice.c +++ b/libc/calls/nice.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" #include "libc/fmt/conv.h" +#include "libc/limits.h" #include "libc/macros.internal.h" #include "libc/sysv/consts/prio.h" diff --git a/libc/calls/posix_fadvise.c b/libc/calls/posix_fadvise.c index ea2b0d5e7..5abda646b 100644 --- a/libc/calls/posix_fadvise.c +++ b/libc/calls/posix_fadvise.c @@ -44,7 +44,7 @@ int sys_fadvise_netbsd(int, int, int64_t, int64_t, int) asm("sys_fadvise"); * @returnserrno * @threadsafe */ -errno_t posix_fadvise(int fd, uint64_t offset, uint64_t len, int advice) { +errno_t posix_fadvise(int fd, int64_t offset, int64_t len, int advice) { int rc, e = errno; if (IsLinux()) { rc = sys_fadvise(fd, offset, len, advice); diff --git a/libc/calls/sched_setaffinity.c b/libc/calls/sched_setaffinity.c index 63b1c9632..722326826 100644 --- a/libc/calls/sched_setaffinity.c +++ b/libc/calls/sched_setaffinity.c @@ -16,6 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/calls.h" #include "libc/calls/internal.h" #include "libc/calls/sched-sysv.internal.h" #include "libc/calls/struct/cpuset.h" @@ -32,7 +33,7 @@ static dontinline textwindows int sys_sched_setaffinity_nt( int rc; int64_t h, closeme = -1; - if (!pid /* || pid == getpid() */) { + if (!pid || pid == getpid()) { h = GetCurrentProcess(); } else if (__isfdkind(pid, kFdProcess)) { h = g_fds.p[pid].handle; diff --git a/libc/calls/setfsgid.c b/libc/calls/setfsgid.c index c6558ebae..e6029a5d3 100644 --- a/libc/calls/setfsgid.c +++ b/libc/calls/setfsgid.c @@ -17,15 +17,15 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" -#include "libc/intrin/strace.internal.h" #include "libc/calls/syscall-sysv.internal.h" #include "libc/dce.h" +#include "libc/intrin/strace.internal.h" /** * Sets user id of current process for file system ops. * @return previous filesystem gid */ -int setfsgid(int gid) { +int setfsgid(unsigned gid) { int rc; if (IsLinux()) { rc = sys_setfsgid(gid); diff --git a/libc/calls/setfsuid.c b/libc/calls/setfsuid.c index c3e7a3703..f573d57a0 100644 --- a/libc/calls/setfsuid.c +++ b/libc/calls/setfsuid.c @@ -17,15 +17,15 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" -#include "libc/intrin/strace.internal.h" #include "libc/calls/syscall-sysv.internal.h" #include "libc/dce.h" +#include "libc/intrin/strace.internal.h" /** * Sets user id of current process for file system ops. * @return previous filesystem uid */ -int setfsuid(int uid) { +int setfsuid(unsigned uid) { int rc; if (IsLinux()) { rc = sys_setfsuid(uid); diff --git a/libc/calls/setgid.c b/libc/calls/setgid.c index 37cccc8fd..021b04d87 100644 --- a/libc/calls/setgid.c +++ b/libc/calls/setgid.c @@ -17,9 +17,9 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" -#include "libc/intrin/strace.internal.h" #include "libc/calls/syscall-sysv.internal.h" #include "libc/dce.h" +#include "libc/intrin/strace.internal.h" /** * Sets group id of current process. @@ -28,7 +28,7 @@ * @raise EINVAL if gid not in legal range * @raise EPERM if lack privileges */ -int setgid(int gid) { +int setgid(unsigned gid) { int rc; if (IsWindows() && gid == getgid()) { rc = 0; diff --git a/libc/calls/setpriority-nt.c b/libc/calls/setpriority-nt.c index fda743835..3af7b8e37 100644 --- a/libc/calls/setpriority-nt.c +++ b/libc/calls/setpriority-nt.c @@ -16,37 +16,60 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/intrin/safemacros.internal.h" -#include "libc/calls/kntprioritycombos.internal.h" +#include "libc/calls/calls.h" +#include "libc/calls/internal.h" +#include "libc/calls/syscall-nt.internal.h" #include "libc/calls/syscall_support-nt.internal.h" +#include "libc/nt/enum/processaccess.h" +#include "libc/nt/enum/processcreationflags.h" #include "libc/nt/process.h" #include "libc/nt/runtime.h" -#include "libc/nt/thread.h" +#include "libc/sysv/consts/prio.h" +#include "libc/sysv/errfuns.h" -static textwindows struct NtPriorityCombo findntprio(int nice) { - size_t l, r, m; - l = 0; - r = kNtPriorityCombosLen; - while (l < r) { - m = (l + r) >> 1; - if (kNtPriorityCombos[m].nice > nice) { - r = m; - } else { - l = m + 1; - } - } - return kNtPriorityCombos[max(0, l - 1)]; -} - -textwindows int sys_setpriority_nt(int nice) { +textwindows int sys_setpriority_nt(int which, unsigned pid, int nice) { + int rc; uint32_t tier; - struct NtPriorityCombo p; - p = findntprio(nice); - tier = 1 << (p.lg2tier - 1); - if (SetPriorityClass(GetCurrentProcess(), tier) && - SetThreadPriority(GetCurrentThread(), p.wut)) { - return p.nice; - } else { - return __winerr(); + int64_t h, closeme = -1; + + if (which != PRIO_PROCESS) { + return einval(); } + + if (!pid || pid == getpid()) { + h = GetCurrentProcess(); + } else if (__isfdkind(pid, kFdProcess)) { + h = g_fds.p[pid].handle; + } else { + h = OpenProcess(kNtProcessSetInformation | kNtProcessQueryInformation, + false, pid); + if (!h) return __winerr(); + closeme = h; + } + + if (nice <= -15) { + tier = kNtRealtimePriorityClass; + } else if (nice <= -9) { + tier = kNtHighPriorityClass; + } else if (nice <= -3) { + tier = kNtAboveNormalPriorityClass; + } else if (nice <= 3) { + tier = kNtNormalPriorityClass; + } else if (nice <= 12) { + tier = kNtBelowNormalPriorityClass; + } else { + tier = kNtIdlePriorityClass; + } + + if (SetPriorityClass(h, tier)) { + rc = 0; + } else { + rc = __winerr(); + } + + if (closeme != -1) { + CloseHandle(closeme); + } + + return rc; } diff --git a/libc/calls/setpriority.c b/libc/calls/setpriority.c index 13eb826d4..34381f875 100644 --- a/libc/calls/setpriority.c +++ b/libc/calls/setpriority.c @@ -20,22 +20,38 @@ #include "libc/calls/syscall-nt.internal.h" #include "libc/calls/syscall-sysv.internal.h" #include "libc/dce.h" +#include "libc/intrin/describeflags.internal.h" +#include "libc/intrin/strace.internal.h" /** * Sets nice value of thing. * - * @param which can be PRIO_PROCESS, PRIO_PGRP, PRIO_USER + * On Windows, there's only six priority classes. We define them as -16 + * (realtime), -10 (high), -5 (above), 0 (normal), 5 (below), 15 (idle) + * which are the only values that'll roundtrip getpriority/setpriority. + * + * @param which can be one of: + * - `PRIO_PROCESS` is supported universally + * - `PRIO_PGRP` is supported on unix + * - `PRIO_USER` is supported on unix * @param who is the pid, pgid, or uid, 0 meaning current * @param value ∈ [-NZERO,NZERO) which is clamped automatically - * @return 0 on success or -1 w/ errno - * @error EACCES if lower that RLIMIT_NICE - * @error EACCES on Linux without CAP_SYS_NICE - * @see getpriority(), nice() + * @return 0 on success, or -1 w/ errno + * @raise EINVAL if `which` was invalid or unsupported + * @error EACCES if `value` lower that `RLIMIT_NICE` + * @error EACCES on Linux without `CAP_SYS_NICE` + * @raise EPERM if access to process was denied + * @raise ESRCH if the process didn't exist + * @see getpriority() */ int setpriority(int which, unsigned who, int value) { + int rc; if (!IsWindows()) { - return sys_setpriority(which, who, value); + rc = sys_setpriority(which, who, value); } else { - return sys_getsetpriority_nt(which, who, value, sys_setpriority_nt); + rc = sys_setpriority_nt(which, who, value); } + STRACE("setpriority(%s, %u, %d) → %d% m", DescribeWhichPrio(which), who, + value, rc); + return rc; } diff --git a/libc/calls/setuid.c b/libc/calls/setuid.c index cf10ba64b..3b1ef2b21 100644 --- a/libc/calls/setuid.c +++ b/libc/calls/setuid.c @@ -17,9 +17,9 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" -#include "libc/intrin/strace.internal.h" #include "libc/calls/syscall-sysv.internal.h" #include "libc/dce.h" +#include "libc/intrin/strace.internal.h" /** * Sets user id of current process. @@ -30,7 +30,7 @@ * @raise EAGAIN change would cause `RLIMIT_NPROC` to be exceeded * @raise EPERM if lack privileges */ -int setuid(int uid) { +int setuid(unsigned uid) { int rc; if (IsWindows() && uid == getuid()) { rc = 0; diff --git a/libc/calls/sigaltstack.c b/libc/calls/sigaltstack.c index 6902eac58..6693d5969 100644 --- a/libc/calls/sigaltstack.c +++ b/libc/calls/sigaltstack.c @@ -16,7 +16,6 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/intrin/strace.internal.h" #include "libc/calls/struct/metasigaltstack.h" #include "libc/calls/struct/sigaltstack.h" #include "libc/calls/struct/sigaltstack.internal.h" @@ -24,6 +23,8 @@ #include "libc/dce.h" #include "libc/intrin/asan.internal.h" #include "libc/intrin/describeflags.internal.h" +#include "libc/intrin/strace.internal.h" +#include "libc/sysv/consts/ss.h" #include "libc/sysv/errfuns.h" static void sigaltstack2bsd(struct sigaltstack_bsd *bsd, @@ -76,6 +77,8 @@ static void sigaltstack2linux(struct sigaltstack *linux, * @param neu if non-null will install new signal alt stack * @param old if non-null will receive current signal alt stack * @return 0 on success, or -1 w/ errno + * @raise EFAULT if bad memory was supplied + * @raise ENOMEM if `neu->ss_size` is less than `MINSIGSTKSZ` */ int sigaltstack(const struct sigaltstack *neu, struct sigaltstack *old) { int rc; @@ -86,6 +89,8 @@ int sigaltstack(const struct sigaltstack *neu, struct sigaltstack *old) { (neu && (__asan_check(neu, sizeof(*neu)).kind || __asan_check(neu->ss_sp, neu->ss_size).kind)))) { rc = efault(); + } else if (neu && neu->ss_size < MINSIGSTKSZ) { + rc = enomem(); } else if (IsLinux() || IsBsd()) { if (IsLinux()) { a = neu; diff --git a/libc/calls/struct/dirent.h b/libc/calls/struct/dirent.h index ac3605c9a..b9027a56e 100644 --- a/libc/calls/struct/dirent.h +++ b/libc/calls/struct/dirent.h @@ -20,8 +20,13 @@ int closedir(DIR *); int dirfd(DIR *); long telldir(DIR *); struct dirent *readdir(DIR *); +int readdir_r(DIR *, struct dirent *, struct dirent **); void rewinddir(DIR *); void seekdir(DIR *, long); +int alphasort(const struct dirent **, const struct dirent **); +int versionsort(const struct dirent **, const struct dirent **); +int scandir(const char *, struct dirent ***, int (*)(const struct dirent *), + int (*)(const struct dirent **, const struct dirent **)); COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/calls/syscall-nt.internal.h b/libc/calls/syscall-nt.internal.h index 7410b5672..4d011f596 100644 --- a/libc/calls/syscall-nt.internal.h +++ b/libc/calls/syscall-nt.internal.h @@ -20,8 +20,7 @@ int sys_fork_nt(void) hidden; int sys_ftruncate_nt(int64_t, uint64_t) hidden; int sys_getloadavg_nt(double *, int) hidden; int sys_getppid_nt(void) hidden; -int sys_getpriority_nt(int) hidden; -int sys_getsetpriority_nt(int, int, int, int (*)(int)); +int sys_getpriority_nt(int, unsigned) hidden; int sys_kill_nt(int, int) hidden; int sys_linkat_nt(int, const char *, int, const char *) hidden; int sys_madvise_nt(void *, size_t, int) hidden; @@ -31,7 +30,7 @@ int sys_open_nt(int, const char *, uint32_t, int32_t) dontdiscard hidden; int sys_pipe_nt(int[hasatleast 2], unsigned) hidden; int sys_renameat_nt(int, const char *, int, const char *) hidden; int sys_sched_yield_nt(void) hidden; -int sys_setpriority_nt(int) hidden; +int sys_setpriority_nt(int, unsigned, int) hidden; int sys_symlinkat_nt(const char *, int, const char *) hidden; int sys_sync_nt(void) hidden; int sys_truncate_nt(const char *, uint64_t) hidden; diff --git a/libc/calls/termios.h b/libc/calls/termios.h index 19ad16c71..91e11f720 100644 --- a/libc/calls/termios.h +++ b/libc/calls/termios.h @@ -31,8 +31,8 @@ int tcflow(int, int); int tcflush(int, int); int tcsendbreak(int, int); void cfmakeraw(struct termios *); -int cfsetospeed(struct termios *, int); -int cfsetispeed(struct termios *, int); +int cfsetospeed(struct termios *, unsigned); +int cfsetispeed(struct termios *, unsigned); uint32_t cfgetospeed(const struct termios *); uint32_t cfgetispeed(const struct termios *); diff --git a/libc/calls/tkill.c b/libc/calls/tkill.c index 0be116697..cfff8bcd6 100644 --- a/libc/calls/tkill.c +++ b/libc/calls/tkill.c @@ -48,6 +48,10 @@ static textwindows int sys_tkill_nt(int tid, int sig) { * @param tid is thread id * @param sig does nothing on xnu * @return 0 on success, or -1 w/ errno + * @raise ESRCH if `tid` was valid but no such thread existed + * @raise EAGAIN if `RLIMIT_SIGPENDING` was exceeded + * @raise EINVAL if `tid` or `sig` was invalid + * @raise EPERM if permission was denied * @asyncsignalsafe */ int tkill(int tid, int sig) { diff --git a/libc/calls/truncate.c b/libc/calls/truncate.c index 3b0890afd..71da10f30 100644 --- a/libc/calls/truncate.c +++ b/libc/calls/truncate.c @@ -61,7 +61,7 @@ * @see ftruncate() * @threadsafe */ -int truncate(const char *path, uint64_t length) { +int truncate(const char *path, int64_t length) { int rc; struct ZiposUri zipname; if (IsMetal()) { diff --git a/libc/calls/umask.c b/libc/calls/umask.c index 11bbca624..d667403a0 100644 --- a/libc/calls/umask.c +++ b/libc/calls/umask.c @@ -17,9 +17,9 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" -#include "libc/intrin/strace.internal.h" #include "libc/calls/syscall-sysv.internal.h" #include "libc/dce.h" +#include "libc/intrin/strace.internal.h" /** * Sets file mode creation mask. @@ -27,7 +27,7 @@ * @return previous mask * @note always succeeds */ -int umask(int newmask) { +unsigned umask(unsigned newmask) { int oldmask; if (!IsWindows()) { oldmask = sys_umask(newmask); diff --git a/libc/calls/weirdtypes.h b/libc/calls/weirdtypes.h index 2121cd7af..8fc13707e 100644 --- a/libc/calls/weirdtypes.h +++ b/libc/calls/weirdtypes.h @@ -11,7 +11,7 @@ #define cc_t uint8_t #define clock_t int64_t /* uint64_t on xnu */ #define dev_t uint64_t /* int32_t on xnu */ -#define fsblkcnt_t int64_t +#define fsblkcnt_t uint64_t #define fsfilcnt_t int64_t /* uint32_t on xnu */ #define gid_t uint32_t #define id_t uint32_t /* int32_t on linux/freebsd/etc. */ @@ -36,6 +36,8 @@ #define timer_t void* #define uid_t uint32_t #define rlim_t uint64_t /* int64_t on bsd */ +#define clockid_t int32_t +#define nlink_t uint64_t #define TIME_T_MAX __INT64_MAX__ #define TIME_T_MIN (-TIME_T_MAX - 1) diff --git a/libc/dns/dns.h b/libc/dns/dns.h index dc9388f3e..86ab7626a 100644 --- a/libc/dns/dns.h +++ b/libc/dns/dns.h @@ -66,7 +66,7 @@ struct addrinfo { int getaddrinfo(const char *, const char *, const struct addrinfo *, struct addrinfo **) paramsnonnull((4)); -int freeaddrinfo(struct addrinfo *); +void freeaddrinfo(struct addrinfo *); int getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, int); const char *gai_strerror(int); diff --git a/libc/dns/freeaddrinfo.c b/libc/dns/freeaddrinfo.c index 147323056..aaa0b67ce 100644 --- a/libc/dns/freeaddrinfo.c +++ b/libc/dns/freeaddrinfo.c @@ -23,7 +23,7 @@ * Frees addresses returned by getaddrinfo(). * @threadsafe */ -int freeaddrinfo(struct addrinfo *ai) { +void freeaddrinfo(struct addrinfo *ai) { struct addrinfo *next; while (ai) { /* we assume ai_addr and ai_canonname are shoehorned */ @@ -31,5 +31,4 @@ int freeaddrinfo(struct addrinfo *ai) { free(ai); ai = next; } - return 0; } diff --git a/libc/dns/resolvedns.c b/libc/dns/resolvedns.c index bf83c3669..66ecf6159 100644 --- a/libc/dns/resolvedns.c +++ b/libc/dns/resolvedns.c @@ -27,6 +27,7 @@ #include "libc/runtime/runtime.h" #include "libc/sock/internal.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/stdio/rand.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" @@ -73,7 +74,7 @@ int ResolveDns(const struct ResolvConf *resolvconf, int af, const char *name, SerializeDnsHeader(msg, &h); if ((n = SerializeDnsQuestion(msg + 12, 500, &q)) == -1) return -1; if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) return -1; - if (sendto(fd, msg, 12 + n, 0, resolvconf->nameservers.p, + if (sendto(fd, msg, 12 + n, 0, (struct sockaddr *)resolvconf->nameservers.p, sizeof(*resolvconf->nameservers.p)) == 12 + n && (n = read(fd, msg, 512)) >= 12) { DeserializeDnsHeader(&h2, msg); diff --git a/libc/dns/resolvednsreverse.c b/libc/dns/resolvednsreverse.c index 5709d1a5e..44dd30544 100644 --- a/libc/dns/resolvednsreverse.c +++ b/libc/dns/resolvednsreverse.c @@ -34,6 +34,7 @@ #include "libc/mem/mem.h" #include "libc/runtime/runtime.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/stdio/rand.h" #include "libc/str/str.h" #include "libc/sysv/consts/af.h" @@ -75,7 +76,7 @@ int ResolveDnsReverse(const struct ResolvConf *resolvconf, int af, SerializeDnsHeader(msg, &h); if ((n = SerializeDnsQuestion(msg + 12, 500, &q)) == -1) return -1; if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) return -1; - if (sendto(fd, msg, 12 + n, 0, resolvconf->nameservers.p, + if (sendto(fd, msg, 12 + n, 0, (struct sockaddr *)resolvconf->nameservers.p, sizeof(*resolvconf->nameservers.p)) == 12 + n && (n = read(fd, msg, 512)) >= 12) { DeserializeDnsHeader(&h2, msg); diff --git a/libc/fmt/atoi.c b/libc/fmt/atoi.c index 58f3522be..33e29a690 100644 --- a/libc/fmt/atoi.c +++ b/libc/fmt/atoi.c @@ -36,6 +36,7 @@ * * @param s is a non-null nul-terminated string * @return the decoded signed saturated integer + * @raise ERANGE on overflow */ int atoi(const char *s) { int x, c, d; diff --git a/libc/fmt/strtoul.c b/libc/fmt/strtoul.c index facc41c18..dc3945a03 100644 --- a/libc/fmt/strtoul.c +++ b/libc/fmt/strtoul.c @@ -19,6 +19,7 @@ #include "libc/errno.h" #include "libc/fmt/conv.h" #include "libc/fmt/strtol.internal.h" +#include "libc/limits.h" #include "libc/str/str.h" #include "libc/str/tab.internal.h" @@ -34,6 +35,7 @@ * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or * decimal (base 10) by default * @return decoded integer mod 2⁶⁴ negated if leading `-` + * @raise ERANGE on overflow */ unsigned long strtoul(const char *s, char **endptr, int base) { char t = 0; @@ -45,8 +47,12 @@ unsigned long strtoul(const char *s, char **endptr, int base) { if ((c = kBase36[c & 255]) && --c < base) { t |= 1; do { - x *= base; - x += c; + if (__builtin_mul_overflow(x, base, &x) || + __builtin_add_overflow(x, c, &x)) { + if (endptr) *endptr = s + 1; + errno = ERANGE; + return ULONG_MAX; + } } while ((c = kBase36[*++s & 255]) && --c < base); } if (t && endptr) *endptr = s; diff --git a/libc/imag.h b/libc/imag.h new file mode 100644 index 000000000..22de64620 --- /dev/null +++ b/libc/imag.h @@ -0,0 +1,6 @@ +#ifndef COSMOPOLITAN_LIBC_IMAG_H_ +#define COSMOPOLITAN_LIBC_IMAG_H_ + +#define I _Complex_I + +#endif /* COSMOPOLITAN_LIBC_IMAG_H_ */ diff --git a/libc/intrin/describeflags.internal.h b/libc/intrin/describeflags.internal.h index 693a74828..f1ea22bf7 100644 --- a/libc/intrin/describeflags.internal.h +++ b/libc/intrin/describeflags.internal.h @@ -60,6 +60,7 @@ const char *DescribeSocketProtocol(char[12], int); const char *DescribeSocketType(char[64], int); const char *DescribeStdioState(char[12], int); const char *DescribeWhence(char[12], int); +const char *DescribeWhichPrio(char[12], int); #define DescribeArchPrctlCode(x) DescribeArchPrctlCode(alloca(12), x) #define DescribeCapability(x) DescribeCapability(alloca(20), x) @@ -106,6 +107,7 @@ const char *DescribeWhence(char[12], int); #define DescribeSocketType(x) DescribeSocketType(alloca(64), x) #define DescribeStdioState(x) DescribeStdioState(alloca(12), x) #define DescribeWhence(x) DescribeWhence(alloca(12), x) +#define DescribeWhichPrio(x) DescribeWhichPrio(alloca(12), x) COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/calls/getsetpriority-nt.c b/libc/intrin/describewhichprio.c similarity index 80% rename from libc/calls/getsetpriority-nt.c rename to libc/intrin/describewhichprio.c index 188394cf9..a29eacd91 100644 --- a/libc/calls/getsetpriority-nt.c +++ b/libc/intrin/describewhichprio.c @@ -1,7 +1,7 @@ /*-*- 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 │ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,14 +16,14 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/calls/calls.h" -#include "libc/fmt/conv.h" +#include "libc/fmt/itoa.h" +#include "libc/intrin/describeflags.internal.h" #include "libc/sysv/consts/prio.h" -#include "libc/sysv/errfuns.h" -textwindows int sys_getsetpriority_nt(int which, unsigned who, int value, - int (*impl)(int)) { - if (which != PRIO_PROCESS && which != PRIO_PGRP) return einval(); - if (who && who != getpid() && who != gettid()) return esrch(); - return impl(value); +const char *(DescribeWhichPrio)(char buf[12], int x) { + if (x == PRIO_PROCESS) return "PRIO_PROCESS"; + if (x == PRIO_PGRP) return "PRIO_PGRP"; + if (x == PRIO_USER) return "PRIO_USER"; + FormatInt32(buf, x); + return buf; } diff --git a/libc/intrin/pthread_setspecific.c b/libc/intrin/pthread_setspecific.c index ffa0f9351..86ff3e9da 100644 --- a/libc/intrin/pthread_setspecific.c +++ b/libc/intrin/pthread_setspecific.c @@ -23,7 +23,7 @@ /** * Sets value of TLS slot for current thread. */ -int pthread_setspecific(pthread_key_t key, void *val) { +int pthread_setspecific(pthread_key_t key, const void *val) { if (0 <= key && key < PTHREAD_KEYS_MAX) { __get_tls()->tib_keys[key] = val; return 0; diff --git a/libc/isystem/arpa/inet.h b/libc/isystem/arpa/inet.h index 2a4c7cd4e..7b85ba362 100644 --- a/libc/isystem/arpa/inet.h +++ b/libc/isystem/arpa/inet.h @@ -1,4 +1,8 @@ #ifndef LIBC_ISYSTEM_ARPA_INET_H_ #define LIBC_ISYSTEM_ARPA_INET_H_ +#include "libc/calls/weirdtypes.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" +#include "libc/sysv/consts/af.h" +#include "libc/sysv/consts/inet6.h" #endif diff --git a/libc/isystem/complex.h b/libc/isystem/complex.h index 1da2fa62f..44c91f1b6 100644 --- a/libc/isystem/complex.h +++ b/libc/isystem/complex.h @@ -1,6 +1,6 @@ #ifndef LIBC_ISYSTEM_COMPLEX_H_ #define LIBC_ISYSTEM_COMPLEX_H_ #include "libc/complex.h" +#include "libc/imag.h" #include "libc/math.h" -#define I _Complex_I #endif diff --git a/libc/isystem/dirent.h b/libc/isystem/dirent.h index 0f389f275..fa9b3e28c 100644 --- a/libc/isystem/dirent.h +++ b/libc/isystem/dirent.h @@ -2,5 +2,6 @@ #define LIBC_ISYSTEM_DIRENT_H_ #include "libc/calls/calls.h" #include "libc/calls/struct/dirent.h" +#include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/dt.h" #endif diff --git a/libc/isystem/fcntl.h b/libc/isystem/fcntl.h index 6170497a0..f516bb53e 100644 --- a/libc/isystem/fcntl.h +++ b/libc/isystem/fcntl.h @@ -1,8 +1,12 @@ #ifndef LIBC_ISYSTEM_SYS_FCNTL_H_ #define LIBC_ISYSTEM_SYS_FCNTL_H_ #include "libc/calls/calls.h" +#include "libc/calls/struct/flock.h" +#include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/at.h" #include "libc/sysv/consts/f.h" #include "libc/sysv/consts/fd.h" #include "libc/sysv/consts/o.h" +#include "libc/sysv/consts/posix.h" +#include "libc/sysv/consts/s.h" #endif diff --git a/libc/isystem/ftw.h b/libc/isystem/ftw.h new file mode 100644 index 000000000..034cb918b --- /dev/null +++ b/libc/isystem/ftw.h @@ -0,0 +1,6 @@ +#ifndef COSMOPOLITAN_LIBC_ISYSTEM_FTW_H_ +#define COSMOPOLITAN_LIBC_ISYSTEM_FTW_H_ +#include "libc/calls/weirdtypes.h" +#include "libc/sysv/consts/s.h" +#include "third_party/musl/ftw.h" +#endif /* COSMOPOLITAN_LIBC_ISYSTEM_FTW_H_ */ diff --git a/libc/isystem/glob.h b/libc/isystem/glob.h new file mode 100644 index 000000000..bdefa8042 --- /dev/null +++ b/libc/isystem/glob.h @@ -0,0 +1,4 @@ +#ifndef COSMOPOLITAN_LIBC_ISYSTEM_GLOB_H_ +#define COSMOPOLITAN_LIBC_ISYSTEM_GLOB_H_ +#include "third_party/musl/glob.h" +#endif /* COSMOPOLITAN_LIBC_ISYSTEM_GLOB_H_ */ diff --git a/libc/isystem/inttypes.h b/libc/isystem/inttypes.h index f95642209..5d0afed9e 100644 --- a/libc/isystem/inttypes.h +++ b/libc/isystem/inttypes.h @@ -2,4 +2,6 @@ #define LIBC_ISYSTEM_INTTYPES_H_ #include "libc/fmt/conv.h" #include "libc/inttypes.h" +#include "libc/limits.h" +#include "libc/literal.h" #endif /* LIBC_ISYSTEM_INTTYPES_H_ */ diff --git a/libc/isystem/langinfo.h b/libc/isystem/langinfo.h index 333daa44d..de503701f 100644 --- a/libc/isystem/langinfo.h +++ b/libc/isystem/langinfo.h @@ -1,5 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_ISYSTEM_LANGINFO_H_ #define COSMOPOLITAN_LIBC_ISYSTEM_LANGINFO_H_ #include "libc/str/langinfo.h" +#include "libc/str/locale.h" #include "libc/str/nltypes.h" #endif /* COSMOPOLITAN_LIBC_ISYSTEM_LANGINFO_H_ */ diff --git a/libc/isystem/libgen.h b/libc/isystem/libgen.h new file mode 100644 index 000000000..db17f68f0 --- /dev/null +++ b/libc/isystem/libgen.h @@ -0,0 +1,4 @@ +#ifndef COSMOPOLITAN_LIBC_ISYSTEM_LIBGEN_H_ +#define COSMOPOLITAN_LIBC_ISYSTEM_LIBGEN_H_ +#include "libc/fmt/conv.h" +#endif /* COSMOPOLITAN_LIBC_ISYSTEM_LIBGEN_H_ */ diff --git a/libc/isystem/limits.h b/libc/isystem/limits.h index 6eb8b5ff6..45a682014 100644 --- a/libc/isystem/limits.h +++ b/libc/isystem/limits.h @@ -1,9 +1,9 @@ #ifndef LIBC_ISYSTEM_LIMITS_H_ #define LIBC_ISYSTEM_LIMITS_H_ -#include "libc/thread/thread.h" #include "libc/limits.h" #include "libc/sysv/consts/_posix.h" #include "libc/sysv/consts/iov.h" #include "libc/sysv/consts/limits.h" #include "libc/sysv/consts/xopen.h" +#include "libc/thread/thread.h" #endif diff --git a/libc/isystem/netinet/in.h b/libc/isystem/netinet/in.h index 8074f9b38..db7800149 100644 --- a/libc/isystem/netinet/in.h +++ b/libc/isystem/netinet/in.h @@ -1,10 +1,12 @@ #ifndef COSMOPOLITAN_LIBC_ISYSTEM_NETINET_IN_H_ #define COSMOPOLITAN_LIBC_ISYSTEM_NETINET_IN_H_ +#include "libc/calls/weirdtypes.h" #include "libc/sock/sock.h" #include "libc/sock/struct/ip_mreq.h" #include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr6.h" #include "libc/sysv/consts/inaddr.h" +#include "libc/sysv/consts/inet6.h" #include "libc/sysv/consts/ip.h" #include "libc/sysv/consts/ipport.h" #include "libc/sysv/consts/ipproto.h" diff --git a/libc/isystem/netinet/tcp.h b/libc/isystem/netinet/tcp.h new file mode 100644 index 000000000..99f109334 --- /dev/null +++ b/libc/isystem/netinet/tcp.h @@ -0,0 +1,6 @@ +#ifndef COSMOPOLITAN_LIBC_ISYSTEM_NETINET_TCP_H_ +#define COSMOPOLITAN_LIBC_ISYSTEM_NETINET_TCP_H_ +#include "libc/sysv/consts/sol.h" +#include "libc/sysv/consts/tcp.h" +#include "libc/sysv/consts/tcpopt.h" +#endif /* COSMOPOLITAN_LIBC_ISYSTEM_NETINET_TCP_H_ */ diff --git a/libc/isystem/netinet/udp.h b/libc/isystem/netinet/udp.h new file mode 100644 index 000000000..754e916af --- /dev/null +++ b/libc/isystem/netinet/udp.h @@ -0,0 +1,4 @@ +#ifndef COSMOPOLITAN_LIBC_ISYSTEM_NETINET_UDP_H_ +#define COSMOPOLITAN_LIBC_ISYSTEM_NETINET_UDP_H_ +#include "libc/sysv/consts/sol.h" +#endif /* COSMOPOLITAN_LIBC_ISYSTEM_NETINET_UDP_H_ */ diff --git a/libc/isystem/poll.h b/libc/isystem/poll.h index 5326a1d0b..0a88a6e01 100644 --- a/libc/isystem/poll.h +++ b/libc/isystem/poll.h @@ -1,5 +1,6 @@ #ifndef LIBC_ISYSTEM_POLL_H_ #define LIBC_ISYSTEM_POLL_H_ +#include "libc/calls/weirdtypes.h" #include "libc/sock/sock.h" #include "libc/sock/struct/pollfd.h" #include "libc/sysv/consts/poll.h" diff --git a/libc/isystem/pthread.h b/libc/isystem/pthread.h index 77ba04720..ddd82f16f 100644 --- a/libc/isystem/pthread.h +++ b/libc/isystem/pthread.h @@ -1,5 +1,7 @@ #ifndef LIBC_ISYSTEM_PTHREAD_H_ #define LIBC_ISYSTEM_PTHREAD_H_ +#include "libc/calls/weirdtypes.h" +#include "libc/sysv/consts/clock.h" #include "libc/thread/thread.h" #include "libc/thread/thread2.h" #endif /* LIBC_ISYSTEM_PTHREAD_H_ */ diff --git a/libc/isystem/sched.h b/libc/isystem/sched.h index b5381dd38..a91e4cf23 100644 --- a/libc/isystem/sched.h +++ b/libc/isystem/sched.h @@ -3,5 +3,6 @@ #include "libc/calls/calls.h" #include "libc/calls/struct/cpuset.h" #include "libc/calls/struct/sched_param.h" +#include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/sched.h" #endif diff --git a/libc/isystem/signal.h b/libc/isystem/signal.h index 56733fe19..f009abeca 100644 --- a/libc/isystem/signal.h +++ b/libc/isystem/signal.h @@ -6,4 +6,5 @@ #include "libc/calls/struct/siginfo.h" #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sicode.h" +#include "libc/sysv/consts/ss.h" #endif diff --git a/libc/isystem/spawn.h b/libc/isystem/spawn.h new file mode 100644 index 000000000..679428a19 --- /dev/null +++ b/libc/isystem/spawn.h @@ -0,0 +1,5 @@ +#ifndef COSMOPOLITAN_LIBC_ISYSTEM_SPAWN_H_ +#define COSMOPOLITAN_LIBC_ISYSTEM_SPAWN_H_ +#include "libc/calls/weirdtypes.h" +#include "libc/stdio/spawn.h" +#endif /* COSMOPOLITAN_LIBC_ISYSTEM_SPAWN_H_ */ diff --git a/libc/isystem/stdint.h b/libc/isystem/stdint.h index 5a3dc2798..1f16a96a2 100644 --- a/libc/isystem/stdint.h +++ b/libc/isystem/stdint.h @@ -1,5 +1,6 @@ #ifndef LIBC_ISYSTEM_STDINT_H_ #define LIBC_ISYSTEM_STDINT_H_ +#include "libc/inttypes.h" #include "libc/limits.h" #include "libc/literal.h" #endif diff --git a/libc/isystem/stdio.h b/libc/isystem/stdio.h index a9a67e076..cf5d81c8f 100644 --- a/libc/isystem/stdio.h +++ b/libc/isystem/stdio.h @@ -1,9 +1,11 @@ #ifndef LIBC_ISYSTEM_STDIO_H_ #define LIBC_ISYSTEM_STDIO_H_ #include "libc/calls/calls.h" +#include "libc/calls/dprintf.h" +#include "libc/calls/weirdtypes.h" #include "libc/fmt/fmt.h" #include "libc/mem/fmt.h" -#include "libc/stdio/lock.internal.h" #include "libc/stdio/stdio.h" #include "libc/stdio/temp.h" +#include "third_party/musl/tempnam.h" #endif diff --git a/libc/isystem/stdlib.h b/libc/isystem/stdlib.h index f3a130fff..79609ca1d 100644 --- a/libc/isystem/stdlib.h +++ b/libc/isystem/stdlib.h @@ -1,11 +1,19 @@ #ifndef LIBC_ISYSTEM_STDLIB_H_ #define LIBC_ISYSTEM_STDLIB_H_ -#include "libc/mem/alg.h" +#include "libc/calls/calls.h" +#include "libc/calls/dprintf.h" +#include "libc/calls/termios.h" #include "libc/fmt/conv.h" +#include "libc/limits.h" +#include "libc/mem/alg.h" #include "libc/mem/mem.h" -#include "libc/stdio/rand.h" #include "libc/runtime/runtime.h" +#include "libc/stdio/rand.h" #include "libc/stdio/temp.h" +#include "libc/str/str.h" #include "libc/sysv/consts/exit.h" #include "third_party/gdtoa/gdtoa.h" +#include "third_party/getopt/getopt.h" +#include "third_party/musl/crypt.h" +#include "third_party/musl/rand48.h" #endif diff --git a/libc/isystem/strings.h b/libc/isystem/strings.h index 997b2fcca..1c6fc89fb 100644 --- a/libc/isystem/strings.h +++ b/libc/isystem/strings.h @@ -1,7 +1,10 @@ #ifndef COSMOPOLITAN_LIBC_ISYSTEM_STRINGS_H_ #define COSMOPOLITAN_LIBC_ISYSTEM_STRINGS_H_ +#include "libc/str/locale.h" #include "libc/str/str.h" + #if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) #include "libc/nexgen32e/ffs.h" #endif + #endif /* COSMOPOLITAN_LIBC_ISYSTEM_STRINGS_H_ */ diff --git a/libc/isystem/sys/socket.h b/libc/isystem/sys/socket.h index 948a7b939..bb311e8e1 100644 --- a/libc/isystem/sys/socket.h +++ b/libc/isystem/sys/socket.h @@ -1,5 +1,6 @@ #ifndef LIBC_ISYSTEM_SYS_SOCKET_H_ #define LIBC_ISYSTEM_SYS_SOCKET_H_ +#include "libc/calls/weirdtypes.h" #include "libc/sock/sock.h" #include "libc/sock/struct/linger.h" #include "libc/sock/struct/msghdr.h" diff --git a/libc/isystem/sys/statvfs.h b/libc/isystem/sys/statvfs.h index 9fca9a003..d0db9f826 100644 --- a/libc/isystem/sys/statvfs.h +++ b/libc/isystem/sys/statvfs.h @@ -1,5 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_ISYSTEM_STATVFS_H_ #define COSMOPOLITAN_LIBC_ISYSTEM_STATVFS_H_ #include "libc/calls/struct/statvfs.h" +#include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/st.h" #endif /* COSMOPOLITAN_LIBC_ISYSTEM_STATVFS_H_ */ diff --git a/libc/isystem/sys/time.h b/libc/isystem/sys/time.h index 3cd4ea469..3ad0ae0d3 100644 --- a/libc/isystem/sys/time.h +++ b/libc/isystem/sys/time.h @@ -1,7 +1,9 @@ #ifndef LIBC_ISYSTEM_SYS_TIME_H_ #define LIBC_ISYSTEM_SYS_TIME_H_ -#include "libc/calls/struct/timeval.h" #include "libc/calls/struct/itimerval.h" +#include "libc/calls/struct/timeval.h" +#include "libc/calls/weirdtypes.h" +#include "libc/sock/select.h" #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/itimer.h" #include "libc/time/struct/timezone.h" diff --git a/libc/isystem/sys/times.h b/libc/isystem/sys/times.h index d7d06e0a3..2a5dbfcab 100644 --- a/libc/isystem/sys/times.h +++ b/libc/isystem/sys/times.h @@ -2,4 +2,5 @@ #define COSMOPOLITAN_LIBC_ISYSTEM_SYS_TIMES_H_ #include "libc/calls/calls.h" #include "libc/calls/struct/tms.h" +#include "libc/calls/weirdtypes.h" #endif /* COSMOPOLITAN_LIBC_ISYSTEM_SYS_TIMES_H_ */ diff --git a/libc/isystem/sys/types.h b/libc/isystem/sys/types.h index 3739af21e..ff476054b 100644 --- a/libc/isystem/sys/types.h +++ b/libc/isystem/sys/types.h @@ -2,11 +2,12 @@ #define LIBC_ISYSTEM_SYS_TYPES_H_ #include "libc/calls/makedev.h" #include "libc/calls/weirdtypes.h" +#include "libc/thread/thread.h" #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) -#include "libc/intrin/newbie.h" #include "libc/calls/typedef/u.h" #include "libc/calls/weirdtypes.h" +#include "libc/intrin/newbie.h" #include "libc/sock/select.h" #include "libc/sysv/consts/endian.h" #endif diff --git a/libc/isystem/sys/uio.h b/libc/isystem/sys/uio.h index 38c871d08..f2f6d4960 100644 --- a/libc/isystem/sys/uio.h +++ b/libc/isystem/sys/uio.h @@ -1,4 +1,5 @@ #ifndef COSMOPOLITAN_LIBC_ISYSTEM_SYS_UIO_H_ #define COSMOPOLITAN_LIBC_ISYSTEM_SYS_UIO_H_ #include "libc/calls/calls.h" +#include "libc/calls/struct/iovec.h" #endif /* COSMOPOLITAN_LIBC_ISYSTEM_SYS_UIO_H_ */ diff --git a/libc/isystem/sys/un.h b/libc/isystem/sys/un.h index f93565a54..8212c66ef 100644 --- a/libc/isystem/sys/un.h +++ b/libc/isystem/sys/un.h @@ -1,4 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_ISYSTEM_SYS_UN_H_ #define COSMOPOLITAN_LIBC_ISYSTEM_SYS_UN_H_ +#include "libc/calls/weirdtypes.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #endif /* COSMOPOLITAN_LIBC_ISYSTEM_SYS_UN_H_ */ diff --git a/libc/isystem/sys/wait.h b/libc/isystem/sys/wait.h index 0bf76cb6e..2be2345b2 100644 --- a/libc/isystem/sys/wait.h +++ b/libc/isystem/sys/wait.h @@ -1,6 +1,8 @@ #ifndef LIBC_ISYSTEM_SYS_WAIT_H_ #define LIBC_ISYSTEM_SYS_WAIT_H_ #include "libc/calls/calls.h" +#include "libc/calls/struct/siginfo.h" #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/w.h" +#include "libc/sysv/consts/waitid.h" #endif diff --git a/libc/isystem/termios.h b/libc/isystem/termios.h index a0c65572a..2ea2aacf5 100644 --- a/libc/isystem/termios.h +++ b/libc/isystem/termios.h @@ -1,6 +1,7 @@ #ifndef COSMOPOLITAN_LIBC_ISYSTEM_TERMIOS_H_ #define COSMOPOLITAN_LIBC_ISYSTEM_TERMIOS_H_ #include "libc/calls/termios.h" +#include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/baud.h" #include "libc/sysv/consts/termios.h" #endif /* COSMOPOLITAN_LIBC_ISYSTEM_TERMIOS_H_ */ diff --git a/libc/isystem/tgmath.h b/libc/isystem/tgmath.h index 1150fe8e3..ed6bd063d 100644 --- a/libc/isystem/tgmath.h +++ b/libc/isystem/tgmath.h @@ -1,10 +1,10 @@ #ifndef LIBC_ISYSTEM_TGMATH_H_ #define LIBC_ISYSTEM_TGMATH_H_ #include "libc/complex.h" +#include "libc/imag.h" #include "libc/math.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) #if __STDC_VERSION__ + 0 >= 201112 -COSMOPOLITAN_C_START_ /* from https://en.cppreference.com/w/c/numeric/tgmath */ @@ -268,8 +268,11 @@ COSMOPOLITAN_C_START_ : remainder, long double \ : remainderl)(x, y) -#define remquo(x, y) \ - _Generic((x), float : remquof, default : remquo, long double : remquol)(x, y) +#define remquo(x, y, z) \ + _Generic((x), float \ + : remquof, default \ + : remquo, long double \ + : remquol)(x, y, z) #define rint(x) \ _Generic((x), float : rintf, default : rint, long double : rintl)(x) @@ -294,38 +297,36 @@ COSMOPOLITAN_C_START_ #define carg(x) \ _Generic((x), complex float \ - : cargf, complex default \ + : cargf, default \ : carg, complex long double \ : cargl)(x) #define conj(x) \ _Generic((x), complex float \ - : conjf, complex default \ + : conjf, default \ : conj, complex long double \ : conjl)(x) #undef creal #define creal(x) \ _Generic((x), complex float \ - : crealf, complex default \ + : crealf, default \ : creal, complex long double \ : creall)(x) #undef cimag #define cimag(x) \ _Generic((x), complex float \ - : cimagf, complex default \ + : cimagf, default \ : cimag, complex long double \ : cimagl)(x) #define cproj(x) \ _Generic((x), complex float \ - : cprojf, complex default \ + : cprojf, default \ : cproj, complex long double \ : cprojl)(x) -COSMOPOLITAN_C_END_ - #endif /* C11 */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* LIBC_ISYSTEM_TGMATH_H_ */ diff --git a/libc/isystem/time.h b/libc/isystem/time.h index 64a6b69fa..f1af736fe 100644 --- a/libc/isystem/time.h +++ b/libc/isystem/time.h @@ -5,6 +5,7 @@ #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" +#include "libc/sysv/consts/timer.h" #include "libc/time/struct/tm.h" #include "libc/time/time.h" #endif diff --git a/libc/isystem/unistd.h b/libc/isystem/unistd.h index ef6635601..4632df6ca 100644 --- a/libc/isystem/unistd.h +++ b/libc/isystem/unistd.h @@ -3,9 +3,13 @@ #include "libc/calls/calls.h" #include "libc/calls/weirdtypes.h" #include "libc/runtime/pathconf.h" +#include "libc/runtime/runtime.h" #include "libc/runtime/sysconf.h" +#include "libc/sysv/consts/f.h" #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" +#include "libc/time/time.h" #include "third_party/getopt/getopt.h" +#include "third_party/musl/crypt.h" #endif diff --git a/libc/isystem/wchar.h b/libc/isystem/wchar.h index 481f84ce5..4fb2f7eba 100644 --- a/libc/isystem/wchar.h +++ b/libc/isystem/wchar.h @@ -1,5 +1,7 @@ #ifndef LIBC_ISYSTEM_WCHAR_H_ #define LIBC_ISYSTEM_WCHAR_H_ +#include "libc/fmt/conv.h" +#include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/str/unicode.h" #include "libc/time/time.h" diff --git a/libc/isystem/wctype.h b/libc/isystem/wctype.h index abab50ae4..da1785f31 100644 --- a/libc/isystem/wctype.h +++ b/libc/isystem/wctype.h @@ -1,4 +1,6 @@ #ifndef LIBC_ISYSTEM_WCTYPE_H_ #define LIBC_ISYSTEM_WCTYPE_H_ +#include "libc/calls/calls.h" +#include "libc/fmt/conv.h" #include "libc/str/str.h" #endif diff --git a/libc/limits.h b/libc/limits.h index ea4d9da32..458dc7348 100644 --- a/libc/limits.h +++ b/libc/limits.h @@ -35,6 +35,7 @@ #define UINT64_MAX __UINT64_MAX__ #define INTMAX_MAX __INTMAX_MAX__ #define UINTMAX_MAX __UINTMAX_MAX__ +#define SSIZE_MAX __INT64_MAX__ #define SCHAR_MIN (-SCHAR_MAX - 1) #define SHRT_MIN (-SHRT_MAX - 1) @@ -107,22 +108,42 @@ #define NL_SETMAX 255 #define NL_TEXTMAX 2048 -#define UINT_FAST64_MAX __UINT_FAST64_MAX__ -#define UINT_FAST8_MAX __UINT_FAST8_MAX__ -#define INT_FAST32_MAX __INT_FAST32_MAX__ -#define INT_FAST16_MAX __INT_FAST16_MAX__ -#define UINT_FAST32_MAX __UINT_FAST32_MAX__ -#define INT_FAST8_MAX __INT_FAST8_MAX__ -#define INT_FAST64_MAX __INT_FAST64_MAX__ -#define UINT_FAST16_MAX __UINT_FAST16_MAX__ +#define INT_FAST8_MIN (-__INT_FAST8_MAX__ - 1) +#define INT_FAST16_MIN (-__INT_FAST16_MAX__ - 1) +#define INT_FAST32_MIN (-__INT_FAST32_MAX__ - 1) +#define INT_FAST64_MIN (-__INT_FAST64_MAX__ - 1) +#define INT_LEAST8_MIN (-__INT_LEAST8_MAX__ - 1) +#define INT_LEAST16_MIN (-__INT_LEAST16_MAX__ - 1) +#define INT_LEAST32_MIN (-__INT_LEAST32_MAX__ - 1) +#define INT_LEAST64_MIN (-__INT_LEAST64_MAX__ - 1) +#define INT_FAST8_MAX __INT_FAST8_MAX__ +#define INT_FAST16_MAX __INT_FAST16_MAX__ +#define INT_FAST32_MAX __INT_FAST32_MAX__ +#define INT_FAST64_MAX __INT_FAST64_MAX__ +#define INT_LEAST8_MAX __INT_LEAST8_MAX__ +#define INT_LEAST16_MAX __INT_LEAST16_MAX__ +#define INT_LEAST32_MAX __INT_LEAST32_MAX__ +#define INT_LEAST64_MAX __INT_LEAST64_MAX__ +#define UINT_FAST8_MAX __UINT_FAST8_MAX__ +#define UINT_FAST16_MAX __UINT_FAST16_MAX__ +#define UINT_FAST32_MAX __UINT_FAST32_MAX__ +#define UINT_FAST64_MAX __UINT_FAST64_MAX__ +#define UINT_LEAST8_MAX __UINT_LEAST8_MAX__ +#define UINT_LEAST16_MAX __UINT_LEAST16_MAX__ +#define UINT_LEAST32_MAX __UINT_LEAST32_MAX__ +#define UINT_LEAST64_MAX __UINT_LEAST64_MAX__ -#define UINT_FAST64_MIN (-UINT_FAST64_MAX - 1) -#define UINT_FAST8_MIN (-UINT_FAST8_MAX - 1) -#define INT_FAST32_MIN (-INT_FAST32_MAX - 1) -#define INT_FAST16_MIN (-INT_FAST16_MAX - 1) -#define UINT_FAST32_MIN (-UINT_FAST32_MAX - 1) -#define INT_FAST8_MIN (-INT_FAST8_MAX - 1) -#define INT_FAST64_MIN (-INT_FAST64_MAX - 1) -#define UINT_FAST16_MIN (-UINT_FAST16_MAX - 1) +#define BC_BASE_MAX 99 +#define BC_DIM_MAX 2048 +#define BC_SCALE_MAX 99 +#define BC_STRING_MAX 1000 +#define CHARCLASS_NAME_MAX 14 +#define COLL_WEIGHTS_MAX 2 +#define EXPR_NEST_MAX 32 +#define LINE_MAX 4096 +#define RE_DUP_MAX 255 +#define LONG_BIT 64 +#define NZERO 20 +#define NL_LANGMAX 32 #endif /* COSMOPOLITAN_LIBC_LIMITS_H_ */ diff --git a/libc/literal.h b/libc/literal.h index d9ae4456a..9f7184db8 100644 --- a/libc/literal.h +++ b/libc/literal.h @@ -22,6 +22,14 @@ #define UINT64_C(c) c##UL #endif +#if UINTPTR_MAX == UINT64_MAX +#define INTMAX_C(c) c##L +#define UINTMAX_C(c) c##UL +#else +#define INTMAX_C(c) c##LL +#define UINTMAX_C(c) c##ULL +#endif + #if __SIZEOF_INTMAX__ == 16 #define INT128_C(c) ((intmax_t)(c)) #define UINT128_C(c) ((uintmax_t)(c)) diff --git a/libc/log/oncrash.c b/libc/log/oncrash.c index d6ae1a992..da017092b 100644 --- a/libc/log/oncrash.c +++ b/libc/log/oncrash.c @@ -278,6 +278,7 @@ static wontreturn relegated noinstrument void __minicrash(int sig, * @vforksafe */ relegated void __oncrash(int sig, struct siginfo *si, ucontext_t *ctx) { + kprintf("oncrash\n"); intptr_t rip; int me, owner; int gdbpid, err; diff --git a/libc/math.h b/libc/math.h index e49e3f612..73800d3d9 100644 --- a/libc/math.h +++ b/libc/math.h @@ -64,8 +64,8 @@ #define FP_ZERO 2 #define FP_SUBNORMAL 3 #define FP_NORMAL 4 -#define FP_ILOGB0 (-2147483647-1) -#define FP_ILOGBNAN (-2147483647-1) +#define FP_ILOGB0 (-2147483647 - 1) +#define FP_ILOGBNAN (-2147483647 - 1) #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ @@ -99,6 +99,8 @@ typedef double double_t; #define fpclassify(x) \ __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x) +extern int signgam; + double acos(double); double acosh(double); double asin(double); @@ -307,6 +309,20 @@ void sincosl(long double, long double *, long double *); float fsumf(const float *, size_t); double fsum(const double *, size_t); +double j0(double); +double j1(double); +double jn(int, double); +float j0f(float); +float j1f(float); +float jnf(int, float); + +double y0(double); +double y1(double); +double yn(int, double); +float y0f(float); +float y1f(float); +float ynf(int, float); + COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_MATH_H_ */ diff --git a/libc/nexgen32e/longjmp.S b/libc/nexgen32e/longjmp.S index e4e2666ae..eb96b02fd 100644 --- a/libc/nexgen32e/longjmp.S +++ b/libc/nexgen32e/longjmp.S @@ -17,7 +17,6 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/macros.internal.h" -.privileged // Loads previously saved processor state. // @@ -42,3 +41,4 @@ longjmp: jmp *56(%rdi) .endfn longjmp,globl .alias longjmp,_longjmp + .alias longjmp,siglongjmp diff --git a/libc/nexgen32e/setjmp.S b/libc/nexgen32e/setjmp.S index 04c3a6deb..64da805bd 100644 --- a/libc/nexgen32e/setjmp.S +++ b/libc/nexgen32e/setjmp.S @@ -18,7 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/macros.internal.h" -// Saves caller CPU state to cacheline. +// Saves cpu state. // // @param rdi points to jmp_buf // @return rax 0 when set and !0 when longjmp'd diff --git a/libc/tinymath/rintf.S b/libc/runtime/__sigsetjmp_tail.c similarity index 69% rename from libc/tinymath/rintf.S rename to libc/runtime/__sigsetjmp_tail.c index 358ead1a3..ac622abea 100644 --- a/libc/tinymath/rintf.S +++ b/libc/runtime/__sigsetjmp_tail.c @@ -1,7 +1,7 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +/*-*- 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 │ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,32 +16,17 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" +#include "libc/assert.h" +#include "libc/calls/struct/sigset.h" +#include "libc/runtime/runtime.h" +#include "libc/sysv/consts/sig.h" -rintf: .leafprologue - .profilable - movaps %xmm0,%xmm1 - movss .LC8(%rip),%xmm2 - andps %xmm2,%xmm1 - movss .LC7(%rip),%xmm3 - comiss %xmm1,%xmm3 - jbe 1f - addss %xmm3,%xmm1 - andnps %xmm0,%xmm2 - movaps %xmm2,%xmm0 - subss %xmm3,%xmm1 - orps %xmm1,%xmm0 -1: .leafepilogue - .endfn rintf,globl - - .rodata.cst4 -.LC7: .long 1258291200 - - .rodata.cst16 -.LC8: .long 2147483647 - .long 0 - .long 0 - .long 0 - -// TODO(jart): -// vroundss $4,%xmm0,%xmm0,%xmm0 +// kudos rich felker for the brilliant design +hidden int __sigsetjmp_tail(sigjmp_buf jb, int rc) { + _Static_assert( + sizeof(sigjmp_buf) == sizeof(jmp_buf) + 8 + 8 + sizeof(sigset_t), + "please recompute sigjmp_buf w.r.t. sigset_t"); + void *p = (char *)jb + sizeof(jmp_buf) + 8 + 8; + _npassert(!sigprocmask(SIG_SETMASK, rc ? p : 0, rc ? 0 : p)); + return rc; +} diff --git a/libc/runtime/daemon.c b/libc/runtime/daemon.c new file mode 100644 index 000000000..f70011623 --- /dev/null +++ b/libc/runtime/daemon.c @@ -0,0 +1,56 @@ +/*-*- 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 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/calls.h" +#include "libc/paths.h" +#include "libc/sysv/consts/o.h" + +/** + * Daemonizes process. + */ +int daemon(int nochdir, int noclose) { + int fd; + + switch (fork()) { + case -1: + return (-1); + case 0: + break; + default: + _Exit(0); + } + + if (setsid() == -1) { + return -1; + } + + if (!nochdir) { + chdir("/"); + } + + if (!noclose && (fd = open(_PATH_DEVNULL, O_RDWR)) != -1) { + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + if (fd > 2) { + close(fd); + } + } + + return 0; +} diff --git a/libc/runtime/enable_tls.c b/libc/runtime/enable_tls.c index e89c46ae0..ed3b16f95 100644 --- a/libc/runtime/enable_tls.c +++ b/libc/runtime/enable_tls.c @@ -34,6 +34,7 @@ #include "libc/stdalign.internal.h" #include "libc/str/str.h" #include "libc/sysv/consts/nrlinux.h" +#include "libc/thread/posixthread.internal.h" #include "libc/thread/tls.h" #include "third_party/xed/x86.h" @@ -57,6 +58,7 @@ typedef char xmm_t __attribute__((__vector_size__(16), __aligned__(1))); __msabi extern typeof(TlsAlloc) *const __imp_TlsAlloc; +struct PosixThread _pthread_main; extern unsigned char __tls_mov_nt_rax[]; extern unsigned char __tls_add_nt_rax[]; _Alignas(TLS_ALIGNMENT) static char __static_tls[5008]; @@ -127,6 +129,7 @@ privileged void __enable_tls(void) { tib->tib_self = tib; tib->tib_self2 = tib; tib->tib_errno = __errno; + tib->tib_pthread = (pthread_t)&_pthread_main; if (IsLinux()) { // gnu/systemd guarantees pid==tid for the main thread so we can // avoid issuing a superfluous system call at startup in program @@ -134,6 +137,9 @@ privileged void __enable_tls(void) { } else { tib->tib_tid = sys_gettid(); } + _pthread_main.tib = tib; + _pthread_main.tid = tib->tib_tid; + _pthread_main.flags = PT_MAINTHREAD; __repmovsb(tls, _tdata_start, _TLDZ); // ask the operating system to change the x86 segment register diff --git a/libc/runtime/fenv.S b/libc/runtime/fenv.S new file mode 100644 index 000000000..c2cc71ab2 --- /dev/null +++ b/libc/runtime/fenv.S @@ -0,0 +1,119 @@ +/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ +│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/macros.internal.h" + +feclearexcept: + # maintain exceptions in the sse mxcsr, clear x87 exceptions + mov %edi,%ecx + and $0x3f,%ecx + fnstsw %ax + test %eax,%ecx + jz 1f + fnclex +1: stmxcsr -8(%rsp) + and $0x3f,%eax + or %eax,-8(%rsp) + test %ecx,-8(%rsp) + jz 1f + not %ecx + and %ecx,-8(%rsp) + ldmxcsr -8(%rsp) +1: xor %eax,%eax + ret + .endfn feclearexcept,globl + +feraiseexcept: + and $0x3f,%edi + stmxcsr -8(%rsp) + or %edi,-8(%rsp) + ldmxcsr -8(%rsp) + xor %eax,%eax + ret + .endfn feraiseexcept,globl + +__fesetround: + push %rax + xor %eax,%eax + mov %edi,%ecx + fnstcw (%rsp) + andb $0xf3,1(%rsp) + or %ch,1(%rsp) + fldcw (%rsp) + stmxcsr (%rsp) + shl $3,%ch + andb $0x9f,1(%rsp) + or %ch,1(%rsp) + ldmxcsr (%rsp) + pop %rcx + ret + .endfn __fesetround,globl,hidden + +fegetround: + push %rax + stmxcsr (%rsp) + pop %rax + shr $3,%eax + and $0xc00,%eax + ret + .endfn fegetround,globl + +fegetenv: + xor %eax,%eax + fnstenv (%rdi) + stmxcsr 28(%rdi) + ret + .endfn fegetenv,globl + +fesetenv: + xor %eax,%eax + inc %rdi + jz 1f + fldenv -1(%rdi) + ldmxcsr 27(%rdi) + ret +1: push %rax + push %rax + pushq $0xffff + pushq $0x37f + fldenv (%rsp) + pushq $0x1f80 + ldmxcsr (%rsp) + add $40,%rsp + ret + .endfn fesetenv,globl + +fetestexcept: + and $0x3f,%edi + push %rax + stmxcsr (%rsp) + pop %rsi + fnstsw %ax + or %esi,%eax + and %edi,%eax + ret + .endfn fetestexcept,globl diff --git a/libc/runtime/fenv.h b/libc/runtime/fenv.h index 4dd9c8788..f8ca8a82c 100644 --- a/libc/runtime/fenv.h +++ b/libc/runtime/fenv.h @@ -7,16 +7,24 @@ #define FE_TOWARDZERO 0x0c00 #define FE_INVALID 1 +#define __FE_DENORM 2 #define FE_DIVBYZERO 4 #define FE_OVERFLOW 8 #define FE_UNDERFLOW 16 #define FE_INEXACT 32 -#define FE_ALL_EXCEPT 61 +#define FE_ALL_EXCEPT 63 + +#ifdef __FLT_EVAL_METHOD__ +#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ +#else +#define FLT_EVAL_METHOD 0 +#endif #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ #define FLT_ROUNDS (__flt_rounds()) +#define FE_DFL_ENV ((const fenv_t *)-1) typedef void *fenv_t; typedef uint16_t fexcept_t; diff --git a/libc/runtime/runtime.h b/libc/runtime/runtime.h index 03bc97343..40953f2aa 100644 --- a/libc/runtime/runtime.h +++ b/libc/runtime/runtime.h @@ -7,6 +7,7 @@ COSMOPOLITAN_C_START_ ╚────────────────────────────────────────────────────────────────────────────│*/ typedef long jmp_buf[8]; +typedef long sigjmp_buf[12]; extern char **environ; /* CRT */ extern int __argc; /* CRT */ @@ -49,6 +50,7 @@ extern size_t __virtualmax; extern bool __isworker; void mcount(void); +int daemon(int, int); int _freestack(void *); void _bt(const char *, ...); unsigned long getauxval(unsigned long); @@ -60,6 +62,8 @@ void longjmp(jmp_buf, int) libcesque wontreturn paramsnonnull(); axdx_t setlongerjmp(jmp_buf) libcesque returnstwice paramsnonnull(); void longerjmp(jmp_buf, intptr_t) libcesque wontreturn paramsnonnull(); int _setjmp(jmp_buf) libcesque returnstwice paramsnonnull(); +int sigsetjmp(sigjmp_buf, int) libcesque returnstwice paramsnonnull(); +void siglongjmp(sigjmp_buf, int) libcesque wontreturn paramsnonnull(); void _longjmp(jmp_buf, int) libcesque wontreturn paramsnonnull(); void exit(int) wontreturn; void _exit(int) libcesque wontreturn; diff --git a/libc/runtime/sigsetjmp.S b/libc/runtime/sigsetjmp.S new file mode 100644 index 000000000..4873843fd --- /dev/null +++ b/libc/runtime/sigsetjmp.S @@ -0,0 +1,49 @@ +/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ +│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/macros.internal.h" + +// Saves caller CPU state and signal mask. +// +// @param rdi points to jmp_buf +// @param esi if non-zero will cause mask to be saved +// @return eax 0 when set and !0 when longjmp'd +// @returnstwice +sigsetjmp: + test %esi,%esi + jz setjmp + popq 64(%rdi) + mov %rbx,72(%rdi) + mov %rdi,%rbx + call setjmp + pushq 64(%rbx) + mov %rbx,%rdi + mov %eax,%esi + mov 72(%rdi),%rbx + jmp __sigsetjmp_tail + .hidden __sigsetjmp_tail + .endfn sigsetjmp,globl diff --git a/libc/runtime/sysconf.h b/libc/runtime/sysconf.h index 42774d35a..317158ad9 100644 --- a/libc/runtime/sysconf.h +++ b/libc/runtime/sysconf.h @@ -1,13 +1,147 @@ #ifndef COSMOPOLITAN_LIBC_RUNTIME_SYSCONF_H_ #define COSMOPOLITAN_LIBC_RUNTIME_SYSCONF_H_ -#define _SC_ARG_MAX 0 -#define _SC_CHILD_MAX 1 -#define _SC_CLK_TCK 2 -#define _SC_OPEN_MAX 4 -#define _SC_PAGESIZE 30 -#define _SC_PAGE_SIZE 30 -#define _SC_NPROCESSORS_ONLN 1002 +#define _SC_ARG_MAX 0 +#define _SC_CHILD_MAX 1 +#define _SC_CLK_TCK 2 +#define _SC_NGROUPS_MAX 3 +#define _SC_OPEN_MAX 4 +#define _SC_STREAM_MAX 5 +#define _SC_TZNAME_MAX 6 +#define _SC_JOB_CONTROL 7 +#define _SC_SAVED_IDS 8 +#define _SC_REALTIME_SIGNALS 9 +#define _SC_PRIORITY_SCHEDULING 10 +#define _SC_TIMERS 11 +#define _SC_ASYNCHRONOUS_IO 12 +#define _SC_PRIORITIZED_IO 13 +#define _SC_SYNCHRONIZED_IO 14 +#define _SC_FSYNC 15 +#define _SC_MAPPED_FILES 16 +#define _SC_MEMLOCK 17 +#define _SC_MEMLOCK_RANGE 18 +#define _SC_MEMORY_PROTECTION 19 +#define _SC_MESSAGE_PASSING 20 +#define _SC_SEMAPHORES 21 +#define _SC_SHARED_MEMORY_OBJECTS 22 +#define _SC_AIO_LISTIO_MAX 23 +#define _SC_AIO_MAX 24 +#define _SC_AIO_PRIO_DELTA_MAX 25 +#define _SC_DELAYTIMER_MAX 26 +#define _SC_MQ_OPEN_MAX 27 +#define _SC_MQ_PRIO_MAX 28 +#define _SC_VERSION 29 +#define _SC_PAGE_SIZE 30 +#define _SC_PAGESIZE 30 /* !! */ +#define _SC_RTSIG_MAX 31 +#define _SC_SEM_NSEMS_MAX 32 +#define _SC_SEM_VALUE_MAX 33 +#define _SC_SIGQUEUE_MAX 34 +#define _SC_TIMER_MAX 35 +#define _SC_BC_BASE_MAX 36 +#define _SC_BC_DIM_MAX 37 +#define _SC_BC_SCALE_MAX 38 +#define _SC_BC_STRING_MAX 39 +#define _SC_COLL_WEIGHTS_MAX 40 +#define _SC_EXPR_NEST_MAX 42 +#define _SC_LINE_MAX 43 +#define _SC_RE_DUP_MAX 44 +#define _SC_2_VERSION 46 +#define _SC_2_C_BIND 47 +#define _SC_2_C_DEV 48 +#define _SC_2_FORT_DEV 49 +#define _SC_2_FORT_RUN 50 +#define _SC_2_SW_DEV 51 +#define _SC_2_LOCALEDEF 52 +#define _SC_UIO_MAXIOV 60 /* !! */ +#define _SC_IOV_MAX 60 +#define _SC_THREADS 67 +#define _SC_THREAD_SAFE_FUNCTIONS 68 +#define _SC_GETGR_R_SIZE_MAX 69 +#define _SC_GETPW_R_SIZE_MAX 70 +#define _SC_LOGIN_NAME_MAX 71 +#define _SC_TTY_NAME_MAX 72 +#define _SC_THREAD_DESTRUCTOR_ITERATIONS 73 +#define _SC_THREAD_KEYS_MAX 74 +#define _SC_THREAD_STACK_MIN 75 +#define _SC_THREAD_THREADS_MAX 76 +#define _SC_THREAD_ATTR_STACKADDR 77 +#define _SC_THREAD_ATTR_STACKSIZE 78 +#define _SC_THREAD_PRIORITY_SCHEDULING 79 +#define _SC_THREAD_PRIO_INHERIT 80 +#define _SC_THREAD_PRIO_PROTECT 81 +#define _SC_THREAD_PROCESS_SHARED 82 +#define _SC_NPROCESSORS_CONF 83 +#define _SC_NPROCESSORS_ONLN 84 +#define _SC_PHYS_PAGES 85 +#define _SC_AVPHYS_PAGES 86 +#define _SC_ATEXIT_MAX 87 +#define _SC_PASS_MAX 88 +#define _SC_XOPEN_VERSION 89 +#define _SC_XOPEN_XCU_VERSION 90 +#define _SC_XOPEN_UNIX 91 +#define _SC_XOPEN_CRYPT 92 +#define _SC_XOPEN_ENH_I18N 93 +#define _SC_XOPEN_SHM 94 +#define _SC_2_CHAR_TERM 95 +#define _SC_2_UPE 97 +#define _SC_XOPEN_XPG2 98 +#define _SC_XOPEN_XPG3 99 +#define _SC_XOPEN_XPG4 100 +#define _SC_NZERO 109 +#define _SC_XBS5_ILP32_OFF32 125 +#define _SC_XBS5_ILP32_OFFBIG 126 +#define _SC_XBS5_LP64_OFF64 127 +#define _SC_XBS5_LPBIG_OFFBIG 128 +#define _SC_XOPEN_LEGACY 129 +#define _SC_XOPEN_REALTIME 130 +#define _SC_XOPEN_REALTIME_THREADS 131 +#define _SC_ADVISORY_INFO 132 +#define _SC_BARRIERS 133 +#define _SC_CLOCK_SELECTION 137 +#define _SC_CPUTIME 138 +#define _SC_THREAD_CPUTIME 139 +#define _SC_MONOTONIC_CLOCK 149 +#define _SC_READER_WRITER_LOCKS 153 +#define _SC_SPIN_LOCKS 154 +#define _SC_REGEXP 155 +#define _SC_SHELL 157 +#define _SC_SPAWN 159 +#define _SC_SPORADIC_SERVER 160 +#define _SC_THREAD_SPORADIC_SERVER 161 +#define _SC_TIMEOUTS 164 +#define _SC_TYPED_MEMORY_OBJECTS 165 +#define _SC_2_PBS 168 +#define _SC_2_PBS_ACCOUNTING 169 +#define _SC_2_PBS_LOCATE 170 +#define _SC_2_PBS_MESSAGE 171 +#define _SC_2_PBS_TRACK 172 +#define _SC_SYMLOOP_MAX 173 +#define _SC_STREAMS 174 +#define _SC_2_PBS_CHECKPOINT 175 +#define _SC_V6_ILP32_OFF32 176 +#define _SC_V6_ILP32_OFFBIG 177 +#define _SC_V6_LP64_OFF64 178 +#define _SC_V6_LPBIG_OFFBIG 179 +#define _SC_HOST_NAME_MAX 180 +#define _SC_TRACE 181 +#define _SC_TRACE_EVENT_FILTER 182 +#define _SC_TRACE_INHERIT 183 +#define _SC_TRACE_LOG 184 +#define _SC_IPV6 235 +#define _SC_RAW_SOCKETS 236 +#define _SC_V7_ILP32_OFF32 237 +#define _SC_V7_ILP32_OFFBIG 238 +#define _SC_V7_LP64_OFF64 239 +#define _SC_V7_LPBIG_OFFBIG 240 +#define _SC_SS_REPL_MAX 241 +#define _SC_TRACE_EVENT_NAME_MAX 242 +#define _SC_TRACE_NAME_MAX 243 +#define _SC_TRACE_SYS_MAX 244 +#define _SC_TRACE_USER_EVENT_MAX 245 +#define _SC_XOPEN_STREAMS 246 +#define _SC_THREAD_ROBUST_PRIO_INHERIT 247 +#define _SC_THREAD_ROBUST_PRIO_PROTECT 248 #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ diff --git a/libc/sock/accept4.c b/libc/sock/accept4.c index 0f7c4a8e2..bc030e6d0 100644 --- a/libc/sock/accept4.c +++ b/libc/sock/accept4.c @@ -17,11 +17,12 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/internal.h" -#include "libc/intrin/strace.internal.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/strace.internal.h" #include "libc/sock/internal.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr.internal.h" #include "libc/sock/syscall_fd.internal.h" #include "libc/sysv/errfuns.h" @@ -38,7 +39,8 @@ * @asyncsignalsafe * @restartable (unless SO_RCVTIMEO) */ -int accept4(int fd, void *out_addr, uint32_t *inout_addrsize, int flags) { +int accept4(int fd, struct sockaddr *out_addr, uint32_t *inout_addrsize, + int flags) { int rc; char addrbuf[72]; if (!out_addr || !inout_addrsize || diff --git a/libc/sock/bind.c b/libc/sock/bind.c index d91dc8e4b..c7a68f878 100644 --- a/libc/sock/bind.c +++ b/libc/sock/bind.c @@ -17,11 +17,12 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/internal.h" -#include "libc/intrin/strace.internal.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/strace.internal.h" #include "libc/sock/internal.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr.internal.h" #include "libc/sock/syscall_fd.internal.h" #include "libc/sysv/errfuns.h" @@ -40,7 +41,7 @@ * @error ENETDOWN, EPFNOSUPPORT, etc. * @asyncsignalsafe */ -int bind(int fd, const void *addr, uint32_t addrsize) { +int bind(int fd, const struct sockaddr *addr, uint32_t addrsize) { int rc; if (!addr || (IsAsan() && !__asan_is_valid(addr, addrsize))) { rc = efault(); diff --git a/libc/sock/connect.c b/libc/sock/connect.c index dc604347e..b827473d4 100644 --- a/libc/sock/connect.c +++ b/libc/sock/connect.c @@ -17,11 +17,12 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/internal.h" -#include "libc/intrin/strace.internal.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/strace.internal.h" #include "libc/sock/internal.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr.internal.h" #include "libc/sock/syscall_fd.internal.h" #include "libc/sysv/errfuns.h" @@ -37,7 +38,7 @@ * @asyncsignalsafe * @restartable (unless SO_RCVTIMEO) */ -int connect(int fd, const void *addr, uint32_t addrsize) { +int connect(int fd, const struct sockaddr *addr, uint32_t addrsize) { int rc; if (addr && !(IsAsan() && !__asan_is_valid(addr, addrsize))) { if (!IsWindows()) { diff --git a/libc/sock/getpeername.c b/libc/sock/getpeername.c index 2472f1dd8..5cba134c8 100644 --- a/libc/sock/getpeername.c +++ b/libc/sock/getpeername.c @@ -17,11 +17,12 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/internal.h" -#include "libc/intrin/strace.internal.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/strace.internal.h" #include "libc/sock/internal.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr.internal.h" #include "libc/sock/syscall_fd.internal.h" #include "libc/sysv/errfuns.h" @@ -31,7 +32,7 @@ * @return 0 on success or -1 w/ errno * @see getsockname() */ -int getpeername(int fd, void *out_addr, uint32_t *out_addrsize) { +int getpeername(int fd, struct sockaddr *out_addr, uint32_t *out_addrsize) { int rc; if (!out_addr || !out_addrsize || (IsAsan() && (!__asan_is_valid(out_addrsize, 4) || diff --git a/libc/sock/getsockname.c b/libc/sock/getsockname.c index d8a516144..bcac531b5 100644 --- a/libc/sock/getsockname.c +++ b/libc/sock/getsockname.c @@ -17,11 +17,12 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/internal.h" -#include "libc/intrin/strace.internal.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/strace.internal.h" #include "libc/sock/internal.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr.internal.h" #include "libc/sock/syscall_fd.internal.h" #include "libc/sysv/errfuns.h" @@ -31,7 +32,7 @@ * @return 0 on success or -1 w/ errno * @see getpeername() */ -int getsockname(int fd, void *out_addr, uint32_t *out_addrsize) { +int getsockname(int fd, struct sockaddr *out_addr, uint32_t *out_addrsize) { int rc; if (!out_addrsize || !out_addrsize || (IsAsan() && (!__asan_is_valid(out_addrsize, 4) || diff --git a/libc/sock/recvfrom.c b/libc/sock/recvfrom.c index 5501f196d..447bb12b1 100644 --- a/libc/sock/recvfrom.c +++ b/libc/sock/recvfrom.c @@ -17,14 +17,15 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/internal.h" -#include "libc/intrin/strace.internal.h" #include "libc/calls/struct/iovec.h" #include "libc/calls/struct/iovec.internal.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/strace.internal.h" #include "libc/nt/winsock.h" #include "libc/sock/internal.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr.internal.h" #include "libc/sock/syscall_fd.internal.h" #include "libc/sysv/errfuns.h" @@ -47,7 +48,8 @@ * @restartable (unless SO_RCVTIMEO) */ ssize_t recvfrom(int fd, void *buf, size_t size, uint32_t flags, - void *opt_out_srcaddr, uint32_t *opt_inout_srcaddrsize) { + struct sockaddr *opt_out_srcaddr, + uint32_t *opt_inout_srcaddrsize) { ssize_t rc; uint32_t sz; union sockaddr_storage_bsd bsd; @@ -65,7 +67,8 @@ ssize_t recvfrom(int fd, void *buf, size_t size, uint32_t flags, } else { sz = sizeof(bsd); if ((rc = sys_recvfrom(fd, buf, size, flags, &bsd, &sz)) != -1) { - sockaddr2linux(&bsd, sz, opt_out_srcaddr, opt_inout_srcaddrsize); + sockaddr2linux(&bsd, sz, (void *)opt_out_srcaddr, + opt_inout_srcaddrsize); } } } else if (__isfdopen(fd)) { diff --git a/libc/sock/sendto.c b/libc/sock/sendto.c index 1b757fe03..82aa74ab7 100644 --- a/libc/sock/sendto.c +++ b/libc/sock/sendto.c @@ -18,14 +18,15 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/assert.h" #include "libc/calls/internal.h" -#include "libc/intrin/strace.internal.h" #include "libc/calls/struct/iovec.h" #include "libc/calls/struct/iovec.internal.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/strace.internal.h" #include "libc/macros.internal.h" #include "libc/sock/internal.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr.internal.h" #include "libc/str/str.h" #include "libc/sysv/errfuns.h" @@ -52,7 +53,7 @@ * @restartable (unless SO_RCVTIMEO) */ ssize_t sendto(int fd, const void *buf, size_t size, uint32_t flags, - const void *opt_addr, uint32_t addrsize) { + const struct sockaddr *opt_addr, uint32_t addrsize) { ssize_t rc; uint32_t bsdaddrsize; union sockaddr_storage_bsd bsd; diff --git a/libc/sock/sock.h b/libc/sock/sock.h index 6487e140c..ccfa6b1ad 100644 --- a/libc/sock/sock.h +++ b/libc/sock/sock.h @@ -29,21 +29,14 @@ uint32_t *GetHostIps(void); int nointernet(void); int socket(int, int, int); -int accept4(int, void *, uint32_t *, int); -int bind(int, const void *, uint32_t); -int connect(int, const void *, uint32_t); int listen(int, int); int shutdown(int, int); -int getsockname(int, void *, uint32_t *); -int getpeername(int, void *, uint32_t *); ssize_t send(int, const void *, size_t, int); ssize_t recv(int, void *, size_t, int); -ssize_t recvfrom(int, void *, size_t, uint32_t, void *, uint32_t *); ssize_t sendfile(int, int, int64_t *, size_t); int getsockopt(int, int, int, void *, uint32_t *); int setsockopt(int, int, int, const void *, uint32_t); int socketpair(int, int, int, int[2]); -ssize_t sendto(int, const void *, size_t, uint32_t, const void *, uint32_t); int sockatmark(int); COSMOPOLITAN_C_END_ diff --git a/libc/sock/struct/msghdr.h b/libc/sock/struct/msghdr.h index ec6880e25..d3730de29 100644 --- a/libc/sock/struct/msghdr.h +++ b/libc/sock/struct/msghdr.h @@ -8,10 +8,11 @@ struct msghdr { /* Linux+NT ABI */ void *msg_name; /* optional address */ uint32_t msg_namelen; /* size of msg_name */ struct iovec *msg_iov; /* scatter/gather array */ - uint64_t msg_iovlen; /* iovec count */ + int msg_iovlen; /* iovec count */ void *msg_control; /* credentials and stuff */ - uint64_t msg_controllen; /* size of msg_control */ - uint32_t msg_flags; /* MSG_XXX */ + uint32_t msg_controllen; /* size of msg_control */ + uint32_t __pad0; /* reconcile abi */ + int msg_flags; /* MSG_XXX */ }; ssize_t recvmsg(int, struct msghdr *, int); diff --git a/libc/sock/struct/sockaddr.h b/libc/sock/struct/sockaddr.h index f16765785..3fcd71ce1 100644 --- a/libc/sock/struct/sockaddr.h +++ b/libc/sock/struct/sockaddr.h @@ -36,6 +36,14 @@ struct sockaddr_storage { int inet_aton(const char *, struct in_addr *); char *inet_ntoa(struct in_addr); int accept(int, struct sockaddr *, uint32_t *); +int accept4(int, struct sockaddr *, uint32_t *, int); +int bind(int, const struct sockaddr *, uint32_t); +int connect(int, const struct sockaddr *, uint32_t); +int getsockname(int, struct sockaddr *, uint32_t *); +int getpeername(int, struct sockaddr *, uint32_t *); +ssize_t recvfrom(int, void *, size_t, uint32_t, struct sockaddr *, uint32_t *); +ssize_t sendto(int, const void *, size_t, uint32_t, const struct sockaddr *, + uint32_t); COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/tinymath/expm1.S b/libc/stdio/alphasort.c similarity index 79% rename from libc/tinymath/expm1.S rename to libc/stdio/alphasort.c index 37be04e6b..89f506eb8 100644 --- a/libc/tinymath/expm1.S +++ b/libc/stdio/alphasort.c @@ -1,7 +1,7 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +/*-*- 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 │ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,12 +16,9 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" +#include "libc/calls/struct/dirent.h" +#include "libc/str/str.h" -// Returns 𝑒^x-1. -// -// @param 𝑥 is double scalar in low half of %xmm0 -// @return double scalar in low half of %xmm0 -expm1: ezlea expm1l,ax - jmp _d2ld2 - .endfn expm1,globl +int alphasort(const struct dirent **a, const struct dirent **b) { + return strcoll((*a)->d_name, (*b)->d_name); +} diff --git a/libc/stdio/dirstream.c b/libc/stdio/dirstream.c index 4e0ac0d22..262c839bc 100644 --- a/libc/stdio/dirstream.c +++ b/libc/stdio/dirstream.c @@ -439,6 +439,39 @@ struct dirent *readdir(DIR *dir) { return e; } +/** + * Reads directory entry reentrantly. + * + * @param dir is the object opendir() or fdopendir() returned + * @param output is where directory entry is copied if not eof + * @param result will receive `output` pointer, or null on eof + * @return 0 on success, or errno on error + * @returnserrno + * @threadsafe + */ +errno_t readdir_r(DIR *dir, struct dirent *output, struct dirent **result) { + int err, olderr; + struct dirent *entry; + _lockdir(dir); + olderr = errno; + errno = 0; + entry = readdir_impl(dir); + err = errno; + errno = olderr; + if (err) { + _unlockdir(dir); + return err; + } + if (entry) { + memcpy(output, entry, entry->d_reclen); + } else { + output = 0; + } + _unlockdir(dir); + *result = output; + return 0; +} + /** * Closes directory object returned by opendir(). * @return 0 on success or -1 w/ errno @@ -464,6 +497,7 @@ int closedir(DIR *dir) { /** * Returns offset into directory data. + * @threadsafe */ long telldir(DIR *dir) { long rc; @@ -475,6 +509,7 @@ long telldir(DIR *dir) { /** * Returns file descriptor associated with DIR object. + * @threadsafe */ int dirfd(DIR *dir) { int rc; @@ -492,6 +527,7 @@ int dirfd(DIR *dir) { /** * Seeks to beginning of directory stream. + * @threadsafe */ void rewinddir(DIR *dir) { _lockdir(dir); @@ -517,6 +553,7 @@ void rewinddir(DIR *dir) { /** * Seeks in directory stream. + * @threadsafe */ void seekdir(DIR *dir, long off) { long i; diff --git a/libc/stdio/fgets_unlocked.c b/libc/stdio/fgets_unlocked.c index 026ccd7f5..813435a2f 100644 --- a/libc/stdio/fgets_unlocked.c +++ b/libc/stdio/fgets_unlocked.c @@ -64,7 +64,9 @@ char *fgets_unlocked(char *s, int size, FILE *f) { if (c == '\n') break; } } - *p = '\0'; + if (p > s || f->state != -1) { + *p = '\0'; + } } return p > s ? s : NULL; } diff --git a/libc/stdio/rand.h b/libc/stdio/rand.h index 8e0ebffbf..76ff8b4ff 100644 --- a/libc/stdio/rand.h +++ b/libc/stdio/rand.h @@ -8,7 +8,7 @@ COSMOPOLITAN_C_START_ ╚────────────────────────────────────────────────────────────────────────────│*/ int rand(void); -void srand(uint64_t); +void srand(unsigned); double poz(double); double pochisq(double, int); void rt_init(int); diff --git a/libc/stdio/rewind.c b/libc/stdio/rewind.c index 6ad7a680d..56f0cc6a5 100644 --- a/libc/stdio/rewind.c +++ b/libc/stdio/rewind.c @@ -28,8 +28,7 @@ */ void rewind(FILE *f) { flockfile(f); - if (!fseeko_unlocked(f, 0, SEEK_SET)) { - f->state = 0; - } + fseeko_unlocked(f, 0, SEEK_SET); + f->state = 0; funlockfile(f); } diff --git a/libc/stdio/scandir.c b/libc/stdio/scandir.c new file mode 100644 index 000000000..c2119c495 --- /dev/null +++ b/libc/stdio/scandir.c @@ -0,0 +1,78 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/struct/dirent.h" +#include "libc/errno.h" +#include "libc/limits.h" +#include "libc/mem/alg.h" +#include "libc/mem/mem.h" +#include "libc/str/str.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +int scandir(const char *path, struct dirent ***res, + int (*sel)(const struct dirent *), + int (*cmp)(const struct dirent **, const struct dirent **)) +{ + DIR *d = opendir(path); + struct dirent *de, **names=0, **tmp; + size_t cnt=0, len=0; + int old_errno = errno; + + if (!d) return -1; + + while ((errno=0), (de = readdir(d))) { + if (sel && !sel(de)) continue; + if (cnt >= len) { + len = 2*len+1; + if (len > SIZE_MAX/sizeof *names) break; + tmp = realloc(names, len * sizeof *names); + if (!tmp) break; + names = tmp; + } + names[cnt] = malloc(de->d_reclen); + if (!names[cnt]) break; + memcpy(names[cnt++], de, de->d_reclen); + } + + closedir(d); + + if (errno) { + if (names) while (cnt-->0) free(names[cnt]); + free(names); + return -1; + } + errno = old_errno; + + if (cmp) qsort(names, cnt, sizeof *names, (int (*)(const void *, const void *))cmp); + *res = names; + return cnt; +} diff --git a/libc/stdio/spawn.h b/libc/stdio/spawn.h index 7fe335c2e..58c99474a 100644 --- a/libc/stdio/spawn.h +++ b/libc/stdio/spawn.h @@ -42,7 +42,7 @@ int posix_spawnattr_setschedparam(posix_spawnattr_t *, const struct sched_param *); int posix_spawnattr_getsigmask(const posix_spawnattr_t *, sigset_t *); int posix_spawnattr_setsigmask(posix_spawnattr_t *, const sigset_t *); -int posix_spawnattr_getdefault(const posix_spawnattr_t *, sigset_t *); +int posix_spawnattr_getsigdefault(const posix_spawnattr_t *, sigset_t *); int posix_spawnattr_setsigdefault(posix_spawnattr_t *, const sigset_t *); COSMOPOLITAN_C_END_ diff --git a/libc/stdio/srand.c b/libc/stdio/srand.c index 53c06e3f3..51bf4e2d4 100644 --- a/libc/stdio/srand.c +++ b/libc/stdio/srand.c @@ -23,4 +23,6 @@ extern uint64_t g_rando; /** * Seeds random number generator that's used by rand(). */ -void(srand)(uint64_t seed) { g_rando = seed; } +void srand(unsigned seed) { + g_rando = seed; +} diff --git a/libc/tinymath/scalb.S b/libc/stdio/versionsort.c similarity index 77% rename from libc/tinymath/scalb.S rename to libc/stdio/versionsort.c index d835b65f7..ae15a1ace 100644 --- a/libc/tinymath/scalb.S +++ b/libc/stdio/versionsort.c @@ -1,7 +1,7 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +/*-*- 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 │ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,14 +16,9 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" +#include "libc/calls/struct/dirent.h" +#include "libc/str/str.h" -// Returns 𝑥 × 2ʸ. -// -// @param 𝑥 is double passed in %xmm0 -// @param 𝑦 is double passed in %xmm1, which is truncated -// @return result in %xmm0 -// @see ldexp() -scalb: cvttsd2si %xmm1,%edi - jmp ldexp - .endfn scalb,globl +int versionsort(const struct dirent **a, const struct dirent **b) { + return strverscmp((*a)->d_name, (*b)->d_name); +} diff --git a/libc/str/locale.h b/libc/str/locale.h index d979a9be3..e1382fa59 100644 --- a/libc/str/locale.h +++ b/libc/str/locale.h @@ -76,6 +76,8 @@ unsigned long long wcstoull_l(const wchar_t *, wchar_t **, int, locale_t); void freelocale(locale_t); wint_t towlower_l(wint_t, locale_t); wint_t towupper_l(wint_t, locale_t); +int strcasecmp_l(const char *, const char *, locale_t); +int strncasecmp_l(const char *, const char *, size_t, locale_t); COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/str/str.h b/libc/str/str.h index e18824f48..b0eb7fbb2 100644 --- a/libc/str/str.h +++ b/libc/str/str.h @@ -21,6 +21,7 @@ int isgraph(int); int tolower(int); int ispunct(int); int toupper(int); +int toascii(int); int hextoint(int); int _cescapec(int); diff --git a/libc/str/strcasecmp_l.c b/libc/str/strcasecmp_l.c new file mode 100644 index 000000000..607ed4fa1 --- /dev/null +++ b/libc/str/strcasecmp_l.c @@ -0,0 +1,24 @@ +/*-*- 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 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/locale.h" +#include "libc/str/str.h" + +int strcasecmp_l(const char *a, const char *b, locale_t l) { + return strcasecmp(a, b); +} diff --git a/libc/str/strlcat.c b/libc/str/strlcat.c index 8274b0966..47a1dd8cf 100644 --- a/libc/str/strlcat.c +++ b/libc/str/strlcat.c @@ -1,7 +1,7 @@ -/*-*- 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│ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ Copyright (c) 1998, 2015 Todd C. Miller │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,25 +16,48 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/intrin/safemacros.internal.h" #include "libc/str/str.h" +// clang-format off +// $OpenBSD: strlcat.c,v 1.19 2019/01/25 00:19:25 millert Exp $ + +asm(".ident\t\"\\n\\n\ +strlcat (ISC)\\n\ +Copyright (c) 1998, 2015 Todd C. Miller \""); +asm(".include \"libc/disclaimer.inc\""); /** - * Appends string SRC to DEST, the BSD way. - * - * @param dest is a buffer holding a NUL-terminated string - * @param src is a NUL-terminated string - * @param size is byte capacity of dest - * @return strlen(dest) + strlen(src) - * @note dest and src can't overlap - * @see strncat() + * Appends string, the BSD way. + * + * Appends `src` to string `dst` of size `dsize` (unlike strncat, + * `dsize` is the full size of `dst`, not space left). At most `dsize-1` + * characters will be copied. Always NUL terminates (unless `dsize <= + * strlen(dst)`). Returns `strlen(src) + MIN(dsize, strlen(initial + * dst))`. If `retval >= dsize`, truncation occurred. */ -size_t strlcat(char *dest, const char *src, size_t size) { - size_t destlen = strnlen(dest, size); - size_t srclen = strlen(src); - if (size) { - memcpy(&dest[destlen], src, min(srclen, size - destlen)); - dest[min(destlen + srclen, size - 1)] = '\0'; - } - return destlen + srclen; +size_t +strlcat(char *dst, const char *src, size_t dsize) +{ + const char *odst = dst; + const char *osrc = src; + size_t n = dsize; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end. */ + while (n-- != 0 && *dst != '\0') + dst++; + dlen = dst - odst; + n = dsize - dlen; + + if (n-- == 0) + return(dlen + strlen(src)); + while (*src != '\0') { + if (n != 0) { + *dst++ = *src; + n--; + } + src++; + } + *dst = '\0'; + + return(dlen + (src - osrc)); /* count does not include NUL */ } diff --git a/libc/str/strncasecmp_l.c b/libc/str/strncasecmp_l.c new file mode 100644 index 000000000..782313b2e --- /dev/null +++ b/libc/str/strncasecmp_l.c @@ -0,0 +1,24 @@ +/*-*- 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 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/locale.h" +#include "libc/str/str.h" + +int strncasecmp_l(const char *a, const char *b, size_t n, locale_t l) { + return strncasecmp(a, b, n); +} diff --git a/libc/str/toascii.c b/libc/str/toascii.c new file mode 100644 index 000000000..e631a798c --- /dev/null +++ b/libc/str/toascii.c @@ -0,0 +1,23 @@ +/*-*- 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 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" + +int toascii(int c) { + return c & 127; +} diff --git a/libc/sysv/consts.sh b/libc/sysv/consts.sh index 444894c92..d65884bec 100755 --- a/libc/sysv/consts.sh +++ b/libc/sysv/consts.sh @@ -1300,7 +1300,6 @@ syscon prio PRIO_PGRP 1 1 1 1 1 1 # unix consensus / poly nt syscon prio PRIO_USER 2 2 2 2 2 2 # unix consensus / poly nt syscon prio PRIO_MIN -20 -20 -20 -20 -20 -20 # unix consensus / poly nt syscon prio PRIO_MAX 20 20 20 20 20 20 # unix consensus / poly nt -syscon prio NZERO 20 20 20 20 20 20 # unix consensus / polyfilled nt # getrusage() who # diff --git a/libc/sysv/consts/NZERO.s b/libc/sysv/consts/NZERO.s deleted file mode 100644 index 140c3e81f..000000000 --- a/libc/sysv/consts/NZERO.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/sysv/consts/syscon.internal.inc" -.syscon prio,NZERO,20,20,20,20,20,20 diff --git a/libc/sysv/consts/_posix.h b/libc/sysv/consts/_posix.h index 3e9fcf6d9..0d2e8f2ea 100644 --- a/libc/sysv/consts/_posix.h +++ b/libc/sysv/consts/_posix.h @@ -5,6 +5,7 @@ /* IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008) */ #define _POSIX_AIO_LISTIO_MAX 2 +#define _POSIX_CLOCKRES_MIN 20000000 #define _POSIX_AIO_MAX 1 #define _POSIX_ARG_MAX 4096 #define _POSIX_CHILD_MAX 25 diff --git a/libc/sysv/consts/inet6.h b/libc/sysv/consts/inet6.h new file mode 100644 index 000000000..46e2ea4cb --- /dev/null +++ b/libc/sysv/consts/inet6.h @@ -0,0 +1,6 @@ +#ifndef COSMOPOLITAN_LIBC_SYSV_CONSTS_INET6_H_ +#define COSMOPOLITAN_LIBC_SYSV_CONSTS_INET6_H_ + +#define INET6_ADDRSTRLEN 48 + +#endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_INET6_H_ */ diff --git a/libc/sysv/consts/prio.h b/libc/sysv/consts/prio.h index e1a237ef1..c426295fa 100644 --- a/libc/sysv/consts/prio.h +++ b/libc/sysv/consts/prio.h @@ -9,7 +9,6 @@ extern const int PRIO_MIN; extern const int PRIO_PGRP; extern const int PRIO_PROCESS; extern const int PRIO_USER; -extern const int NZERO; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ @@ -19,6 +18,5 @@ COSMOPOLITAN_C_END_ #define PRIO_USER LITERALLY(2) #define PRIO_MIN LITERALLY(-20) #define PRIO_MAX LITERALLY(20) -#define NZERO LITERALLY(20) #endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_PRIO_H_ */ diff --git a/libc/thread/posixthread.internal.h b/libc/thread/posixthread.internal.h index fc8d5bef9..05c16cddb 100644 --- a/libc/thread/posixthread.internal.h +++ b/libc/thread/posixthread.internal.h @@ -61,14 +61,17 @@ enum PosixThreadStatus { struct PosixThread { _Atomic(enum PosixThreadStatus) status; void *(*start_routine)(void *); - void *arg; // start_routine's parameter - void *rc; // start_routine's return value - int flags; // see PT_* constants - int tid; // clone parent tid - char *altstack; // thread sigaltstack - char *tls; // bottom of tls allocation - struct CosmoTib *tib; // middle of tls allocation - jmp_buf exiter; // for pthread_exit + void *arg; // start_routine's parameter + void *rc; // start_routine's return value + int tid; // clone parent tid + int flags; // see PT_* constants + _Atomic(int) cancelled; // thread has bad beliefs + char cancelasync; // PTHREAD_CANCEL_DEFERRED/ASYNCHRONOUS + char canceldisable; // PTHREAD_CANCEL_ENABLE/DISABLE + char *altstack; // thread sigaltstack + char *tls; // bottom of tls allocation + struct CosmoTib *tib; // middle of tls allocation + jmp_buf exiter; // for pthread_exit pthread_attr_t attr; struct _pthread_cleanup_buffer *cleanup; }; diff --git a/libc/thread/pthread_cancel.c b/libc/thread/pthread_cancel.c index 13d0a9652..520f0646f 100644 --- a/libc/thread/pthread_cancel.c +++ b/libc/thread/pthread_cancel.c @@ -34,7 +34,7 @@ * void OnUsr1(int sig) { gotusr1 = true; } * struct sigaction sa = {.sa_handler = OnUsr1}; * sigaction(SIGUSR1, &sa, 0); - * tkill(pthread_getunique_np(thread), SIGUSR1); + * pthread_kill(thread, SIGUSR1); * * The above code should successfully cancel a thread's blocking io * operations in most cases, e.g. @@ -61,7 +61,7 @@ * @see https://sourceware.org/bugzilla/show_bug.cgi?id=12683 */ int pthread_cancel(pthread_t thread) { - kprintf("error: pthread_cancel() is unsupported, please read the " - "cosmopolitan libc documentation for further details\n"); + kprintf("error: pthread_cancel() isn't supported, please see the" + " cosmopolitan libc documentation for further details\n"); _Exit(1); } diff --git a/libc/thread/pthread_equal.c b/libc/thread/pthread_equal.c index 6941eb9d3..c227121d6 100644 --- a/libc/thread/pthread_equal.c +++ b/libc/thread/pthread_equal.c @@ -17,7 +17,6 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/thread/thread.h" -#include "libc/thread/posixthread.internal.h" /** * Compares thread ids; @@ -25,7 +24,5 @@ * @return nonzero if equal, otherwise zero */ int pthread_equal(pthread_t t1, pthread_t t2) { - struct PosixThread *a = (struct PosixThread *)t1; - struct PosixThread *b = (struct PosixThread *)t2; - return a->tid == b->tid; + return t1 == t2; } diff --git a/libc/thread/pthread_exit.c b/libc/thread/pthread_exit.c index 93529da7f..68eebf71c 100644 --- a/libc/thread/pthread_exit.c +++ b/libc/thread/pthread_exit.c @@ -17,6 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/dce.h" +#include "libc/intrin/atomic.h" #include "libc/limits.h" #include "libc/mem/gc.h" #include "libc/runtime/runtime.h" @@ -25,8 +26,6 @@ #include "libc/thread/tls.h" #include "third_party/nsync/futex.internal.h" -STATIC_YOINK("_pthread_main"); - /** * Terminates current POSIX thread. * @@ -86,7 +85,7 @@ wontreturn void pthread_exit(void *rc) { // this implementation so much simpler for example we want't to call // set_tid_address() upon every program startup which isn't possible // on non-linux platforms anyway. - __get_tls()->tib_tid = 0; + atomic_store_explicit(&__get_tls()->tib_tid, 0, memory_order_release); nsync_futex_wake_((int *)&__get_tls()->tib_tid, INT_MAX, !IsWindows()); _Exit1(0); } diff --git a/libc/thread/pthread_kill.c b/libc/thread/pthread_kill.c new file mode 100644 index 000000000..e6f0ca18a --- /dev/null +++ b/libc/thread/pthread_kill.c @@ -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 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/calls.h" +#include "libc/errno.h" +#include "libc/thread/posixthread.internal.h" +#include "libc/thread/thread.h" + +/** + * Sends signal to thread. + * + * @return 0 on success, or errno on error + * @raise ESRCH if `tid` was valid but no such thread existed + * @raise EAGAIN if `RLIMIT_SIGPENDING` was exceeded + * @raise EINVAL if `tid` or `sig` was invalid + * @raise EPERM if permission was denied + */ +int pthread_kill(pthread_t thread, int sig) { + int rc, e = errno; + struct PosixThread *pt = (struct PosixThread *)thread; + if (!tkill(pt->tid, sig)) { + rc = 0; + } else { + rc = errno; + errno = e; + } + return rc; +} diff --git a/libc/thread/pthread_self.c b/libc/thread/pthread_self.c index b228c63b0..2152a3482 100644 --- a/libc/thread/pthread_self.c +++ b/libc/thread/pthread_self.c @@ -16,14 +16,16 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" #include "libc/thread/thread.h" #include "libc/thread/tls.h" -STATIC_YOINK("_pthread_main"); - /** * Returns current POSIX thread. */ pthread_t pthread_self(void) { - return __get_tls()->tib_pthread; + pthread_t t; + t = __get_tls()->tib_pthread; + _unassert(t); + return t; } diff --git a/libc/tinymath/floorf.S b/libc/thread/pthread_setcancelstate.c similarity index 61% rename from libc/tinymath/floorf.S rename to libc/thread/pthread_setcancelstate.c index d9aa9c460..ddb2c66aa 100644 --- a/libc/tinymath/floorf.S +++ b/libc/thread/pthread_setcancelstate.c @@ -1,7 +1,7 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +/*-*- 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 │ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,41 +16,32 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" +#include "libc/errno.h" +#include "libc/thread/posixthread.internal.h" +#include "libc/thread/thread.h" +#include "libc/thread/tls.h" -// Returns largest integral not greater than 𝑥. -// -// @param 𝑥 is float scalar in low quarter of %xmm0 -// @return float scalar in low quarter of %xmm0 -floorf: .leafprologue - .profilable - movss 4f(%rip),%xmm3 - movss 2f(%rip),%xmm4 - movaps %xmm0,%xmm2 - movaps %xmm0,%xmm1 - andps %xmm3,%xmm2 - ucomiss %xmm2,%xmm4 - jbe 1f - cvttss2sil %xmm0,%eax - pxor %xmm2,%xmm2 - movss 3f(%rip),%xmm4 - andnps %xmm1,%xmm3 - cvtsi2ssl %eax,%xmm2 - movaps %xmm2,%xmm5 - cmpnless %xmm0,%xmm5 - movaps %xmm5,%xmm0 - andps %xmm4,%xmm0 - subss %xmm0,%xmm2 - movaps %xmm2,%xmm0 - orps %xmm3,%xmm0 -1: .leafepilogue - .endfn floorf,globl - - .rodata.cst4 -2: .long 0x4b000000 -3: .long 0x3f800000 - .rodata.cst16 -4: .long 0x7fffffff - .long 0x00000000 - .long 0x00000000 - .long 0x00000000 +/** + * Sets cancelability state. + * + * @param state may be one of: + * - `PTHREAD_CANCEL_ENABLE` (default) + * - `PTHREAD_CANCEL_DISABLE` + * @param oldstate optionally receives old value + * @return 0 on success, or errno on error + * @raise EINVAL if `state` has bad value + * @see pthread_cancel() for docs + */ +int pthread_setcancelstate(int state, int *oldstate) { + struct PosixThread *pt; + switch (state) { + case PTHREAD_CANCEL_ENABLE: + case PTHREAD_CANCEL_DISABLE: + pt = (struct PosixThread *)__get_tls()->tib_pthread; + if (oldstate) *oldstate = pt->canceldisable; + pt->canceldisable = state; + return 0; + default: + return EINVAL; + } +} diff --git a/libc/tinymath/floor.S b/libc/thread/pthread_setcanceltype.c similarity index 61% rename from libc/tinymath/floor.S rename to libc/thread/pthread_setcanceltype.c index ccd4e6c7b..d95d3bb81 100644 --- a/libc/tinymath/floor.S +++ b/libc/thread/pthread_setcanceltype.c @@ -1,7 +1,7 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +/*-*- 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 │ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,43 +16,32 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" +#include "libc/errno.h" +#include "libc/thread/posixthread.internal.h" +#include "libc/thread/thread.h" +#include "libc/thread/tls.h" -// Returns largest integral not greater than 𝑥. -// -// @param 𝑥 is double scalar in low half of %xmm0 -// @return double scalar in low half of %xmm0 -floor: .leafprologue - .profilable - movsd 4f(%rip),%xmm3 - movsd 2f(%rip),%xmm4 - movapd %xmm0,%xmm2 - movapd %xmm0,%xmm1 - andpd %xmm3,%xmm2 - ucomisd %xmm2,%xmm4 - jbe 1f - cvttsd2siq %xmm0,%rax - pxor %xmm2,%xmm2 - movsd 3f(%rip),%xmm4 - andnpd %xmm1,%xmm3 - cvtsi2sdq %rax,%xmm2 - movapd %xmm2,%xmm5 - cmpnlesd %xmm0,%xmm5 - movapd %xmm5,%xmm0 - andpd %xmm4,%xmm0 - subsd %xmm0,%xmm2 - movapd %xmm2,%xmm0 - orpd %xmm3,%xmm0 -1: .leafepilogue - .endfn floor,globl - - .rodata.cst8 -2: .long 0x00000000 - .long 0x43300000 -3: .long 0x00000000 - .long 0x3ff00000 - .rodata.cst16 -4: .long 0xffffffff - .long 0x7fffffff - .long 0x00000000 - .long 0x00000000 +/** + * Sets cancellation strategy. + * + * @param type may be one of: + * - `PTHREAD_CANCEL_DEFERRED` (default) + * - `PTHREAD_CANCEL_ASYNCHRONOUS` + * @param oldtype optionally receives old value + * @return 0 on success, or errno on error + * @raise EINVAL if `type` has bad value + * @see pthread_cancel() for docs + */ +int pthread_setcanceltype(int type, int *oldtype) { + struct PosixThread *pt; + switch (type) { + case PTHREAD_CANCEL_DEFERRED: + case PTHREAD_CANCEL_ASYNCHRONOUS: + pt = (struct PosixThread *)__get_tls()->tib_pthread; + if (oldtype) *oldtype = pt->cancelasync; + pt->cancelasync = type; + return 0; + default: + return EINVAL; + } +} diff --git a/libc/thread/pthread_main.c b/libc/thread/pthread_setschedprio.c similarity index 81% rename from libc/thread/pthread_main.c rename to libc/thread/pthread_setschedprio.c index f3a2115ff..8bb96c24b 100644 --- a/libc/thread/pthread_main.c +++ b/libc/thread/pthread_setschedprio.c @@ -16,16 +16,14 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/calls/calls.h" #include "libc/thread/posixthread.internal.h" +#include "libc/thread/thread.h" -// it's only be possible for this memory to be accessed when the user -// has linked either pthread_self() or pthread_exit() which yoink it. -struct PosixThread _pthread_main; - -__attribute__((__constructor__)) static void pthread_self_init(void) { - _pthread_main.tid = gettid(); - _pthread_main.tib = __get_tls(); - _pthread_main.flags = PT_MAINTHREAD; - __get_tls()->tib_pthread = (pthread_t)&_pthread_main; +/** + * Sets scheduler parameter on thread. + */ +int pthread_setschedprio(pthread_t thread, int prio) { + struct PosixThread *pt = (struct PosixThread *)thread; + pt->attr.__schedparam = prio; + return _pthread_reschedule(pt); } diff --git a/libc/thread/thread.h b/libc/thread/thread.h index 6fc8af956..f17fd20f3 100644 --- a/libc/thread/thread.h +++ b/libc/thread/thread.h @@ -23,6 +23,14 @@ #define PTHREAD_INHERIT_SCHED 0 #define PTHREAD_EXPLICIT_SCHED 1 +#define PTHREAD_CANCELED ((void *)-1) + +#define PTHREAD_CANCEL_ENABLE 0 +#define PTHREAD_CANCEL_DISABLE 1 + +#define PTHREAD_CANCEL_DEFERRED 0 +#define PTHREAD_CANCEL_ASYNCHRONOUS 1 + #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ @@ -122,7 +130,11 @@ int pthread_attr_setstack(pthread_attr_t *, void *, size_t); int pthread_attr_getstacksize(const pthread_attr_t *, size_t *); int pthread_attr_setstacksize(pthread_attr_t *, size_t); int pthread_detach(pthread_t); +int pthread_kill(pthread_t, int); int pthread_cancel(pthread_t); +int pthread_setcanceltype(int, int *); +int pthread_setcancelstate(int, int *); +int pthread_setschedprio(pthread_t, int); int pthread_join(pthread_t, void **); int pthread_equal(pthread_t, pthread_t); int pthread_once(pthread_once_t *, void (*)(void)); @@ -165,7 +177,7 @@ int pthread_rwlock_trywrlock(pthread_rwlock_t *); int pthread_rwlock_unlock(pthread_rwlock_t *); int pthread_key_create(pthread_key_t *, pthread_key_dtor); int pthread_key_delete(pthread_key_t); -int pthread_setspecific(pthread_key_t, void *); +int pthread_setspecific(pthread_key_t, const void *); void *pthread_getspecific(pthread_key_t); int pthread_barrierattr_init(pthread_barrierattr_t *); int pthread_barrierattr_destroy(pthread_barrierattr_t *); diff --git a/libc/tinymath/__cexp.c b/libc/tinymath/__cexp.c index 4fc3faa10..8411dc27e 100644 --- a/libc/tinymath/__cexp.c +++ b/libc/tinymath/__cexp.c @@ -35,7 +35,6 @@ Copyright 2005-2014 Rich Felker, et. al.\""); asm(".include \"libc/disclaimer.inc\""); /* clang-format off */ - /* origin: FreeBSD /usr/src/lib/msun/src/k_exp.c */ /*- * Copyright (c) 2011 David Schultz diff --git a/libc/tinymath/atan.c b/libc/tinymath/atan.c index f630eb6e6..3a83997cf 100644 --- a/libc/tinymath/atan.c +++ b/libc/tinymath/atan.c @@ -33,7 +33,7 @@ asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ Copyright 2005-2014 Rich Felker, et. al.\""); asm(".include \"libc/disclaimer.inc\""); -/* clang-format off */ +// clang-format off /* origin: FreeBSD /usr/src/lib/msun/src/s_atan.c */ /* diff --git a/libc/tinymath/atan2.c b/libc/tinymath/atan2.c index 7e456fb15..3c6a8d257 100644 --- a/libc/tinymath/atan2.c +++ b/libc/tinymath/atan2.c @@ -1,29 +1,148 @@ -/*-*- 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 2021 Justine Alexandra Roberts Tunney │ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ │ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ +│ Musl Libc │ +│ Copyright © 2005-2020 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ │ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/math.h" +#include "libc/tinymath/complex.internal.h" + +asm(".ident\t\"\\n\\n\ +fdlibm (fdlibm license)\\n\ +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\""); +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +/* origin: FreeBSD /usr/src/lib/msun/src/e_atan2.c */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + * + */ +/* atan2(y,x) + * Method : + * 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x). + * 2. Reduce x to positive by (if x and y are unexceptional): + * ARG (x+iy) = arctan(y/x) ... if x > 0, + * ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0, + * + * Special cases: + * + * ATAN2((anything), NaN ) is NaN; + * ATAN2(NAN , (anything) ) is NaN; + * ATAN2(+-0, +(anything but NaN)) is +-0 ; + * ATAN2(+-0, -(anything but NaN)) is +-pi ; + * ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2; + * ATAN2(+-(anything but INF and NaN), +INF) is +-0 ; + * ATAN2(+-(anything but INF and NaN), -INF) is +-pi; + * ATAN2(+-INF,+INF ) is +-pi/4 ; + * ATAN2(+-INF,-INF ) is +-3pi/4; + * ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2; + * + * Constants: + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +static const double +pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */ +pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */ /** * Returns arc tangent of 𝑦/𝑥. * @note the greatest of all libm functions */ -double atan2(double y, double x) { - long double st; - asm("fpatan" : "=t"(st) : "0"((long double)x), "u"((long double)y) : "st(1)"); - return st; +double atan2(double y, double x) +{ + double z; + uint32_t m,lx,ly,ix,iy; + + if (isnan(x) || isnan(y)) + return x+y; + EXTRACT_WORDS(ix, lx, x); + EXTRACT_WORDS(iy, ly, y); + if ((ix-0x3ff00000 | lx) == 0) /* x = 1.0 */ + return atan(y); + m = ((iy>>31)&1) | ((ix>>30)&2); /* 2*sign(x)+sign(y) */ + ix = ix & 0x7fffffff; + iy = iy & 0x7fffffff; + + /* when y = 0 */ + if ((iy|ly) == 0) { + switch(m) { + case 0: + case 1: return y; /* atan(+-0,+anything)=+-0 */ + case 2: return pi; /* atan(+0,-anything) = pi */ + case 3: return -pi; /* atan(-0,-anything) =-pi */ + } + } + /* when x = 0 */ + if ((ix|lx) == 0) + return m&1 ? -pi/2 : pi/2; + /* when x is INF */ + if (ix == 0x7ff00000) { + if (iy == 0x7ff00000) { + switch(m) { + case 0: return pi/4; /* atan(+INF,+INF) */ + case 1: return -pi/4; /* atan(-INF,+INF) */ + case 2: return 3*pi/4; /* atan(+INF,-INF) */ + case 3: return -3*pi/4; /* atan(-INF,-INF) */ + } + } else { + switch(m) { + case 0: return 0.0; /* atan(+...,+INF) */ + case 1: return -0.0; /* atan(-...,+INF) */ + case 2: return pi; /* atan(+...,-INF) */ + case 3: return -pi; /* atan(-...,-INF) */ + } + } + } + /* |y/x| > 0x1p64 */ + if (ix+(64<<20) < iy || iy == 0x7ff00000) + return m&1 ? -pi/2 : pi/2; + + /* z = atan(|y/x|) without spurious underflow */ + if ((m&2) && iy+(64<<20) < ix) /* |y/x| < 0x1p-64, x<0 */ + z = 0; + else + z = atan(fabs(y/x)); + switch (m) { + case 0: return z; /* atan(+,+) */ + case 1: return -z; /* atan(-,+) */ + case 2: return pi - (z-pi_lo); /* atan(+,-) */ + default: /* case 3 */ + return (z-pi_lo) - pi; /* atan(-,-) */ + } } diff --git a/libc/tinymath/atanf.c b/libc/tinymath/atanf.c index 889e65385..340ee90b9 100644 --- a/libc/tinymath/atanf.c +++ b/libc/tinymath/atanf.c @@ -33,7 +33,7 @@ asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ Copyright 2005-2014 Rich Felker, et. al.\""); asm(".include \"libc/disclaimer.inc\""); -/* clang-format off */ +// clang-format off /* origin: FreeBSD /usr/src/lib/msun/src/s_atanf.c */ /* diff --git a/libc/tinymath/expm1.c b/libc/tinymath/expm1.c new file mode 100644 index 000000000..dee375cd4 --- /dev/null +++ b/libc/tinymath/expm1.c @@ -0,0 +1,238 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/internal.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +/* origin: FreeBSD /usr/src/lib/msun/src/s_expm1.c */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +/* expm1(x) + * Returns exp(x)-1, the exponential of x minus 1. + * + * Method + * 1. Argument reduction: + * Given x, find r and integer k such that + * + * x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658 + * + * Here a correction term c will be computed to compensate + * the error in r when rounded to a floating-point number. + * + * 2. Approximating expm1(r) by a special rational function on + * the interval [0,0.34658]: + * Since + * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ... + * we define R1(r*r) by + * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r) + * That is, + * R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r) + * = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r)) + * = 1 - r^2/60 + r^4/2520 - r^6/100800 + ... + * We use a special Remez algorithm on [0,0.347] to generate + * a polynomial of degree 5 in r*r to approximate R1. The + * maximum error of this polynomial approximation is bounded + * by 2**-61. In other words, + * R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5 + * where Q1 = -1.6666666666666567384E-2, + * Q2 = 3.9682539681370365873E-4, + * Q3 = -9.9206344733435987357E-6, + * Q4 = 2.5051361420808517002E-7, + * Q5 = -6.2843505682382617102E-9; + * z = r*r, + * with error bounded by + * | 5 | -61 + * | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2 + * | | + * + * expm1(r) = exp(r)-1 is then computed by the following + * specific way which minimize the accumulation rounding error: + * 2 3 + * r r [ 3 - (R1 + R1*r/2) ] + * expm1(r) = r + --- + --- * [--------------------] + * 2 2 [ 6 - r*(3 - R1*r/2) ] + * + * To compensate the error in the argument reduction, we use + * expm1(r+c) = expm1(r) + c + expm1(r)*c + * ~ expm1(r) + c + r*c + * Thus c+r*c will be added in as the correction terms for + * expm1(r+c). Now rearrange the term to avoid optimization + * screw up: + * ( 2 2 ) + * ({ ( r [ R1 - (3 - R1*r/2) ] ) } r ) + * expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- ) + * ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 ) + * ( ) + * + * = r - E + * 3. Scale back to obtain expm1(x): + * From step 1, we have + * expm1(x) = either 2^k*[expm1(r)+1] - 1 + * = or 2^k*[expm1(r) + (1-2^-k)] + * 4. Implementation notes: + * (A). To save one multiplication, we scale the coefficient Qi + * to Qi*2^i, and replace z by (x^2)/2. + * (B). To achieve maximum accuracy, we compute expm1(x) by + * (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf) + * (ii) if k=0, return r-E + * (iii) if k=-1, return 0.5*(r-E)-0.5 + * (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E) + * else return 1.0+2.0*(r-E); + * (v) if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1) + * (vi) if k <= 20, return 2^k((1-2^-k)-(E-r)), else + * (vii) return 2^k(1-((E+2^-k)-r)) + * + * Special cases: + * expm1(INF) is INF, expm1(NaN) is NaN; + * expm1(-INF) is -1, and + * for finite argument, only expm1(0)=0 is exact. + * + * Accuracy: + * according to an error analysis, the error is always less than + * 1 ulp (unit in the last place). + * + * Misc. info. + * For IEEE double + * if x > 7.09782712893383973096e+02 then expm1(x) overflow + * + * Constants: + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +static const double +o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */ +ln2_hi = 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */ +ln2_lo = 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */ +invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */ +/* Scaled Q's: Qn_here = 2**n * Qn_above, for R(2*z) where z = hxs = x*x/2: */ +Q1 = -3.33333333333331316428e-02, /* BFA11111 111110F4 */ +Q2 = 1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */ +Q3 = -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */ +Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */ +Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */ + +/** + * Returns 𝑒^𝑥-𝟷. + */ +double expm1(double x) +{ + double_t y,hi,lo,c,t,e,hxs,hfx,r1,twopk; + union {double f; uint64_t i;} u = {x}; + uint32_t hx = u.i>>32 & 0x7fffffff; + int k, sign = u.i>>63; + + /* filter out huge and non-finite argument */ + if (hx >= 0x4043687A) { /* if |x|>=56*ln2 */ + if (isnan(x)) + return x; + if (sign) + return -1; + if (x > o_threshold) { + x *= 0x1p1023; + return x; + } + } + + /* argument reduction */ + if (hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ + if (hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */ + if (!sign) { + hi = x - ln2_hi; + lo = ln2_lo; + k = 1; + } else { + hi = x + ln2_hi; + lo = -ln2_lo; + k = -1; + } + } else { + k = invln2*x + (sign ? -0.5 : 0.5); + t = k; + hi = x - t*ln2_hi; /* t*ln2_hi is exact here */ + lo = t*ln2_lo; + } + x = hi-lo; + c = (hi-x)-lo; + } else if (hx < 0x3c900000) { /* |x| < 2**-54, return x */ + if (hx < 0x00100000) + FORCE_EVAL((float)x); + return x; + } else + k = 0; + + /* x is now in primary range */ + hfx = 0.5*x; + hxs = x*hfx; + r1 = 1.0+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5)))); + t = 3.0-r1*hfx; + e = hxs*((r1-t)/(6.0 - x*t)); + if (k == 0) /* c is 0 */ + return x - (x*e-hxs); + e = x*(e-c) - c; + e -= hxs; + /* exp(x) ~ 2^k (x_reduced - e + 1) */ + if (k == -1) + return 0.5*(x-e) - 0.5; + if (k == 1) { + if (x < -0.25) + return -2.0*(e-(x+0.5)); + return 1.0+2.0*(x-e); + } + u.i = (uint64_t)(0x3ff + k)<<52; /* 2^k */ + twopk = u.f; + if (k < 0 || k > 56) { /* suffice to return exp(x)-1 */ + y = x - e + 1.0; + if (k == 1024) + y = y*2.0*0x1p1023; + else + y = y*twopk; + return y - 1.0; + } + u.i = (uint64_t)(0x3ff - k)<<52; /* 2^-k */ + if (k < 20) + y = (x-e+(1-u.f))*twopk; + else + y = (x-(e+u.f)+1)*twopk; + return y; +} diff --git a/libc/tinymath/floor.c b/libc/tinymath/floor.c new file mode 100644 index 000000000..d52b02590 --- /dev/null +++ b/libc/tinymath/floor.c @@ -0,0 +1,65 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/internal.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 +#define EPS DBL_EPSILON +#elif FLT_EVAL_METHOD==2 +#define EPS LDBL_EPSILON +#endif +static const double_t toint = 1/EPS; + +double floor(double x) +{ + union {double f; uint64_t i;} u = {x}; + int e = u.i >> 52 & 0x7ff; + double_t y; + + if (e >= 0x3ff+52 || x == 0) + return x; + /* y = int(x) - x, where int(x) is an integer neighbor of x */ + if (u.i >> 63) + y = x - toint + toint - x; + else + y = x + toint - toint - x; + /* special case because of non-nearest rounding modes */ + if (e <= 0x3ff-1) { + FORCE_EVAL(y); + return u.i >> 63 ? -1 : 0; + } + if (y > 0) + return x + y - 1; + return x + y; +} diff --git a/libc/tinymath/floorf.c b/libc/tinymath/floorf.c new file mode 100644 index 000000000..006ce95b4 --- /dev/null +++ b/libc/tinymath/floorf.c @@ -0,0 +1,61 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/tinymath/internal.h" +#include "third_party/libcxx/math.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +float floorf(float x) +{ + union {float f; uint32_t i;} u = {x}; + int e = (int)(u.i >> 23 & 0xff) - 0x7f; + uint32_t m; + + if (e >= 23) + return x; + if (e >= 0) { + m = 0x007fffff >> e; + if ((u.i & m) == 0) + return x; + FORCE_EVAL(x + 0x1p120f); + if (u.i >> 31) + u.i += m; + u.i &= ~m; + } else { + FORCE_EVAL(x + 0x1p120f); + if (u.i >> 31 == 0) + u.i = 0; + else if (u.i << 1) + u.f = -1.0; + } + return u.f; +} diff --git a/libc/tinymath/fmod.c b/libc/tinymath/fmod.c index 27e89f986..2d3b1d7f5 100644 --- a/libc/tinymath/fmod.c +++ b/libc/tinymath/fmod.c @@ -25,7 +25,7 @@ │ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ │ │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "third_party/libcxx/math.h" +#include "libc/math.h" asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ diff --git a/libc/tinymath/hypot.c b/libc/tinymath/hypot.c index 46555c1f6..5f64d803a 100644 --- a/libc/tinymath/hypot.c +++ b/libc/tinymath/hypot.c @@ -1,33 +1,101 @@ -/*-*- 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 2021 Justine Alexandra Roberts Tunney │ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ │ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ │ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/math.h" +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +#if FLT_EVAL_METHOD > 1U && LDBL_MANT_DIG == 64 +#define SPLIT (0x1p32 + 1) +#else +#define SPLIT (0x1p27 + 1) +#endif + +static void sq(double_t *hi, double_t *lo, double x) +{ + double_t xh, xl, xc; + + xc = (double_t)x*SPLIT; + xh = x - xc + xc; + xl = x - xh; + *hi = (double_t)x*x; + *lo = xh*xh - *hi + 2*xh*xl + xl*xl; +} + /** * Returns euclidean distance. */ -double hypot(double a, double b) { - double r, t; - if (isinf(a) || isinf(b)) return INFINITY; - a = fabs(a); - b = fabs(b); - if (a < b) t = b, b = a, a = t; - if (!a) return b; - r = b / a; - return a * sqrt(1 + r * r); +double hypot(double x, double y) +{ + union {double f; uint64_t i;} ux = {x}, uy = {y}, ut; + int ex, ey; + double_t hx, lx, hy, ly, z; + + /* arrange |x| >= |y| */ + ux.i &= -1ULL>>1; + uy.i &= -1ULL>>1; + if (ux.i < uy.i) { + ut = ux; + ux = uy; + uy = ut; + } + + /* special cases */ + ex = ux.i>>52; + ey = uy.i>>52; + x = ux.f; + y = uy.f; + /* note: hypot(inf,nan) == inf */ + if (ey == 0x7ff) + return y; + if (ex == 0x7ff || uy.i == 0) + return x; + /* note: hypot(x,y) ~= x + y*y/x/2 with inexact for small y/x */ + /* 64 difference is enough for ld80 double_t */ + if (ex - ey > 64) + return x + y; + + /* precise sqrt argument in nearest rounding mode without overflow */ + /* xh*xh must not overflow and xl*xl must not underflow in sq */ + z = 1; + if (ex > 0x3ff+510) { + z = 0x1p700; + x *= 0x1p-700; + y *= 0x1p-700; + } else if (ey < 0x3ff-450) { + z = 0x1p-700; + x *= 0x1p700; + y *= 0x1p700; + } + sq(&hx, &lx, x); + sq(&hy, &ly, y); + return z*sqrt(ly+lx+hy+hx); } diff --git a/libc/tinymath/hypotf.c b/libc/tinymath/hypotf.c index 4ddd691bb..79d345da1 100644 --- a/libc/tinymath/hypotf.c +++ b/libc/tinymath/hypotf.c @@ -1,33 +1,67 @@ -/*-*- 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 2021 Justine Alexandra Roberts Tunney │ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ │ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ │ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/math.h" -/** - * Returns euclidean distance. - */ -float hypotf(float a, float b) { - float r, t; - if (isinf(a) || isinf(b)) return INFINITY; - a = fabsf(a); - b = fabsf(b); - if (a < b) t = b, b = a, a = t; - if (!a) return b; - r = b / a; - return a * sqrtf(1 + r * r); +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +float hypotf(float x, float y) +{ + union {float f; uint32_t i;} ux = {x}, uy = {y}, ut; + float_t z; + + ux.i &= -1U>>1; + uy.i &= -1U>>1; + if (ux.i < uy.i) { + ut = ux; + ux = uy; + uy = ut; + } + + x = ux.f; + y = uy.f; + if (uy.i == 0xff<<23) + return y; + if (ux.i >= 0xff<<23 || uy.i == 0 || ux.i - uy.i >= 25<<23) + return x + y; + + z = 1; + if (ux.i >= (0x7f+60)<<23) { + z = 0x1p90f; + x *= 0x1p-90f; + y *= 0x1p-90f; + } else if (uy.i < (0x7f-60)<<23) { + z = 0x1p-90f; + x *= 0x1p90f; + y *= 0x1p90f; + } + return z*sqrtf((double)x*x + (double)y*y); } diff --git a/libc/tinymath/hypotl.c b/libc/tinymath/hypotl.c index 6e418a4f2..093a59a14 100644 --- a/libc/tinymath/hypotl.c +++ b/libc/tinymath/hypotl.c @@ -1,33 +1,100 @@ -/*-*- 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 2021 Justine Alexandra Roberts Tunney │ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ │ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ │ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/math.h" +#include "libc/tinymath/ldshape.internal.h" -/** - * Returns euclidean distance. - */ -long double hypotl(long double a, long double b) { - long double r, t; - if (isinf(a) || isinf(b)) return INFINITY; - a = fabsl(a); - b = fabsl(b); - if (a < b) t = b, b = a, a = t; - if (!a) return b; - r = b / a; - return a * sqrtl(1 + r * r); +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 +long double hypotl(long double x, long double y) +{ + return hypot(x, y); } +#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 +#if LDBL_MANT_DIG == 64 +#define SPLIT (0x1p32L+1) +#elif LDBL_MANT_DIG == 113 +#define SPLIT (0x1p57L+1) +#endif + +static void sq(long double *hi, long double *lo, long double x) +{ + long double xh, xl, xc; + xc = x*SPLIT; + xh = x - xc + xc; + xl = x - xh; + *hi = x*x; + *lo = xh*xh - *hi + 2*xh*xl + xl*xl; +} + +long double hypotl(long double x, long double y) +{ + union ldshape ux = {x}, uy = {y}; + int ex, ey; + long double hx, lx, hy, ly, z; + + ux.i.se &= 0x7fff; + uy.i.se &= 0x7fff; + if (ux.i.se < uy.i.se) { + ex = uy.i.se; + ey = ux.i.se; + x = uy.f; + y = ux.f; + } else { + ex = ux.i.se; + ey = uy.i.se; + x = ux.f; + y = uy.f; + } + + if (ex == 0x7fff && isinf(y)) + return y; + if (ex == 0x7fff || y == 0) + return x; + if (ex - ey > LDBL_MANT_DIG) + return x + y; + + z = 1; + if (ex > 0x3fff+8000) { + z = 0x1p10000L; + x *= 0x1p-10000L; + y *= 0x1p-10000L; + } else if (ey < 0x3fff-8000) { + z = 0x1p-10000L; + x *= 0x1p10000L; + y *= 0x1p10000L; + } + sq(&hx, &lx, x); + sq(&hy, &ly, y); + return z*sqrtl(ly+lx+hy+hx); +} +#endif diff --git a/libc/tinymath/j0.c b/libc/tinymath/j0.c new file mode 100644 index 000000000..621d80dc9 --- /dev/null +++ b/libc/tinymath/j0.c @@ -0,0 +1,409 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/complex.internal.h" + +asm(".ident\t\"\\n\\n\ +Double-precision math functions (MIT License)\\n\ +Copyright 2018 ARM Limited\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +/* origin: FreeBSD /usr/src/lib/msun/src/e_j0.c */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +/* j0(x), y0(x) + * Bessel function of the first and second kinds of order zero. + * Method -- j0(x): + * 1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ... + * 2. Reduce x to |x| since j0(x)=j0(-x), and + * for x in (0,2) + * j0(x) = 1-z/4+ z^2*R0/S0, where z = x*x; + * (precision: |j0-1+z/4-z^2R0/S0 |<2**-63.67 ) + * for x in (2,inf) + * j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0)) + * where x0 = x-pi/4. It is better to compute sin(x0),cos(x0) + * as follow: + * cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4) + * = 1/sqrt(2) * (cos(x) + sin(x)) + * sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4) + * = 1/sqrt(2) * (sin(x) - cos(x)) + * (To avoid cancellation, use + * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) + * to compute the worse one.) + * + * 3 Special cases + * j0(nan)= nan + * j0(0) = 1 + * j0(inf) = 0 + * + * Method -- y0(x): + * 1. For x<2. + * Since + * y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...) + * therefore y0(x)-2/pi*j0(x)*ln(x) is an even function. + * We use the following function to approximate y0, + * y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2 + * where + * U(z) = u00 + u01*z + ... + u06*z^6 + * V(z) = 1 + v01*z + ... + v04*z^4 + * with absolute approximation error bounded by 2**-72. + * Note: For tiny x, U/V = u0 and j0(x)~1, hence + * y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27) + * 2. For x>=2. + * y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0)) + * where x0 = x-pi/4. It is better to compute sin(x0),cos(x0) + * by the method mentioned above. + * 3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0. + */ + +static double pzero(double), qzero(double); + +static const double +invsqrtpi = 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */ +tpi = 6.36619772367581382433e-01; /* 0x3FE45F30, 0x6DC9C883 */ + +/* common method when |x|>=2 */ +static double common(uint32_t ix, double x, int y0) +{ + double s,c,ss,cc,z; + + /* + * j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x-pi/4)-q0(x)*sin(x-pi/4)) + * y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x-pi/4)+q0(x)*cos(x-pi/4)) + * + * sin(x-pi/4) = (sin(x) - cos(x))/sqrt(2) + * cos(x-pi/4) = (sin(x) + cos(x))/sqrt(2) + * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) + */ + s = sin(x); + c = cos(x); + if (y0) + c = -c; + cc = s+c; + /* avoid overflow in 2*x, big ulp error when x>=0x1p1023 */ + if (ix < 0x7fe00000) { + ss = s-c; + z = -cos(2*x); + if (s*c < 0) + cc = z/ss; + else + ss = z/cc; + if (ix < 0x48000000) { + if (y0) + ss = -ss; + cc = pzero(x)*cc-qzero(x)*ss; + } + } + return invsqrtpi*cc/sqrt(x); +} + +/* R0/S0 on [0, 2.00] */ +static const double +R02 = 1.56249999999999947958e-02, /* 0x3F8FFFFF, 0xFFFFFFFD */ +R03 = -1.89979294238854721751e-04, /* 0xBF28E6A5, 0xB61AC6E9 */ +R04 = 1.82954049532700665670e-06, /* 0x3EBEB1D1, 0x0C503919 */ +R05 = -4.61832688532103189199e-09, /* 0xBE33D5E7, 0x73D63FCE */ +S01 = 1.56191029464890010492e-02, /* 0x3F8FFCE8, 0x82C8C2A4 */ +S02 = 1.16926784663337450260e-04, /* 0x3F1EA6D2, 0xDD57DBF4 */ +S03 = 5.13546550207318111446e-07, /* 0x3EA13B54, 0xCE84D5A9 */ +S04 = 1.16614003333790000205e-09; /* 0x3E1408BC, 0xF4745D8F */ + +double j0(double x) +{ + double z,r,s; + uint32_t ix; + + GET_HIGH_WORD(ix, x); + ix &= 0x7fffffff; + + /* j0(+-inf)=0, j0(nan)=nan */ + if (ix >= 0x7ff00000) + return 1/(x*x); + x = fabs(x); + + if (ix >= 0x40000000) { /* |x| >= 2 */ + /* large ulp error near zeros: 2.4, 5.52, 8.6537,.. */ + return common(ix,x,0); + } + + /* 1 - x*x/4 + x*x*R(x^2)/S(x^2) */ + if (ix >= 0x3f200000) { /* |x| >= 2**-13 */ + /* up to 4ulp error close to 2 */ + z = x*x; + r = z*(R02+z*(R03+z*(R04+z*R05))); + s = 1+z*(S01+z*(S02+z*(S03+z*S04))); + return (1+x/2)*(1-x/2) + z*(r/s); + } + + /* 1 - x*x/4 */ + /* prevent underflow */ + /* inexact should be raised when x!=0, this is not done correctly */ + if (ix >= 0x38000000) /* |x| >= 2**-127 */ + x = 0.25*x*x; + return 1 - x; +} + +static const double +u00 = -7.38042951086872317523e-02, /* 0xBFB2E4D6, 0x99CBD01F */ +u01 = 1.76666452509181115538e-01, /* 0x3FC69D01, 0x9DE9E3FC */ +u02 = -1.38185671945596898896e-02, /* 0xBF8C4CE8, 0xB16CFA97 */ +u03 = 3.47453432093683650238e-04, /* 0x3F36C54D, 0x20B29B6B */ +u04 = -3.81407053724364161125e-06, /* 0xBECFFEA7, 0x73D25CAD */ +u05 = 1.95590137035022920206e-08, /* 0x3E550057, 0x3B4EABD4 */ +u06 = -3.98205194132103398453e-11, /* 0xBDC5E43D, 0x693FB3C8 */ +v01 = 1.27304834834123699328e-02, /* 0x3F8A1270, 0x91C9C71A */ +v02 = 7.60068627350353253702e-05, /* 0x3F13ECBB, 0xF578C6C1 */ +v03 = 2.59150851840457805467e-07, /* 0x3E91642D, 0x7FF202FD */ +v04 = 4.41110311332675467403e-10; /* 0x3DFE5018, 0x3BD6D9EF */ + +double y0(double x) +{ + double z,u,v; + uint32_t ix,lx; + + EXTRACT_WORDS(ix, lx, x); + + /* y0(nan)=nan, y0(<0)=nan, y0(0)=-inf, y0(inf)=0 */ + if ((ix<<1 | lx) == 0) + return -1/0.0; + if (ix>>31) + return 0/0.0; + if (ix >= 0x7ff00000) + return 1/x; + + if (ix >= 0x40000000) { /* x >= 2 */ + /* large ulp errors near zeros: 3.958, 7.086,.. */ + return common(ix,x,1); + } + + /* U(x^2)/V(x^2) + (2/pi)*j0(x)*log(x) */ + if (ix >= 0x3e400000) { /* x >= 2**-27 */ + /* large ulp error near the first zero, x ~= 0.89 */ + z = x*x; + u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06))))); + v = 1.0+z*(v01+z*(v02+z*(v03+z*v04))); + return u/v + tpi*(j0(x)*log(x)); + } + return u00 + tpi*log(x); +} + +/* The asymptotic expansions of pzero is + * 1 - 9/128 s^2 + 11025/98304 s^4 - ..., where s = 1/x. + * For x >= 2, We approximate pzero by + * pzero(x) = 1 + (R/S) + * where R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10 + * S = 1 + pS0*s^2 + ... + pS4*s^10 + * and + * | pzero(x)-1-R/S | <= 2 ** ( -60.26) + */ +static const double pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ + 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ + -7.03124999999900357484e-02, /* 0xBFB1FFFF, 0xFFFFFD32 */ + -8.08167041275349795626e+00, /* 0xC02029D0, 0xB44FA779 */ + -2.57063105679704847262e+02, /* 0xC0701102, 0x7B19E863 */ + -2.48521641009428822144e+03, /* 0xC0A36A6E, 0xCD4DCAFC */ + -5.25304380490729545272e+03, /* 0xC0B4850B, 0x36CC643D */ +}; +static const double pS8[5] = { + 1.16534364619668181717e+02, /* 0x405D2233, 0x07A96751 */ + 3.83374475364121826715e+03, /* 0x40ADF37D, 0x50596938 */ + 4.05978572648472545552e+04, /* 0x40E3D2BB, 0x6EB6B05F */ + 1.16752972564375915681e+05, /* 0x40FC810F, 0x8F9FA9BD */ + 4.76277284146730962675e+04, /* 0x40E74177, 0x4F2C49DC */ +}; + +static const double pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ + -1.14125464691894502584e-11, /* 0xBDA918B1, 0x47E495CC */ + -7.03124940873599280078e-02, /* 0xBFB1FFFF, 0xE69AFBC6 */ + -4.15961064470587782438e+00, /* 0xC010A370, 0xF90C6BBF */ + -6.76747652265167261021e+01, /* 0xC050EB2F, 0x5A7D1783 */ + -3.31231299649172967747e+02, /* 0xC074B3B3, 0x6742CC63 */ + -3.46433388365604912451e+02, /* 0xC075A6EF, 0x28A38BD7 */ +}; +static const double pS5[5] = { + 6.07539382692300335975e+01, /* 0x404E6081, 0x0C98C5DE */ + 1.05125230595704579173e+03, /* 0x40906D02, 0x5C7E2864 */ + 5.97897094333855784498e+03, /* 0x40B75AF8, 0x8FBE1D60 */ + 9.62544514357774460223e+03, /* 0x40C2CCB8, 0xFA76FA38 */ + 2.40605815922939109441e+03, /* 0x40A2CC1D, 0xC70BE864 */ +}; + +static const double pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ + -2.54704601771951915620e-09, /* 0xBE25E103, 0x6FE1AA86 */ + -7.03119616381481654654e-02, /* 0xBFB1FFF6, 0xF7C0E24B */ + -2.40903221549529611423e+00, /* 0xC00345B2, 0xAEA48074 */ + -2.19659774734883086467e+01, /* 0xC035F74A, 0x4CB94E14 */ + -5.80791704701737572236e+01, /* 0xC04D0A22, 0x420A1A45 */ + -3.14479470594888503854e+01, /* 0xC03F72AC, 0xA892D80F */ +}; +static const double pS3[5] = { + 3.58560338055209726349e+01, /* 0x4041ED92, 0x84077DD3 */ + 3.61513983050303863820e+02, /* 0x40769839, 0x464A7C0E */ + 1.19360783792111533330e+03, /* 0x4092A66E, 0x6D1061D6 */ + 1.12799679856907414432e+03, /* 0x40919FFC, 0xB8C39B7E */ + 1.73580930813335754692e+02, /* 0x4065B296, 0xFC379081 */ +}; + +static const double pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ + -8.87534333032526411254e-08, /* 0xBE77D316, 0xE927026D */ + -7.03030995483624743247e-02, /* 0xBFB1FF62, 0x495E1E42 */ + -1.45073846780952986357e+00, /* 0xBFF73639, 0x8A24A843 */ + -7.63569613823527770791e+00, /* 0xC01E8AF3, 0xEDAFA7F3 */ + -1.11931668860356747786e+01, /* 0xC02662E6, 0xC5246303 */ + -3.23364579351335335033e+00, /* 0xC009DE81, 0xAF8FE70F */ +}; +static const double pS2[5] = { + 2.22202997532088808441e+01, /* 0x40363865, 0x908B5959 */ + 1.36206794218215208048e+02, /* 0x4061069E, 0x0EE8878F */ + 2.70470278658083486789e+02, /* 0x4070E786, 0x42EA079B */ + 1.53875394208320329881e+02, /* 0x40633C03, 0x3AB6FAFF */ + 1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */ +}; + +static double pzero(double x) +{ + const double *p,*q; + double_t z,r,s; + uint32_t ix; + + GET_HIGH_WORD(ix, x); + ix &= 0x7fffffff; + if (ix >= 0x40200000){p = pR8; q = pS8;} + else if (ix >= 0x40122E8B){p = pR5; q = pS5;} + else if (ix >= 0x4006DB6D){p = pR3; q = pS3;} + else /*ix >= 0x40000000*/ {p = pR2; q = pS2;} + z = 1.0/(x*x); + r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); + s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); + return 1.0 + r/s; +} + + +/* For x >= 8, the asymptotic expansions of qzero is + * -1/8 s + 75/1024 s^3 - ..., where s = 1/x. + * We approximate pzero by + * qzero(x) = s*(-1.25 + (R/S)) + * where R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10 + * S = 1 + qS0*s^2 + ... + qS5*s^12 + * and + * | qzero(x)/s +1.25-R/S | <= 2 ** ( -61.22) + */ +static const double qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ + 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ + 7.32421874999935051953e-02, /* 0x3FB2BFFF, 0xFFFFFE2C */ + 1.17682064682252693899e+01, /* 0x40278952, 0x5BB334D6 */ + 5.57673380256401856059e+02, /* 0x40816D63, 0x15301825 */ + 8.85919720756468632317e+03, /* 0x40C14D99, 0x3E18F46D */ + 3.70146267776887834771e+04, /* 0x40E212D4, 0x0E901566 */ +}; +static const double qS8[6] = { + 1.63776026895689824414e+02, /* 0x406478D5, 0x365B39BC */ + 8.09834494656449805916e+03, /* 0x40BFA258, 0x4E6B0563 */ + 1.42538291419120476348e+05, /* 0x41016652, 0x54D38C3F */ + 8.03309257119514397345e+05, /* 0x412883DA, 0x83A52B43 */ + 8.40501579819060512818e+05, /* 0x4129A66B, 0x28DE0B3D */ + -3.43899293537866615225e+05, /* 0xC114FD6D, 0x2C9530C5 */ +}; + +static const double qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ + 1.84085963594515531381e-11, /* 0x3DB43D8F, 0x29CC8CD9 */ + 7.32421766612684765896e-02, /* 0x3FB2BFFF, 0xD172B04C */ + 5.83563508962056953777e+00, /* 0x401757B0, 0xB9953DD3 */ + 1.35111577286449829671e+02, /* 0x4060E392, 0x0A8788E9 */ + 1.02724376596164097464e+03, /* 0x40900CF9, 0x9DC8C481 */ + 1.98997785864605384631e+03, /* 0x409F17E9, 0x53C6E3A6 */ +}; +static const double qS5[6] = { + 8.27766102236537761883e+01, /* 0x4054B1B3, 0xFB5E1543 */ + 2.07781416421392987104e+03, /* 0x40A03BA0, 0xDA21C0CE */ + 1.88472887785718085070e+04, /* 0x40D267D2, 0x7B591E6D */ + 5.67511122894947329769e+04, /* 0x40EBB5E3, 0x97E02372 */ + 3.59767538425114471465e+04, /* 0x40E19118, 0x1F7A54A0 */ + -5.35434275601944773371e+03, /* 0xC0B4EA57, 0xBEDBC609 */ +}; + +static const double qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ + 4.37741014089738620906e-09, /* 0x3E32CD03, 0x6ADECB82 */ + 7.32411180042911447163e-02, /* 0x3FB2BFEE, 0x0E8D0842 */ + 3.34423137516170720929e+00, /* 0x400AC0FC, 0x61149CF5 */ + 4.26218440745412650017e+01, /* 0x40454F98, 0x962DAEDD */ + 1.70808091340565596283e+02, /* 0x406559DB, 0xE25EFD1F */ + 1.66733948696651168575e+02, /* 0x4064D77C, 0x81FA21E0 */ +}; +static const double qS3[6] = { + 4.87588729724587182091e+01, /* 0x40486122, 0xBFE343A6 */ + 7.09689221056606015736e+02, /* 0x40862D83, 0x86544EB3 */ + 3.70414822620111362994e+03, /* 0x40ACF04B, 0xE44DFC63 */ + 6.46042516752568917582e+03, /* 0x40B93C6C, 0xD7C76A28 */ + 2.51633368920368957333e+03, /* 0x40A3A8AA, 0xD94FB1C0 */ + -1.49247451836156386662e+02, /* 0xC062A7EB, 0x201CF40F */ +}; + +static const double qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ + 1.50444444886983272379e-07, /* 0x3E84313B, 0x54F76BDB */ + 7.32234265963079278272e-02, /* 0x3FB2BEC5, 0x3E883E34 */ + 1.99819174093815998816e+00, /* 0x3FFFF897, 0xE727779C */ + 1.44956029347885735348e+01, /* 0x402CFDBF, 0xAAF96FE5 */ + 3.16662317504781540833e+01, /* 0x403FAA8E, 0x29FBDC4A */ + 1.62527075710929267416e+01, /* 0x403040B1, 0x71814BB4 */ +}; +static const double qS2[6] = { + 3.03655848355219184498e+01, /* 0x403E5D96, 0xF7C07AED */ + 2.69348118608049844624e+02, /* 0x4070D591, 0xE4D14B40 */ + 8.44783757595320139444e+02, /* 0x408A6645, 0x22B3BF22 */ + 8.82935845112488550512e+02, /* 0x408B977C, 0x9C5CC214 */ + 2.12666388511798828631e+02, /* 0x406A9553, 0x0E001365 */ + -5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */ +}; + +static double qzero(double x) +{ + const double *p,*q; + double_t s,r,z; + uint32_t ix; + + GET_HIGH_WORD(ix, x); + ix &= 0x7fffffff; + if (ix >= 0x40200000){p = qR8; q = qS8;} + else if (ix >= 0x40122E8B){p = qR5; q = qS5;} + else if (ix >= 0x4006DB6D){p = qR3; q = qS3;} + else /*ix >= 0x40000000*/ {p = qR2; q = qS2;} + z = 1.0/(x*x); + r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); + s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); + return (-.125 + r/s)/x; +} diff --git a/libc/tinymath/j0f.c b/libc/tinymath/j0f.c new file mode 100644 index 000000000..426c5d0e5 --- /dev/null +++ b/libc/tinymath/j0f.c @@ -0,0 +1,347 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/complex.internal.h" + +asm(".ident\t\"\\n\\n\ +Double-precision math functions (MIT License)\\n\ +Copyright 2018 ARM Limited\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +/* origin: FreeBSD /usr/src/lib/msun/src/e_j0f.c */ +/* + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +static float pzerof(float), qzerof(float); + +static const float +invsqrtpi = 5.6418961287e-01, /* 0x3f106ebb */ +tpi = 6.3661974669e-01; /* 0x3f22f983 */ + +static float common(uint32_t ix, float x, int y0) +{ + float z,s,c,ss,cc; + /* + * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x) + * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x) + */ + s = sinf(x); + c = cosf(x); + if (y0) + c = -c; + cc = s+c; + if (ix < 0x7f000000) { + ss = s-c; + z = -cosf(2*x); + if (s*c < 0) + cc = z/ss; + else + ss = z/cc; + if (ix < 0x58800000) { + if (y0) + ss = -ss; + cc = pzerof(x)*cc-qzerof(x)*ss; + } + } + return invsqrtpi*cc/sqrtf(x); +} + +/* R0/S0 on [0, 2.00] */ +static const float +R02 = 1.5625000000e-02, /* 0x3c800000 */ +R03 = -1.8997929874e-04, /* 0xb947352e */ +R04 = 1.8295404516e-06, /* 0x35f58e88 */ +R05 = -4.6183270541e-09, /* 0xb19eaf3c */ +S01 = 1.5619102865e-02, /* 0x3c7fe744 */ +S02 = 1.1692678527e-04, /* 0x38f53697 */ +S03 = 5.1354652442e-07, /* 0x3509daa6 */ +S04 = 1.1661400734e-09; /* 0x30a045e8 */ + +float j0f(float x) +{ + float z,r,s; + uint32_t ix; + + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; + if (ix >= 0x7f800000) + return 1/(x*x); + x = fabsf(x); + + if (ix >= 0x40000000) { /* |x| >= 2 */ + /* large ulp error near zeros */ + return common(ix, x, 0); + } + if (ix >= 0x3a000000) { /* |x| >= 2**-11 */ + /* up to 4ulp error near 2 */ + z = x*x; + r = z*(R02+z*(R03+z*(R04+z*R05))); + s = 1+z*(S01+z*(S02+z*(S03+z*S04))); + return (1+x/2)*(1-x/2) + z*(r/s); + } + if (ix >= 0x21800000) /* |x| >= 2**-60 */ + x = 0.25f*x*x; + return 1 - x; +} + +static const float +u00 = -7.3804296553e-02, /* 0xbd9726b5 */ +u01 = 1.7666645348e-01, /* 0x3e34e80d */ +u02 = -1.3818567619e-02, /* 0xbc626746 */ +u03 = 3.4745343146e-04, /* 0x39b62a69 */ +u04 = -3.8140706238e-06, /* 0xb67ff53c */ +u05 = 1.9559013964e-08, /* 0x32a802ba */ +u06 = -3.9820518410e-11, /* 0xae2f21eb */ +v01 = 1.2730483897e-02, /* 0x3c509385 */ +v02 = 7.6006865129e-05, /* 0x389f65e0 */ +v03 = 2.5915085189e-07, /* 0x348b216c */ +v04 = 4.4111031494e-10; /* 0x2ff280c2 */ + +float y0f(float x) +{ + float z,u,v; + uint32_t ix; + + GET_FLOAT_WORD(ix, x); + if ((ix & 0x7fffffff) == 0) + return -1/0.0f; + if (ix>>31) + return 0/0.0f; + if (ix >= 0x7f800000) + return 1/x; + if (ix >= 0x40000000) { /* |x| >= 2.0 */ + /* large ulp error near zeros */ + return common(ix,x,1); + } + if (ix >= 0x39000000) { /* x >= 2**-13 */ + /* large ulp error at x ~= 0.89 */ + z = x*x; + u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06))))); + v = 1+z*(v01+z*(v02+z*(v03+z*v04))); + return u/v + tpi*(j0f(x)*logf(x)); + } + return u00 + tpi*logf(x); +} + +/* The asymptotic expansions of pzero is + * 1 - 9/128 s^2 + 11025/98304 s^4 - ..., where s = 1/x. + * For x >= 2, We approximate pzero by + * pzero(x) = 1 + (R/S) + * where R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10 + * S = 1 + pS0*s^2 + ... + pS4*s^10 + * and + * | pzero(x)-1-R/S | <= 2 ** ( -60.26) + */ +static const float pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ + 0.0000000000e+00, /* 0x00000000 */ + -7.0312500000e-02, /* 0xbd900000 */ + -8.0816707611e+00, /* 0xc1014e86 */ + -2.5706311035e+02, /* 0xc3808814 */ + -2.4852163086e+03, /* 0xc51b5376 */ + -5.2530439453e+03, /* 0xc5a4285a */ +}; +static const float pS8[5] = { + 1.1653436279e+02, /* 0x42e91198 */ + 3.8337448730e+03, /* 0x456f9beb */ + 4.0597855469e+04, /* 0x471e95db */ + 1.1675296875e+05, /* 0x47e4087c */ + 4.7627726562e+04, /* 0x473a0bba */ +}; +static const float pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ + -1.1412546255e-11, /* 0xad48c58a */ + -7.0312492549e-02, /* 0xbd8fffff */ + -4.1596107483e+00, /* 0xc0851b88 */ + -6.7674766541e+01, /* 0xc287597b */ + -3.3123129272e+02, /* 0xc3a59d9b */ + -3.4643338013e+02, /* 0xc3ad3779 */ +}; +static const float pS5[5] = { + 6.0753936768e+01, /* 0x42730408 */ + 1.0512523193e+03, /* 0x44836813 */ + 5.9789707031e+03, /* 0x45bad7c4 */ + 9.6254453125e+03, /* 0x461665c8 */ + 2.4060581055e+03, /* 0x451660ee */ +}; + +static const float pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ + -2.5470459075e-09, /* 0xb12f081b */ + -7.0311963558e-02, /* 0xbd8fffb8 */ + -2.4090321064e+00, /* 0xc01a2d95 */ + -2.1965976715e+01, /* 0xc1afba52 */ + -5.8079170227e+01, /* 0xc2685112 */ + -3.1447946548e+01, /* 0xc1fb9565 */ +}; +static const float pS3[5] = { + 3.5856033325e+01, /* 0x420f6c94 */ + 3.6151397705e+02, /* 0x43b4c1ca */ + 1.1936077881e+03, /* 0x44953373 */ + 1.1279968262e+03, /* 0x448cffe6 */ + 1.7358093262e+02, /* 0x432d94b8 */ +}; + +static const float pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ + -8.8753431271e-08, /* 0xb3be98b7 */ + -7.0303097367e-02, /* 0xbd8ffb12 */ + -1.4507384300e+00, /* 0xbfb9b1cc */ + -7.6356959343e+00, /* 0xc0f4579f */ + -1.1193166733e+01, /* 0xc1331736 */ + -3.2336456776e+00, /* 0xc04ef40d */ +}; +static const float pS2[5] = { + 2.2220300674e+01, /* 0x41b1c32d */ + 1.3620678711e+02, /* 0x430834f0 */ + 2.7047027588e+02, /* 0x43873c32 */ + 1.5387539673e+02, /* 0x4319e01a */ + 1.4657617569e+01, /* 0x416a859a */ +}; + +static float pzerof(float x) +{ + const float *p,*q; + float_t z,r,s; + uint32_t ix; + + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; + if (ix >= 0x41000000){p = pR8; q = pS8;} + else if (ix >= 0x409173eb){p = pR5; q = pS5;} + else if (ix >= 0x4036d917){p = pR3; q = pS3;} + else /*ix >= 0x40000000*/ {p = pR2; q = pS2;} + z = 1.0f/(x*x); + r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); + s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); + return 1.0f + r/s; +} + + +/* For x >= 8, the asymptotic expansions of qzero is + * -1/8 s + 75/1024 s^3 - ..., where s = 1/x. + * We approximate pzero by + * qzero(x) = s*(-1.25 + (R/S)) + * where R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10 + * S = 1 + qS0*s^2 + ... + qS5*s^12 + * and + * | qzero(x)/s +1.25-R/S | <= 2 ** ( -61.22) + */ +static const float qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ + 0.0000000000e+00, /* 0x00000000 */ + 7.3242187500e-02, /* 0x3d960000 */ + 1.1768206596e+01, /* 0x413c4a93 */ + 5.5767340088e+02, /* 0x440b6b19 */ + 8.8591972656e+03, /* 0x460a6cca */ + 3.7014625000e+04, /* 0x471096a0 */ +}; +static const float qS8[6] = { + 1.6377603149e+02, /* 0x4323c6aa */ + 8.0983447266e+03, /* 0x45fd12c2 */ + 1.4253829688e+05, /* 0x480b3293 */ + 8.0330925000e+05, /* 0x49441ed4 */ + 8.4050156250e+05, /* 0x494d3359 */ + -3.4389928125e+05, /* 0xc8a7eb69 */ +}; + +static const float qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ + 1.8408595828e-11, /* 0x2da1ec79 */ + 7.3242180049e-02, /* 0x3d95ffff */ + 5.8356351852e+00, /* 0x40babd86 */ + 1.3511157227e+02, /* 0x43071c90 */ + 1.0272437744e+03, /* 0x448067cd */ + 1.9899779053e+03, /* 0x44f8bf4b */ +}; +static const float qS5[6] = { + 8.2776611328e+01, /* 0x42a58da0 */ + 2.0778142090e+03, /* 0x4501dd07 */ + 1.8847289062e+04, /* 0x46933e94 */ + 5.6751113281e+04, /* 0x475daf1d */ + 3.5976753906e+04, /* 0x470c88c1 */ + -5.3543427734e+03, /* 0xc5a752be */ +}; + +static const float qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ + 4.3774099900e-09, /* 0x3196681b */ + 7.3241114616e-02, /* 0x3d95ff70 */ + 3.3442313671e+00, /* 0x405607e3 */ + 4.2621845245e+01, /* 0x422a7cc5 */ + 1.7080809021e+02, /* 0x432acedf */ + 1.6673394775e+02, /* 0x4326bbe4 */ +}; +static const float qS3[6] = { + 4.8758872986e+01, /* 0x42430916 */ + 7.0968920898e+02, /* 0x44316c1c */ + 3.7041481934e+03, /* 0x4567825f */ + 6.4604252930e+03, /* 0x45c9e367 */ + 2.5163337402e+03, /* 0x451d4557 */ + -1.4924745178e+02, /* 0xc3153f59 */ +}; + +static const float qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ + 1.5044444979e-07, /* 0x342189db */ + 7.3223426938e-02, /* 0x3d95f62a */ + 1.9981917143e+00, /* 0x3fffc4bf */ + 1.4495602608e+01, /* 0x4167edfd */ + 3.1666231155e+01, /* 0x41fd5471 */ + 1.6252708435e+01, /* 0x4182058c */ +}; +static const float qS2[6] = { + 3.0365585327e+01, /* 0x41f2ecb8 */ + 2.6934811401e+02, /* 0x4386ac8f */ + 8.4478375244e+02, /* 0x44533229 */ + 8.8293585205e+02, /* 0x445cbbe5 */ + 2.1266638184e+02, /* 0x4354aa98 */ + -5.3109550476e+00, /* 0xc0a9f358 */ +}; + +static float qzerof(float x) +{ + const float *p,*q; + float_t s,r,z; + uint32_t ix; + + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; + if (ix >= 0x41000000){p = qR8; q = qS8;} + else if (ix >= 0x409173eb){p = qR5; q = qS5;} + else if (ix >= 0x4036d917){p = qR3; q = qS3;} + else /*ix >= 0x40000000*/ {p = qR2; q = qS2;} + z = 1.0f/(x*x); + r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); + s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); + return (-.125f + r/s)/x; +} diff --git a/libc/tinymath/j1.c b/libc/tinymath/j1.c new file mode 100644 index 000000000..e7172a672 --- /dev/null +++ b/libc/tinymath/j1.c @@ -0,0 +1,396 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/complex.internal.h" + +asm(".ident\t\"\\n\\n\ +Double-precision math functions (MIT License)\\n\ +Copyright 2018 ARM Limited\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +/* origin: FreeBSD /usr/src/lib/msun/src/e_j1.c */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +/* j1(x), y1(x) + * Bessel function of the first and second kinds of order zero. + * Method -- j1(x): + * 1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ... + * 2. Reduce x to |x| since j1(x)=-j1(-x), and + * for x in (0,2) + * j1(x) = x/2 + x*z*R0/S0, where z = x*x; + * (precision: |j1/x - 1/2 - R0/S0 |<2**-61.51 ) + * for x in (2,inf) + * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1)) + * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1)) + * where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1) + * as follow: + * cos(x1) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4) + * = 1/sqrt(2) * (sin(x) - cos(x)) + * sin(x1) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) + * = -1/sqrt(2) * (sin(x) + cos(x)) + * (To avoid cancellation, use + * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) + * to compute the worse one.) + * + * 3 Special cases + * j1(nan)= nan + * j1(0) = 0 + * j1(inf) = 0 + * + * Method -- y1(x): + * 1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN + * 2. For x<2. + * Since + * y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...) + * therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function. + * We use the following function to approximate y1, + * y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2 + * where for x in [0,2] (abs err less than 2**-65.89) + * U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4 + * V(z) = 1 + v0[0]*z + ... + v0[4]*z^5 + * Note: For tiny x, 1/x dominate y1 and hence + * y1(tiny) = -2/pi/tiny, (choose tiny<2**-54) + * 3. For x>=2. + * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1)) + * where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1) + * by method mentioned above. + */ + +static double pone(double), qone(double); + +static const double +invsqrtpi = 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */ +tpi = 6.36619772367581382433e-01; /* 0x3FE45F30, 0x6DC9C883 */ + +static double common(uint32_t ix, double x, int y1, int sign) +{ + double z,s,c,ss,cc; + + /* + * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x-3pi/4)-q1(x)*sin(x-3pi/4)) + * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x-3pi/4)+q1(x)*cos(x-3pi/4)) + * + * sin(x-3pi/4) = -(sin(x) + cos(x))/sqrt(2) + * cos(x-3pi/4) = (sin(x) - cos(x))/sqrt(2) + * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) + */ + s = sin(x); + if (y1) + s = -s; + c = cos(x); + cc = s-c; + if (ix < 0x7fe00000) { + /* avoid overflow in 2*x */ + ss = -s-c; + z = cos(2*x); + if (s*c > 0) + cc = z/ss; + else + ss = z/cc; + if (ix < 0x48000000) { + if (y1) + ss = -ss; + cc = pone(x)*cc-qone(x)*ss; + } + } + if (sign) + cc = -cc; + return invsqrtpi*cc/sqrt(x); +} + +/* R0/S0 on [0,2] */ +static const double +r00 = -6.25000000000000000000e-02, /* 0xBFB00000, 0x00000000 */ +r01 = 1.40705666955189706048e-03, /* 0x3F570D9F, 0x98472C61 */ +r02 = -1.59955631084035597520e-05, /* 0xBEF0C5C6, 0xBA169668 */ +r03 = 4.96727999609584448412e-08, /* 0x3E6AAAFA, 0x46CA0BD9 */ +s01 = 1.91537599538363460805e-02, /* 0x3F939D0B, 0x12637E53 */ +s02 = 1.85946785588630915560e-04, /* 0x3F285F56, 0xB9CDF664 */ +s03 = 1.17718464042623683263e-06, /* 0x3EB3BFF8, 0x333F8498 */ +s04 = 5.04636257076217042715e-09, /* 0x3E35AC88, 0xC97DFF2C */ +s05 = 1.23542274426137913908e-11; /* 0x3DAB2ACF, 0xCFB97ED8 */ + +double j1(double x) +{ + double z,r,s; + uint32_t ix; + int sign; + + GET_HIGH_WORD(ix, x); + sign = ix>>31; + ix &= 0x7fffffff; + if (ix >= 0x7ff00000) + return 1/(x*x); + if (ix >= 0x40000000) /* |x| >= 2 */ + return common(ix, fabs(x), 0, sign); + if (ix >= 0x38000000) { /* |x| >= 2**-127 */ + z = x*x; + r = z*(r00+z*(r01+z*(r02+z*r03))); + s = 1+z*(s01+z*(s02+z*(s03+z*(s04+z*s05)))); + z = r/s; + } else + /* avoid underflow, raise inexact if x!=0 */ + z = x; + return (0.5 + z)*x; +} + +static const double U0[5] = { + -1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */ + 5.04438716639811282616e-02, /* 0x3FA9D3C7, 0x76292CD1 */ + -1.91256895875763547298e-03, /* 0xBF5F55E5, 0x4844F50F */ + 2.35252600561610495928e-05, /* 0x3EF8AB03, 0x8FA6B88E */ + -9.19099158039878874504e-08, /* 0xBE78AC00, 0x569105B8 */ +}; +static const double V0[5] = { + 1.99167318236649903973e-02, /* 0x3F94650D, 0x3F4DA9F0 */ + 2.02552581025135171496e-04, /* 0x3F2A8C89, 0x6C257764 */ + 1.35608801097516229404e-06, /* 0x3EB6C05A, 0x894E8CA6 */ + 6.22741452364621501295e-09, /* 0x3E3ABF1D, 0x5BA69A86 */ + 1.66559246207992079114e-11, /* 0x3DB25039, 0xDACA772A */ +}; + +double y1(double x) +{ + double z,u,v; + uint32_t ix,lx; + + EXTRACT_WORDS(ix, lx, x); + /* y1(nan)=nan, y1(<0)=nan, y1(0)=-inf, y1(inf)=0 */ + if ((ix<<1 | lx) == 0) + return -1/0.0; + if (ix>>31) + return 0/0.0; + if (ix >= 0x7ff00000) + return 1/x; + + if (ix >= 0x40000000) /* x >= 2 */ + return common(ix, x, 1, 0); + if (ix < 0x3c900000) /* x < 2**-54 */ + return -tpi/x; + z = x*x; + u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4]))); + v = 1+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4])))); + return x*(u/v) + tpi*(j1(x)*log(x)-1/x); +} + +/* For x >= 8, the asymptotic expansions of pone is + * 1 + 15/128 s^2 - 4725/2^15 s^4 - ..., where s = 1/x. + * We approximate pone by + * pone(x) = 1 + (R/S) + * where R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10 + * S = 1 + ps0*s^2 + ... + ps4*s^10 + * and + * | pone(x)-1-R/S | <= 2 ** ( -60.06) + */ + +static const double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ + 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ + 1.17187499999988647970e-01, /* 0x3FBDFFFF, 0xFFFFFCCE */ + 1.32394806593073575129e+01, /* 0x402A7A9D, 0x357F7FCE */ + 4.12051854307378562225e+02, /* 0x4079C0D4, 0x652EA590 */ + 3.87474538913960532227e+03, /* 0x40AE457D, 0xA3A532CC */ + 7.91447954031891731574e+03, /* 0x40BEEA7A, 0xC32782DD */ +}; +static const double ps8[5] = { + 1.14207370375678408436e+02, /* 0x405C8D45, 0x8E656CAC */ + 3.65093083420853463394e+03, /* 0x40AC85DC, 0x964D274F */ + 3.69562060269033463555e+04, /* 0x40E20B86, 0x97C5BB7F */ + 9.76027935934950801311e+04, /* 0x40F7D42C, 0xB28F17BB */ + 3.08042720627888811578e+04, /* 0x40DE1511, 0x697A0B2D */ +}; + +static const double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ + 1.31990519556243522749e-11, /* 0x3DAD0667, 0xDAE1CA7D */ + 1.17187493190614097638e-01, /* 0x3FBDFFFF, 0xE2C10043 */ + 6.80275127868432871736e+00, /* 0x401B3604, 0x6E6315E3 */ + 1.08308182990189109773e+02, /* 0x405B13B9, 0x452602ED */ + 5.17636139533199752805e+02, /* 0x40802D16, 0xD052D649 */ + 5.28715201363337541807e+02, /* 0x408085B8, 0xBB7E0CB7 */ +}; +static const double ps5[5] = { + 5.92805987221131331921e+01, /* 0x404DA3EA, 0xA8AF633D */ + 9.91401418733614377743e+02, /* 0x408EFB36, 0x1B066701 */ + 5.35326695291487976647e+03, /* 0x40B4E944, 0x5706B6FB */ + 7.84469031749551231769e+03, /* 0x40BEA4B0, 0xB8A5BB15 */ + 1.50404688810361062679e+03, /* 0x40978030, 0x036F5E51 */ +}; + +static const double pr3[6] = { + 3.02503916137373618024e-09, /* 0x3E29FC21, 0xA7AD9EDD */ + 1.17186865567253592491e-01, /* 0x3FBDFFF5, 0x5B21D17B */ + 3.93297750033315640650e+00, /* 0x400F76BC, 0xE85EAD8A */ + 3.51194035591636932736e+01, /* 0x40418F48, 0x9DA6D129 */ + 9.10550110750781271918e+01, /* 0x4056C385, 0x4D2C1837 */ + 4.85590685197364919645e+01, /* 0x4048478F, 0x8EA83EE5 */ +}; +static const double ps3[5] = { + 3.47913095001251519989e+01, /* 0x40416549, 0xA134069C */ + 3.36762458747825746741e+02, /* 0x40750C33, 0x07F1A75F */ + 1.04687139975775130551e+03, /* 0x40905B7C, 0x5037D523 */ + 8.90811346398256432622e+02, /* 0x408BD67D, 0xA32E31E9 */ + 1.03787932439639277504e+02, /* 0x4059F26D, 0x7C2EED53 */ +}; + +static const double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ + 1.07710830106873743082e-07, /* 0x3E7CE9D4, 0xF65544F4 */ + 1.17176219462683348094e-01, /* 0x3FBDFF42, 0xBE760D83 */ + 2.36851496667608785174e+00, /* 0x4002F2B7, 0xF98FAEC0 */ + 1.22426109148261232917e+01, /* 0x40287C37, 0x7F71A964 */ + 1.76939711271687727390e+01, /* 0x4031B1A8, 0x177F8EE2 */ + 5.07352312588818499250e+00, /* 0x40144B49, 0xA574C1FE */ +}; +static const double ps2[5] = { + 2.14364859363821409488e+01, /* 0x40356FBD, 0x8AD5ECDC */ + 1.25290227168402751090e+02, /* 0x405F5293, 0x14F92CD5 */ + 2.32276469057162813669e+02, /* 0x406D08D8, 0xD5A2DBD9 */ + 1.17679373287147100768e+02, /* 0x405D6B7A, 0xDA1884A9 */ + 8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */ +}; + +static double pone(double x) +{ + const double *p,*q; + double_t z,r,s; + uint32_t ix; + + GET_HIGH_WORD(ix, x); + ix &= 0x7fffffff; + if (ix >= 0x40200000){p = pr8; q = ps8;} + else if (ix >= 0x40122E8B){p = pr5; q = ps5;} + else if (ix >= 0x4006DB6D){p = pr3; q = ps3;} + else /*ix >= 0x40000000*/ {p = pr2; q = ps2;} + z = 1.0/(x*x); + r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); + s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); + return 1.0+ r/s; +} + +/* For x >= 8, the asymptotic expansions of qone is + * 3/8 s - 105/1024 s^3 - ..., where s = 1/x. + * We approximate pone by + * qone(x) = s*(0.375 + (R/S)) + * where R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10 + * S = 1 + qs1*s^2 + ... + qs6*s^12 + * and + * | qone(x)/s -0.375-R/S | <= 2 ** ( -61.13) + */ + +static const double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ + 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ + -1.02539062499992714161e-01, /* 0xBFBA3FFF, 0xFFFFFDF3 */ + -1.62717534544589987888e+01, /* 0xC0304591, 0xA26779F7 */ + -7.59601722513950107896e+02, /* 0xC087BCD0, 0x53E4B576 */ + -1.18498066702429587167e+04, /* 0xC0C724E7, 0x40F87415 */ + -4.84385124285750353010e+04, /* 0xC0E7A6D0, 0x65D09C6A */ +}; +static const double qs8[6] = { + 1.61395369700722909556e+02, /* 0x40642CA6, 0xDE5BCDE5 */ + 7.82538599923348465381e+03, /* 0x40BE9162, 0xD0D88419 */ + 1.33875336287249578163e+05, /* 0x4100579A, 0xB0B75E98 */ + 7.19657723683240939863e+05, /* 0x4125F653, 0x72869C19 */ + 6.66601232617776375264e+05, /* 0x412457D2, 0x7719AD5C */ + -2.94490264303834643215e+05, /* 0xC111F969, 0x0EA5AA18 */ +}; + +static const double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ + -2.08979931141764104297e-11, /* 0xBDB6FA43, 0x1AA1A098 */ + -1.02539050241375426231e-01, /* 0xBFBA3FFF, 0xCB597FEF */ + -8.05644828123936029840e+00, /* 0xC0201CE6, 0xCA03AD4B */ + -1.83669607474888380239e+02, /* 0xC066F56D, 0x6CA7B9B0 */ + -1.37319376065508163265e+03, /* 0xC09574C6, 0x6931734F */ + -2.61244440453215656817e+03, /* 0xC0A468E3, 0x88FDA79D */ +}; +static const double qs5[6] = { + 8.12765501384335777857e+01, /* 0x405451B2, 0xFF5A11B2 */ + 1.99179873460485964642e+03, /* 0x409F1F31, 0xE77BF839 */ + 1.74684851924908907677e+04, /* 0x40D10F1F, 0x0D64CE29 */ + 4.98514270910352279316e+04, /* 0x40E8576D, 0xAABAD197 */ + 2.79480751638918118260e+04, /* 0x40DB4B04, 0xCF7C364B */ + -4.71918354795128470869e+03, /* 0xC0B26F2E, 0xFCFFA004 */ +}; + +static const double qr3[6] = { + -5.07831226461766561369e-09, /* 0xBE35CFA9, 0xD38FC84F */ + -1.02537829820837089745e-01, /* 0xBFBA3FEB, 0x51AEED54 */ + -4.61011581139473403113e+00, /* 0xC01270C2, 0x3302D9FF */ + -5.78472216562783643212e+01, /* 0xC04CEC71, 0xC25D16DA */ + -2.28244540737631695038e+02, /* 0xC06C87D3, 0x4718D55F */ + -2.19210128478909325622e+02, /* 0xC06B66B9, 0x5F5C1BF6 */ +}; +static const double qs3[6] = { + 4.76651550323729509273e+01, /* 0x4047D523, 0xCCD367E4 */ + 6.73865112676699709482e+02, /* 0x40850EEB, 0xC031EE3E */ + 3.38015286679526343505e+03, /* 0x40AA684E, 0x448E7C9A */ + 5.54772909720722782367e+03, /* 0x40B5ABBA, 0xA61D54A6 */ + 1.90311919338810798763e+03, /* 0x409DBC7A, 0x0DD4DF4B */ + -1.35201191444307340817e+02, /* 0xC060E670, 0x290A311F */ +}; + +static const double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ + -1.78381727510958865572e-07, /* 0xBE87F126, 0x44C626D2 */ + -1.02517042607985553460e-01, /* 0xBFBA3E8E, 0x9148B010 */ + -2.75220568278187460720e+00, /* 0xC0060484, 0x69BB4EDA */ + -1.96636162643703720221e+01, /* 0xC033A9E2, 0xC168907F */ + -4.23253133372830490089e+01, /* 0xC04529A3, 0xDE104AAA */ + -2.13719211703704061733e+01, /* 0xC0355F36, 0x39CF6E52 */ +}; +static const double qs2[6] = { + 2.95333629060523854548e+01, /* 0x403D888A, 0x78AE64FF */ + 2.52981549982190529136e+02, /* 0x406F9F68, 0xDB821CBA */ + 7.57502834868645436472e+02, /* 0x4087AC05, 0xCE49A0F7 */ + 7.39393205320467245656e+02, /* 0x40871B25, 0x48D4C029 */ + 1.55949003336666123687e+02, /* 0x40637E5E, 0x3C3ED8D4 */ + -4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */ +}; + +static double qone(double x) +{ + const double *p,*q; + double_t s,r,z; + uint32_t ix; + + GET_HIGH_WORD(ix, x); + ix &= 0x7fffffff; + if (ix >= 0x40200000){p = qr8; q = qs8;} + else if (ix >= 0x40122E8B){p = qr5; q = qs5;} + else if (ix >= 0x4006DB6D){p = qr3; q = qs3;} + else /*ix >= 0x40000000*/ {p = qr2; q = qs2;} + z = 1.0/(x*x); + r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); + s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); + return (.375 + r/s)/x; +} diff --git a/libc/tinymath/j1f.c b/libc/tinymath/j1f.c new file mode 100644 index 000000000..593565427 --- /dev/null +++ b/libc/tinymath/j1f.c @@ -0,0 +1,343 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/complex.internal.h" + +asm(".ident\t\"\\n\\n\ +Double-precision math functions (MIT License)\\n\ +Copyright 2018 ARM Limited\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +/* origin: FreeBSD /usr/src/lib/msun/src/e_j1f.c */ +/* + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +static float ponef(float), qonef(float); + +static const float +invsqrtpi = 5.6418961287e-01, /* 0x3f106ebb */ +tpi = 6.3661974669e-01; /* 0x3f22f983 */ + +static float common(uint32_t ix, float x, int y1, int sign) +{ + double z,s,c,ss,cc; + + s = sinf(x); + if (y1) + s = -s; + c = cosf(x); + cc = s-c; + if (ix < 0x7f000000) { + ss = -s-c; + z = cosf(2*x); + if (s*c > 0) + cc = z/ss; + else + ss = z/cc; + if (ix < 0x58800000) { + if (y1) + ss = -ss; + cc = ponef(x)*cc-qonef(x)*ss; + } + } + if (sign) + cc = -cc; + return invsqrtpi*cc/sqrtf(x); +} + +/* R0/S0 on [0,2] */ +static const float +r00 = -6.2500000000e-02, /* 0xbd800000 */ +r01 = 1.4070566976e-03, /* 0x3ab86cfd */ +r02 = -1.5995563444e-05, /* 0xb7862e36 */ +r03 = 4.9672799207e-08, /* 0x335557d2 */ +s01 = 1.9153760746e-02, /* 0x3c9ce859 */ +s02 = 1.8594678841e-04, /* 0x3942fab6 */ +s03 = 1.1771846857e-06, /* 0x359dffc2 */ +s04 = 5.0463624390e-09, /* 0x31ad6446 */ +s05 = 1.2354227016e-11; /* 0x2d59567e */ + +float j1f(float x) +{ + float z,r,s; + uint32_t ix; + int sign; + + GET_FLOAT_WORD(ix, x); + sign = ix>>31; + ix &= 0x7fffffff; + if (ix >= 0x7f800000) + return 1/(x*x); + if (ix >= 0x40000000) /* |x| >= 2 */ + return common(ix, fabsf(x), 0, sign); + if (ix >= 0x39000000) { /* |x| >= 2**-13 */ + z = x*x; + r = z*(r00+z*(r01+z*(r02+z*r03))); + s = 1+z*(s01+z*(s02+z*(s03+z*(s04+z*s05)))); + z = 0.5f + r/s; + } else + z = 0.5f; + return z*x; +} + +static const float U0[5] = { + -1.9605709612e-01, /* 0xbe48c331 */ + 5.0443872809e-02, /* 0x3d4e9e3c */ + -1.9125689287e-03, /* 0xbafaaf2a */ + 2.3525259166e-05, /* 0x37c5581c */ + -9.1909917899e-08, /* 0xb3c56003 */ +}; +static const float V0[5] = { + 1.9916731864e-02, /* 0x3ca3286a */ + 2.0255257550e-04, /* 0x3954644b */ + 1.3560879779e-06, /* 0x35b602d4 */ + 6.2274145840e-09, /* 0x31d5f8eb */ + 1.6655924903e-11, /* 0x2d9281cf */ +}; + +float y1f(float x) +{ + float z,u,v; + uint32_t ix; + + GET_FLOAT_WORD(ix, x); + if ((ix & 0x7fffffff) == 0) + return -1/0.0f; + if (ix>>31) + return 0/0.0f; + if (ix >= 0x7f800000) + return 1/x; + if (ix >= 0x40000000) /* |x| >= 2.0 */ + return common(ix,x,1,0); + if (ix < 0x33000000) /* x < 2**-25 */ + return -tpi/x; + z = x*x; + u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4]))); + v = 1.0f+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4])))); + return x*(u/v) + tpi*(j1f(x)*logf(x)-1.0f/x); +} + +/* For x >= 8, the asymptotic expansions of pone is + * 1 + 15/128 s^2 - 4725/2^15 s^4 - ..., where s = 1/x. + * We approximate pone by + * pone(x) = 1 + (R/S) + * where R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10 + * S = 1 + ps0*s^2 + ... + ps4*s^10 + * and + * | pone(x)-1-R/S | <= 2 ** ( -60.06) + */ + +static const float pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ + 0.0000000000e+00, /* 0x00000000 */ + 1.1718750000e-01, /* 0x3df00000 */ + 1.3239480972e+01, /* 0x4153d4ea */ + 4.1205184937e+02, /* 0x43ce06a3 */ + 3.8747453613e+03, /* 0x45722bed */ + 7.9144794922e+03, /* 0x45f753d6 */ +}; +static const float ps8[5] = { + 1.1420736694e+02, /* 0x42e46a2c */ + 3.6509309082e+03, /* 0x45642ee5 */ + 3.6956207031e+04, /* 0x47105c35 */ + 9.7602796875e+04, /* 0x47bea166 */ + 3.0804271484e+04, /* 0x46f0a88b */ +}; + +static const float pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ + 1.3199052094e-11, /* 0x2d68333f */ + 1.1718749255e-01, /* 0x3defffff */ + 6.8027510643e+00, /* 0x40d9b023 */ + 1.0830818176e+02, /* 0x42d89dca */ + 5.1763616943e+02, /* 0x440168b7 */ + 5.2871520996e+02, /* 0x44042dc6 */ +}; +static const float ps5[5] = { + 5.9280597687e+01, /* 0x426d1f55 */ + 9.9140142822e+02, /* 0x4477d9b1 */ + 5.3532670898e+03, /* 0x45a74a23 */ + 7.8446904297e+03, /* 0x45f52586 */ + 1.5040468750e+03, /* 0x44bc0180 */ +}; + +static const float pr3[6] = { + 3.0250391081e-09, /* 0x314fe10d */ + 1.1718686670e-01, /* 0x3defffab */ + 3.9329774380e+00, /* 0x407bb5e7 */ + 3.5119403839e+01, /* 0x420c7a45 */ + 9.1055007935e+01, /* 0x42b61c2a */ + 4.8559066772e+01, /* 0x42423c7c */ +}; +static const float ps3[5] = { + 3.4791309357e+01, /* 0x420b2a4d */ + 3.3676245117e+02, /* 0x43a86198 */ + 1.0468714600e+03, /* 0x4482dbe3 */ + 8.9081134033e+02, /* 0x445eb3ed */ + 1.0378793335e+02, /* 0x42cf936c */ +}; + +static const float pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ + 1.0771083225e-07, /* 0x33e74ea8 */ + 1.1717621982e-01, /* 0x3deffa16 */ + 2.3685150146e+00, /* 0x401795c0 */ + 1.2242610931e+01, /* 0x4143e1bc */ + 1.7693971634e+01, /* 0x418d8d41 */ + 5.0735230446e+00, /* 0x40a25a4d */ +}; +static const float ps2[5] = { + 2.1436485291e+01, /* 0x41ab7dec */ + 1.2529022980e+02, /* 0x42fa9499 */ + 2.3227647400e+02, /* 0x436846c7 */ + 1.1767937469e+02, /* 0x42eb5bd7 */ + 8.3646392822e+00, /* 0x4105d590 */ +}; + +static float ponef(float x) +{ + const float *p,*q; + float_t z,r,s; + uint32_t ix; + + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; + if (ix >= 0x41000000){p = pr8; q = ps8;} + else if (ix >= 0x409173eb){p = pr5; q = ps5;} + else if (ix >= 0x4036d917){p = pr3; q = ps3;} + else /*ix >= 0x40000000*/ {p = pr2; q = ps2;} + z = 1.0f/(x*x); + r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); + s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); + return 1.0f + r/s; +} + +/* For x >= 8, the asymptotic expansions of qone is + * 3/8 s - 105/1024 s^3 - ..., where s = 1/x. + * We approximate pone by + * qone(x) = s*(0.375 + (R/S)) + * where R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10 + * S = 1 + qs1*s^2 + ... + qs6*s^12 + * and + * | qone(x)/s -0.375-R/S | <= 2 ** ( -61.13) + */ + +static const float qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ + 0.0000000000e+00, /* 0x00000000 */ + -1.0253906250e-01, /* 0xbdd20000 */ + -1.6271753311e+01, /* 0xc1822c8d */ + -7.5960174561e+02, /* 0xc43de683 */ + -1.1849806641e+04, /* 0xc639273a */ + -4.8438511719e+04, /* 0xc73d3683 */ +}; +static const float qs8[6] = { + 1.6139537048e+02, /* 0x43216537 */ + 7.8253862305e+03, /* 0x45f48b17 */ + 1.3387534375e+05, /* 0x4802bcd6 */ + 7.1965775000e+05, /* 0x492fb29c */ + 6.6660125000e+05, /* 0x4922be94 */ + -2.9449025000e+05, /* 0xc88fcb48 */ +}; + +static const float qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ + -2.0897993405e-11, /* 0xadb7d219 */ + -1.0253904760e-01, /* 0xbdd1fffe */ + -8.0564479828e+00, /* 0xc100e736 */ + -1.8366960144e+02, /* 0xc337ab6b */ + -1.3731937256e+03, /* 0xc4aba633 */ + -2.6124443359e+03, /* 0xc523471c */ +}; +static const float qs5[6] = { + 8.1276550293e+01, /* 0x42a28d98 */ + 1.9917987061e+03, /* 0x44f8f98f */ + 1.7468484375e+04, /* 0x468878f8 */ + 4.9851425781e+04, /* 0x4742bb6d */ + 2.7948074219e+04, /* 0x46da5826 */ + -4.7191835938e+03, /* 0xc5937978 */ +}; + +static const float qr3[6] = { + -5.0783124372e-09, /* 0xb1ae7d4f */ + -1.0253783315e-01, /* 0xbdd1ff5b */ + -4.6101160049e+00, /* 0xc0938612 */ + -5.7847221375e+01, /* 0xc267638e */ + -2.2824453735e+02, /* 0xc3643e9a */ + -2.1921012878e+02, /* 0xc35b35cb */ +}; +static const float qs3[6] = { + 4.7665153503e+01, /* 0x423ea91e */ + 6.7386511230e+02, /* 0x4428775e */ + 3.3801528320e+03, /* 0x45534272 */ + 5.5477290039e+03, /* 0x45ad5dd5 */ + 1.9031191406e+03, /* 0x44ede3d0 */ + -1.3520118713e+02, /* 0xc3073381 */ +}; + +static const float qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ + -1.7838172539e-07, /* 0xb43f8932 */ + -1.0251704603e-01, /* 0xbdd1f475 */ + -2.7522056103e+00, /* 0xc0302423 */ + -1.9663616180e+01, /* 0xc19d4f16 */ + -4.2325313568e+01, /* 0xc2294d1f */ + -2.1371921539e+01, /* 0xc1aaf9b2 */ +}; +static const float qs2[6] = { + 2.9533363342e+01, /* 0x41ec4454 */ + 2.5298155212e+02, /* 0x437cfb47 */ + 7.5750280762e+02, /* 0x443d602e */ + 7.3939318848e+02, /* 0x4438d92a */ + 1.5594900513e+02, /* 0x431bf2f2 */ + -4.9594988823e+00, /* 0xc09eb437 */ +}; + +static float qonef(float x) +{ + const float *p,*q; + float_t s,r,z; + uint32_t ix; + + GET_FLOAT_WORD(ix, x); + ix &= 0x7fffffff; + if (ix >= 0x41000000){p = qr8; q = qs8;} + else if (ix >= 0x409173eb){p = qr5; q = qs5;} + else if (ix >= 0x4036d917){p = qr3; q = qs3;} + else /*ix >= 0x40000000*/ {p = qr2; q = qs2;} + z = 1.0f/(x*x); + r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); + s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); + return (.375f + r/s)/x; +} diff --git a/libc/tinymath/jn.c b/libc/tinymath/jn.c new file mode 100644 index 000000000..cfaad4823 --- /dev/null +++ b/libc/tinymath/jn.c @@ -0,0 +1,314 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/complex.internal.h" + +asm(".ident\t\"\\n\\n\ +Double-precision math functions (MIT License)\\n\ +Copyright 2018 ARM Limited\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +/* origin: FreeBSD /usr/src/lib/msun/src/e_jn.c */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +/* + * jn(n, x), yn(n, x) + * floating point Bessel's function of the 1st and 2nd kind + * of order n + * + * Special cases: + * y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal; + * y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal. + * Note 2. About jn(n,x), yn(n,x) + * For n=0, j0(x) is called, + * for n=1, j1(x) is called, + * for n<=x, forward recursion is used starting + * from values of j0(x) and j1(x). + * for n>x, a continued fraction approximation to + * j(n,x)/j(n-1,x) is evaluated and then backward + * recursion is used starting from a supposed value + * for j(n,x). The resulting value of j(0,x) is + * compared with the actual value to correct the + * supposed value of j(n,x). + * + * yn(n,x) is similar in all respects, except + * that forward recursion is used for all + * values of n>1. + */ + +static const double invsqrtpi = 5.64189583547756279280e-01; /* 0x3FE20DD7, 0x50429B6D */ + +double jn(int n, double x) +{ + uint32_t ix, lx; + int nm1, i, sign; + double a, b, temp; + + EXTRACT_WORDS(ix, lx, x); + sign = ix>>31; + ix &= 0x7fffffff; + + if ((ix | (lx|-lx)>>31) > 0x7ff00000) /* nan */ + return x; + + /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x) + * Thus, J(-n,x) = J(n,-x) + */ + /* nm1 = |n|-1 is used instead of |n| to handle n==INT_MIN */ + if (n == 0) + return j0(x); + if (n < 0) { + nm1 = -(n+1); + x = -x; + sign ^= 1; + } else + nm1 = n-1; + if (nm1 == 0) + return j1(x); + + sign &= n; /* even n: 0, odd n: signbit(x) */ + x = fabs(x); + if ((ix|lx) == 0 || ix == 0x7ff00000) /* if x is 0 or inf */ + b = 0.0; + else if (nm1 < x) { + /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */ + if (ix >= 0x52d00000) { /* x > 2**302 */ + /* (x >> n**2) + * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi) + * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi) + * Let s=sin(x), c=cos(x), + * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then + * + * n sin(xn)*sqt2 cos(xn)*sqt2 + * ---------------------------------- + * 0 s-c c+s + * 1 -s-c -c+s + * 2 -s+c -c-s + * 3 s+c c-s + */ + switch(nm1&3) { + case 0: temp = -cos(x)+sin(x); break; + case 1: temp = -cos(x)-sin(x); break; + case 2: temp = cos(x)-sin(x); break; + default: + case 3: temp = cos(x)+sin(x); break; + } + b = invsqrtpi*temp/sqrt(x); + } else { + a = j0(x); + b = j1(x); + for (i=0; i 32) /* underflow */ + b = 0.0; + else { + temp = x*0.5; + b = temp; + a = 1.0; + for (i=2; i<=nm1+1; i++) { + a *= (double)i; /* a = n! */ + b *= temp; /* b = (x/2)^n */ + } + b = b/a; + } + } else { + /* use backward recurrence */ + /* x x^2 x^2 + * J(n,x)/J(n-1,x) = ---- ------ ------ ..... + * 2n - 2(n+1) - 2(n+2) + * + * 1 1 1 + * (for large x) = ---- ------ ------ ..... + * 2n 2(n+1) 2(n+2) + * -- - ------ - ------ - + * x x x + * + * Let w = 2n/x and h=2/x, then the above quotient + * is equal to the continued fraction: + * 1 + * = ----------------------- + * 1 + * w - ----------------- + * 1 + * w+h - --------- + * w+2h - ... + * + * To determine how many terms needed, let + * Q(0) = w, Q(1) = w(w+h) - 1, + * Q(k) = (w+k*h)*Q(k-1) - Q(k-2), + * When Q(k) > 1e4 good for single + * When Q(k) > 1e9 good for double + * When Q(k) > 1e17 good for quadruple + */ + /* determine k */ + double t,q0,q1,w,h,z,tmp,nf; + int k; + + nf = nm1 + 1.0; + w = 2*nf/x; + h = 2/x; + z = w+h; + q0 = w; + q1 = w*z - 1.0; + k = 1; + while (q1 < 1.0e9) { + k += 1; + z += h; + tmp = z*q1 - q0; + q0 = q1; + q1 = tmp; + } + for (t=0.0, i=k; i>=0; i--) + t = 1/(2*(i+nf)/x - t); + a = t; + b = 1.0; + /* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n) + * Hence, if n*(log(2n/x)) > ... + * single 8.8722839355e+01 + * double 7.09782712893383973096e+02 + * long double 1.1356523406294143949491931077970765006170e+04 + * then recurrent value may overflow and the result is + * likely underflow to zero + */ + tmp = nf*log(fabs(w)); + if (tmp < 7.09782712893383973096e+02) { + for (i=nm1; i>0; i--) { + temp = b; + b = b*(2.0*i)/x - a; + a = temp; + } + } else { + for (i=nm1; i>0; i--) { + temp = b; + b = b*(2.0*i)/x - a; + a = temp; + /* scale b to avoid spurious overflow */ + if (b > 0x1p500) { + a /= b; + t /= b; + b = 1.0; + } + } + } + z = j0(x); + w = j1(x); + if (fabs(z) >= fabs(w)) + b = t*z/b; + else + b = t*w/a; + } + } + return sign ? -b : b; +} + + +double yn(int n, double x) +{ + uint32_t ix, lx, ib; + int nm1, sign, i; + double a, b, temp; + + EXTRACT_WORDS(ix, lx, x); + sign = ix>>31; + ix &= 0x7fffffff; + + if ((ix | (lx|-lx)>>31) > 0x7ff00000) /* nan */ + return x; + if (sign && (ix|lx)!=0) /* x < 0 */ + return 0/0.0; + if (ix == 0x7ff00000) + return 0.0; + + if (n == 0) + return y0(x); + if (n < 0) { + nm1 = -(n+1); + sign = n&1; + } else { + nm1 = n-1; + sign = 0; + } + if (nm1 == 0) + return sign ? -y1(x) : y1(x); + + if (ix >= 0x52d00000) { /* x > 2**302 */ + /* (x >> n**2) + * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi) + * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi) + * Let s=sin(x), c=cos(x), + * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then + * + * n sin(xn)*sqt2 cos(xn)*sqt2 + * ---------------------------------- + * 0 s-c c+s + * 1 -s-c -c+s + * 2 -s+c -c-s + * 3 s+c c-s + */ + switch(nm1&3) { + case 0: temp = -sin(x)-cos(x); break; + case 1: temp = -sin(x)+cos(x); break; + case 2: temp = sin(x)+cos(x); break; + default: + case 3: temp = sin(x)-cos(x); break; + } + b = invsqrtpi*temp/sqrt(x); + } else { + a = y0(x); + b = y1(x); + /* quit if b is -inf */ + GET_HIGH_WORD(ib, b); + for (i=0; i>31; + ix &= 0x7fffffff; + if (ix > 0x7f800000) /* nan */ + return x; + + /* J(-n,x) = J(n,-x), use |n|-1 to avoid overflow in -n */ + if (n == 0) + return j0f(x); + if (n < 0) { + nm1 = -(n+1); + x = -x; + sign ^= 1; + } else + nm1 = n-1; + if (nm1 == 0) + return j1f(x); + + sign &= n; /* even n: 0, odd n: signbit(x) */ + x = fabsf(x); + if (ix == 0 || ix == 0x7f800000) /* if x is 0 or inf */ + b = 0.0f; + else if (nm1 < x) { + /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */ + a = j0f(x); + b = j1f(x); + for (i=0; i 8) /* underflow */ + nm1 = 8; + temp = 0.5f * x; + b = temp; + a = 1.0f; + for (i=2; i<=nm1+1; i++) { + a *= (float)i; /* a = n! */ + b *= temp; /* b = (x/2)^n */ + } + b = b/a; + } else { + /* use backward recurrence */ + /* x x^2 x^2 + * J(n,x)/J(n-1,x) = ---- ------ ------ ..... + * 2n - 2(n+1) - 2(n+2) + * + * 1 1 1 + * (for large x) = ---- ------ ------ ..... + * 2n 2(n+1) 2(n+2) + * -- - ------ - ------ - + * x x x + * + * Let w = 2n/x and h=2/x, then the above quotient + * is equal to the continued fraction: + * 1 + * = ----------------------- + * 1 + * w - ----------------- + * 1 + * w+h - --------- + * w+2h - ... + * + * To determine how many terms needed, let + * Q(0) = w, Q(1) = w(w+h) - 1, + * Q(k) = (w+k*h)*Q(k-1) - Q(k-2), + * When Q(k) > 1e4 good for single + * When Q(k) > 1e9 good for double + * When Q(k) > 1e17 good for quadruple + */ + /* determine k */ + float t,q0,q1,w,h,z,tmp,nf; + int k; + + nf = nm1+1.0f; + w = 2*nf/x; + h = 2/x; + z = w+h; + q0 = w; + q1 = w*z - 1.0f; + k = 1; + while (q1 < 1.0e4f) { + k += 1; + z += h; + tmp = z*q1 - q0; + q0 = q1; + q1 = tmp; + } + for (t=0.0f, i=k; i>=0; i--) + t = 1.0f/(2*(i+nf)/x-t); + a = t; + b = 1.0f; + /* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n) + * Hence, if n*(log(2n/x)) > ... + * single 8.8722839355e+01 + * double 7.09782712893383973096e+02 + * long double 1.1356523406294143949491931077970765006170e+04 + * then recurrent value may overflow and the result is + * likely underflow to zero + */ + tmp = nf*logf(fabsf(w)); + if (tmp < 88.721679688f) { + for (i=nm1; i>0; i--) { + temp = b; + b = 2.0f*i*b/x - a; + a = temp; + } + } else { + for (i=nm1; i>0; i--){ + temp = b; + b = 2.0f*i*b/x - a; + a = temp; + /* scale b to avoid spurious overflow */ + if (b > 0x1p60f) { + a /= b; + t /= b; + b = 1.0f; + } + } + } + z = j0f(x); + w = j1f(x); + if (fabsf(z) >= fabsf(w)) + b = t*z/b; + else + b = t*w/a; + } + } + return sign ? -b : b; +} + +float ynf(int n, float x) +{ + uint32_t ix, ib; + int nm1, sign, i; + float a, b, temp; + + GET_FLOAT_WORD(ix, x); + sign = ix>>31; + ix &= 0x7fffffff; + if (ix > 0x7f800000) /* nan */ + return x; + if (sign && ix != 0) /* x < 0 */ + return 0/0.0f; + if (ix == 0x7f800000) + return 0.0f; + + if (n == 0) + return y0f(x); + if (n < 0) { + nm1 = -(n+1); + sign = n&1; + } else { + nm1 = n-1; + sign = 0; + } + if (nm1 == 0) + return sign ? -y1f(x) : y1f(x); + + a = y0f(x); + b = y1f(x); + /* quit if b is -inf */ + GET_FLOAT_WORD(ib,b); + for (i = 0; i < nm1 && ib != 0xff800000; ) { + i++; + temp = b; + b = (2.0f*i/x)*b - a; + GET_FLOAT_WORD(ib, b); + a = temp; + } + return sign ? -b : b; +} diff --git a/libc/tinymath/kernel.internal.h b/libc/tinymath/kernel.internal.h index 9263e4814..a8280b8d8 100644 --- a/libc/tinymath/kernel.internal.h +++ b/libc/tinymath/kernel.internal.h @@ -3,8 +3,6 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ -extern int __signgam; - double __cos(double, double) hidden; double __sin(double, double, int) hidden; double __tan(double, double, int) hidden; diff --git a/libc/tinymath/lgamma.c b/libc/tinymath/lgamma.c index c7c5e8577..fa896ed2b 100644 --- a/libc/tinymath/lgamma.c +++ b/libc/tinymath/lgamma.c @@ -23,5 +23,5 @@ * Returns natural logarithm of absolute value of gamma function. */ double lgamma(double x) { - return lgamma_r(x, &__signgam); + return lgamma_r(x, &signgam); } diff --git a/libc/tinymath/lgammaf.c b/libc/tinymath/lgammaf.c index 641d69769..813e211a7 100644 --- a/libc/tinymath/lgammaf.c +++ b/libc/tinymath/lgammaf.c @@ -20,5 +20,5 @@ #include "libc/tinymath/kernel.internal.h" float lgammaf(float x) { - return lgammaf_r(x, &__signgam); + return lgammaf_r(x, &signgam); } diff --git a/libc/tinymath/powf.c b/libc/tinymath/powf.c index 9c15bfbb4..05bcc780b 100644 --- a/libc/tinymath/powf.c +++ b/libc/tinymath/powf.c @@ -37,7 +37,7 @@ asm(".ident\t\"\\n\\n\ Double-precision math functions (MIT License)\\n\ Copyright 2018 ARM Limited\""); asm(".include \"libc/disclaimer.inc\""); -/* clang-format off */ +// clang-format off /* * Copyright (c) 2017-2018, Arm Limited. diff --git a/libc/tinymath/rint.S b/libc/tinymath/rint.S deleted file mode 100644 index 9ece4dc58..000000000 --- a/libc/tinymath/rint.S +++ /dev/null @@ -1,67 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/nexgen32e/x86feature.h" -#include "libc/intrin/smmintrin.internal.h" -#include "libc/macros.internal.h" - -// Rounds to nearest integer. -// -// @param is double passed in %xmm0 -// @return double in %xmm0 -// @note rounding behavior can be changed in mxcsr -rint: -#if !X86_NEED(SSE4_2) - testb X86_HAVE(SSE4_2)+kCpuids(%rip) - jz rint$k8 - .text.antiquity -rint$k8: -0: movq %xmm0,%rax - movq %xmm0,%rdx - shr $52,%rdx - and $2047,%edx - cmp $1074,%edx - jg 2f - movsd mmm(%rip),%xmm1 - shr $63,%rax - jne 3f - addsd %xmm1,%xmm0 - subsd %xmm1,%xmm0 -1: pxor %xmm2,%xmm2 - ucomisd %xmm2,%xmm0 - jp 2f - jne 2f - movsd sgn(%rip),%xmm0 - test %rax,%rax - je 4f -2: ret -3: subsd %xmm1,%xmm0 - addsd %xmm1,%xmm0 - jmp 1b -4: pxor %xmm0,%xmm0 - ret - .endfn rint$k8,globl,hidden - .previous - .rodata.cst8 -sgn: .quad 0x8000000000000000 -mmm: .quad 0x4330000000000000 - .previous -#endif - roundsd $_MM_FROUND_RINT,%xmm0,%xmm0 - ret - .endfn rint,globl diff --git a/libc/tinymath/rint.c b/libc/tinymath/rint.c new file mode 100644 index 000000000..fe2068836 --- /dev/null +++ b/libc/tinymath/rint.c @@ -0,0 +1,59 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 +#define EPS DBL_EPSILON +#elif FLT_EVAL_METHOD==2 +#define EPS LDBL_EPSILON +#endif +static const double_t toint = 1/EPS; + +double rint(double x) +{ + union {double f; uint64_t i;} u = {x}; + int e = u.i>>52 & 0x7ff; + int s = u.i>>63; + double_t y; + + if (e >= 0x3ff+52) + return x; + if (s) + y = x - toint + toint; + else + y = x + toint - toint; + if (y == 0) + return s ? -0.0 : 0; + return y; +} diff --git a/libc/tinymath/rintf.c b/libc/tinymath/rintf.c new file mode 100644 index 000000000..4f875fd52 --- /dev/null +++ b/libc/tinymath/rintf.c @@ -0,0 +1,61 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +#if FLT_EVAL_METHOD==0 +#define EPS FLT_EPSILON +#elif FLT_EVAL_METHOD==1 +#define EPS DBL_EPSILON +#elif FLT_EVAL_METHOD==2 +#define EPS LDBL_EPSILON +#endif +static const float_t toint = 1/EPS; + +float rintf(float x) +{ + union {float f; uint32_t i;} u = {x}; + int e = u.i>>23 & 0xff; + int s = u.i>>31; + float_t y; + + if (e >= 0x7f+23) + return x; + if (s) + y = x - toint + toint; + else + y = x + toint - toint; + if (y == 0) + return s ? -0.0f : 0.0f; + return y; +} diff --git a/libc/tinymath/round.S b/libc/tinymath/round.S deleted file mode 100644 index 17e4605b4..000000000 --- a/libc/tinymath/round.S +++ /dev/null @@ -1,68 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" -#include "libc/intrin/smmintrin.internal.h" -#include "libc/nexgen32e/x86feature.h" - -// Rounds to nearest integer, away from zero. -// -// @param 𝑥 is double scalar in low half of %xmm0 -// @return double scalar in low half of %xmm0 -// @define round(𝑥) = copysign(trunc(fabs(𝑥)+.5),𝑥) -// round(𝑥) = trunc(𝑥+copysign(.5,𝑥)) -round: -#if !X86_NEED(SSE4_2) - testb X86_HAVE(SSE4_2)+kCpuids(%rip) - jz round$k8 - .text.antiquity -round$k8: - .leafprologue - .profilable - movapd %xmm0,%xmm1 - movsd D(%rip),%xmm2 - movsd C(%rip),%xmm3 - andpd %xmm2,%xmm1 - ucomisd %xmm1,%xmm3 - jbe 2f - addsd A(%rip),%xmm1 - andnpd %xmm0,%xmm2 - movapd %xmm2,%xmm0 - cvttsd2siq %xmm1,%rax - pxor %xmm1,%xmm1 - cvtsi2sdq %rax,%xmm1 - orpd %xmm1,%xmm0 -2: .leafepilogue - .endfn round$k8,globl,hidden - .previous - .rodata.cst16 -C: .quad 0x4330000000000000,0 -D: .quad 0x7fffffffffffffff,0 - .previous -#endif - movapd %xmm0,%xmm1 - andpd B(%rip),%xmm0 - orpd A(%rip),%xmm0 - addsd %xmm1,%xmm0 - roundsd $_MM_FROUND_TO_ZERO,%xmm0,%xmm0 - ret - .endfn round,globl - - .rodata.cst16 -A: .quad 0x3fdfffffffffffff,0 -B: .quad 0x8000000000000000,0 diff --git a/libc/tinymath/round.c b/libc/tinymath/round.c new file mode 100644 index 000000000..ec79bda0d --- /dev/null +++ b/libc/tinymath/round.c @@ -0,0 +1,69 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/internal.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 +#define EPS DBL_EPSILON +#elif FLT_EVAL_METHOD==2 +#define EPS LDBL_EPSILON +#endif +static const double_t toint = 1/EPS; + +double round(double x) +{ + union {double f; uint64_t i;} u = {x}; + int e = u.i >> 52 & 0x7ff; + double_t y; + + if (e >= 0x3ff+52) + return x; + if (u.i >> 63) + x = -x; + if (e < 0x3ff-1) { + /* raise inexact if x!=0 */ + FORCE_EVAL(x + toint); + return 0*u.f; + } + y = x + toint - toint - x; + if (y > 0.5) + y = y + x - 1; + else if (y <= -0.5) + y = y + x + 1; + else + y = y + x; + if (u.i >> 63) + y = -y; + return y; +} diff --git a/libc/tinymath/roundf.S b/libc/tinymath/roundf.S deleted file mode 100644 index 3badb5bbe..000000000 --- a/libc/tinymath/roundf.S +++ /dev/null @@ -1,66 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" -#include "libc/intrin/smmintrin.internal.h" -#include "libc/nexgen32e/x86feature.h" - -// Rounds to nearest integer, away from zero. -// -// @param 𝑥 is float scalar in low quarter of %xmm0 -// @return float scalar in low quarter of %xmm0 -roundf: -#if !X86_NEED(SSE4_2) - testb X86_HAVE(SSE4_2)+kCpuids(%rip) - jz roundf$k8 - .text.antiquity -roundf$k8: - .leafprologue - .profilable - movaps %xmm0,%xmm1 - movss D(%rip),%xmm2 - movss C(%rip),%xmm3 - andps %xmm2,%xmm1 - ucomiss %xmm1,%xmm3 - jbe 2f - addss A(%rip),%xmm1 - cvttss2sil %xmm1,%eax - pxor %xmm1,%xmm1 - cvtsi2ssl %eax,%xmm1 - andnps %xmm0,%xmm2 - movaps %xmm2,%xmm0 - orps %xmm1,%xmm0 -2: .leafepilogue - .endfn roundf$k8,globl,hidden - .previous - .rodata.cst16 -C: .long 0x4b000000,0,0,0 -D: .long 0x7fffffff,0,0,0 - .previous -#endif - movaps %xmm0,%xmm1 - andps B(%rip),%xmm0 - orps A(%rip),%xmm0 - addss %xmm1,%xmm0 - roundss $_MM_FROUND_TO_ZERO,%xmm0,%xmm0 - ret - .endfn roundf,globl - - .rodata.cst16 -A: .long 0x3effffff,0,0,0 -B: .long 0x80000000,0,0,0 diff --git a/libc/tinymath/roundf.c b/libc/tinymath/roundf.c new file mode 100644 index 000000000..7cab4ccc4 --- /dev/null +++ b/libc/tinymath/roundf.c @@ -0,0 +1,70 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/internal.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +#if FLT_EVAL_METHOD==0 +#define EPS FLT_EPSILON +#elif FLT_EVAL_METHOD==1 +#define EPS DBL_EPSILON +#elif FLT_EVAL_METHOD==2 +#define EPS LDBL_EPSILON +#endif +static const float_t toint = 1/EPS; + +float roundf(float x) +{ + union {float f; uint32_t i;} u = {x}; + int e = u.i >> 23 & 0xff; + float_t y; + + if (e >= 0x7f+23) + return x; + if (u.i >> 31) + x = -x; + if (e < 0x7f-1) { + FORCE_EVAL(x + toint); + return 0*u.f; + } + y = x + toint - toint - x; + if (y > 0.5f) + y = y + x - 1; + else if (y <= -0.5f) + y = y + x + 1; + else + y = y + x; + if (u.i >> 31) + y = -y; + return y; +} diff --git a/libc/tinymath/scalb.c b/libc/tinymath/scalb.c new file mode 100644 index 000000000..a0ff13c14 --- /dev/null +++ b/libc/tinymath/scalb.c @@ -0,0 +1,70 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2020 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" + +asm(".ident\t\"\\n\\n\ +fdlibm (fdlibm license)\\n\ +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\""); +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +/* origin: FreeBSD /usr/src/lib/msun/src/e_scalb.c */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +/* + * scalb(x, fn) is provide for + * passing various standard test suite. One + * should use scalbn() instead. + */ + +double scalb(double x, double fn) +{ + if (isnan(x) || isnan(fn)) + return x*fn; + if (!isfinite(fn)) { + if (fn > 0.0) + return x*fn; + else + return x/(-fn); + } + if (rint(fn) != fn) return (fn-fn)/(fn-fn); + if ( fn > 65000.0) return scalbn(x, 65000); + if (-fn > 65000.0) return scalbn(x,-65000); + return scalbn(x,(int)fn); +} diff --git a/libc/tinymath/signgam.c b/libc/tinymath/signgam.c index 0d5610623..1e52094fc 100644 --- a/libc/tinymath/signgam.c +++ b/libc/tinymath/signgam.c @@ -17,4 +17,4 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -int __signgam; +int signgam; diff --git a/libc/tinymath/tanf.S b/libc/tinymath/tanf.S deleted file mode 100644 index faf026c2c..000000000 --- a/libc/tinymath/tanf.S +++ /dev/null @@ -1,28 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -// Returns tangent of 𝑥. -// -// @param 𝑥 is float scalar in low quarter of %xmm0 -// @return float scalar in low quarter of %xmm0 -// @domain -(3π/8) < 𝑥 < 3π/8 for best accuracy -tanf: ezlea tanl,ax - jmp _f2ld2 - .endfn tanf,globl diff --git a/libc/tinymath/tanf.c b/libc/tinymath/tanf.c new file mode 100644 index 000000000..901f0f47b --- /dev/null +++ b/libc/tinymath/tanf.c @@ -0,0 +1,99 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2020 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/complex.internal.h" +#include "libc/tinymath/kernel.internal.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +/* origin: FreeBSD /usr/src/lib/msun/src/s_tanf.c */ +/* + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + * Optimized by Bruce D. Evans. + */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* Small multiples of pi/2 rounded to double precision. */ +static const double +t1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */ +t2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */ +t3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */ +t4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */ + +float tanf(float x) +{ + double y; + uint32_t ix; + unsigned n, sign; + + GET_FLOAT_WORD(ix, x); + sign = ix >> 31; + ix &= 0x7fffffff; + + if (ix <= 0x3f490fda) { /* |x| ~<= pi/4 */ + if (ix < 0x39800000) { /* |x| < 2**-12 */ + /* raise inexact if x!=0 and underflow if subnormal */ + FORCE_EVAL(ix < 0x00800000 ? x/0x1p120f : x+0x1p120f); + return x; + } + return __tandf(x, 0); + } + if (ix <= 0x407b53d1) { /* |x| ~<= 5*pi/4 */ + if (ix <= 0x4016cbe3) /* |x| ~<= 3pi/4 */ + return __tandf((sign ? x+t1pio2 : x-t1pio2), 1); + else + return __tandf((sign ? x+t2pio2 : x-t2pio2), 0); + } + if (ix <= 0x40e231d5) { /* |x| ~<= 9*pi/4 */ + if (ix <= 0x40afeddf) /* |x| ~<= 7*pi/4 */ + return __tandf((sign ? x+t3pio2 : x-t3pio2), 1); + else + return __tandf((sign ? x+t4pio2 : x-t4pio2), 0); + } + + /* tan(Inf or NaN) is NaN */ + if (ix >= 0x7f800000) + return x - x; + + /* argument reduction */ + n = __rem_pio2f(x, &y); + return __tandf(y, n&1); +} diff --git a/net/turfwar/turfwar.c b/net/turfwar/turfwar.c index 18524a4cd..b22d7f353 100644 --- a/net/turfwar/turfwar.c +++ b/net/turfwar/turfwar.c @@ -730,7 +730,7 @@ void *ListenWorker(void *arg) { setsockopt(server, SOL_TCP, TCP_FASTOPEN, &yes, sizeof(yes)); setsockopt(server, SOL_TCP, TCP_QUICKACK, &yes, sizeof(yes)); setsockopt(server, SOL_TCP, TCP_NODELAY, &yes, sizeof(yes)); - CHECK_NE(-1, bind(server, &addr, sizeof(addr))); + CHECK_NE(-1, bind(server, (struct sockaddr *)&addr, sizeof(addr))); CHECK_NE(-1, listen(server, 1)); while (!nsync_note_is_notified(g_shutdown[0])) { client.size = sizeof(client.addr); @@ -766,7 +766,7 @@ void *HttpWorker(void *arg) { char *msgbuf = _gc(xmalloc(MSG_BUF)); char *inbuf = NewSafeBuffer(INBUF_SIZE); char *outbuf = NewSafeBuffer(OUTBUF_SIZE); - struct HttpMessage *msg = _gc(xmalloc(sizeof(struct HttpMessage))); + struct HttpMessage *msg = _gc(xcalloc(1, sizeof(struct HttpMessage))); BlockSignals(); DontRunOnFirstCpus(1); @@ -800,6 +800,7 @@ void *HttpWorker(void *arg) { // wait for http message // this may be cancelled by sigusr1 AllowSigusr1(); + DestroyHttpMessage(msg); InitHttpMessage(msg, kHttpRequest); g_worker[id].startread = _timespec_real(); if ((got = read(client.sock, inbuf, INBUF_SIZE)) <= 0) { @@ -1014,6 +1015,7 @@ void *HttpWorker(void *arg) { "Vary: Accept\r\n" "Cache-Control: private\r\n" "Content-Type: image/gif\r\n" + "Connection: close\r\n" "Date: "); p = FormatDate(p); p = stpcpy(p, "\r\nContent-Length: "); @@ -1031,6 +1033,7 @@ void *HttpWorker(void *arg) { "Vary: Accept\r\n" "Cache-Control: private\r\n" "Content-Type: text/plain\r\n" + "Connection: close\r\n" "Date: "); p = FormatDate(p); p = stpcpy(p, "\r\nContent-Length: "); @@ -1056,6 +1059,7 @@ void *HttpWorker(void *arg) { "Vary: Accept\r\n" "Cache-Control: private\r\n" "Content-Type: text/html\r\n" + "Connection: close\r\n" "Date: "); p = FormatDate(p); p = stpcpy(p, "\r\nContent-Length: "); @@ -1069,12 +1073,14 @@ void *HttpWorker(void *arg) { "Vary: Accept\r\n" "Cache-Control: private\r\n" "Content-Length: 0\r\n" + "Connection: close\r\n" "Date: "); p = FormatDate(p); p = stpcpy(p, "\r\n\r\n"); } outmsglen = p - outbuf; sent = write(client.sock, outbuf, p - outbuf); + break; } else { LOG("%s: 502 Claims Queue Full\n", ipbuf); Write(client.sock, "HTTP/1.1 502 Claims Queue Full\r\n" @@ -1266,9 +1272,9 @@ void OnCtrlC(int sig) { // so if a user smashes that ctrl-c then we tkill the workers more LOG("Received %s again so sending another volley...\n", strsignal(sig)); for (int i = 0; i < g_workers; ++i) { - tkill(pthread_getunique_np(g_listener), SIGUSR1); + pthread_kill(g_listener, SIGUSR1); if (!g_worker[i].shutdown) { - tkill(pthread_getunique_np(g_worker[i].th), SIGUSR1); + pthread_kill(g_worker[i].th, SIGUSR1); } } } @@ -1672,7 +1678,7 @@ void Meltdown(void) { (g_worker[i].msgcount > PANIC_MSGS || _timespec_gte(_timespec_sub(now, g_worker[i].startread), _timespec_frommillis(MELTALIVE_MS)))) { - tkill(pthread_getunique_np(g_worker[i].th), SIGUSR1); + pthread_kill(g_worker[i].th, SIGUSR1); ++marks; } } @@ -1804,7 +1810,7 @@ int main(int argc, char *argv[]) { // create lots of http workers to serve those assets LOG("Online\n"); - g_worker = _gc(xcalloc(g_workers, sizeof(*g_worker))); + g_worker = xcalloc(g_workers, sizeof(*g_worker)); for (intptr_t i = 0; i < g_workers; ++i) { CHECK_EQ(0, pthread_create(&g_worker[i].th, 0, HttpWorker, (void *)i)); } @@ -1815,13 +1821,13 @@ int main(int argc, char *argv[]) { // cancel listen() so we stop accepting new clients LOG("Interrupting listen...\n"); - tkill(pthread_getunique_np(g_listener), SIGUSR1); - CHECK_EQ(0, pthread_join(g_listener, 0)); + pthread_kill(g_listener, SIGUSR1); + pthread_join(g_listener, 0); // cancel read() so that keepalive clients finish faster LOG("Interrupting workers...\n"); for (int i = 0; i < g_workers; ++i) { - tkill(pthread_getunique_np(g_worker[i].th), SIGUSR1); + pthread_kill(g_worker[i].th, SIGUSR1); } // wait for producers to finish @@ -1865,6 +1871,7 @@ int main(int argc, char *argv[]) { nsync_note_free(g_shutdown[i]); } nsync_counter_free(g_ready); + free(g_worker); LOG("Goodbye\n"); // CheckForMemoryLeaks(); diff --git a/test/libc/calls/getpriority_test.c b/test/libc/calls/getpriority_test.c new file mode 100644 index 000000000..4b7177681 --- /dev/null +++ b/test/libc/calls/getpriority_test.c @@ -0,0 +1,88 @@ +/*-*- 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 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/calls.h" +#include "libc/calls/struct/sigset.h" +#include "libc/dce.h" +#include "libc/errno.h" +#include "libc/intrin/kprintf.h" +#include "libc/runtime/runtime.h" +#include "libc/sysv/consts/prio.h" +#include "libc/sysv/consts/sig.h" +#include "libc/testlib/subprocess.h" +#include "libc/testlib/testlib.h" + +void SetUp(void) { + if (getpriority(PRIO_PROCESS, getpid()) != 0) { + kprintf("getpriority_test.com must be launched at priority zero\n"); + exit(0); + } +} + +TEST(getpriority, badWhich_einval) { + ASSERT_SYS(EINVAL, -1, getpriority(-1, 0)); + ASSERT_SYS(EINVAL, -1, setpriority(-1, 0, 0)); +} + +TEST(getpriority, lowerPriorityOfSelf) { + SPAWN(fork); + ASSERT_SYS(0, 0, getpriority(PRIO_PROCESS, 0)); + ASSERT_SYS(0, 0, getpriority(PRIO_PROCESS, getpid())); + ASSERT_SYS(0, 0, setpriority(PRIO_PROCESS, getpid(), 5)); + ASSERT_SYS(0, 5, getpriority(PRIO_PROCESS, getpid())); + ASSERT_SYS(0, 5, getpriority(PRIO_PROCESS, 0)); + EXITS(0); +} + +TEST(getpriority, higherPriorityOfSelf) { + if (IsWindows() || getuid() == 0) { + SPAWN(fork); + ASSERT_SYS(0, 0, setpriority(PRIO_PROCESS, 0, -5)); + ASSERT_SYS(0, -5, getpriority(PRIO_PROCESS, 0)); + ASSERT_SYS(0, 0, setpriority(PRIO_PROCESS, 0, 0)); + EXITS(0); + } +} + +TEST(getpriority, lowerAndRaiseItAgain_notAllowed) { + return; // this behavior seems limited to modern linux + SPAWN(fork); + ASSERT_SYS(0, 0, setpriority(PRIO_PROCESS, 0, 5)); + ASSERT_SYS(EACCES, -1, setpriority(PRIO_PROCESS, 0, 4)); + EXITS(0); +} + +TEST(getpriority, lowerPriorityOfSubprocess) { + int pid, ws; + sigset_t ss, oldss; + sigemptyset(&ss); + sigaddset(&ss, SIGUSR1); + ASSERT_SYS(0, 0, sigprocmask(SIG_BLOCK, &ss, &oldss)); + ASSERT_NE(-1, (pid = fork())); + if (!pid) { + sigemptyset(&ss); + ASSERT_SYS(EINTR, -1, sigsuspend(&ss)); + _Exit(0); + } + ASSERT_SYS(0, 0, getpriority(PRIO_PROCESS, pid)); + ASSERT_SYS(0, 0, setpriority(PRIO_PROCESS, pid, 5)); + ASSERT_SYS(0, 5, getpriority(PRIO_PROCESS, pid)); + ASSERT_SYS(0, 0, kill(pid, SIGUSR1)); + ASSERT_SYS(0, pid, wait(&ws)); + ASSERT_SYS(0, 0, sigprocmask(SIG_SETMASK, &oldss, 0)); +} diff --git a/test/libc/calls/pledge_test.c b/test/libc/calls/pledge_test.c index 81f0bef3c..983d02c02 100644 --- a/test/libc/calls/pledge_test.c +++ b/test/libc/calls/pledge_test.c @@ -277,7 +277,9 @@ TEST(pledge, stdioTty_sendtoRestricted_requiresNullAddr) { mmap((void *)0x300000000000, FRAMESIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); sin->sin_family = AF_INET; - ASSERT_SYS(EPERM, -1, sendto(sv[0], "hello", 5, 0, sin, sizeof(*sin))); + ASSERT_SYS( + EPERM, -1, + sendto(sv[0], "hello", 5, 0, (struct sockaddr *)sin, sizeof(*sin))); _Exit(0); } close(sv[0]); @@ -346,10 +348,11 @@ TEST(pledge, inet_forbidsOtherSockets) { ASSERT_SYS(EPERM, -1, socket(AF_INET, SOCK_DGRAM, IPPROTO_RAW)); ASSERT_SYS(EPERM, -1, setsockopt(3, SOL_SOCKET, SO_TIMESTAMP, &yes, 4)); struct sockaddr_in sin = {AF_INET, 0, {htonl(0x7f000001)}}; - ASSERT_SYS(0, 0, bind(4, &sin, sizeof(sin))); + ASSERT_SYS(0, 0, bind(4, (struct sockaddr *)&sin, sizeof(sin))); uint32_t az = sizeof(sin); - ASSERT_SYS(0, 0, getsockname(4, &sin, &az)); - ASSERT_SYS(0, 5, sendto(3, "hello", 5, 0, &sin, sizeof(sin))); + ASSERT_SYS(0, 0, getsockname(4, (struct sockaddr *)&sin, &az)); + ASSERT_SYS(0, 5, + sendto(3, "hello", 5, 0, (struct sockaddr *)&sin, sizeof(sin))); _Exit(0); } EXPECT_NE(-1, wait(&ws)); diff --git a/test/libc/calls/poll_test.c b/test/libc/calls/poll_test.c index 4357222f6..72471202c 100644 --- a/test/libc/calls/poll_test.c +++ b/test/libc/calls/poll_test.c @@ -93,7 +93,7 @@ TEST(ppoll, weCanProveItChecksForSignals) { TEST(poll, testNegativeOneFd_isIgnored) { ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); struct sockaddr_in addr = {AF_INET, 0, {htonl(INADDR_LOOPBACK)}}; - ASSERT_SYS(0, 0, bind(3, &addr, sizeof(addr))); + ASSERT_SYS(0, 0, bind(3, (struct sockaddr *)&addr, sizeof(addr))); ASSERT_SYS(0, 0, listen(3, 10)); struct pollfd fds[] = {{-1}, {3}}; EXPECT_SYS(0, 0, poll(fds, ARRAYLEN(fds), 1)); diff --git a/test/libc/fmt/atoi_test.c b/test/libc/fmt/atoi_test.c index 1b0fc92c3..0f032a2ef 100644 --- a/test/libc/fmt/atoi_test.c +++ b/test/libc/fmt/atoi_test.c @@ -172,13 +172,6 @@ TEST(strtoul, weirdComma) { EXPECT_EQ(0, e - p); } -TEST(strtoul, outsideLimit_doesModulus) { - EXPECT_EQ(/* python -c 'print(((2**123-1)/123)%(2**64))' */ - 9298358801382050408ull, - strtoul(/* python -c 'print((2**123-1)/123)' */ - "86453853384384772221385825058884200", 0, 10)); -} - TEST(strtol, testHex) { EXPECT_EQ(0, strtol("", 0, 16)); EXPECT_EQ(0, strtol("0", 0, 16)); @@ -556,6 +549,15 @@ TEST(wcstoumax, testIBM) { ASSERT_STREQ(L"f", e); } +TEST(strtoul, testoverflow) { + errno = 0; + char *e = 0; + unsigned long x = strtoul("18446744073709551616", &e, 0); + ASSERT_EQ(ULONG_MAX, x); + ASSERT_EQ(ERANGE, errno); + ASSERT_STREQ("", e); +} + BENCH(atoi, bench) { EZBENCH2("atoi 10⁸", donothing, EXPROPRIATE(atoi(VEIL("r", "100000000")))); EZBENCH2("strtol 10⁸", donothing, diff --git a/test/libc/log/backtrace.c b/test/libc/log/backtrace.c index 44e2aaf6c..269d2fb2b 100644 --- a/test/libc/log/backtrace.c +++ b/test/libc/log/backtrace.c @@ -113,13 +113,12 @@ int main(int argc, char *argv[]) { pDataOverrunCrash(10 + 1); exit(0); case 5: - exit((intptr_t)pStackOverrunCrash(10 + 1)); + exit((intptr_t)pStackOverrunCrash(10 + 10000)); case 6: exit((intptr_t)pMemoryLeakCrash()); case 7: exit(pNpeCrash(0)); case 8: - __cxa_finalize(0); exit(pNpeCrash(0)); case 9: exit(pStackOverflow(pStackOverflow, 0)); diff --git a/test/libc/mem/malloc_test.c b/test/libc/mem/malloc_test.c index 80ed53c03..680c60d42 100644 --- a/test/libc/mem/malloc_test.c +++ b/test/libc/mem/malloc_test.c @@ -18,15 +18,18 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" #include "libc/calls/struct/stat.h" +#include "libc/calls/struct/timespec.h" #include "libc/dce.h" #include "libc/intrin/bits.h" #include "libc/intrin/cxaatexit.internal.h" #include "libc/intrin/safemacros.internal.h" #include "libc/macros.internal.h" -#include "libc/mem/mem.h" +#include "libc/mem/gc.h" #include "libc/mem/gc.internal.h" +#include "libc/mem/mem.h" #include "libc/runtime/memtrack.internal.h" #include "libc/runtime/runtime.h" +#include "libc/runtime/sysconf.h" #include "libc/stdio/rand.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" @@ -34,7 +37,10 @@ #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/prot.h" #include "libc/testlib/ezbench.h" +#include "libc/testlib/subprocess.h" #include "libc/testlib/testlib.h" +#include "libc/thread/thread.h" +#include "libc/time/time.h" #define N 1024 #define M 20 @@ -44,10 +50,6 @@ void SetUp(void) { if (IsWindows()) exit(0); } -void SetUpOnce(void) { - ASSERT_SYS(0, 0, pledge("stdio rpath", 0)); -} - TEST(malloc, zeroMeansOne) { ASSERT_GE(malloc_usable_size(gc(malloc(0))), 1); } @@ -146,3 +148,36 @@ BENCH(bulk_free, bench) { EZBENCH2("bulk_free()", BulkFreeBenchSetup(), bulk_free(bulk, ARRAYLEN(bulk))); } + +#define ITERATIONS 10000 + +void *Worker(void *arg) { + for (int i = 0; i < ITERATIONS; ++i) { + char *p; + ASSERT_NE(NULL, (p = malloc(lemur64() % 128))); + ASSERT_NE(NULL, (p = realloc(p, max(lemur64() % 128, 1)))); + free(p); + } + return 0; +} + +BENCH(malloc, torture) { + int i, n = GetCpuCount() * 2; + pthread_t *t = _gc(malloc(sizeof(pthread_t) * n)); + if (!n) return; + printf("\nmalloc torture test w/ %d threads and %d iterations\n", n, + ITERATIONS); + SPAWN(fork); + struct timespec t1 = _timespec_real(); + for (i = 0; i < n; ++i) { + ASSERT_EQ(0, pthread_create(t + i, 0, Worker, 0)); + } + for (i = 0; i < n; ++i) { + ASSERT_EQ(0, pthread_join(t[i], 0)); + } + struct timespec t2 = _timespec_real(); + printf("consumed %g wall and %g cpu seconds\n", + _timespec_tomicros(_timespec_sub(t2, t1)) * 1e-6, + (double)clock() / CLOCKS_PER_SEC); + EXITS(0); +} diff --git a/test/libc/runtime/sigsetjmp_test.c b/test/libc/runtime/sigsetjmp_test.c new file mode 100644 index 000000000..6c7e9c9f9 --- /dev/null +++ b/test/libc/runtime/sigsetjmp_test.c @@ -0,0 +1,56 @@ +/*-*- 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 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/calls.h" +#include "libc/calls/struct/sigaction.h" +#include "libc/calls/struct/siginfo.h" +#include "libc/calls/struct/sigset.h" +#include "libc/dce.h" +#include "libc/runtime/runtime.h" +#include "libc/sysv/consts/sa.h" +#include "libc/sysv/consts/sig.h" +#include "libc/testlib/testlib.h" + +sigjmp_buf jb; +volatile int sigs; +volatile int jumps; + +void OnSignal(int sig, siginfo_t *si, void *ctx) { + ++sigs; +} + +TEST(sigsetjmp, test) { + if (IsWindows()) return; // no sigusr1 support + sigset_t ss; + int i, n = 1000; + struct sigaction sa = {.sa_sigaction = OnSignal}; + ASSERT_SYS(0, 0, sigaction(SIGUSR1, &sa, 0)); + for (i = 0; i < n; ++i) { + if (!sigsetjmp(jb, 1)) { + sigemptyset(&ss); + sigaddset(&ss, SIGUSR1); + ASSERT_SYS(0, 0, sigprocmask(SIG_BLOCK, &ss, 0)); + ASSERT_SYS(0, 0, raise(SIGUSR1)); + siglongjmp(jb, 1); + } else { + ++jumps; + } + } + ASSERT_EQ(1000, jumps); + ASSERT_EQ(1000, sigs); +} diff --git a/test/libc/sock/nointernet_test.c b/test/libc/sock/nointernet_test.c index ff4261044..ad81797d2 100644 --- a/test/libc/sock/nointernet_test.c +++ b/test/libc/sock/nointernet_test.c @@ -47,8 +47,9 @@ void SetUpOnce(void) { TEST(nointernet, testLocalhost_isAllowed) { struct sockaddr_in addr = {AF_INET, 0, {htonl(0x7f000001)}}; ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - ASSERT_SYS(0, 0, bind(3, &addr, sizeof(addr))); - ASSERT_SYS(ECONNREFUSED, -1, connect(3, &addr, sizeof(addr))); + ASSERT_SYS(0, 0, bind(3, (struct sockaddr *)&addr, sizeof(addr))); + ASSERT_SYS(ECONNREFUSED, -1, + connect(3, (struct sockaddr *)&addr, sizeof(addr))); ASSERT_SYS(0, 0, close(3)); } @@ -56,8 +57,8 @@ TEST(nointernet, testPublicInternet_isDenied) { struct sockaddr_in addr = {AF_INET, 0, {htonl(0x06060600)}}; ASSERT_SYS(EPERM, -1, socket(AF_BLUETOOTH, SOCK_STREAM, IPPROTO_TCP)); ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - ASSERT_SYS(ENOSYS, -1, bind(3, &addr, sizeof(addr))); - ASSERT_SYS(ENOSYS, -1, connect(3, &addr, sizeof(addr))); + ASSERT_SYS(ENOSYS, -1, bind(3, (struct sockaddr *)&addr, sizeof(addr))); + ASSERT_SYS(ENOSYS, -1, connect(3, (struct sockaddr *)&addr, sizeof(addr))); ASSERT_SYS(0, 0, close(3)); } diff --git a/test/libc/sock/sendfile_test.c b/test/libc/sock/sendfile_test.c index 1977851a0..ad1570ca9 100644 --- a/test/libc/sock/sendfile_test.c +++ b/test/libc/sock/sendfile_test.c @@ -65,8 +65,8 @@ TEST(sendfile, testSeeking) { ASSERT_SYS(0, 512, write(3, kHyperion, 512)); ASSERT_SYS(0, 0, close(3)); ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - ASSERT_SYS(0, 0, bind(3, &addr, sizeof(addr))); - ASSERT_SYS(0, 0, getsockname(3, &addr, &addrsize)); + ASSERT_SYS(0, 0, bind(3, (struct sockaddr *)&addr, sizeof(addr))); + ASSERT_SYS(0, 0, getsockname(3, (struct sockaddr *)&addr, &addrsize)); ASSERT_SYS(0, 0, listen(3, 1)); if (!fork()) { ASSERT_SYS(0, 4, accept(3, (struct sockaddr *)&addr, &addrsize)); @@ -89,7 +89,7 @@ TEST(sendfile, testSeeking) { } ASSERT_SYS(0, 0, close(3)); ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - ASSERT_SYS(0, 0, connect(3, &addr, sizeof(addr))); + ASSERT_SYS(0, 0, connect(3, (struct sockaddr *)&addr, sizeof(addr))); ASSERT_SYS(0, 12, read(3, buf, 12)); // needed due to windows ASSERT_SYS(0, 500, read(3, buf + 12, 700)); ASSERT_EQ(0, memcmp(buf, kHyperion, 512)); @@ -111,8 +111,8 @@ TEST(sendfile, testPositioning) { ASSERT_SYS(0, 512, write(3, kHyperion, 512)); ASSERT_SYS(0, 0, close(3)); ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - ASSERT_SYS(0, 0, bind(3, &addr, sizeof(addr))); - ASSERT_SYS(0, 0, getsockname(3, &addr, &addrsize)); + ASSERT_SYS(0, 0, bind(3, (struct sockaddr *)&addr, sizeof(addr))); + ASSERT_SYS(0, 0, getsockname(3, (struct sockaddr *)&addr, &addrsize)); ASSERT_SYS(0, 0, listen(3, 1)); if (!fork()) { signal(SIGPIPE, SIG_IGN); @@ -130,7 +130,7 @@ TEST(sendfile, testPositioning) { } ASSERT_SYS(0, 0, close(3)); ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - ASSERT_SYS(0, 0, connect(3, &addr, sizeof(addr))); + ASSERT_SYS(0, 0, connect(3, (struct sockaddr *)&addr, sizeof(addr))); ASSERT_SYS(0, 6, read(3, buf, 6)); ASSERT_SYS(0, 6, read(3, buf + 6, 6)); ASSERT_SYS(0, 0, read(3, buf, 12)); diff --git a/test/libc/sock/setsockopt_test.c b/test/libc/sock/setsockopt_test.c index b8250c66a..bebb5848e 100644 --- a/test/libc/sock/setsockopt_test.c +++ b/test/libc/sock/setsockopt_test.c @@ -38,7 +38,7 @@ TEST(setsockopt, SO_RCVTIMEO) { struct sockaddr_in sa = {AF_INET, 0, {htonl(0x7f000001)}}; EXPECT_SYS(0, 3, socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)); EXPECT_SYS(0, 0, setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))); - EXPECT_SYS(0, 0, bind(3, &sa, sizeof(struct sockaddr_in))); + EXPECT_SYS(0, 0, bind(3, (struct sockaddr *)&sa, sizeof(struct sockaddr_in))); EXPECT_SYS(EAGAIN, -1, read(3, buf, sizeof(buf))); EXPECT_SYS(0, 0, close(3)); } diff --git a/test/libc/sock/socket_test.c b/test/libc/sock/socket_test.c index 0d04bb8de..0ab394fdf 100644 --- a/test/libc/sock/socket_test.c +++ b/test/libc/sock/socket_test.c @@ -36,8 +36,8 @@ TEST(ipv4, test) { .sin_addr.s_addr = htonl(0x7f000001), }; ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - ASSERT_SYS(0, 0, bind(3, &addr, sizeof(addr))); - ASSERT_SYS(0, 0, getsockname(3, &addr, &addrsize)); + ASSERT_SYS(0, 0, bind(3, (struct sockaddr *)&addr, sizeof(addr))); + ASSERT_SYS(0, 0, getsockname(3, (struct sockaddr *)&addr, &addrsize)); ASSERT_SYS(0, 0, listen(3, SOMAXCONN)); ASSERT_NE(-1, (pid = fork())); if (!pid) { @@ -49,7 +49,7 @@ TEST(ipv4, test) { } EXPECT_SYS(0, 0, close(3)); EXPECT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - EXPECT_SYS(0, 0, connect(3, &addr, sizeof(addr))); + EXPECT_SYS(0, 0, connect(3, (struct sockaddr *)&addr, sizeof(addr))); EXPECT_SYS(0, 5, read(3, buf, 16)); EXPECT_STREQ("hello", buf); EXPECT_SYS(0, 0, close(3)); @@ -68,8 +68,8 @@ TEST(ipv6, test) { .sin6_addr.s6_addr[15] = 1, }; ASSERT_SYS(0, 3, socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)); - ASSERT_SYS(0, 0, bind(3, &addr, sizeof(addr))); - ASSERT_SYS(0, 0, getsockname(3, &addr, &addrsize)); + ASSERT_SYS(0, 0, bind(3, (struct sockaddr *)&addr, sizeof(addr))); + ASSERT_SYS(0, 0, getsockname(3, (struct sockaddr *)&addr, &addrsize)); ASSERT_EQ(AF_INET6, addr.sin6_family); ASSERT_NE(0, addr.sin6_port); ASSERT_SYS(0, 0, listen(3, SOMAXCONN)); @@ -83,7 +83,7 @@ TEST(ipv6, test) { } EXPECT_SYS(0, 0, close(3)); EXPECT_SYS(0, 3, socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)); - EXPECT_SYS(0, 0, connect(3, &addr, sizeof(addr))); + EXPECT_SYS(0, 0, connect(3, (struct sockaddr *)&addr, sizeof(addr))); EXPECT_SYS(0, 5, read(3, buf, 16)); EXPECT_STREQ("hello", buf); EXPECT_SYS(0, 0, close(3)); diff --git a/test/libc/sock/unix_test.c b/test/libc/sock/unix_test.c index 189838b63..3ac20bf97 100644 --- a/test/libc/sock/unix_test.c +++ b/test/libc/sock/unix_test.c @@ -66,7 +66,7 @@ TEST(unix, datagram) { alarm(3); while (!fileexists(addr.sun_path)) usleep(10000); ASSERT_SYS(0, 3, socket(AF_UNIX, SOCK_DGRAM, 0)); - ASSERT_SYS(0, 5, sendto(3, "hello", 5, 0, &addr, len)); + ASSERT_SYS(0, 5, sendto(3, "hello", 5, 0, (struct sockaddr *)&addr, len)); ASSERT_SYS(0, 0, close(3)); ASSERT_NE(-1, wait(&ws)); EXPECT_TRUE(WIFEXITED(ws)); diff --git a/test/libc/stdio/fgets_test.c b/test/libc/stdio/fgets_test.c index 7031682a2..65c157954 100644 --- a/test/libc/stdio/fgets_test.c +++ b/test/libc/stdio/fgets_test.c @@ -16,9 +16,10 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/mem/mem.h" #include "libc/mem/gc.internal.h" +#include "libc/mem/mem.h" #include "libc/stdio/stdio.h" +#include "libc/str/str.h" #include "libc/testlib/ezbench.h" #include "libc/testlib/hyperion.h" #include "libc/testlib/testlib.h" @@ -33,6 +34,18 @@ TEST(fgets, test) { fclose(f); } +TEST(fgets, eof) { + FILE *f; + char s[10]; + char buf[] = "test"; + ASSERT_NE(NULL, (f = fmemopen(buf, sizeof buf, "r"))); + ASSERT_EQ(s, fgets(s, sizeof s, f)); + ASSERT_EQ(0, strcmp(s, buf)); + ASSERT_EQ(0, fgets(s, sizeof s, f)); + ASSERT_EQ('t', s[0]); + ASSERT_EQ(0, fclose(f)); +} + void Benchmark(void) { FILE *f; char *line; diff --git a/test/tool/net/redbean_test.c b/test/tool/net/redbean_test.c index 7e1e189bd..b5c8c4b97 100644 --- a/test/tool/net/redbean_test.c +++ b/test/tool/net/redbean_test.c @@ -75,7 +75,7 @@ char *SendHttpRequest(const char *s) { ssize_t rc; struct sockaddr_in addr = {AF_INET, htons(port), {htonl(INADDR_LOOPBACK)}}; EXPECT_NE(-1, (fd = Socket())); - EXPECT_NE(-1, connect(fd, &addr, sizeof(addr))); + EXPECT_NE(-1, connect(fd, (struct sockaddr *)&addr, sizeof(addr))); n = strlen(s); EXPECT_EQ(n, write(fd, s, n)); shutdown(fd, SHUT_WR); diff --git a/third_party/dlmalloc/locks.inc b/third_party/dlmalloc/locks.inc index 56c19072d..53f11739e 100644 --- a/third_party/dlmalloc/locks.inc +++ b/third_party/dlmalloc/locks.inc @@ -38,7 +38,7 @@ static int malloc_lock(atomic_int *lk) { if (!__threaded) return 0; while (atomic_exchange_explicit(lk, 1, memory_order_acquire)) { - sched_yield(); + donothing; } return 0; } diff --git a/third_party/getopt/getopt.h b/third_party/getopt/getopt.h index 06767a39e..22ecf6ded 100644 --- a/third_party/getopt/getopt.h +++ b/third_party/getopt/getopt.h @@ -1,25 +1,29 @@ #ifndef COSMOPOLITAN_THIRD_PARTY_GETOPT_GETOPT_H_ #define COSMOPOLITAN_THIRD_PARTY_GETOPT_GETOPT_H_ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ extern char *optarg; extern int optind, opterr, optopt, optreset; -int getopt(int nargc, char *const nargv[], const char *ostr); -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 +int getopt(int, char *const[], const char *); +int getsubopt(char **, char *const *, char **); + struct option { const char *name; int has_arg; int *flag; int val; }; -int getopt_long(int nargc, char *const *nargv, const char *options, - const struct option *long_options, int *idx); -int getopt_long_only(int nargc, char *const *nargv, const char *options, - const struct option *long_options, int *idx); + +int getopt_long(int, char *const *, const char *, const struct option *, int *); +int getopt_long_only(int, char *const *, const char *, const struct option *, + int *); COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/third_party/getopt/getsubopt.c b/third_party/getopt/getsubopt.c new file mode 100644 index 000000000..274ed088a --- /dev/null +++ b/third_party/getopt/getsubopt.c @@ -0,0 +1,91 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright (c) 1990, 1993 │ +│ The Regents of the University of California. All rights reserved. │ +│ │ +│ Redistribution and use in source and binary forms, with or without │ +│ modification, are permitted provided that the following conditions │ +│ are met: │ +│ 1. Redistributions of source code must retain the above copyright │ +│ notice, this list of conditions and the following disclaimer. │ +│ 2. Redistributions in binary form must reproduce the above copyright │ +│ notice, this list of conditions and the following disclaimer in the │ +│ documentation and/or other materials provided with the distribution. │ +│ 3. Neither the name of the University nor the names of its contributors │ +│ may be used to endorse or promote products derived from this software │ +│ without specific prior written permission. │ +│ │ +│ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND │ +│ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE │ +│ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE │ +│ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE │ +│ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL │ +│ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS │ +│ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) │ +│ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT │ +│ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY │ +│ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF │ +│ SUCH DAMAGE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" +#include "third_party/getopt/getopt.h" +// clang-format off + +/* + * The SVID interface to getsubopt provides no way of figuring out which + * part of the suboptions list wasn't matched. This makes error messages + * tricky... The extern variable suboptarg is a pointer to the token + * which didn't match. + */ +char *suboptarg; + +int +getsubopt(char **optionp, char * const *tokens, char **valuep) +{ + int cnt; + char *p; + + suboptarg = *valuep = NULL; + + if (!optionp || !*optionp) + return(-1); + + /* skip leading white-space, commas */ + for (p = *optionp; *p && (*p == ',' || *p == ' ' || *p == '\t'); ++p); + + if (!*p) { + *optionp = p; + return(-1); + } + + /* save the start of the token, and skip the rest of the token. */ + for (suboptarg = p; + *++p && *p != ',' && *p != '=' && *p != ' ' && *p != '\t';); + + if (*p) { + /* + * If there's an equals sign, set the value pointer, and + * skip over the value part of the token. Terminate the + * token. + */ + if (*p == '=') { + *p = '\0'; + for (*valuep = ++p; + *p && *p != ',' && *p != ' ' && *p != '\t'; ++p); + if (*p) + *p++ = '\0'; + } else + *p++ = '\0'; + /* Skip any whitespace or commas after this token. */ + for (; *p && (*p == ',' || *p == ' ' || *p == '\t'); ++p); + } + + /* set optionp for next round. */ + *optionp = p; + + for (cnt = 0; *tokens; ++tokens, ++cnt) + if (!strcmp(suboptarg, *tokens)) + return(cnt); + return(-1); +} diff --git a/third_party/lua/lunix.c b/third_party/lua/lunix.c index 803735489..18ea91a47 100644 --- a/third_party/lua/lunix.c +++ b/third_party/lua/lunix.c @@ -62,6 +62,7 @@ #include "libc/sock/struct/ifconf.h" #include "libc/sock/struct/linger.h" #include "libc/sock/struct/pollfd.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/sock/syslog.h" #include "libc/stdio/append.h" #include "libc/stdio/stdio.h" @@ -858,7 +859,8 @@ static int LuaUnixSetpgid(lua_State *L) { setpgid(luaL_checkinteger(L, 1), luaL_checkinteger(L, 2))); } -static dontinline int LuaUnixSetid(lua_State *L, const char *call, int f(int)) { +static dontinline int LuaUnixSetid(lua_State *L, const char *call, + int f(unsigned)) { int olderr = errno; return SysretBool(L, call, olderr, f(luaL_checkinteger(L, 1))); } @@ -1373,8 +1375,9 @@ static int LuaUnixBind(lua_State *L) { struct sockaddr_storage ss; int olderr = errno; MakeSockaddr(L, 2, &ss, &salen); - return SysretBool(L, "bind", olderr, - bind(luaL_checkinteger(L, 1), &ss, salen)); + return SysretBool( + L, "bind", olderr, + bind(luaL_checkinteger(L, 1), (struct sockaddr *)&ss, salen)); } // unix.connect(fd:int, ip:uint32, port:uint16) @@ -1386,8 +1389,9 @@ static int LuaUnixConnect(lua_State *L) { struct sockaddr_storage ss; int olderr = errno; MakeSockaddr(L, 2, &ss, &salen); - return SysretBool(L, "connect", olderr, - connect(luaL_checkinteger(L, 1), &ss, salen)); + return SysretBool( + L, "connect", olderr, + connect(luaL_checkinteger(L, 1), (struct sockaddr *)&ss, salen)); } // unix.listen(fd:int[, backlog:int]) @@ -1400,13 +1404,13 @@ static int LuaUnixListen(lua_State *L) { } static int LuaUnixGetname(lua_State *L, const char *name, - int func(int, void *, uint32_t *)) { + int func(int, struct sockaddr *, uint32_t *)) { int olderr; uint32_t addrsize; struct sockaddr_storage ss = {0}; olderr = errno; addrsize = sizeof(ss) - 1; - if (!func(luaL_checkinteger(L, 1), &ss, &addrsize)) { + if (!func(luaL_checkinteger(L, 1), (struct sockaddr *)&ss, &addrsize)) { return PushSockaddr(L, &ss); } else { return LuaUnixSysretErrno(L, name, olderr); @@ -1525,7 +1529,7 @@ static int LuaUnixAccept(lua_State *L) { addrsize = sizeof(ss); serverfd = luaL_checkinteger(L, 1); flags = luaL_optinteger(L, 2, 0); - clientfd = accept4(serverfd, &ss, &addrsize, flags); + clientfd = accept4(serverfd, (struct sockaddr *)&ss, &addrsize, flags); if (clientfd != -1) { lua_pushinteger(L, clientfd); return 1 + PushSockaddr(L, &ss); @@ -1607,7 +1611,8 @@ static int LuaUnixRecvfrom(lua_State *L) { bufsiz = MIN(bufsiz, 0x7ffff000); flags = luaL_optinteger(L, 3, 0); buf = LuaAllocOrDie(L, bufsiz); - if ((rc = recvfrom(fd, buf, bufsiz, flags, &ss, &addrsize)) != -1) { + if ((rc = recvfrom(fd, buf, bufsiz, flags, (struct sockaddr *)&ss, + &addrsize)) != -1) { got = rc; lua_pushlstring(L, buf, got); pushed = 1 + PushSockaddr(L, &ss); @@ -1673,8 +1678,9 @@ static int LuaUnixSendto(lua_State *L) { data = luaL_checklstring(L, 2, &size); i = MakeSockaddr(L, 3, &ss, &salen); flags = luaL_optinteger(L, i, 0); - return SysretInteger(L, "sendto", olderr, - sendto(fd, data, size, flags, &ss, salen)); + return SysretInteger( + L, "sendto", olderr, + sendto(fd, data, size, flags, (struct sockaddr *)&ss, salen)); } // unix.shutdown(fd:int, how:int) diff --git a/third_party/make/job.c b/third_party/make/job.c index caa11a68c..d7b789fd2 100644 --- a/third_party/make/job.c +++ b/third_party/make/job.c @@ -1904,7 +1904,9 @@ child_execute_job (struct childbase *child, c = 0; } - internet = parse_bool (get_target_variable + internet = !get_target_variable(STRING_SIZE_TUPLE (".STRICT"), + c->file, 0) || + parse_bool (get_target_variable (STRING_SIZE_TUPLE (".INTERNET"), c ? c->file : 0, "0")); diff --git a/third_party/musl/crypt.h b/third_party/musl/crypt.h index 087400dc5..7dae908bb 100644 --- a/third_party/musl/crypt.h +++ b/third_party/musl/crypt.h @@ -8,6 +8,8 @@ struct crypt_data { char __buf[256]; }; +void encrypt(char *, int); +void setkey(const char *); char *crypt(const char *, const char *); char *crypt_r(const char *, const char *, struct crypt_data *); diff --git a/third_party/musl/lockf.c b/third_party/musl/lockf.c new file mode 100644 index 000000000..9bad45660 --- /dev/null +++ b/third_party/musl/lockf.c @@ -0,0 +1,68 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/calls.h" +#include "libc/calls/struct/flock.h" +#include "libc/calls/weirdtypes.h" +#include "libc/errno.h" +#include "libc/sysv/consts/f.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +int lockf(int fd, int op, off_t size) +{ + struct flock l = { + .l_type = F_WRLCK, + .l_whence = SEEK_CUR, + .l_len = size, + }; + if (op == F_TEST){ + l.l_type = F_RDLCK; + if (fcntl(fd, F_GETLK, &l) < 0) + return -1; + if (l.l_type == F_UNLCK || l.l_pid == getpid()) + return 0; + errno = EACCES; + return -1; + } + if (op == F_ULOCK) { + l.l_type = F_UNLCK; + return fcntl(fd, F_SETLK, &l); + } + if (op == F_TLOCK) { + return fcntl(fd, F_SETLK, &l); + } + if (op == F_LOCK) { + return fcntl(fd, F_SETLKW, &l); + } + errno = EINVAL; + return -1; +} diff --git a/third_party/musl/rand48.c b/third_party/musl/rand48.c new file mode 100644 index 000000000..6a06aa853 --- /dev/null +++ b/third_party/musl/rand48.c @@ -0,0 +1,101 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" +#include "third_party/musl/rand48.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +// clang-format off + +static unsigned short __seed48[7] = { 0, 0, 0, 0xe66d, 0xdeec, 0x5, 0xb }; + +static uint64_t __rand48_step(unsigned short *xi, unsigned short *lc) +{ + uint64_t a, x; + x = xi[0] | xi[1]+0U<<16 | xi[2]+0ULL<<32; + a = lc[0] | lc[1]+0U<<16 | lc[2]+0ULL<<32; + x = a*x + lc[3]; + xi[0] = x; + xi[1] = x>>16; + xi[2] = x>>32; + return x & 0xffffffffffffull; +} + +double erand48(unsigned short s[3]) +{ + union { + uint64_t u; + double f; + } x = { 0x3ff0000000000000ULL | __rand48_step(s, __seed48+3)<<4 }; + return x.f - 1.0; +} + +double drand48(void) +{ + return erand48(__seed48); +} + +void lcong48(unsigned short p[7]) +{ + memcpy(__seed48, p, sizeof __seed48); +} + +long nrand48(unsigned short s[3]) +{ + return __rand48_step(s, __seed48+3) >> 17; +} + +long lrand48(void) +{ + return nrand48(__seed48); +} + +long jrand48(unsigned short s[3]) +{ + return (int32_t)(__rand48_step(s, __seed48+3) >> 16); +} + +long mrand48(void) +{ + return jrand48(__seed48); +} + +unsigned short *seed48(unsigned short *s) +{ + static unsigned short p[3]; + memcpy(p, __seed48, sizeof p); + memcpy(__seed48, s, sizeof p); + return p; +} + +void srand48(long seed) +{ + seed48((unsigned short [3]){ 0x330e, seed, seed>>16 }); +} diff --git a/third_party/musl/rand48.h b/third_party/musl/rand48.h new file mode 100644 index 000000000..14799456f --- /dev/null +++ b/third_party/musl/rand48.h @@ -0,0 +1,18 @@ +#ifndef COSMOPOLITAN_THIRD_PARTY_MUSL_RAND48_H_ +#define COSMOPOLITAN_THIRD_PARTY_MUSL_RAND48_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +double drand48(void); +double erand48(unsigned short[3]); +long int lrand48(void); +long int nrand48(unsigned short[3]); +long mrand48(void); +long jrand48(unsigned short[3]); +void srand48(long); +unsigned short *seed48(unsigned short[3]); +void lcong48(unsigned short[7]); + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_MUSL_RAND48_H_ */ diff --git a/tool/build/lib/syscall.c b/tool/build/lib/syscall.c index dbd3ea469..3d09d3990 100644 --- a/tool/build/lib/syscall.c +++ b/tool/build/lib/syscall.c @@ -40,13 +40,14 @@ #include "libc/log/check.h" #include "libc/log/log.h" #include "libc/macros.internal.h" +#include "libc/mem/gc.internal.h" #include "libc/mem/mem.h" #include "libc/nexgen32e/vendor.internal.h" -#include "libc/mem/gc.internal.h" #include "libc/runtime/pc.internal.h" #include "libc/runtime/runtime.h" #include "libc/sock/select.h" #include "libc/sock/sock.h" +#include "libc/sock/struct/sockaddr.h" #include "libc/str/str.h" #include "libc/sysv/consts/af.h" #include "libc/sysv/consts/at.h" @@ -485,7 +486,7 @@ static int OpAccept4(struct Machine *m, int fd, int64_t aa, int64_t asa, } static int OpConnectBind(struct Machine *m, int fd, int64_t aa, uint32_t as, - int impl(int, const void *, uint32_t)) { + int impl(int, const struct sockaddr *, uint32_t)) { struct sockaddr_in addr; struct sockaddr_in_bits gaddr; if (as != sizeof(gaddr)) return einval(); @@ -540,7 +541,7 @@ static int OpGetsockopt(struct Machine *m, int fd, int level, int optname, } static int OpSocketName(struct Machine *m, int fd, int64_t aa, int64_t asa, - int SocketName(int, void *, socklen_t *)) { + int SocketName(int, struct sockaddr *, socklen_t *)) { int rc; uint32_t addrsize; uint8_t gaddrsize[4]; diff --git a/tool/build/runitd.c b/tool/build/runitd.c index dfffc8ccf..4c6fd9d87 100644 --- a/tool/build/runitd.c +++ b/tool/build/runitd.c @@ -216,12 +216,13 @@ void StartTcpServer(void) { setsockopt(g_servfd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo)); LOGIFNEG1(setsockopt(g_servfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))); - if (bind(g_servfd, &g_servaddr, sizeof(g_servaddr)) == -1) { + if (bind(g_servfd, (struct sockaddr *)&g_servaddr, sizeof(g_servaddr)) == + -1) { FATALF("bind failed %m"); } CHECK_NE(-1, listen(g_servfd, 10)); asize = sizeof(g_servaddr); - CHECK_NE(-1, getsockname(g_servfd, &g_servaddr, &asize)); + CHECK_NE(-1, getsockname(g_servfd, (struct sockaddr *)&g_servaddr, &asize)); INFOF("%s:%s", "listening on tcp", _gc(DescribeAddress(&g_servaddr))); if (g_sendready) { printf("ready %hu\n", ntohs(g_servaddr.sin_port)); @@ -374,7 +375,8 @@ void HandleClient(void) { addrsize = sizeof(addr); INFOF("accept"); do { - g_clifd = accept4(g_servfd, &addr, &addrsize, SOCK_CLOEXEC); + g_clifd = + accept4(g_servfd, (struct sockaddr *)&addr, &addrsize, SOCK_CLOEXEC); } while (g_clifd == -1 && errno == EAGAIN); CHECK_NE(-1, g_clifd); if (fork()) { diff --git a/tool/net/echo.c b/tool/net/echo.c index 2437e5c2e..434e9625b 100644 --- a/tool/net/echo.c +++ b/tool/net/echo.c @@ -54,21 +54,22 @@ void UdpServer(void) { struct sockaddr_in addr2; uint32_t addrsize2 = sizeof(struct sockaddr_in); CHECK_NE(-1, (sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))); - CHECK_NE(-1, bind(sock, &addr, addrsize)); - CHECK_NE(-1, getsockname(sock, &addr2, &addrsize2)); + CHECK_NE(-1, bind(sock, (struct sockaddr *)&addr, addrsize)); + CHECK_NE(-1, getsockname(sock, (struct sockaddr *)&addr2, &addrsize2)); ip = ntohl(addr2.sin_addr.s_addr); kprintf("udp server %hhu.%hhu.%hhu.%hhu %hu%n", ip >> 24, ip >> 16, ip >> 8, ip, ntohs(addr2.sin_port)); for (;;) { + CHECK_NE(-1, (rc = recvfrom(sock, buf, sizeof(buf), 0, + (struct sockaddr *)&addr2, &addrsize2))); CHECK_NE(-1, - (rc = recvfrom(sock, buf, sizeof(buf), 0, &addr2, &addrsize2))); - CHECK_NE(-1, sendto(sock, buf, rc, 0, &addr2, addrsize2)); + sendto(sock, buf, rc, 0, (struct sockaddr *)&addr2, addrsize2)); } } void UdpClient(void) { CHECK_NE(-1, (sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))); - CHECK_NE(-1, connect(sock, &addr, addrsize)); + CHECK_NE(-1, connect(sock, (struct sockaddr *)&addr, addrsize)); for (;;) { rngset(buf, sizeof(buf), _rand64, -1); CHECK_NE(-1, write(sock, &addr, addrsize)); @@ -81,9 +82,9 @@ void TcpServer(void) { struct sockaddr_in addr2; uint32_t addrsize2 = sizeof(struct sockaddr_in); CHECK_NE(-1, (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))); - CHECK_NE(-1, bind(sock, &addr, addrsize)); + CHECK_NE(-1, bind(sock, (struct sockaddr *)&addr, addrsize)); CHECK_NE(-1, listen(sock, 10)); - CHECK_NE(-1, getsockname(sock, &addr2, &addrsize2)); + CHECK_NE(-1, getsockname(sock, (struct sockaddr *)&addr2, &addrsize2)); ip = ntohl(addr2.sin_addr.s_addr); kprintf("tcp server %hhu.%hhu.%hhu.%hhu %hu%n", ip >> 24, ip >> 16, ip >> 8, ip, ntohs(addr2.sin_port)); @@ -104,7 +105,7 @@ void TcpServer(void) { void TcpClient(void) { CHECK_NE(-1, (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))); - CHECK_NE(-1, connect(sock, &addr, addrsize)); + CHECK_NE(-1, connect(sock, (struct sockaddr *)&addr, addrsize)); for (;;) { rngset(buf, sizeof(buf), _rand64, -1); CHECK_NE(-1, write(sock, buf, sizeof(buf))); diff --git a/tool/net/redbean.c b/tool/net/redbean.c index e7670ef56..9a4c0bf32 100644 --- a/tool/net/redbean.c +++ b/tool/net/redbean.c @@ -6492,8 +6492,8 @@ static void MonitorMemory(void) { static int HandleConnection(size_t i) { int pid, rc = 0; clientaddrsize = sizeof(clientaddr); - if ((client = accept4(servers.p[i].fd, &clientaddr, &clientaddrsize, - SOCK_CLOEXEC)) != -1) { + if ((client = accept4(servers.p[i].fd, (struct sockaddr *)&clientaddr, + &clientaddrsize, SOCK_CLOEXEC)) != -1) { startconnection = _timespec_real(); if (UNLIKELY(maxworkers) && shared->workers >= maxworkers) { EnterMeltdownMode(); @@ -6776,7 +6776,7 @@ static void Listen(void) { continue; } - if (bind(servers.p[n].fd, &servers.p[n].addr, + if (bind(servers.p[n].fd, (struct sockaddr *)&servers.p[n].addr, sizeof(servers.p[n].addr)) == -1) { DIEF("(srvr) bind error: %m: %hhu.%hhu.%hhu.%hhu:%hu", ips.p[i] >> 24, ips.p[i] >> 16, ips.p[i] >> 8, ips.p[i], ports.p[j]); @@ -6785,7 +6785,8 @@ static void Listen(void) { DIEF("(srvr) listen error: %m"); } addrsize = sizeof(servers.p[n].addr); - if (getsockname(servers.p[n].fd, &servers.p[n].addr, &addrsize) == -1) { + if (getsockname(servers.p[n].fd, (struct sockaddr *)&servers.p[n].addr, + &addrsize) == -1) { DIEF("(srvr) getsockname error: %m"); } port = ntohs(servers.p[n].addr.sin_port);