Age | Commit message (Collapse) | Author |
|
We use weak linking to ensure we clean up at exit time correctly. If
libc is linked, then we call our cleanup function by registering an
atexit callback with the library. If libc is not linked, we have a weak
symbol that results in a noop. Similarly, if we call rt·exit while
linked with libc, this immediately calls libc's exit (which will call
our cleanup as we registered it). If we are not linked to libc, exit()
is given as a weak link to a noop function.
|
|
|
|
I found the split to be arbitrary. Better to include the functionality
in the standard library. I also split the headers to allow for more
granular inclusion (but the library is still monolithic). The only
ugliness is the circular dependency introduced with libutf's generated
functions. We put explicit prereqs with the necessary object files
instead.
|
|
This is a large change. In order to remove myself from libc's arcane
interface, I implemented an independent runtime layer. It is based on
musl's wonderful implementation mostly. Critically, if libc is linked to
the program, then we cooperate. Namely, we call start main and let libc
do all initialization. If not, then we have a noop defined in rt3.a.
The general structure of the file is:
1. sys/$os/$arch contains all architecture dependent code
2. sys/$os/port contains all code that depends on the os, but is
portable
3. rt/$arch contains all the runtime architecture dependent code
4. rt/* contains the portable runtime code.
Obviously testing is needed. Specifically, while code is checked in for
the most popular architectures, it only has been tested on one computer!
Overall this is exciting and as been educational.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is very much a work in progress. Still ruminating on the structure
of the library. It feels right but I want a more "social" presence -
namely the ability to link to a libc seemlessly. The solution is most
likely weak aliasing that musl uses - but musl itself weak aliases
global symbols, e.g malloc. We would have to define weak internal
symbols that musl defines as strong links but this knows too much about
the internals of musl...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Updated our assumptions of readline to handle valid unicode input.
This required integrating with an explicit library to handle unicode
knowledge.
|
|
|
|
|
|
|
|
|
|
The readline functionality operated on the assumption that 1 byte = 1
character. This is obviously wrong if you input a non-ascii character.
This commit temporarily removes a lot of functionality but parses input
bytes in a unicode-aware manner.
The outstanding problem now is 1 unicode rune != 1 column. There are
double wide characters, as well as zero width runes, that further break
our assumption that 1 rune = 1 character = 1 column. This is the next
iteration.
|
|
I was hiding too many important constants. This commit moves them to the
main exported header.
|
|
Additionally, decode can now apply backwards on a byte string.
|
|
|
|
Refactored code to pull out utf8 functions from base into a standalone
library. Also left the required function inside arg.c so that code that
calls ARG_BEGIN doesn't have to link to libunicode.
|
|
|
|
Prototypes for loops sketched. This required recognizing keywords and
returning from yylex. Debugging/testing will be required.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Now correctly prints out argv[1]
|
|
|
|
|
|
|
|
|
|
One quick solution to the lack of tracking deep into the command line is
to note that the pattern of code emitted for an async is:
Xasync
|__ child (command)
|__ parent (continues)
The child creates a process group, as described before. If the child is
a simple command, we will now "exec" as it will exit immediately after
the command. This gives us the correct behavior, at least for simple
cases.
This also fixed pipes. However, if child has to be forked, i.e. can't be
immediately execed, then I don't think this process works...
|