urbit/i/n/u.h
2014-11-25 15:31:35 -08:00

109 lines
2.8 KiB
C

/* i/n/u.h
**
** This file is in the public domain.
*/
/** Constants.
**/
/* u3_none - u3_noun which is not a noun.
*/
# define u3_none (u3_noun)0xffffffff
/* u3_nul: 0, hoon ~.
*/
# define u3_nul 0
/* u3_blip: 0, hoon %$.
*/
# define u3_blip 0
/** Typedefs.
**/
/* u3_post: pointer offset into u3_Loom; _p suffix; declare as u3p().
*/
typedef c3_w u3_post;
# define u3p(type) u3_post
/* u3_noun: tagged noun pointer.
**
** If bit 31 is 0, a u3_noun is a direct 31-bit atom ("cat").
** If bit 31 is 1 and bit 30 0, an indirect atom ("pug").
** If bit 31 is 1 and bit 30 1, an indirect cell ("pom").
**
** Bits 0-29 are a word offset against u3_Loom (u3_post).
*/
typedef c3_w u3_noun;
/* u3_weak: u3_noun which may be u3_none (not a noun).
*/
typedef u3_noun u3_weak;
/* u3_atom: u3_noun which must be an atom.
*/
typedef u3_noun u3_atom;
/* u3_term: u3_noun which must be a term (@tas).
*/
typedef u3_noun u3_term;
/* u3_cell, u3_trel, u3_qual, u3_quin: cell, triple, quadruple, quintuple.
*/
typedef u3_noun u3_cell;
typedef u3_noun u3_trel;
typedef u3_noun u3_qual;
typedef u3_noun u3_quin;
/* u3_funk, u3_funq: unary and binary noun functions.
*/
typedef u3_noun (*u3_funk)(u3_noun);
typedef u3_noun (*u3_funq)(u3_noun, u3_noun);
/** Macros.
**/
/* u3_assure(): loobean assert, bailing with %fail.
*/
# define u3_assure(x) if ( !_(x) ) { u3m_bail(c3__fail); }
/* u3_assert(): loobean assert, bailing with %exit.
*/
# define u3_assent(x) if ( !_(x) ) { u3m_bail(c3__exit); }
/** Aliases.
**/
/* u3h(), u3t(), u3at(): noun fragments.
*/
# define u3h(som) u3x_h(som)
# define u3t(som) u3x_t(som)
# define u3at(axe, som) u3x_at(axe, som)
/* u3nc(), u3nt(), u3nq(): tuple composition.
*/
# define u3nc(a, b) u3i_cell(a, b)
# define u3nt(a, b, c) u3i_trel(a, b, c)
# define u3nq(a, b, c, d) u3i_qual(a, b, c, d)
/* u3du(), u3ud(): noun/cell test.
*/
# define u3du(som) (u3r_du(som))
# define u3ud(som) (u3r_ud(som))
/* u3k(), u3z(): reference counts.
*/
# define u3k(som) u3a_gain(som)
# define u3z(som) u3a_lose(som)
/* u3do(), u3dc(), u3dt(), u3dq(): arvo calls.
*/
# define u3do(txt_c, arg) u3v_do(txt_c, arg)
# define u3dc(txt_c, a, b) u3v_do(txt_c, u3nc(a, b))
# define u3dt(txt_c, a, b, c) u3v_do(txt_c, u3nt(a, b, c))
# define u3dq(txt_c, a, b, c, d) u3v_do(txt_c, u3nt(a, b, c, d))
/* u3to(), u3of(): offset/pointer conversion.
*/
# define u3to(type, x) ((type *) u3a_into(x))
# define u3of(type, x) (u3a_outa((type *)x))