diff --git a/Makefile b/Makefile index 58a8ec34ad..7160cb2c2d 100644 --- a/Makefile +++ b/Makefile @@ -148,9 +148,12 @@ J_B_OFILES=\ jets/b/lent.o \ jets/b/levy.o \ jets/b/lien.o \ + jets/b/murn.o \ jets/b/need.o \ + jets/b/reap.o \ jets/b/reel.o \ jets/b/roll.o \ + jets/b/skid.o \ jets/b/skim.o \ jets/b/skip.o \ jets/b/scag.o \ @@ -324,9 +327,6 @@ V_OFILES=\ MAIN_FILE =\ vere/main.o -MEME_FILE =\ - tests/test.o - VERE_OFILES=\ $(CRE2_OFILES) \ $(OUT_OFILES) \ @@ -334,12 +334,6 @@ VERE_OFILES=\ $(MAIN_FILE) \ $(V_OFILES) -MEME_OFILES=\ - $(CRE2_OFILES) \ - $(OUT_OFILES) \ - $(BASE_OFILES) \ - $(MEME_FILE) - VERE_DFILES=$(VERE_OFILES:%.o=.d/%.d) -include $(VERE_DFILES) @@ -385,7 +379,6 @@ all: urbit @echo "# Set custom configuration here, please!" > ".make.conf" urbit: $(BIN)/urbit -meme: $(BIN)/meme $(LIBUV_MAKEFILE) $(LIBUV_MAKEFILE2): cd outside/libuv_0.11 ; sh autogen.sh ; ./configure --disable-dtrace @@ -442,10 +435,6 @@ $(BIN)/urbit: $(LIBCRE) $(LIBCOMMONMARK) $(VERE_OFILES) $(LIBUV) $(LIBRE2) $(LIB @$(CLD) $(CLDOSFLAGS) -o $(BIN)/urbit $(VERE_OFILES) $(LIBUV) $(LIBCRE) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBS) $(LIBCOMMONMARK) $(LIBSCRYPT) $(LIBSOFTFLOAT) endif -$(BIN)/meme: $(LIBCRE) $(LIBCOMMONMARK) $(MEME_OFILES) $(LIBUV) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBSCRYPT) $(LIBSOFTFLOAT) - mkdir -p $(BIN) - $(CLD) $(CLDOSFLAGS) -o $(BIN)/meme $(MEME_OFILES) $(LIBUV) $(LIBCRE) $(LIBRE2) $(LIBED25519) $(LIBANACHRONISM) $(LIBS) $(LIBCOMMONMARK) $(LIBSCRYPT) $(LIBSOFTFLOAT) - tags: ctags -R -f .tags --exclude=root diff --git a/README.md b/README.md index 5947a13967..25ec31108d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,15 @@ urbit ===== -urbit is a new programming and execution environment designed from -scratch. +Urbit is a new computing environment designed from scratch. -At present urbit is under heavy development. If you're interested in -keeping in touch or following the project you can: +At present urbit is under heavy development. It's not useful for +any external purpose. Documentation is completely inadequate. +Anyone can use the interpreter, of course, but the network is +invitation-only. + +If you're interested in keeping in touch or following the project +you can: - Enter your email address at [urbit.org](http://urbit.org). - Subscribe to the @@ -14,22 +18,19 @@ keeping in touch or following the project you can: - Follow [@urbit_](https://twitter.com/urbit\_) on Twitter. - Get in touch with us via email, <urbit@urbit.org> -All of the source code is distributed under the MIT license, but is for -all intents and purposes in the public domain. +All of the source code is distributed under the MIT license. -Pacakges +Packages -------- #### Ubuntu or Debian -Third-party pacakge files are maintained at https://github.com/yebyen/urbit-deb. Urbit is only supported on Jessie onward. +Third-party package files are maintained at https://github.com/yebyen/urbit-deb. Urbit is only supported on Jessie onward. #### OS X - Homebrew brew install --HEAD homebrew/head-only/urbit -If this succeeds, proceed to the [Run section](#run). Otherwise, the build must be done manually: - Dependencies ------------ urbit depends on: @@ -95,27 +96,29 @@ Just run `make`: (On FreeBSD, use `gmake` instead.) -Run <a id="run"/> +Run (with a network invitation) --- -Inside of the `urbit` directory run +If you have a planet named `~fintud-macrep` and a ticket +`~fortyv-tombyt-tabsen-sonres`, run - bin/urbit -c pier + bin/urbit -w fintud-macrep -t fortyv-tombyt-tabsen-sonres -where `pier` is a directory that does not exist. +Your pier (all Urbit state, log and checkpoint) will be in +`./fintud-macrep`. To restart Urbit: -All your state (an append-only log and a memory checkpoint) will live in -this directory. The name of your pier doesn't matter and is not visible -internally. + bin/urbit fintud-macrep -Begin ------ +Run (without a network invitation) +--- -To begin a 32-bit planet use +Run - :?begin + bin/urbit -c mypier -which will guide you through the setup process. +Urbit will create a comet in `mypier`. To restart: + + bin/urbit mypier Basics ------ @@ -137,6 +140,8 @@ turned it off. Talk ---- +If you're on the network, you can use its most basic application, `talk`. + If `talk` is not running, start it with `*talk` from the task manager. Use `^x` to switch to the `talk` prompt and then run @@ -145,16 +150,12 @@ Use `^x` to switch to the `talk` prompt and then run to join the `urbit-meta` channel. People in there are helpful. -There are four main `talk` commands: +There are three main `talk` commands: ;join ~urbit-name/channel `;join` subscribes your main feed to a remote channel. - ;create channel %name 'description' - -`;create` creates a channel on your urbit. - ;<number> `;<number>` activates a previous message number, like a URL that got @@ -168,7 +169,7 @@ for a private message. Filesystem Sync --------------- -Our filesystem, `%clay` does not automatically sync to unix. If you want +Our filesystem, `%clay`, does not automatically sync to unix. If you want to get files in and out of urbit, you'll need to setup a mount point. Since each mount point is always watching for changes you may also want to unmount from time to time. @@ -199,7 +200,7 @@ your urbit and: where pier is the name of your pier. While the network is still young from time to time we reboot the entire -thing. We call this a 'continuity breach' since we're breaking the +universe. We call this a 'continuity breach' since we're breaking the continuity of our crypto. When this happens you'll need to back up your data and start a fresh diff --git a/include/jets/q.h b/include/jets/q.h index 78de9e2acf..27c24fa5bb 100644 --- a/include/jets/q.h +++ b/include/jets/q.h @@ -25,9 +25,12 @@ u3_noun u3qb_lent(u3_noun); u3_noun u3qb_levy(u3_noun, u3_noun); u3_noun u3qb_lien(u3_noun, u3_noun); + u3_noun u3qb_murn(u3_noun, u3_noun); u3_noun u3qb_need(u3_noun); + u3_noun u3qb_reap(u3_atom, u3_noun); u3_noun u3qb_reel(u3_noun, u3_noun); u3_noun u3qb_roll(u3_noun, u3_noun); + u3_noun u3qb_skid(u3_noun, u3_noun); u3_noun u3qb_skim(u3_noun, u3_noun); u3_noun u3qb_skip(u3_noun, u3_noun); u3_noun u3qb_scag(u3_atom, u3_noun); diff --git a/include/jets/w.h b/include/jets/w.h index 74b02e7410..f46dcafc4d 100644 --- a/include/jets/w.h +++ b/include/jets/w.h @@ -24,9 +24,12 @@ u3_noun u3wb_lent(u3_noun); u3_noun u3wb_levy(u3_noun); u3_noun u3wb_lien(u3_noun); + u3_noun u3wb_murn(u3_noun); u3_noun u3wb_need(u3_noun); + u3_noun u3wb_reap(u3_noun); u3_noun u3wb_reel(u3_noun); u3_noun u3wb_roll(u3_noun); + u3_noun u3wb_skid(u3_noun); u3_noun u3wb_skim(u3_noun); u3_noun u3wb_skip(u3_noun); u3_noun u3wb_scag(u3_noun); diff --git a/jets/b/murn.c b/jets/b/murn.c new file mode 100644 index 0000000000..08647c4446 --- /dev/null +++ b/jets/b/murn.c @@ -0,0 +1,46 @@ +/* j/2/murn.c +** +*/ +#include "all.h" + + +/* functions +*/ + u3_noun + u3qb_murn(u3_noun a, u3_noun b) + { + if ( 0 == a ) { + return a; + } + else if ( c3n == u3du(a) ) { + return u3m_bail(c3__exit); + } + else { + u3_noun one = u3n_slam_on(u3k(b), u3k(u3h(a))); + u3_noun two = u3qb_murn(u3t(a), b); + u3_noun nex; + + switch ( u3ud(one) ) { + case c3y: u3z(one); + return two; + case c3n: nex = u3nc(u3k(u3t(one)), two); + u3z(one); + return nex; + default: u3z(one); + u3z(two); + return u3_none; + } + } + } + u3_noun + u3wb_murn(u3_noun cor) + { + u3_noun a, b; + + if ( c3n == u3r_mean(cor, u3x_sam_2, &a, u3x_sam_3, &b, 0) ) { + return u3m_bail(c3__exit); + } else { + return u3qb_murn(a, b); + } + } + diff --git a/jets/b/reap.c b/jets/b/reap.c new file mode 100644 index 0000000000..87a7d7809f --- /dev/null +++ b/jets/b/reap.c @@ -0,0 +1,41 @@ +/* j/2/reap.c +** +*/ +#include "all.h" + + +/* functions +*/ + u3_noun + u3qb_reap(u3_atom a, + u3_noun b) + { + if ( !_(u3a_is_cat(a)) ) { + return u3m_bail(c3__fail); + } + else { + u3_noun acc = u3_nul; + c3_w i_w = a; + + while ( i_w ) { + acc = u3nc(b, acc); + i_w--; + } + + return acc; + } + } + + u3_noun + u3wb_reap(u3_noun cor) + { + u3_noun a, b; + + if ( (c3n == u3r_mean(cor, u3x_sam_2, &a, u3x_sam_3, &b, 0)) || + (c3n == u3ud(a)) ) + { + return u3m_bail(c3__exit); + } else { + return u3qb_reap(a, b); + } + } diff --git a/jets/b/skid.c b/jets/b/skid.c new file mode 100644 index 0000000000..ac714240e9 --- /dev/null +++ b/jets/b/skid.c @@ -0,0 +1,44 @@ +/* j/2/skid.c +** +*/ +#include "all.h" + + +/* functions +*/ + u3_noun + u3qb_skid(u3_noun a, + u3_noun b) + { + if ( 0 == a ) { + return u3nc(u3_nul, u3_nul); + } + else if ( c3n == u3du(a) ) { + return u3m_bail(c3__exit); + } else { + u3_noun acc = u3qb_skid(u3t(a), b); + u3_noun hoz = u3n_slam_on(u3k(b), u3k(u3h(a))); + + switch ( hoz ) { + case c3y: acc = u3nc(u3nc(u3k(u3h(a)), u3h(acc)), u3t(acc)); + break; + case c3n: acc = u3nc(u3h(acc), u3nc(u3k(u3h(a)), u3t(acc))); + break; + default: u3z(hoz); + return u3m_bail(c3__exit); + } + u3z(hoz); + return acc; + } + } + u3_noun + u3wb_skid(u3_noun cor) + { + u3_noun a, b; + + if ( c3n == u3r_mean(cor, u3x_sam_2, &a, u3x_sam_3, &b, 0) ) { + return u3m_bail(c3__exit); + } else { + return u3qb_skid(a, b); + } + } diff --git a/jets/tree.c b/jets/tree.c index 7b9eda6bae..ffc5cdba0e 100644 --- a/jets/tree.c +++ b/jets/tree.c @@ -21,9 +21,12 @@ static u3j_harm _mood__hoon_flop_a[] = {{".2", u3wb_flop, c3y}, {}}; static u3j_harm _mood__hoon_lent_a[] = {{".2", u3wb_lent, c3y}, {}}; static u3j_harm _mood__hoon_levy_a[] = {{".2", u3wb_levy, c3y}, {}}; static u3j_harm _mood__hoon_lien_a[] = {{".2", u3wb_lien, c3y}, {}}; +static u3j_harm _mood__hoon_murn_a[] = {{".2", u3wb_murn, c3y}, {}}; static u3j_harm _mood__hoon_need_a[] = {{".2", u3wb_need, c3y}, {}}; +static u3j_harm _mood__hoon_reap_a[] = {{".2", u3wb_reap, c3y}, {}}; static u3j_harm _mood__hoon_reel_a[] = {{".2", u3wb_reel, c3y}, {}}; static u3j_harm _mood__hoon_roll_a[] = {{".2", u3wb_roll, c3y}, {}}; +static u3j_harm _mood__hoon_skid_a[] = {{".2", u3wb_skid, c3y}, {}}; static u3j_harm _mood__hoon_skim_a[] = {{".2", u3wb_skim, c3y}, {}}; static u3j_harm _mood__hoon_skip_a[] = {{".2", u3wb_skip, c3y}, {}}; static u3j_harm _mood__hoon_scag_a[] = {{".2", u3wb_scag, c3y}, {}}; @@ -451,9 +454,12 @@ static u3j_core _mood__hoon_d[] = { "lent", _mood__hoon_lent_a }, { "levy", _mood__hoon_levy_a }, { "lien", _mood__hoon_lien_a }, + { "murn", _mood__hoon_murn_a }, { "need", _mood__hoon_need_a }, + { "reap", _mood__hoon_reap_a }, { "reel", _mood__hoon_reel_a }, { "roll", _mood__hoon_roll_a }, + { "skid", _mood__hoon_skid_a }, { "skim", _mood__hoon_skim_a }, { "skip", _mood__hoon_skip_a }, { "scag", _mood__hoon_scag_a }, diff --git a/noun/nock.c b/noun/nock.c index 0d2b1ff4ed..9fc771dd33 100644 --- a/noun/nock.c +++ b/noun/nock.c @@ -133,212 +133,212 @@ _n_nock_on(u3_noun bus, u3_noun fol) u3a_lose(fol); return u3i_cell(poz, riv); } - else switch ( hib ) { - default: return u3m_bail(c3__exit); + else { + static void* lut[] = { + &&l0, &&l1, &&l2, &&l3, &&l4, &&l5, + &&l6, &&l7, &&l8, &&l9, &&l10, &&l11 + }; - case 0: { - if ( c3n == u3r_ud(gal) ) { - return u3m_bail(c3__exit); - } - else { - u3_noun pro = u3k(u3at(gal, bus)); - - u3a_lose(bus); u3a_lose(fol); - return pro; - } + if(hib > 11) { + return u3m_bail(c3__exit); } - c3_assert(!"not reached"); - case 1: { - u3_noun pro = u3k(gal); + goto *lut[hib]; + + { + l0: { + if ( c3n == u3r_ud(gal) ) { + return u3m_bail(c3__exit); + } + else { + u3_noun pro = u3k(u3at(gal, bus)); - u3a_lose(bus); u3a_lose(fol); - return pro; - } - c3_assert(!"not reached"); + u3a_lose(bus); u3a_lose(fol); + return pro; + } + } - case 2: { - u3_noun nex = _n_nock_on(u3k(bus), u3k(u3t(gal))); - u3_noun seb = _n_nock_on(bus, u3k(u3h(gal))); + l1: { + u3_noun pro = u3k(gal); - u3a_lose(fol); - bus = seb; - fol = nex; - continue; - } - c3_assert(!"not reached"); + u3a_lose(bus); u3a_lose(fol); + return pro; + } - case 3: { - u3_noun gof, pro; + l2: { + u3_noun nex = _n_nock_on(u3k(bus), u3k(u3t(gal))); + u3_noun seb = _n_nock_on(bus, u3k(u3h(gal))); - gof = _n_nock_on(bus, u3k(gal)); - pro = u3r_du(gof); + u3a_lose(fol); + bus = seb; + fol = nex; + continue; + } - u3a_lose(gof); u3a_lose(fol); - return pro; - } - c3_assert(!"not reached"); + l3: { + u3_noun gof, pro; - case 4: { - u3_noun gof, pro; + gof = _n_nock_on(bus, u3k(gal)); + pro = u3r_du(gof); - gof = _n_nock_on(bus, u3k(gal)); - pro = u3i_vint(gof); + u3a_lose(gof); u3a_lose(fol); + return pro; + } - u3a_lose(fol); - return pro; - } - c3_assert(!"not reached"); + l4: { + u3_noun gof, pro; - case 5: { - u3_noun wim = _n_nock_on(bus, u3k(gal)); - u3_noun pro = u3r_sing(u3h(wim), u3t(wim)); + gof = _n_nock_on(bus, u3k(gal)); + pro = u3i_vint(gof); - u3a_lose(wim); u3a_lose(fol); - return pro; - } - c3_assert(!"not reached"); + u3a_lose(fol); + return pro; + } - case 6: { - u3_noun b_gal, c_gal, d_gal; + l5: { + u3_noun wim = _n_nock_on(bus, u3k(gal)); + u3_noun pro = u3r_sing(u3h(wim), u3t(wim)); - u3x_trel(gal, &b_gal, &c_gal, &d_gal); - { - u3_noun tys = _n_nock_on(u3k(bus), u3k(b_gal)); - u3_noun nex; + u3a_lose(wim); u3a_lose(fol); + return pro; + } - if ( 0 == tys ) { - nex = u3k(c_gal); - } else if ( 1 == tys ) { - nex = u3k(d_gal); - } else return u3m_bail(c3__exit); + l6: { + u3_noun b_gal, c_gal, d_gal; - u3a_lose(fol); - fol = nex; - continue; - } - } - c3_assert(!"not reached"); + u3x_trel(gal, &b_gal, &c_gal, &d_gal); + { + u3_noun tys = _n_nock_on(u3k(bus), u3k(b_gal)); + u3_noun nex; - case 7: { - u3_noun b_gal, c_gal; + if ( 0 == tys ) { + nex = u3k(c_gal); + } else if ( 1 == tys ) { + nex = u3k(d_gal); + } else return u3m_bail(c3__exit); - u3x_cell(gal, &b_gal, &c_gal); - { - u3_noun bod = _n_nock_on(bus, u3k(b_gal)); - u3_noun nex = u3k(c_gal); + u3a_lose(fol); + fol = nex; + continue; + } + } - u3a_lose(fol); - bus = bod; - fol = nex; - continue; - } - } - c3_assert(!"not reached"); + l7: { + u3_noun b_gal, c_gal; - case 8: { - u3_noun b_gal, c_gal; + u3x_cell(gal, &b_gal, &c_gal); + { + u3_noun bod = _n_nock_on(bus, u3k(b_gal)); + u3_noun nex = u3k(c_gal); - u3x_cell(gal, &b_gal, &c_gal); - { - u3_noun heb = _n_nock_on(u3k(bus), u3k(b_gal)); - u3_noun bod = u3nc(heb, bus); - u3_noun nex = u3k(c_gal); + u3a_lose(fol); + bus = bod; + fol = nex; + continue; + } + } - u3a_lose(fol); - bus = bod; - fol = nex; - continue; - } - } - c3_assert(!"not reached"); + l8: { + u3_noun b_gal, c_gal; - case 9: { - u3_noun b_gal, c_gal; + u3x_cell(gal, &b_gal, &c_gal); + { + u3_noun heb = _n_nock_on(u3k(bus), u3k(b_gal)); + u3_noun bod = u3nc(heb, bus); + u3_noun nex = u3k(c_gal); - u3x_cell(gal, &b_gal, &c_gal); - { - u3_noun seb = _n_nock_on(bus, u3k(c_gal)); - u3_noun pro; + u3a_lose(fol); + bus = bod; + fol = nex; + continue; + } + } + + l9: { + u3_noun b_gal, c_gal; + + u3x_cell(gal, &b_gal, &c_gal); + { + u3_noun seb = _n_nock_on(bus, u3k(c_gal)); + u3_noun pro; - u3t_off(noc_o); - pro = u3j_kick(seb, b_gal); - u3t_on(noc_o); + u3t_off(noc_o); + pro = u3j_kick(seb, b_gal); + u3t_on(noc_o); - if ( u3_none != pro ) { - u3a_lose(fol); - return pro; - } - else { - if ( c3n == u3r_ud(b_gal) ) { - return u3m_bail(c3__exit); - } - else { - u3_noun nex = u3k(u3at(b_gal, seb)); + if ( u3_none != pro ) { + u3a_lose(fol); + return pro; + } + else { + if ( c3n == u3r_ud(b_gal) ) { + return u3m_bail(c3__exit); + } + else { + u3_noun nex = u3k(u3at(b_gal, seb)); - u3a_lose(fol); - bus = seb; - fol = nex; - continue; - } - } - } + u3a_lose(fol); + bus = seb; + fol = nex; + continue; + } + } + } + } + + l10: { + u3_noun p_gal, q_gal; + + u3x_cell(gal, &p_gal, &q_gal); + { + u3_noun zep, hod, nex; + + if ( c3y == u3r_du(p_gal) ) { + u3_noun b_gal = u3h(p_gal); + u3_noun c_gal = u3t(p_gal); + u3_noun d_gal = q_gal; + + zep = u3k(b_gal); + hod = _n_nock_on(u3k(bus), u3k(c_gal)); + nex = u3k(d_gal); + } + else { + u3_noun b_gal = p_gal; + u3_noun c_gal = q_gal; + + zep = u3k(b_gal); + hod = u3_nul; + nex = u3k(c_gal); + } + + u3a_lose(fol); + return _n_hint(zep, hod, bus, nex); + } + } + + l11: { + u3_noun gof = _n_nock_on(bus, u3k(gal)); + u3_noun val; + + u3t_off(noc_o); + val = u3m_soft_esc(u3k(gof)); + u3t_on(noc_o); + + if ( !_(u3du(val)) ) { + u3m_bail(u3nt(1, gof, 0)); + } + else { + u3_noun pro; + + u3z(gof); + u3z(fol); + pro = u3k(u3t(val)); + u3z(val); + + return pro; + } + } } - c3_assert(!"not reached"); - - case 10: { - u3_noun p_gal, q_gal; - - u3x_cell(gal, &p_gal, &q_gal); - { - u3_noun zep, hod, nex; - - if ( c3y == u3r_du(p_gal) ) { - u3_noun b_gal = u3h(p_gal); - u3_noun c_gal = u3t(p_gal); - u3_noun d_gal = q_gal; - - zep = u3k(b_gal); - hod = _n_nock_on(u3k(bus), u3k(c_gal)); - nex = u3k(d_gal); - } - else { - u3_noun b_gal = p_gal; - u3_noun c_gal = q_gal; - - zep = u3k(b_gal); - hod = u3_nul; - nex = u3k(c_gal); - } - - u3a_lose(fol); - return _n_hint(zep, hod, bus, nex); - } - } - - case 11: { - u3_noun gof = _n_nock_on(bus, u3k(gal)); - u3_noun val; - - u3t_off(noc_o); - val = u3m_soft_esc(u3k(gof)); - u3t_on(noc_o); - - if ( !_(u3du(val)) ) { - u3m_bail(u3nt(1, gof, 0)); - } - else { - u3_noun pro; - - u3z(gof); - u3z(fol); - pro = u3k(u3t(val)); - u3z(val); - - return pro; - } - } - c3_assert(!"not reached"); } } } diff --git a/vere/main.c b/vere/main.c index 80d1bd925d..da684a737e 100644 --- a/vere/main.c +++ b/vere/main.c @@ -163,6 +163,13 @@ _main_getopt(c3_i argc, c3_c** argv) return c3n; } + if ( u3_Host.ops_u.tic_c == 0 && u3_Host.ops_u.who_c != 0 ) { + c3_c tic_c[29]; + printf("your ticket: ~"); + scanf("%28s",tic_c); + u3_Host.ops_u.tic_c = _main_presig(tic_c); + } + if ( c3y == u3_Host.ops_u.bat ) { u3_Host.ops_u.dem = c3y; u3_Host.ops_u.nuu = c3y; diff --git a/vere/unix.c b/vere/unix.c index 7c111ac802..9998b94b4a 100644 --- a/vere/unix.c +++ b/vere/unix.c @@ -359,7 +359,10 @@ _unix_scan_mount_point(u3_umon* mon_u) else { if ( '.' != out_u->d_name[len_w] || '\0' == out_u->d_name[len_w + 1] - || '~' == out_u->d_name[strlen(out_u->d_name) - 1] ) { + || '~' == out_u->d_name[strlen(out_u->d_name) - 1] + || ('#' == out_u->d_name[0] && + '#' == out_u->d_name[strlen(out_u->d_name) - 1]) + ) { free(pax_c); continue; } @@ -895,6 +898,8 @@ _unix_update_dir(u3_udir* dir_u) if ( !S_ISDIR(buf_u.st_mode) ) { if ( !strchr(out_u->d_name,'.') || '~' == out_u->d_name[strlen(out_u->d_name) - 1] + || ('#' == out_u->d_name[0] && + '#' == out_u->d_name[strlen(out_u->d_name) - 1]) ) { free(pax_c); continue;