mirror of
https://github.com/urbit/shrub.git
synced 2024-12-15 12:43:31 +03:00
Merge branch 'test' of https://github.com/urbit/urbit into test
This commit is contained in:
commit
9e2f7eddc2
28
Makefile
28
Makefile
@ -39,7 +39,7 @@ RM=rm -f
|
||||
CC=gcc
|
||||
CXX=g++
|
||||
CXXFLAGS=$(CFLAGS)
|
||||
CLD=g++ -g -L/usr/local/lib -L/opt/local/lib
|
||||
CLD=g++ -O3 -L/usr/local/lib -L/opt/local/lib
|
||||
|
||||
ifeq ($(OS),osx)
|
||||
COSFLAGS=-fno-diagnostics-fixit-info
|
||||
@ -354,7 +354,7 @@ LIBCOMMONMARK=outside/commonmark/build/src/libcmark.a
|
||||
|
||||
LIBSCRYPT=outside/scrypt/scrypt.a
|
||||
|
||||
all: vere
|
||||
all: urbit
|
||||
|
||||
.MAKEFILE-VERSION: Makefile .make.conf
|
||||
@echo "Makefile update."
|
||||
@ -363,7 +363,7 @@ all: vere
|
||||
.make.conf:
|
||||
@echo "# Set custom configuration here, please!" > ".make.conf"
|
||||
|
||||
vere: $(BIN)/vere
|
||||
urbit: $(BIN)/urbit
|
||||
meme: $(BIN)/meme
|
||||
|
||||
$(LIBUV_MAKEFILE) $(LIBUV_MAKEFILE2):
|
||||
@ -393,14 +393,14 @@ $(CRE2_OFILES): outside/cre2/src/src/cre2.cpp outside/cre2/src/src/cre2.h $(LIBR
|
||||
$(V_OFILES): i/v/vere.h
|
||||
|
||||
ifdef NO_SILENT_RULES
|
||||
$(BIN)/vere: $(LIBCRE) $(LIBCOMMONMARK) $(VERE_OFILES) $(LIBUV) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBSCRYPT)
|
||||
$(BIN)/urbit: $(LIBCRE) $(LIBCOMMONMARK) $(VERE_OFILES) $(LIBUV) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBSCRYPT)
|
||||
mkdir -p $(BIN)
|
||||
$(CLD) $(CLDOSFLAGS) -o $(BIN)/vere $(VERE_OFILES) $(LIBUV) $(LIBCRE) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBS) $(LIBCOMMONMARK) $(LIBSCRYPT)
|
||||
$(CLD) $(CLDOSFLAGS) -o $(BIN)/urbit $(VERE_OFILES) $(LIBUV) $(LIBCRE) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBS) $(LIBCOMMONMARK) $(LIBSCRYPT)
|
||||
else
|
||||
$(BIN)/vere: $(LIBCRE) $(LIBCOMMONMARK) $(VERE_OFILES) $(LIBUV) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBSCRYPT)
|
||||
@echo " CCLD $(BIN)/vere"
|
||||
$(BIN)/urbit: $(LIBCRE) $(LIBCOMMONMARK) $(VERE_OFILES) $(LIBUV) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBSCRYPT)
|
||||
@echo " CCLD $(BIN)/urbit"
|
||||
@mkdir -p $(BIN)
|
||||
@$(CLD) $(CLDOSFLAGS) -o $(BIN)/vere $(VERE_OFILES) $(LIBUV) $(LIBCRE) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBS) $(LIBCOMMONMARK) $(LIBSCRYPT)
|
||||
@$(CLD) $(CLDOSFLAGS) -o $(BIN)/urbit $(VERE_OFILES) $(LIBUV) $(LIBCRE) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBS) $(LIBCOMMONMARK) $(LIBSCRYPT)
|
||||
endif
|
||||
|
||||
$(BIN)/meme: $(LIBCRE) $(LIBCOMMONMARK) $(MEME_OFILES) $(LIBUV) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBSCRYPT)
|
||||
@ -416,24 +416,24 @@ etags:
|
||||
osxpackage:
|
||||
$(RM) -r inst
|
||||
$(MAKE) distclean
|
||||
$(MAKE) $(BIN)/vere LIB=/usr/local/lib/urb STATIC=yes
|
||||
$(MAKE) $(BIN)/urbit LIB=/usr/local/lib/urb STATIC=yes
|
||||
mkdir -p inst/usr/local/lib/urb inst/usr/local/bin
|
||||
cp $(BIN)/vere inst/usr/local/bin
|
||||
cp $(BIN)/urbit inst/usr/local/bin
|
||||
cp urb/urbit.pill inst/usr/local/lib/urb
|
||||
cp -R urb/zod inst/usr/local/lib/urb
|
||||
pkgbuild --root inst --identifier org.urbit.vere --version 0.2 vere.pkg
|
||||
pkgbuild --root inst --identifier org.urbit.urbit --version 0.2 urbit.pkg
|
||||
|
||||
debbuild:
|
||||
$(MAKE) $(BIN)/vere LIB=/usr/share/urb
|
||||
$(MAKE) $(BIN)/urbit LIB=/usr/share/urb
|
||||
|
||||
debinstall:
|
||||
mkdir -p $(DESTDIR)/usr/bin $(DESTDIR)/usr/share/urb
|
||||
install -m755 $(BIN)/vere $(DESTDIR)/usr/bin
|
||||
install -m755 $(BIN)/urbit $(DESTDIR)/usr/bin
|
||||
cp urb/urbit.pill $(DESTDIR)/usr/share/urb
|
||||
cp -R urb/zod $(DESTDIR)/usr/share/urb
|
||||
|
||||
clean:
|
||||
$(RM) $(VERE_OFILES) $(BIN)/vere vere.pkg $(VERE_DFILES)
|
||||
$(RM) $(VERE_OFILES) $(BIN)/urbit urbit.pkg $(VERE_DFILES)
|
||||
|
||||
distclean: clean $(LIBUV_MAKEFILE)
|
||||
$(MAKE) -C outside/libuv_0.11 distclean
|
||||
|
248
README.markdown
248
README.markdown
@ -1,8 +1,6 @@
|
||||
Urbit
|
||||
=====
|
||||
|
||||
[![Build Status](https://travis-ci.org/urbit/urbit.png?branch=master)](https://travis-ci.org/urbit/urbit)
|
||||
|
||||
> Tlön is surely a labyrinth, but it is
|
||||
> a labyrinth devised by men, a labyrinth
|
||||
> destined to be deciphered by men.
|
||||
@ -12,7 +10,8 @@ Urbit is a new programming and execution environment designed from scratch. Any
|
||||
resemblance to existing languages or operating systems is coincidental,
|
||||
cosmetic, or inevitable.
|
||||
|
||||
All of the source code is entirely in the public domain.
|
||||
All of the source code is distributed under the MIT license, but is for all
|
||||
intents and purposes in the public domain.
|
||||
|
||||
Install
|
||||
-------------------
|
||||
@ -92,37 +91,54 @@ Run `bin/vere -c mypier` in the urbit directory, where `mypier` is a directory t
|
||||
A _pier_ is an Urbit virtual machine that hosts one or more Urbit identities,
|
||||
or _ships_. When you run `bin/vere -c`, it automatically creates a 128-bit ship, or `submarine`. Your name (a hash of a randomly-generated public key) will look something like:
|
||||
|
||||
~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted
|
||||
~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur
|
||||
|
||||
First you'll see a string of messages like:
|
||||
|
||||
vere: urbit home is /Users/cyarvin/Documents/src/u3/urb
|
||||
loom: mapped 1024MB
|
||||
time: ~2013.9.1..03.57.11..4935
|
||||
ames: on localhost, UDP 63908.
|
||||
vere: urbit home is mypier
|
||||
vere: hostname is cyarvin
|
||||
loom: mapped 2048MB
|
||||
boot: installed 190 jets
|
||||
boot: loading /home/cyarvin/urbit/urb/urbit.pill
|
||||
cv_make: loaded pill /home/cyarvin/urbit/urb/urbit.pill, as 8ddffb8
|
||||
cv_make: kernel 12e1ffdf, core 23b73cd
|
||||
cv_jack: activating kernel 12e1ffdf
|
||||
%post-start
|
||||
cv_jack: activated
|
||||
cv_start: time: ~2015.5.9..18.03.32..ba77
|
||||
|
||||
Next vere will generate a 2048 RSA key that will be used as your identity:
|
||||
|
||||
generating 2048-bit RSA pair...
|
||||
|
||||
and then it'll pause a little, 'cause this is slow, and then
|
||||
|
||||
saving passcode in /Users/cyarvin/.urbit/~magsut-hopful.txt
|
||||
saving passcode in mypier/.urb/code.~malmel-ridnep
|
||||
(for real security, write it down and delete the file...)
|
||||
|
||||
and, then, if the network gods are happy, your submarine will start pulling
|
||||
down Arvo files:
|
||||
|
||||
+ /~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/main/1/bin/ticket/hoon
|
||||
+ /~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/main/1/bin/reset/hoon
|
||||
+ /~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/main/1/bin/ye/hoon
|
||||
+ /~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/main/1/bin/ls/hoon
|
||||
[%bos ~zod ~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur]
|
||||
[%behn-init ~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur]
|
||||
ames: czar zod.urbit.org: ip .192.241.195.84
|
||||
kick: init: ~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur
|
||||
ames: on localhost, UDP 55659.
|
||||
http: live (insecure) on 8081
|
||||
http: live ("secure") on 8444
|
||||
term: live on 10024
|
||||
; ~zod |Tianming| is your neighbor
|
||||
; ~zod |Tianming| is your neighbor
|
||||
<sole>
|
||||
|
||||
and the like. You'll see a couple pages of this stuff. Don't worry too much
|
||||
about the details right now. Finally, you'll get the Arvo shell prompt (which
|
||||
is also a Hoon REPL):
|
||||
You will probably be stuck here for a while as your local submarine copies all of its files from the master carrier, `~zod`. This is normal.
|
||||
|
||||
~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/try=>
|
||||
Once that is finished, you will be dropped into the main application, the `:dojo` shell (which is coincidentally also a Hoon REPL):
|
||||
|
||||
~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur:dojo>
|
||||
|
||||
If you would like to safely bring this ship back into port (End the Unix process),
|
||||
just enter Control-D.
|
||||
just enter Control-V to switch to the task manager, then Control-D.
|
||||
|
||||
To re-launch your pier after creation run `bin/vere mypier` (exclude the `-c`)
|
||||
|
||||
@ -151,19 +167,18 @@ Let's say one of your ships is `~waclux-tomwyc` and its ticket is
|
||||
rendered in Hoon's syllabic base, `@p`.)
|
||||
|
||||
A new life awaits you on the off-world colonies! To begin, just
|
||||
type at the submarine prompt:
|
||||
type at the `:dojo` prompt:
|
||||
|
||||
:begin ~waclux-tomwyc
|
||||
:helm?begin
|
||||
|
||||
and follow the directions. When the script completes, hit return
|
||||
and you'll be the `~waclux-tomwyc` you wanted to be. Now, when other user's see you in chat or look at your
|
||||
Urbit social profile (a fasplan), they can learn whatever information you gave the :begin process.
|
||||
and enter your ship name and ticket when prompted. When the script completes, hit return
|
||||
and you'll begin re-cloning the files from `~zod` needed to boot the destroyer, after which you will become the `~waclux-tomwyc` you wanted to be.
|
||||
|
||||
###5. Play with Arvo
|
||||
|
||||
If all went well, you now have a nice short prompt:
|
||||
|
||||
~waclux-tomwyc/try=>
|
||||
~waclux-tomwyc:dojo>
|
||||
|
||||
If all did not go well (send us another email), or you're just
|
||||
too impatient to wait for your destroyer, you have a big long
|
||||
@ -175,29 +190,30 @@ exercises will still work.
|
||||
Let's try a few quick things to stretch your fingers. Type these
|
||||
command lines and you should see the matching results:
|
||||
|
||||
~waclux-tomwyc/try=> "hello, world"
|
||||
~waclux-tomwyc:dojo> "hello, world"
|
||||
"hello, world"
|
||||
|
||||
~waclux-tomwyc/try=> (add 2 2)
|
||||
|
||||
~waclux-tomwyc:dojo> (add 2 2)
|
||||
4
|
||||
|
||||
~waclux-tomwyc/try=> :hello %world
|
||||
"hello, world."
|
||||
~waclux-tomwyc:dojo> +hello %world
|
||||
'hello, dlrow'
|
||||
|
||||
~waclux-tomwyc/try=> :cat /=main=/bin/hello/hoon
|
||||
~waclux-tomwyc:dojo> +cat /=home=/cat/hello/gate/hook :: XX make this work
|
||||
::
|
||||
:: /=main=/bin/hello/hoon
|
||||
:::: /hook/gate/hello/cat
|
||||
::
|
||||
/? 314
|
||||
::
|
||||
|= *
|
||||
|= [planet=@ta ~]
|
||||
^- bowl
|
||||
:_ ~ :_ ~
|
||||
:- %%
|
||||
!>("hello, {(trip planet)}.")
|
||||
::::
|
||||
!:
|
||||
|= [* [[txt=@tas ~] ~]]
|
||||
:- %noun
|
||||
(crip (weld "hello, " (flop (trip txt))))
|
||||
|
||||
What did you just do?
|
||||
|
||||
One, you used Arvo as a Hoon REPL to print the constant `"hello,
|
||||
One, you used the Hoon REPL to print the constant `"hello,
|
||||
world"`, which is a fancy way to write the Nock noun
|
||||
|
||||
[104 101 108 108 111 44 32 119 111 114 108 100 0]
|
||||
@ -205,7 +221,7 @@ world"`, which is a fancy way to write the Nock noun
|
||||
Two, you called the Hoon `add` function to see that two plus two
|
||||
is four. Math seems to work the same on the off-world colonies.
|
||||
|
||||
Three, you ran the Arvo application `:hello` with the argument
|
||||
Three, you ran the `:dojo` application `+hello` with the argument
|
||||
`%world`, which is just a fancy way to write the atom
|
||||
`431.316.168.567` (or, for non-Germans, `431,316,168,567`). You
|
||||
might recognize it better as `0x64.6c72.6f77` - the ASCII
|
||||
@ -214,18 +230,18 @@ characters in LSB first order.
|
||||
(Is Urbit German? Sadly, no. But all our noun print formats are
|
||||
URL-safe, which dot is and comma isn't.)
|
||||
|
||||
And you (4) used the Arvo application :cat to print the Hoon file
|
||||
And you (4) used the `:dojo` application `+cat` to print the Hoon file
|
||||
|
||||
/=main=/bin/hello/hoon
|
||||
/=home=/cat/hello/gate/hook
|
||||
|
||||
which, supposing your current date is
|
||||
|
||||
~2013.9.1..04.38.31..f259
|
||||
~2015.5.9..18.03.32..ba77
|
||||
|
||||
(ie, September 1, 2013 at 4:38:31 GMT/LS25 plus 0xf259/65536
|
||||
seconds), is equivalent to the global path
|
||||
(ie, May 9, 2015 at 18:03:32 GMT/LS25 plus 0xba77/47735 seconds), is
|
||||
equivalent to the global path
|
||||
|
||||
/~waclux-tomwyc/main/~2013.8.23..04.38.31..f259/bin/hello/hoon
|
||||
/~waclux-tomwyc/home/~2015.5.9..18.03.32..ba77/cat/hello/gate/hook
|
||||
|
||||
which anyone in Urbit can, see and even use - but we're getting
|
||||
ahead of ourselves.
|
||||
@ -259,20 +275,31 @@ There are also some special control keys specific to Arvo. It's
|
||||
a good idea to learn these first so that you feel in, um,
|
||||
control.
|
||||
|
||||
First, we'll quit out of an infinite loop with `^C`:
|
||||
First off, Arvo has a simple task manager interface, allowing you see the
|
||||
running commands, along with being able to spawn or kill programs.
|
||||
|
||||
~waclux-tomwyc/try=> :infinite
|
||||
Hitting `^V` will bring you to this interface, and running `-prog`
|
||||
will kill that program while `+prog` will spawn a new one.
|
||||
If you ever end up with a broken program that is spouting errors
|
||||
and wish to restart it, do it from this interface. Even our shell
|
||||
and REPL `:dojo` is just another program in this list!
|
||||
|
||||
This is the base view from Arvo as well. If you kill all your running
|
||||
programs, it will drop you into this interface.
|
||||
|
||||
Next, we'll show you how we can quit out of an infinite loop with `^C`:
|
||||
|
||||
~waclux-tomwyc:dojo> |-($)
|
||||
|
||||
When you hit return at the end of this line, Arvo will appear to
|
||||
hang. Do not be alarmed! This is not a bug - it means that
|
||||
we've started running our infinite loop before printing the next
|
||||
console prompt. Simply hit `^C`, and you'll see
|
||||
|
||||
! intr
|
||||
~waclux-tomwyc/try=> :infinite
|
||||
|
||||
(There may be some stacktrace stuff before the `! intr`, depending
|
||||
on whether your kernel was compiled with debugging.)
|
||||
recover: dig: intr
|
||||
intr
|
||||
[various stack traces]
|
||||
~waclux-tomwyc:dojo> |-($)
|
||||
|
||||
Hit `^U` to delete the line and escape from infinity. Arvo is a
|
||||
deterministic OS; you interrupted it while processing an event
|
||||
@ -296,40 +323,38 @@ current character - as in Unix.
|
||||
|
||||
Try this by running
|
||||
|
||||
~waclux-tomwyc/try=> :begin
|
||||
~waclux-tomwyc:dojo> +helm?begin
|
||||
|
||||
Do you have a ship and a ticket? yes
|
||||
~waclux-tomwyc:dojo: your ship: ~
|
||||
|
||||
Then hit `^D` and you'll be back to the command prompt (which,
|
||||
unlike in Unix, is not a task itself, but part of the OS).
|
||||
Then hit `^D` and you'll kill the current task, the command prompt `:dojo`.
|
||||
|
||||
We don't always want to kill the prompting task. We often want
|
||||
to switch between tasks, or between tasks and the command line.
|
||||
Sort of like switching between windows, except in a command line.
|
||||
We do this with `^X`. Try
|
||||
We do this with `^X`.
|
||||
|
||||
~waclux-tomwyc/try=> :begin
|
||||
Let's try an example: First, make sure you
|
||||
have two apps running, like `:dojo` and `:talk`. Then, try:
|
||||
|
||||
Do you have a ship and a ticket? yes
|
||||
~waclux-tomwyc:dojo> :helm?begin
|
||||
|
||||
But hit `^X` instead of `^D`. You'll get a prompt again. Use
|
||||
~waclux-tomwyc:dojo: your ship: ~
|
||||
|
||||
But hit `^X` instead of `^D`. You'll get switched to the next app in line, in this case `:talk`. Use
|
||||
it:
|
||||
|
||||
~waclux-tomwyc/try=> :begin
|
||||
~waclux-tomwyc:dojo> :helm?begin
|
||||
|
||||
~waclux-tomwyc/try=> :hello %world
|
||||
"hello, world."
|
||||
~waclux-tomwyc/try=>
|
||||
~waclux-tomwyc:talk() hello, world!
|
||||
|
||||
Hit `^X` again:
|
||||
|
||||
~waclux-tomwyc/try=> :begin
|
||||
~waclux-tomwyc:dojo> :helm?begin
|
||||
|
||||
~waclux-tomwyc/try=> :hello %world
|
||||
"hello, world."
|
||||
Do you have a ship and a ticket? yes
|
||||
~waclux-tomwyc:dojo: your ship: ~
|
||||
|
||||
And finally, hit `^C` to kill the task.
|
||||
And finally, hit `^D` to kill the task.
|
||||
|
||||
Lastly, Arvo is a single-level store. Since it's not the '70s
|
||||
anymore and disk is cheap, everything you do is saved for ever.
|
||||
@ -337,29 +362,40 @@ anymore and disk is cheap, everything you do is saved for ever.
|
||||
log - so you, or the government if they haz your filez, can
|
||||
repeat every computation you've ever performed.)
|
||||
|
||||
If the current prompt is just the shell prompt, `^D` on an empty
|
||||
If the current prompt is the task manager, `^D` on an empty
|
||||
line will log out - as in Unix:
|
||||
|
||||
~waclux-tomwyc/try=>
|
||||
oxford:~/urbit; pwd
|
||||
/Users/cyarvin/urbit
|
||||
oxford:~/urbit; echo "hello, world"
|
||||
~waclux-tomwyc:dojo, talk#
|
||||
cyarvin:~/urbit; pwd
|
||||
/home/cyarvin/urbit
|
||||
cyarvin:~/urbit; echo "hello, world"
|
||||
hello, world
|
||||
oxford:~/urbit;
|
||||
cyarvin:~/urbit;
|
||||
|
||||
Then you can restart and be right back where you were - just
|
||||
run `bin/vere` without `-c`:
|
||||
|
||||
oxford:~/urbit; bin/vere mypier
|
||||
vere: urbit home is /Users/cyarvin/urb
|
||||
loom: loaded 9MB
|
||||
time: ~2013.9.1..17.23.05..0cc1
|
||||
ames: on localhost, UDP 60342.
|
||||
http: live on 8080
|
||||
rest: checkpoint to event 383
|
||||
rest: old 0v1c.gkr1o, new 0v10.m4gdu
|
||||
cyarvin:~/urbit; bin/vere mypier
|
||||
vere: urbit home is mypier
|
||||
vere: hostname is cyarvin
|
||||
loom: mapped 2048MB
|
||||
protected loom
|
||||
live: loaded: MB/172.933.120
|
||||
boot: installed 190 jets
|
||||
cv_start: time: ~2015.5.9..19.03.45..a758
|
||||
raft: single-instance mode
|
||||
raft: -> lead
|
||||
sist: booting
|
||||
rest: checkpoint to event 23.630
|
||||
rest: old 0vt.3iqg5, new 0v1j.moa0t
|
||||
loaded passcode from mypier/.urb/code.~lacsep-bonnyr
|
||||
|
||||
---------------- playback complete----------------
|
||||
waclux-tomwyc/try=>
|
||||
ames: on localhost, UDP 46404.
|
||||
http: live (insecure) on 8080
|
||||
http: live ("secure") on 8443
|
||||
term: live on 10023
|
||||
~waclux-tomwyc:dojo, talk#
|
||||
|
||||
Use your arrow keys and you'll see your history is still there.
|
||||
Arvo is indestructible and can be shut down however you like
|
||||
@ -370,34 +406,18 @@ But don't try to operate the same ship on two Unix hosts at the
|
||||
same time. This will confuse everyone, including yourself.
|
||||
|
||||
####System administration
|
||||
|
||||
Sometimes we make changes to Hoon or Arvo (we never make changes
|
||||
to Nock) and you need to update your ship.
|
||||
|
||||
There are two steps to updating. You need to get the new files,
|
||||
and you need to install them. To get them:
|
||||
Luckily, Arvo has some special sauce that allows the same carrier
|
||||
you initially pulled your files from to push kernel update over-the-air.
|
||||
You may notice this happening automatically from time to time through mysterious messages
|
||||
such as:
|
||||
|
||||
~waclux-tomwyc/try=> :update
|
||||
: /~waclux-tomwyc/arvo/2/hoon/hoon
|
||||
: /~waclux-tomwyc/arvo/2/dill/hoon
|
||||
: /~waclux-tomwyc/arvo/2/batz/hoon
|
||||
['merge succeeded' {}]
|
||||
|
||||
To install them (the simplest, slowest, most general way):
|
||||
|
||||
~waclux-tomwyc/try=> :reset
|
||||
|
||||
%reset-start
|
||||
%reset-parsed
|
||||
%reset-compiled
|
||||
%hoon-load
|
||||
[%tang /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/zuse ~tirnux-latwex]
|
||||
[%vane %a /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/ames ~tolryn-watret]
|
||||
[%vane %b /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/batz ~donfex-ladsem]
|
||||
[%vane %c /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/clay ~picsug-mitref]
|
||||
[%vane %d /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/dill ~dilpex-laptug]
|
||||
[%vane %e /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/eyre ~forbur-disben]
|
||||
|
||||
All of your state, including running tasks, will be unchanged.
|
||||
These updates will be applied without having to restart Arvo or any of its
|
||||
`%vanes`. All of your state, including running tasks, will be unchanged.
|
||||
|
||||
Sometimes the interpreter, called `vere` gets updated. In your urbit directory, back in Unixland, run:
|
||||
|
||||
@ -407,20 +427,22 @@ every so often to get the latest Urbit source code. You'll need to run:
|
||||
|
||||
make clean; make
|
||||
|
||||
before executing `bin/vere pier` again.
|
||||
before executing `bin/vere mypier` again.
|
||||
|
||||
|
||||
###6. Chat
|
||||
###6. Talk
|
||||
|
||||
Okay, fine. You're a long way from being an Arvo ninja. But -
|
||||
you're ready for the two most important uses of Urbit right now.
|
||||
One, coding. Two, chatting.
|
||||
|
||||
To start chatting, simply type
|
||||
To start chatting, simply press `^X` to switch to the `:talk` app
|
||||
(If you accidently killed it, no worries: start a new one by typing
|
||||
`+talk` from the `^V` menu)
|
||||
|
||||
~waclux-tomwyc/try=> :chat
|
||||
~waclux-tomwyc:talk()
|
||||
|
||||
and type `?` for the list of commands once `:chat` is running.
|
||||
and type `;join /urbit-meta` to join our main chat room.
|
||||
|
||||
Most of us are hanging out on `:chat` regularly. We can answer any questions you might have and help you get oriented in this new environment.
|
||||
Most of us are hanging out on `:talk` regularly. We can answer any questions you might have and help you get oriented in this new environment.
|
||||
|
||||
|
@ -1121,6 +1121,7 @@
|
||||
# define c3__veer c3_s4('v','e','e','r')
|
||||
# define c3__vega c3_s4('v','e','g','a')
|
||||
# define c3__velt c3_s4('v','e','l','t')
|
||||
# define c3__verb c3_s4('v','e','r','b')
|
||||
# define c3__vern c3_s4('v','e','r','n')
|
||||
# define c3__very c3_s4('v','e','r','y')
|
||||
# define c3__view c3_s4('v','i','e','w')
|
||||
|
18
i/n/a.h
18
i/n/a.h
@ -8,6 +8,12 @@
|
||||
*/
|
||||
# undef U3_MEMORY_DEBUG
|
||||
|
||||
/* U3_CELLOC_TOGGLE: enable toggling of the custum cell allocator
|
||||
* via -g. This slightly slows down the cell allocator even when
|
||||
* it's on. Note that toggling -g breaks the image. If
|
||||
* U3_MEMORY_DEBUG is on, this should generally be on as well.
|
||||
*/
|
||||
# undef U3_CELLOC_TOGGLE
|
||||
|
||||
/** Constants.
|
||||
**/
|
||||
@ -46,7 +52,7 @@
|
||||
|
||||
/** Structures.
|
||||
**/
|
||||
/* u3_atom, u3_cell: logical atom and cell structures.
|
||||
/* u3a_atom, u3a_cell: logical atom and cell structures.
|
||||
*/
|
||||
typedef struct {
|
||||
c3_w mug_w;
|
||||
@ -98,11 +104,9 @@
|
||||
/* u3a_road: contiguous allocation and execution context.
|
||||
*/
|
||||
typedef struct _u3a_road {
|
||||
struct _u3a_road* par_u; // parent road
|
||||
|
||||
struct _u3a_road* kid_u; // child road list
|
||||
struct _u3a_road* nex_u; // sibling road
|
||||
struct _u3a_road* now_u; // current road pointer
|
||||
u3p(struct _u3a_road) par_p; // parent road
|
||||
u3p(struct _u3a_road) kid_p; // child road list
|
||||
u3p(struct _u3a_road) nex_p; // sibling road
|
||||
|
||||
u3p(c3_w) cap_p; // top of transient region
|
||||
u3p(c3_w) hat_p; // top of durable region
|
||||
@ -378,7 +382,7 @@
|
||||
|
||||
/* u3a_sweep(): sweep a fully marked road.
|
||||
*/
|
||||
void
|
||||
c3_w
|
||||
u3a_sweep(void);
|
||||
|
||||
/* u3a_sane(): check allocator sanity.
|
||||
|
2
i/n/h.h
2
i/n/h.h
@ -118,7 +118,7 @@
|
||||
|
||||
/* u3h_mark(): mark hashtable for gc.
|
||||
*/
|
||||
void
|
||||
c3_w
|
||||
u3h_mark(u3p(u3h_root) har_p);
|
||||
|
||||
/* u3h_walk(): traverse hashtable with key, value fn; RETAINS.
|
||||
|
5
i/n/m.h
5
i/n/m.h
@ -81,6 +81,11 @@
|
||||
u3_noun
|
||||
u3m_soft_esc(u3_noun sam);
|
||||
|
||||
/* u3m_mark(): mark all nouns in the road.
|
||||
*/
|
||||
c3_w
|
||||
u3m_mark(void);
|
||||
|
||||
/* u3m_grab(): garbage-collect the world, plus extra roots.
|
||||
*/
|
||||
void
|
||||
|
1
i/n/u.h
1
i/n/u.h
@ -104,5 +104,6 @@
|
||||
/* u3to(), u3of(): offset/pointer conversion.
|
||||
*/
|
||||
# define u3to(type, x) ((type *) u3a_into(x))
|
||||
# define u3tn(type, x) (x == 0) ? (void *)0 : ((type *) u3a_into(x))
|
||||
# define u3of(type, x) (u3a_outa((type *)x))
|
||||
|
||||
|
4
i/n/v.h
4
i/n/v.h
@ -27,6 +27,8 @@
|
||||
u3_noun sen; // instance string
|
||||
u3_noun own; // owner list
|
||||
|
||||
u3_noun sac; // space profiling
|
||||
|
||||
u3_noun roe; // temporary unsaved events
|
||||
u3_noun key; // log key, or 0
|
||||
|
||||
@ -169,5 +171,5 @@
|
||||
|
||||
/* u3v_mark(): mark arvo kernel.
|
||||
*/
|
||||
void
|
||||
c3_w
|
||||
u3v_mark(void);
|
||||
|
14
i/v/vere.h
14
i/v/vere.h
@ -521,6 +521,8 @@
|
||||
c3_c* imp_c; // -I, czar name
|
||||
c3_c* nam_c; // -n, unix hostname
|
||||
c3_c* raf_c; // -r, raft flotilla
|
||||
c3_c* who_c; // -T, begin with ticket
|
||||
c3_c* tic_c; // -T, ticket value
|
||||
c3_w kno_w; // -k, kernel version
|
||||
c3_w fuz_w; // -f, fuzz testing
|
||||
c3_s por_s; // -p, ames port
|
||||
@ -536,7 +538,7 @@
|
||||
c3_o pro; // -P, profile
|
||||
c3_o veb; // -v, verbose (inverse of -q)
|
||||
c3_o nuu; // -c, new pier
|
||||
c3_o vno; // -V
|
||||
c3_o vno; // -V, turn on +verb
|
||||
c3_o mem; // -M, memory madness
|
||||
} u3_opts;
|
||||
|
||||
@ -791,6 +793,16 @@
|
||||
void
|
||||
u3_term_ef_boil();
|
||||
|
||||
/* u3_term_ef_ticket(): initial effects for new ticket.
|
||||
*/
|
||||
void
|
||||
u3_term_ef_ticket(c3_c* who_c, c3_c* tic_c);
|
||||
|
||||
/* u3_term_ef_verb(): initial effects for verbose events.
|
||||
*/
|
||||
void
|
||||
u3_term_ef_verb(void);
|
||||
|
||||
/* u3_term_ef_winc(): window change.
|
||||
*/
|
||||
void
|
||||
|
82
n/a.c
82
n/a.c
@ -561,9 +561,12 @@ u3a_malloc(size_t len_i)
|
||||
c3_w*
|
||||
u3a_celloc(void)
|
||||
{
|
||||
#ifdef U3_MEMORY_DEBUG
|
||||
return u3a_walloc(c3_wiseof(u3a_cell));
|
||||
#else
|
||||
#ifdef U3_CELLOC_TOGGLE
|
||||
if ( u3C.wag_w & u3o_debug_ram ) {
|
||||
return u3a_walloc(c3_wiseof(u3a_cell));
|
||||
}
|
||||
#endif
|
||||
|
||||
u3p(u3a_fbox) cel_p;
|
||||
|
||||
if ( (u3R == &(u3H->rod_u)) || !(cel_p = u3R->all.cel_p) ) {
|
||||
@ -577,7 +580,6 @@ u3a_celloc(void)
|
||||
|
||||
return u3a_boxto(box_u);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* u3a_cfree(): free a cell.
|
||||
@ -585,9 +587,12 @@ u3a_celloc(void)
|
||||
void
|
||||
u3a_cfree(c3_w* cel_w)
|
||||
{
|
||||
#ifdef U3_MEMORY_DEBUG
|
||||
return u3a_wfree(cel_w);
|
||||
#else
|
||||
#ifdef U3_CELLOC_TOGGLE
|
||||
if ( u3C.wag_w & u3o_debug_ram ) {
|
||||
return u3a_wfree(cel_w);
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( u3R == &(u3H->rod_u) ) {
|
||||
return u3a_wfree(cel_w);
|
||||
}
|
||||
@ -598,7 +603,6 @@ u3a_cfree(c3_w* cel_w)
|
||||
u3to(u3a_fbox, fre_p)->nex_p = u3R->all.cel_p;
|
||||
u3R->all.cel_p = fre_p;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* u3a_realloc(): aligned realloc in bytes.
|
||||
@ -963,11 +967,11 @@ _me_copy_south(u3_noun dog)
|
||||
u3a_cell* new_u = (u3a_cell*)(void *)new_w;
|
||||
|
||||
// printf("south: cell %p to %p\r\n", old_u, new_u);
|
||||
|
||||
#if 0
|
||||
if ( old_u->mug_w == 0x730e66cc ) {
|
||||
fprintf(stderr, "BAD: take %p\r\n", new_u);
|
||||
}
|
||||
|
||||
#endif
|
||||
new_u->mug_w = old_u->mug_w;
|
||||
// new_u->mug_w = 0;
|
||||
new_u->hed = _me_copy_south_in(old_u->hed);
|
||||
@ -1310,9 +1314,13 @@ u3a_mark_ptr(void* ptr_v)
|
||||
c3_w siz_w;
|
||||
|
||||
#ifdef U3_MEMORY_DEBUG
|
||||
if ( box_u->eus_w == 0 ) {
|
||||
if ( 0 == box_u->eus_w ) {
|
||||
siz_w = box_u->siz_w;
|
||||
}
|
||||
}
|
||||
else if ( 0xffffffff == box_u->eus_w ) { // see _raft_prof()
|
||||
siz_w = 0xffffffff;
|
||||
box_u->eus_w = 0;
|
||||
}
|
||||
else {
|
||||
siz_w = 0;
|
||||
}
|
||||
@ -1327,7 +1335,11 @@ u3a_mark_ptr(void* ptr_v)
|
||||
else {
|
||||
c3_assert(use_ws != 0);
|
||||
|
||||
if ( use_ws < 0 ) {
|
||||
if ( 0x80000000 == (c3_w)use_ws ) { // see _raft_prof()
|
||||
use_ws = -1;
|
||||
siz_w = 0xffffffff;
|
||||
}
|
||||
else if ( use_ws < 0 ) {
|
||||
use_ws -= 1;
|
||||
siz_w = 0;
|
||||
}
|
||||
@ -1370,7 +1382,7 @@ u3a_mark_noun(u3_noun som)
|
||||
c3_w* dog_w = u3a_to_ptr(som);
|
||||
c3_w new_w = u3a_mark_ptr(dog_w);
|
||||
|
||||
if ( 0 == new_w ) {
|
||||
if ( 0 == new_w || 0xffffffff == new_w ) { // see u3a_mark_ptr()
|
||||
return siz_w;
|
||||
}
|
||||
else {
|
||||
@ -1415,7 +1427,7 @@ u3a_print_memory(c3_c* cap_c, c3_w wor_w)
|
||||
|
||||
/* u3a_sweep(): sweep a fully marked road.
|
||||
*/
|
||||
void
|
||||
c3_w
|
||||
u3a_sweep(void)
|
||||
{
|
||||
c3_w neg_w, pos_w, leq_w, weq_w;
|
||||
@ -1460,6 +1472,17 @@ u3a_sweep(void)
|
||||
u3a_box* box_u = (void *)box_w;
|
||||
|
||||
#ifdef U3_MEMORY_DEBUG
|
||||
/* I suspect these printfs fail hilariously in the case
|
||||
* of non-direct atoms. We shouldn't unconditionally run
|
||||
* u3a_to_pom(). In general, the condition
|
||||
* box_u->siz_w > u3a_mimimum is sufficient, but not necessary,
|
||||
* for the box to represent an atom. The atoms between
|
||||
* 2^31 and 2^32 are the exceptions.
|
||||
*
|
||||
* Update: so, apparently u3.md is incorrect, and a pug is just
|
||||
* an indirect atom. This code should be altered to handle
|
||||
* that.
|
||||
*/
|
||||
if ( box_u->use_w != box_u->eus_w ) {
|
||||
if ( box_u->eus_w != 0 ) {
|
||||
if ( box_u->use_w == 0 ) {
|
||||
@ -1471,7 +1494,8 @@ u3a_sweep(void)
|
||||
(u3_noun)u3a_to_pom(u3a_outa(u3a_boxto(box_w))),
|
||||
((u3a_noun *)(u3a_boxto(box_w)))->mug_w,
|
||||
box_u->use_w, box_u->eus_w);
|
||||
u3m_p("weak", u3a_to_pom(u3a_outa(u3a_boxto(box_w))));
|
||||
u3a_print_memory("weak (minimum)", box_u->siz_w);
|
||||
// u3m_p("weak", u3a_to_pom(u3a_outa(u3a_boxto(box_w))));
|
||||
}
|
||||
weq_w += box_u->siz_w;
|
||||
}
|
||||
@ -1483,7 +1507,8 @@ u3a_sweep(void)
|
||||
? ((u3a_noun *)(u3a_boxto(box_w)))->mug_w
|
||||
: u3r_mug(u3a_to_pom(u3a_outa(u3a_boxto(box_w)))),
|
||||
box_u->use_w);
|
||||
u3m_p("leak", u3a_to_pom(u3a_outa(u3a_boxto(box_w))));
|
||||
u3a_print_memory("leak (minimum)", box_u->siz_w);
|
||||
// u3m_p("leak", u3a_to_pom(u3a_outa(u3a_boxto(box_w))));
|
||||
leq_w += box_u->siz_w;
|
||||
}
|
||||
if ( box_u->cod_w ) {
|
||||
@ -1501,7 +1526,26 @@ u3a_sweep(void)
|
||||
c3_ws use_ws = (c3_ws)box_u->use_w;
|
||||
|
||||
if ( use_ws > 0 ) {
|
||||
printf("leak %p\r\n", box_u);
|
||||
printf("leak %p %x\r\n",
|
||||
box_u,
|
||||
((u3a_noun *)(u3a_boxto(box_w)))->mug_w
|
||||
? ((u3a_noun *)(u3a_boxto(box_w)))->mug_w
|
||||
: u3r_mug(u3a_to_pom(u3a_outa(u3a_boxto(box_w)))));
|
||||
u3a_print_memory("leak (minimum)", box_u->siz_w);
|
||||
|
||||
#if 1
|
||||
/* For those times when you've really just got to crack open
|
||||
* the box and see what's inside
|
||||
*/
|
||||
{
|
||||
int i;
|
||||
for ( i = 0; i < box_u->siz_w; i++ ) {
|
||||
printf("%08x ", (unsigned int)(((c3_w*)box_u)[i]));
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
leq_w += box_u->siz_w;
|
||||
box_u->use_w = 0;
|
||||
|
||||
@ -1534,6 +1578,8 @@ u3a_sweep(void)
|
||||
c3_assert((pos_w + leq_w + weq_w) == neg_w);
|
||||
|
||||
if ( 0 != leq_w || (0 != weq_w) ) { c3_assert(0); }
|
||||
|
||||
return neg_w;
|
||||
}
|
||||
|
||||
/* u3a_slab(): create a length-bounded proto-atom.
|
||||
|
37
n/h.c
37
n/h.c
@ -631,22 +631,26 @@ u3h_walk(u3p(u3h_root) har_p, void (*fun_f)(u3_noun))
|
||||
|
||||
/* _ch_mark_buck(): mark bucket for gc.
|
||||
*/
|
||||
static void
|
||||
c3_w
|
||||
_ch_mark_buck(u3h_buck* hab_u)
|
||||
{
|
||||
c3_w i_w;
|
||||
c3_w tot_w = 0;
|
||||
c3_w i_w;
|
||||
|
||||
for ( i_w = 0; i_w < hab_u->len_w; i_w++ ) {
|
||||
u3a_mark_noun(hab_u->kev[i_w]);
|
||||
tot_w += u3a_mark_noun(hab_u->kev[i_w]);
|
||||
}
|
||||
u3a_mark_ptr(hab_u);
|
||||
tot_w += u3a_mark_ptr(hab_u);
|
||||
|
||||
return tot_w;
|
||||
}
|
||||
|
||||
/* _ch_mark_node(): mark node for gc.
|
||||
*/
|
||||
static void
|
||||
c3_w
|
||||
_ch_mark_node(u3h_node* han_u, c3_w lef_w)
|
||||
{
|
||||
c3_w tot_w = 0;
|
||||
c3_w len_w = _ch_popcount(han_u->map_w);
|
||||
c3_w i_w;
|
||||
|
||||
@ -658,26 +662,30 @@ _ch_mark_node(u3h_node* han_u, c3_w lef_w)
|
||||
if ( _(u3h_slot_is_noun(sot_w)) ) {
|
||||
u3_noun kev = u3h_slot_to_noun(sot_w);
|
||||
|
||||
u3a_mark_noun(kev);
|
||||
tot_w += u3a_mark_noun(kev);
|
||||
}
|
||||
else {
|
||||
void* hav_v = u3h_slot_to_node(sot_w);
|
||||
|
||||
if ( 0 == lef_w ) {
|
||||
_ch_mark_buck(hav_v);
|
||||
tot_w += _ch_mark_buck(hav_v);
|
||||
} else {
|
||||
_ch_mark_node(hav_v, lef_w);
|
||||
tot_w += _ch_mark_node(hav_v, lef_w);
|
||||
}
|
||||
}
|
||||
}
|
||||
u3a_mark_ptr(han_u);
|
||||
|
||||
tot_w += u3a_mark_ptr(han_u);
|
||||
|
||||
return tot_w;
|
||||
}
|
||||
|
||||
/* u3h_mark(): mark hashtable for gc.
|
||||
*/
|
||||
void
|
||||
c3_w
|
||||
u3h_mark(u3p(u3h_root) har_p)
|
||||
{
|
||||
c3_w tot_w = 0;
|
||||
u3h_root* har_u = u3to(u3h_root, har_p);
|
||||
c3_w i_w;
|
||||
|
||||
@ -687,13 +695,16 @@ u3h_mark(u3p(u3h_root) har_p)
|
||||
if ( _(u3h_slot_is_noun(sot_w)) ) {
|
||||
u3_noun kev = u3h_slot_to_noun(sot_w);
|
||||
|
||||
u3a_mark_noun(kev);
|
||||
tot_w += u3a_mark_noun(kev);
|
||||
}
|
||||
else if ( _(u3h_slot_is_node(sot_w)) ) {
|
||||
u3h_node* han_u = u3h_slot_to_node(sot_w);
|
||||
|
||||
_ch_mark_node(han_u, 25);
|
||||
tot_w += _ch_mark_node(han_u, 25);
|
||||
}
|
||||
}
|
||||
u3a_mark_ptr(har_u);
|
||||
|
||||
tot_w += u3a_mark_ptr(har_u);
|
||||
|
||||
return tot_w;
|
||||
}
|
||||
|
4
n/j.c
4
n/j.c
@ -209,8 +209,8 @@ u3j_find(u3_noun bat)
|
||||
return jaw;
|
||||
}
|
||||
|
||||
if ( rod_u->par_u ) {
|
||||
rod_u = rod_u->par_u;
|
||||
if ( rod_u->par_p ) {
|
||||
rod_u = u3to(u3_road, rod_u->par_p);
|
||||
}
|
||||
else return u3_none;
|
||||
}
|
||||
|
61
n/m.c
61
n/m.c
@ -30,11 +30,6 @@
|
||||
void
|
||||
u3m_dump(void);
|
||||
|
||||
/* u3m_mark(): mark all nouns in the road.
|
||||
*/
|
||||
void
|
||||
u3m_mark(void);
|
||||
|
||||
/* u3m_fall(): return to parent road.
|
||||
*/
|
||||
void
|
||||
@ -149,7 +144,7 @@ _cm_signal_handle_term(int x)
|
||||
{
|
||||
// Ignore if we are using base memory from work memory, very rare.
|
||||
//
|
||||
if ( (0 != u3H->rod_u.kid_u) && (&(u3H->rod_u) == u3R) ) {
|
||||
if ( (0 != u3H->rod_u.kid_p) && (&(u3H->rod_u) == u3R) ) {
|
||||
_cm_emergency("ignored", c3__term);
|
||||
}
|
||||
else {
|
||||
@ -184,7 +179,7 @@ _cm_signal_reset(void)
|
||||
u3R = &u3H->rod_u;
|
||||
u3R->cap_p = u3R->mat_p;
|
||||
u3R->ear_p = 0;
|
||||
u3R->kid_u = 0;
|
||||
u3R->kid_p = 0;
|
||||
}
|
||||
|
||||
/* _cm_stack_recover(): recover stack trace, with lacunae.
|
||||
@ -276,13 +271,13 @@ _cm_signal_recover(c3_l sig_l, u3_noun arg)
|
||||
u3R = &(u3H->rod_u);
|
||||
rod_u = u3R;
|
||||
|
||||
while ( rod_u->kid_u ) {
|
||||
while ( rod_u->kid_p ) {
|
||||
#if 0
|
||||
fprintf(stderr, "collecting %d frames\r\n",
|
||||
u3kb_lent(rod_u->kid_u->bug.tax));
|
||||
u3kb_lent((u3to(u3_road, rod_u->kid_p)->bug.tax));
|
||||
#endif
|
||||
tax = u3kb_weld(_cm_stack_recover(rod_u->kid_u), tax);
|
||||
rod_u = rod_u->kid_u;
|
||||
tax = u3kb_weld(_cm_stack_recover(u3to(u3_road, rod_u->kid_p)), tax);
|
||||
rod_u = u3to(u3_road, rod_u->kid_p);
|
||||
}
|
||||
}
|
||||
|
||||
@ -462,17 +457,19 @@ _pave_parts(void)
|
||||
|
||||
/* u3m_mark(): mark all nouns in the road.
|
||||
*/
|
||||
void
|
||||
c3_w
|
||||
u3m_mark(void)
|
||||
{
|
||||
u3h_mark(u3R->jed.har_p);
|
||||
u3a_mark_noun(u3R->jed.das);
|
||||
u3a_mark_noun(u3R->ski.flu);
|
||||
u3a_mark_noun(u3R->bug.tax);
|
||||
u3a_mark_noun(u3R->bug.mer);
|
||||
u3a_mark_noun(u3R->pro.don);
|
||||
u3a_mark_noun(u3R->pro.day);
|
||||
u3h_mark(u3R->cax.har_p);
|
||||
c3_w tot_w = 0;
|
||||
tot_w += u3h_mark(u3R->jed.har_p);
|
||||
tot_w += u3a_mark_noun(u3R->jed.das);
|
||||
tot_w += u3a_mark_noun(u3R->ski.flu);
|
||||
tot_w += u3a_mark_noun(u3R->bug.tax);
|
||||
tot_w += u3a_mark_noun(u3R->bug.mer);
|
||||
tot_w += u3a_mark_noun(u3R->pro.don);
|
||||
tot_w += u3a_mark_noun(u3R->pro.day);
|
||||
tot_w += u3h_mark(u3R->cax.har_p);
|
||||
return tot_w;
|
||||
}
|
||||
|
||||
/* _cm_pave(): instantiate or activate image.
|
||||
@ -712,9 +709,9 @@ u3m_leap(c3_w pad_w)
|
||||
/* Attach the new road to its parents.
|
||||
*/
|
||||
{
|
||||
c3_assert(0 == u3R->kid_u);
|
||||
rod_u->par_u = u3R;
|
||||
u3R->kid_u = rod_u;
|
||||
c3_assert(0 == u3R->kid_p);
|
||||
rod_u->par_p = u3of(u3_road, u3R);
|
||||
u3R->kid_p = u3of(u3_road, rod_u);
|
||||
}
|
||||
|
||||
/* Set up the new road.
|
||||
@ -730,26 +727,26 @@ u3m_leap(c3_w pad_w)
|
||||
void
|
||||
u3m_fall()
|
||||
{
|
||||
c3_assert(0 != u3R->par_u);
|
||||
c3_assert(0 != u3R->par_p);
|
||||
|
||||
#if 0
|
||||
fprintf(stderr, "fall: from %s %p, to %s %p (cap %p, was %p)\r\n",
|
||||
_(u3a_is_north(u3R)) ? "north" : "south",
|
||||
u3R,
|
||||
_(u3a_is_north(u3R)) ? "north" : "south",
|
||||
u3R->par_u,
|
||||
u3to(u3_road, u3R->par_p),
|
||||
u3R->hat_w,
|
||||
u3R->rut_w);
|
||||
#endif
|
||||
|
||||
/* The new cap is the old hat - it's as simple as that.
|
||||
*/
|
||||
u3R->par_u->cap_p = u3R->hat_p;
|
||||
u3to(u3_road, u3R->par_p)->cap_p = u3R->hat_p;
|
||||
|
||||
/* And, we're back home.
|
||||
*/
|
||||
u3R = u3R->par_u;
|
||||
u3R->kid_u = 0;
|
||||
u3R = u3to(u3_road, u3R->par_p);
|
||||
u3R->kid_p = 0;
|
||||
}
|
||||
|
||||
/* u3m_hate(): new, integrated leap mechanism (enter).
|
||||
@ -951,8 +948,8 @@ u3m_soft_run(u3_noun fly,
|
||||
/* Configure the new road.
|
||||
*/
|
||||
{
|
||||
u3R->ski.flu = u3nc(fly, u3R->par_u->ski.flu);
|
||||
u3R->pro.don = u3R->par_u->pro.don;
|
||||
u3R->ski.flu = u3nc(fly, u3to(u3_road, u3R->par_p)->ski.flu);
|
||||
u3R->pro.don = u3to(u3_road, u3R->par_p)->pro.don;
|
||||
u3R->bug.tax = 0;
|
||||
}
|
||||
u3t_on(coy_o);
|
||||
@ -1039,8 +1036,8 @@ u3m_soft_esc(u3_noun sam)
|
||||
/* Configure the new road.
|
||||
*/
|
||||
{
|
||||
u3R->ski.flu = u3t(u3R->par_u->ski.flu);
|
||||
u3R->pro.don = u3R->par_u->pro.don;
|
||||
u3R->ski.flu = u3t(u3to(u3_road, u3R->par_p)->ski.flu);
|
||||
u3R->pro.don = u3to(u3_road, u3R->par_p)->pro.don;
|
||||
u3R->bug.tax = 0;
|
||||
}
|
||||
|
||||
|
5
n/n.c
5
n/n.c
@ -86,7 +86,10 @@ _n_hint(u3_noun zep,
|
||||
}
|
||||
pro = _n_nock_on(u3k(bus), u3k(nex));
|
||||
|
||||
u3z_save_2(c3__nock, bus, nex, pro);
|
||||
if ( u3R != &(u3H->rod_u) ) {
|
||||
u3z_save_2(c3__nock, bus, nex, pro);
|
||||
}
|
||||
|
||||
u3z(bus); u3z(nex);
|
||||
|
||||
return pro;
|
||||
|
6
n/t.c
6
n/t.c
@ -113,8 +113,8 @@ _t_jet_label(u3a_road* rod_u, u3_noun bat)
|
||||
return u3h(u3t(u3t(u3h(cax))));
|
||||
}
|
||||
|
||||
if ( rod_u->par_u ) {
|
||||
rod_u = rod_u->par_u;
|
||||
if ( rod_u->par_p ) {
|
||||
rod_u = u3to(u3_road, rod_u->par_p);
|
||||
}
|
||||
else return u3_none;
|
||||
}
|
||||
@ -175,7 +175,7 @@ _t_samp_process(u3_road* rod_u)
|
||||
}
|
||||
don = u3t(don);
|
||||
}
|
||||
rod_u = rod_u->par_u;
|
||||
rod_u = u3tn(u3_road, rod_u->par_p);
|
||||
}
|
||||
u3z(muf);
|
||||
|
||||
|
37
n/v.c
37
n/v.c
@ -79,6 +79,7 @@ u3v_start(u3_noun now)
|
||||
{
|
||||
u3v_time(now);
|
||||
u3v_numb();
|
||||
u3A->sac = u3_nul;
|
||||
|
||||
{
|
||||
c3_c* wen_c = u3r_string(u3A->wen);
|
||||
@ -490,37 +491,45 @@ u3v_louse(c3_m how_m)
|
||||
|
||||
/* _cv_mark_ova(): mark ova queue.
|
||||
*/
|
||||
static void
|
||||
c3_w
|
||||
_cv_mark_ova(u3p(u3v_cart) egg_p)
|
||||
{
|
||||
c3_w tot_w = 0;
|
||||
|
||||
while ( egg_p ) {
|
||||
u3v_cart* egg_u = u3to(u3v_cart, egg_p);
|
||||
|
||||
u3a_mark_mptr(egg_u);
|
||||
u3a_mark_noun(egg_u->vir);
|
||||
tot_w += u3a_mark_mptr(egg_u);
|
||||
tot_w += u3a_mark_noun(egg_u->vir);
|
||||
|
||||
egg_p = egg_u->nex_p;
|
||||
}
|
||||
|
||||
return tot_w;
|
||||
}
|
||||
|
||||
/* u3v_mark(): mark arvo kernel.
|
||||
*/
|
||||
void
|
||||
c3_w
|
||||
u3v_mark(void)
|
||||
{
|
||||
c3_w tot_w = 0;
|
||||
|
||||
u3v_arvo* arv_u = &(u3H->arv_u);
|
||||
|
||||
u3a_mark_noun(arv_u->yot);
|
||||
u3a_mark_noun(arv_u->now);
|
||||
u3a_mark_noun(arv_u->wen);
|
||||
u3a_mark_noun(arv_u->sen);
|
||||
u3a_mark_noun(arv_u->own);
|
||||
tot_w += u3a_mark_noun(arv_u->yot);
|
||||
tot_w += u3a_mark_noun(arv_u->now);
|
||||
tot_w += u3a_mark_noun(arv_u->wen);
|
||||
tot_w += u3a_mark_noun(arv_u->sen);
|
||||
tot_w += u3a_mark_noun(arv_u->own);
|
||||
|
||||
u3a_mark_noun(arv_u->roe);
|
||||
u3a_mark_noun(arv_u->key);
|
||||
tot_w += u3a_mark_noun(arv_u->roe);
|
||||
tot_w += u3a_mark_noun(arv_u->key);
|
||||
|
||||
u3a_mark_noun(arv_u->ken);
|
||||
u3a_mark_noun(arv_u->roc);
|
||||
tot_w += u3a_mark_noun(arv_u->ken);
|
||||
tot_w += u3a_mark_noun(arv_u->roc);
|
||||
|
||||
_cv_mark_ova(arv_u->ova.egg_p);
|
||||
tot_w += _cv_mark_ova(arv_u->ova.egg_p);
|
||||
|
||||
return tot_w;
|
||||
}
|
||||
|
8
v/ames.c
8
v/ames.c
@ -65,13 +65,9 @@ _ames_czar(c3_y imp_y, c3_s* por_s)
|
||||
c3_c* nam_c = u3r_string(nam);
|
||||
c3_c dns_c[64];
|
||||
|
||||
if ( 0 == imp_y ) {
|
||||
strcpy(dns_c,"104.236.149.223");
|
||||
}
|
||||
else {
|
||||
snprintf(dns_c, 64, "%s.urbit.org", nam_c + 1);
|
||||
}
|
||||
snprintf(dns_c, 64, "%s.urbit.org", nam_c + 1);
|
||||
// uL(fprintf(uH, "czar %s, dns %s\n", nam_c, dns_c));
|
||||
|
||||
free(nam_c);
|
||||
u3z(nam);
|
||||
|
||||
|
7
v/loop.c
7
v/loop.c
@ -691,9 +691,16 @@ u3_lo_lead(void)
|
||||
#endif
|
||||
|
||||
if ( c3y == u3_Host.ops_u.nuu ) {
|
||||
if ( u3_Host.ops_u.who_c ) {
|
||||
u3_term_ef_ticket(u3_Host.ops_u.who_c, u3_Host.ops_u.tic_c);
|
||||
}
|
||||
u3_term_ef_boil(1);
|
||||
}
|
||||
|
||||
if ( c3y == u3_Host.ops_u.veb ) {
|
||||
u3_term_ef_verb();
|
||||
}
|
||||
|
||||
#if 1
|
||||
_lo_slow();
|
||||
#endif
|
||||
|
26
v/main.c
26
v/main.c
@ -40,6 +40,22 @@ _main_readw(const c3_c* str_c, c3_w max_w, c3_w* out_w)
|
||||
|
||||
static c3_c hostbuf[2048]; // kill me
|
||||
|
||||
/* _main_presig(): prefix optional sig.
|
||||
*/
|
||||
c3_c*
|
||||
_main_presig(c3_c* txt_c)
|
||||
{
|
||||
c3_c* new_c = malloc(2 + strlen(txt_c));
|
||||
|
||||
if ( '~' == *txt_c ) {
|
||||
strcpy(new_c, txt_c);
|
||||
} else {
|
||||
new_c[0] = '~';
|
||||
strcpy(new_c + 1, txt_c);
|
||||
}
|
||||
return new_c;
|
||||
}
|
||||
|
||||
/* _main_getopt(): extract option map from command line.
|
||||
*/
|
||||
static u3_noun
|
||||
@ -57,12 +73,12 @@ _main_getopt(c3_i argc, c3_c** argv)
|
||||
u3_Host.ops_u.fak = c3n;
|
||||
u3_Host.ops_u.pro = c3n;
|
||||
u3_Host.ops_u.dry = c3n;
|
||||
u3_Host.ops_u.veb = c3y;
|
||||
u3_Host.ops_u.veb = c3n;
|
||||
u3_Host.ops_u.nuu = c3n;
|
||||
u3_Host.ops_u.mem = c3n;
|
||||
u3_Host.ops_u.kno_w = DefaultKernel;
|
||||
|
||||
while ( (ch_i = getopt(argc, argv, "I:X:f:k:l:n:p:r:LabcdgqvFMPD")) != -1 ) {
|
||||
while ( (ch_i = getopt(argc, argv, "I:T:X:f:k:l:n:p:r:LabcdgqvFMPD")) != -1 ) {
|
||||
switch ( ch_i ) {
|
||||
case 'M': {
|
||||
u3_Host.ops_u.mem = c3y;
|
||||
@ -72,6 +88,11 @@ _main_getopt(c3_i argc, c3_c** argv)
|
||||
u3_Host.ops_u.imp_c = strdup(optarg);
|
||||
break;
|
||||
}
|
||||
case 'T': {
|
||||
u3_Host.ops_u.who_c = _main_presig(optarg);
|
||||
u3_Host.ops_u.tic_c = _main_presig(getpass("your ticket: ~"));
|
||||
break;
|
||||
}
|
||||
case 'X': {
|
||||
if ( 0 != strcmp("wtf", optarg) ) {
|
||||
return c3n;
|
||||
@ -363,6 +384,7 @@ main(c3_i argc,
|
||||
}
|
||||
|
||||
// u3e_grab("main", u3_none);
|
||||
//
|
||||
u3_lo_loop();
|
||||
|
||||
return 0;
|
||||
|
240
v/raft.c
240
v/raft.c
@ -1691,6 +1691,244 @@ _raft_kick_all(u3_noun vir)
|
||||
}
|
||||
}
|
||||
|
||||
/* _raft_spac(): print n spaces.
|
||||
*/
|
||||
void _raft_spac(c3_w n)
|
||||
{
|
||||
for (; n > 0; n--)
|
||||
(fprintf(stderr," "));
|
||||
}
|
||||
|
||||
/* _raft_print_memory: print memory amount. cf u3a_print_memory().
|
||||
*/
|
||||
void
|
||||
_raft_print_memory(c3_w wor_w)
|
||||
{
|
||||
c3_w byt_w = (wor_w * 4);
|
||||
c3_w gib_w = (byt_w / 1000000000);
|
||||
c3_w mib_w = (byt_w % 1000000000) / 1000000;
|
||||
c3_w kib_w = (byt_w % 1000000) / 1000;
|
||||
c3_w bib_w = (byt_w % 1000);
|
||||
|
||||
if ( gib_w ) {
|
||||
(fprintf(stderr, "GB/%d.%03d.%03d.%03d\r\n",
|
||||
gib_w, mib_w, kib_w, bib_w));
|
||||
}
|
||||
else if ( mib_w ) {
|
||||
(fprintf(stderr, "MB/%d.%03d.%03d\r\n", mib_w, kib_w, bib_w));
|
||||
}
|
||||
else if ( kib_w ) {
|
||||
(fprintf(stderr, "KB/%d.%03d\r\n", kib_w, bib_w));
|
||||
}
|
||||
else {
|
||||
(fprintf(stderr, "B/%d\r\n", bib_w));
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* _raft_prof_noun(): get memory usage, in words, of noun. RETAIN.
|
||||
*/
|
||||
c3_w
|
||||
_raft_prof_noun(u3p(u3h_root) hax, u3_noun non, c3_t dud)
|
||||
{
|
||||
return 0;
|
||||
/*
|
||||
u3_weak got = u3h_git(hax, dud ? non & 0x7fffffff : non);
|
||||
|
||||
if (u3_none != got) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
c3_w res;
|
||||
|
||||
if (!(non & 0x80000000)) {
|
||||
res = 1;
|
||||
}
|
||||
if (_(u3ud(non))) {
|
||||
res = 3 + 3 + u3r_met(5, non);
|
||||
}
|
||||
else {
|
||||
res = 3 + 2
|
||||
+ _raft_prof_noun(hax, u3h(non), dud)
|
||||
+ _raft_prof_noun(hax, u3t(non), dud);
|
||||
}
|
||||
|
||||
u3h_put(hax, dud ? non & 0x7fffffff : non, res);
|
||||
|
||||
return res;
|
||||
}
|
||||
*/
|
||||
}
|
||||
#endif
|
||||
|
||||
/* _raft_prof(): print memory profile. RETAIN.
|
||||
*/
|
||||
c3_w
|
||||
_raft_prof(u3p(u3h_root) hax, c3_w den, u3_noun mas)
|
||||
{
|
||||
c3_w tot_w = 0;
|
||||
u3_noun h_mas, t_mas;
|
||||
|
||||
if ( c3n == u3r_cell(mas, &h_mas, &t_mas) ) {
|
||||
_raft_spac(den);
|
||||
(fprintf(stderr, "mistyped mass\r\n"));
|
||||
return tot_w;
|
||||
}
|
||||
else if ( _(u3du(h_mas)) ) {
|
||||
_raft_spac(den);
|
||||
(fprintf(stderr, "mistyped mass head\r\n"));
|
||||
u3m_p("h_mas", h_mas);
|
||||
return tot_w;
|
||||
}
|
||||
else {
|
||||
_raft_spac(den);
|
||||
|
||||
c3_c* lab_c = u3m_pretty(h_mas);
|
||||
(fprintf(stderr, "%s: ", lab_c));
|
||||
free(lab_c);
|
||||
|
||||
u3_noun it_mas, tt_mas;
|
||||
|
||||
if ( c3n == u3r_cell(t_mas, &it_mas, &tt_mas) ) {
|
||||
(fprintf(stderr, "mistyped mass tail\r\n"));
|
||||
return tot_w;
|
||||
}
|
||||
else if ( c3y == it_mas ) {
|
||||
tot_w += u3a_mark_noun(tt_mas);
|
||||
_raft_print_memory(tot_w);
|
||||
|
||||
#if 1
|
||||
/* The basic issue here is that tt_mas is included in
|
||||
* u3A->sac, so they can't both be roots in the normal
|
||||
* sense. When we mark u3A->sac later on, we want tt_mas
|
||||
* to appear unmarked, but its children should be already
|
||||
* marked.
|
||||
*/
|
||||
if ( _(u3a_is_dog(tt_mas)) ) {
|
||||
u3a_box* box_u = u3a_botox(u3a_to_ptr(tt_mas));
|
||||
#ifdef U3_MEMORY_DEBUG
|
||||
if ( 1 == box_u->eus_w ) {
|
||||
box_u->eus_w = 0xffffffff;
|
||||
}
|
||||
else {
|
||||
box_u->eus_w -= 1;
|
||||
}
|
||||
#else
|
||||
if ( -1 == (c3_w)box_u->use_w ) {
|
||||
box_u->use_w = 0x80000000;
|
||||
}
|
||||
else {
|
||||
box_u->use_w += 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
return tot_w;
|
||||
}
|
||||
else if ( c3n == it_mas ) {
|
||||
(fprintf(stderr, "\r\n"));
|
||||
|
||||
while ( _(u3du(tt_mas)) ) {
|
||||
tot_w += _raft_prof(hax, den+2, u3h(tt_mas));
|
||||
tt_mas = u3t(tt_mas);
|
||||
}
|
||||
|
||||
_raft_spac(den);
|
||||
(fprintf(stderr, "--"));
|
||||
_raft_print_memory(tot_w);
|
||||
|
||||
return tot_w;
|
||||
|
||||
}
|
||||
else {
|
||||
_raft_spac(den);
|
||||
(fprintf(stderr, "mistyped (strange) mass tail\r\n"));
|
||||
return tot_w;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* _raft_grab(): garbage collect, checking for profiling. RETAIN.
|
||||
*/
|
||||
static void
|
||||
_raft_grab(u3_noun ova)
|
||||
{
|
||||
if ( u3_nul != u3A->sac ) {
|
||||
c3_w usr_w = 0, ova_w = 0, sac_w = 0, utv_w = 0, utm_w = 0, wep_w = 0,
|
||||
har_w = 0, das_w = 0, flu_w = 0, tax_w = 0, mer_w = 0, don_w = 0,
|
||||
day_w = 0, car_w = 0;
|
||||
|
||||
c3_assert( u3R == &(u3H->rod_u) );
|
||||
|
||||
fprintf(stderr, "\r\n");
|
||||
usr_w = _raft_prof(u3_nul, 0, u3A->sac);
|
||||
fprintf(stderr, "total userspace: ");
|
||||
_raft_print_memory(usr_w);
|
||||
|
||||
ova_w = u3a_mark_noun(ova);
|
||||
fprintf(stderr, "effects list: ");
|
||||
_raft_print_memory(ova_w);
|
||||
|
||||
sac_w = u3a_mark_noun(u3A->sac);
|
||||
fprintf(stderr, "space profile: ");
|
||||
_raft_print_memory(sac_w);
|
||||
|
||||
utv_w = u3v_mark();
|
||||
fprintf(stderr, "arvo stuff: ");
|
||||
_raft_print_memory(utv_w);
|
||||
|
||||
har_w = u3h_mark(u3R->jed.har_p);
|
||||
fprintf(stderr, " warm jet state: ");
|
||||
_raft_print_memory(har_w);
|
||||
|
||||
das_w = u3a_mark_noun(u3R->jed.das);
|
||||
fprintf(stderr, " cold jet state: ");
|
||||
_raft_print_memory(das_w);
|
||||
|
||||
flu_w = u3a_mark_noun(u3R->ski.flu);
|
||||
fprintf(stderr, " namespace: ");
|
||||
_raft_print_memory(flu_w);
|
||||
|
||||
tax_w = u3a_mark_noun(u3R->bug.tax);
|
||||
fprintf(stderr, " trace stack list: ");
|
||||
_raft_print_memory(tax_w);
|
||||
|
||||
mer_w = u3a_mark_noun(u3R->bug.mer);
|
||||
fprintf(stderr, " trace stack buffer: ");
|
||||
_raft_print_memory(mer_w);
|
||||
|
||||
don_w = u3a_mark_noun(u3R->pro.don);
|
||||
fprintf(stderr, " profile battery list: ");
|
||||
_raft_print_memory(don_w);
|
||||
|
||||
day_w = u3a_mark_noun(u3R->pro.day);
|
||||
fprintf(stderr, " profile doss: ");
|
||||
_raft_print_memory(day_w);
|
||||
|
||||
car_w = u3h_mark(u3R->cax.har_p);
|
||||
fprintf(stderr, " memoization: ");
|
||||
_raft_print_memory(car_w);
|
||||
|
||||
utm_w = har_w + das_w + flu_w + tax_w + mer_w + don_w + day_w + car_w;
|
||||
fprintf(stderr, "total road stuff: ");
|
||||
_raft_print_memory(utm_w);
|
||||
|
||||
fprintf(stderr, "total marked: ");
|
||||
_raft_print_memory(usr_w + ova_w + sac_w + utv_w + utm_w);
|
||||
|
||||
wep_w = u3a_sweep();
|
||||
fprintf(stderr, "sweep: ");
|
||||
_raft_print_memory(wep_w);
|
||||
|
||||
u3h_free(u3R->cax.har_p);
|
||||
u3R->cax.har_p = u3h_new();
|
||||
|
||||
u3z(u3A->sac);
|
||||
u3A->sac = u3_nul;
|
||||
}
|
||||
}
|
||||
|
||||
int FOO;
|
||||
|
||||
/* u3_raft_work(): work.
|
||||
@ -1803,6 +2041,8 @@ u3_raft_work(void)
|
||||
_raft_kick_all(vir);
|
||||
egg_u->did = c3y;
|
||||
egg_u->vir = 0;
|
||||
|
||||
_raft_grab(ova);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
124
v/reck.c
124
v/reck.c
@ -66,120 +66,6 @@ _reck_lily(u3_noun fot, u3_noun txt, c3_l* tid_l)
|
||||
}
|
||||
}
|
||||
|
||||
/* _reck_spac(): print n spaces.
|
||||
*/
|
||||
void _reck_spac(c3_w n)
|
||||
{
|
||||
for (; n > 0; n--)
|
||||
uL(fprintf(uH," "));
|
||||
}
|
||||
|
||||
/* _reck_print_memory: print memory amount. cf u3a_print_memory().
|
||||
*/
|
||||
void
|
||||
_reck_print_memory(c3_w wor_w)
|
||||
{
|
||||
c3_w byt_w = (wor_w * 4);
|
||||
c3_w gib_w = (byt_w / 1000000000);
|
||||
c3_w mib_w = (byt_w % 1000000000) / 1000000;
|
||||
c3_w kib_w = (byt_w % 1000000) / 1000;
|
||||
c3_w bib_w = (byt_w % 1000);
|
||||
|
||||
if ( gib_w ) {
|
||||
uL(fprintf(uH, "GB/%d.%03d.%03d.%03d\r\n",
|
||||
gib_w, mib_w, kib_w, bib_w));
|
||||
}
|
||||
else if ( mib_w ) {
|
||||
uL(fprintf(uH, "MB/%d.%03d.%03d\r\n", mib_w, kib_w, bib_w));
|
||||
}
|
||||
else if ( kib_w ) {
|
||||
uL(fprintf(uH, "KB/%d.%03d\r\n", kib_w, bib_w));
|
||||
}
|
||||
else {
|
||||
uL(fprintf(uH, "B/%d\r\n", bib_w));
|
||||
}
|
||||
}
|
||||
|
||||
/* _reck_meme_noun(): get memory usage, in words, of noun. RETAIN.
|
||||
*/
|
||||
c3_w
|
||||
_reck_meme_noun(u3p(u3h_root) hax, u3_noun non, c3_t dud)
|
||||
{
|
||||
u3_weak got = u3h_git(hax, dud ? non & 0x7fffffff : non);
|
||||
|
||||
if (u3_none != got) {
|
||||
return 0; // I think? maybe 1
|
||||
}
|
||||
else {
|
||||
c3_w res;
|
||||
|
||||
if (!(non & 0x80000000)) {
|
||||
res = 1;
|
||||
}
|
||||
if (_(u3ud(non))) {
|
||||
res = 2 + u3r_met(5, non);
|
||||
}
|
||||
else {
|
||||
res = 1
|
||||
+ _reck_meme_noun(hax, u3h(non), dud)
|
||||
+ _reck_meme_noun(hax, u3t(non), dud);
|
||||
}
|
||||
|
||||
u3h_put(hax, dud ? non & 0x7fffffff : non, res);
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
/* _reck_meme_prof(): print memory profile. RETAIN.
|
||||
*/
|
||||
void
|
||||
_reck_meme_prof(u3p(u3h_root) hax, c3_w den, u3_noun mas)
|
||||
{
|
||||
u3_noun h_mas, t_mas;
|
||||
|
||||
if (c3n == u3r_cell(mas, &h_mas, &t_mas)) {
|
||||
_reck_spac(den);
|
||||
uL(fprintf(uH, "mistyped mass\r\n"));
|
||||
return;
|
||||
}
|
||||
if (c3y == h_mas) {
|
||||
_reck_spac(den);
|
||||
_reck_print_memory(_reck_meme_noun(hax, t_mas, false));
|
||||
_reck_spac(den);
|
||||
_reck_print_memory(_reck_meme_noun(hax, t_mas, true));
|
||||
}
|
||||
else if (c3n == h_mas) {
|
||||
u3_noun it_mas, tt_mas, pit_mas, qit_mas;
|
||||
while (u3_nul != t_mas)
|
||||
{
|
||||
_reck_spac(den);
|
||||
if (c3n == u3r_cell(t_mas, &it_mas, &tt_mas)) {
|
||||
uL(fprintf(uH, "mistyped mass list\r\n"));
|
||||
return;
|
||||
}
|
||||
else if (c3n == u3r_cell(it_mas, &pit_mas, &qit_mas)) {
|
||||
uL(fprintf(uH, "mistyped mass list element\r\n"));
|
||||
return;
|
||||
}
|
||||
else {
|
||||
c3_c* pit_c = u3m_pretty(pit_mas);
|
||||
uL(fprintf(uH, "%s\r\n", pit_c));
|
||||
free(pit_c);
|
||||
|
||||
_reck_meme_prof(hax, den+2, qit_mas);
|
||||
|
||||
t_mas = tt_mas;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
_reck_spac(den);
|
||||
uL(fprintf(uH, "mistyped mass head\r\n"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* _reck_kick_term(): apply terminal outputs.
|
||||
*/
|
||||
static u3_noun
|
||||
@ -227,13 +113,7 @@ _reck_kick_term(u3_noun pox, c3_l tid_l, u3_noun fav)
|
||||
|
||||
case c3__mass: p_fav = u3t(fav);
|
||||
{
|
||||
uL(fprintf(uH, "memory profile:\r\n"));
|
||||
|
||||
u3p(u3h_root) hax = u3h_new();
|
||||
|
||||
_reck_meme_prof(hax, 0, p_fav);
|
||||
|
||||
u3h_free(hax);
|
||||
u3A->sac = u3k(p_fav);
|
||||
|
||||
u3z(pox); u3z(fav); return c3y;
|
||||
} break;
|
||||
@ -359,7 +239,7 @@ _reck_kick_spec(u3_noun pox, u3_noun fav)
|
||||
u3z(pox); u3z(fav); return c3n;
|
||||
}
|
||||
else switch ( it_pox ) {
|
||||
default: return c3n;
|
||||
default: u3z(pox); u3z(fav); return c3n;
|
||||
|
||||
case c3__http: {
|
||||
u3_noun pud = tt_pox;
|
||||
|
36
v/term.c
36
v/term.c
@ -1012,6 +1012,42 @@ u3_term_ef_boil(void)
|
||||
}
|
||||
}
|
||||
|
||||
/* u3_term_ef_verb(): initial effects for verbose events
|
||||
*/
|
||||
void
|
||||
u3_term_ef_verb(void)
|
||||
{
|
||||
u3_noun pax = u3nq(u3_blip, c3__term, '1', u3_nul);
|
||||
|
||||
u3v_plan(pax, u3nc(c3__verb, u3_nul));
|
||||
}
|
||||
|
||||
/* u3_term_ef_ticket(): initial effects for new ticket.
|
||||
*/
|
||||
void
|
||||
u3_term_ef_ticket(c3_c* who_c, c3_c* tic_c)
|
||||
{
|
||||
u3_noun pax = u3nq(u3_blip, c3__term, '1', u3_nul);
|
||||
u3_noun who, tic;
|
||||
u3_noun whu, tuc;
|
||||
|
||||
whu = u3dc("slaw", 'p', u3i_string(who_c));
|
||||
if ( u3_nul == whu ) {
|
||||
fprintf(stderr, "ticket: invalid planet '%s'\r\n", who_c);
|
||||
exit(1);
|
||||
}
|
||||
else { who = u3k(u3t(whu)); u3z(whu); }
|
||||
|
||||
tuc = u3dc("slaw", 'p', u3i_string(tic_c));
|
||||
if ( u3_nul == tuc ) {
|
||||
fprintf(stderr, "ticket: invalid secret '%s'\r\n", tic_c);
|
||||
exit(1);
|
||||
}
|
||||
else { tic = u3k(u3t(tuc)); u3z(tuc); }
|
||||
|
||||
u3v_plan(pax, u3nt(c3__tick, who, tic));
|
||||
}
|
||||
|
||||
/* u3_term_ef_bake(): initial effects for new terminal.
|
||||
*/
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user