Age | Commit message (Collapse) | Author |
|
|
|
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...
|
|
Unsure about my modification to the language. I found the parsing of the
case body within switches to be odd - specifically that it parses
liberally and then checks that it has case -> cmd structuring while it
walks the code. This means the language is more permissive than the
semantics. I modified it to be more explicit, but at the cost of having
to end each case statement with a semicolon. I wanted a colon, but this
is a valid word character and thus will be lexed as part of the word.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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...
|
|
Hit a bit of a stopping point. Specifically, the way XAsync runs
currently is by forking the execution context and having the child run
the async code while the parent runs the remainder. The problem with
this architecture is it doesn't interact well with job control. When we
fork, we create a new process group. Thus the Xasync fork becomes the
new leader.
In short, our traversal of the parse tree as to be less "preorder" and
more "in order", i.e. from the leaves up. The "left" command of the
pipeline should be the "leader" of the process group.
|
|
Slowly chipping away at a decent feature list.
Subshell commands are executed by @{ ... }.
|
|
|
|
Added the length and concatenate operators.
Slightly improved the robustness on syntax errors.
|
|
|
|
|
|
|
|
|