Compare commits

...

178 Commits

Author SHA1 Message Date
Jan Nieuwenhuizen b9f40e2653
core: Switch to pointer cells.
Run

   build-aux/pointer.sh

* src/*.c: Update.
* include/mes/*.h: Update.
2019-11-03 10:34:32 +01:00
Jan Nieuwenhuizen 536cf7c075
drop number based cells 2019-11-03 10:34:13 +01:00
Jan Nieuwenhuizen b2d7a0140b
drop flip 2019-11-03 10:24:40 +01:00
Jan Nieuwenhuizen 225862cf84
flip: broken heart. 2019-11-03 10:02:17 +01:00
Jan Nieuwenhuizen b1cdcd2930
gc: flip twice and dump. 2019-11-03 10:02:17 +01:00
Jan Nieuwenhuizen 2dd537314c
gc_dump_arena
* src/gc.c (gc_dump_arena): New function.
2019-11-03 10:02:17 +01:00
Jan Nieuwenhuizen b08dab15ac
core: Pointer Cells: copy back. WIPPERDEWIP
* src/gc.c (gc_init)[POINTER_CELLS]: Do not use double sized arena.
(gc_cellcpy): New function.
* src/gc.c (gc_flip): Use it, do not flip.
2019-11-03 10:02:17 +01:00
Jan Nieuwenhuizen 41b6cc0368
test 2019-11-03 10:02:16 +01:00
Jan Nieuwenhuizen 4e9ebf508b
test: struct.
* src/test/gc.c (test_struct): New function.
(main): Call it.
2019-11-03 10:02:16 +01:00
Jan Nieuwenhuizen 47f797031f
test: vector.
* src/test/gc.c (test_vector): New function.
(main): Call it.
(print_arena): New function.
(test_gc): Call it.
2019-11-03 10:02:16 +01:00
Jan Nieuwenhuizen 3bb4b05666
test: string.
* src/test/gc.c (test_string): New function.
(main): Call it.
2019-11-03 10:02:16 +01:00
Jan Nieuwenhuizen 3a67dc36a5
test: setenv. 2019-11-03 10:02:16 +01:00
Jan Nieuwenhuizen cda1c54517
test: list. 2019-11-03 10:02:16 +01:00
Jan Nieuwenhuizen 0d147dcddd
test: cons. 2019-11-03 10:02:16 +01:00
Jan Nieuwenhuizen 7198116ff0
test: number.
* src/test/gc.c (test_number): New function.
(main): Call it.
2019-11-03 10:02:15 +01:00
Jan Nieuwenhuizen e8a2075c01
test: empty.
* src/test/gc.c (test_empty): New function.
2019-11-03 10:02:15 +01:00
Jan Nieuwenhuizen 906b878a18
core: eval-apply: Prepare for M2-Planet.
* src/eval-apply.c (apply_builtin): Split M2-Planet specific and CC
specifi part off to ..
* src/cc.c: New file, and
* src/m2.c: New file.
2019-11-03 10:02:15 +01:00
Jan Nieuwenhuizen 5d7192ac05
core: display: Prepare for pointer cells, M2-Planet.
* src/display.c (display_helper): Use cell_ref, return. etc
2019-11-03 10:02:15 +01:00
Jan Nieuwenhuizen 1c1b99d19b
core: gc: Prepare for pointer cells, M2-Planet.
* include/mes/mes.h (cell_zero): Declare.
* src/gc.c (gc_init): Initialize it.
(gc_init_news): Likewise.
2019-11-03 09:57:16 +01:00
Jan Nieuwenhuizen fc61fc199d
core: Remove cell_call_with_current_continuation special.
* include/mes/symbols.h (cell_call_with_current_continuation): Remove.
* src/eval-apply.c (eval_apply): Update to use
cell_symbol_call_with_current_continuation.
* src/symbol.c (init_symbols_): Remove inititialization.
2019-11-02 21:32:47 +01:00
Jan Nieuwenhuizen 6307376d8a
core: Remove cell_begin special.
* include/mes/symbols.h (cell_begin): Remove.
* src/eval-apply.c (eval_apply): Update to use cell_symbol_begin.
* src/symbol.c (init_symbols_): Remove initialization.
2019-11-02 21:32:47 +01:00
Jan Nieuwenhuizen 3efb50cf95
core: Remove unused symbols.
* include/mes/symbols.h (cell_symbol_dot, cell_symbol_read_input_file,
cell_symbol_write, cell_symbol_display): Remove
* src/symbol.c (init_symbols_): Remove initializations.
2019-11-02 21:32:47 +01:00
Jan Nieuwenhuizen 34826aaab6
core: builtins: MES_MINI.
* include/mes/mes.h (g_mini): New global.
* src/mes.c (init): Initialize it with environment variable MES_MINI.
* src/builtins.c (mes_builtins): Register a minimal set of builtins
when g_mini.
2019-11-02 21:32:47 +01:00
Jan Nieuwenhuizen b0b53c98e7
boot: Add gc test.
* scaffold/boot/gc.test: New file.
* build-aux/check-boot.sh (TESTS): Add it.
* include/mes/symbols.h (cell_symbol_program): New symbol.
* src/symbol.c (init_symbols_): Initialize it.
* src/mes.c (main): Add it to environment.
2019-11-02 21:32:46 +01:00
Jan Nieuwenhuizen 9b6ef58b10
test: Test-gc.
* src/test/gc.c (main): New unit test.
* simple.make (test-gcc, test-m2): New target to build it.
* build-aux/pointer.sh: Add it.
2019-11-02 21:32:46 +01:00
Jan Nieuwenhuizen 746919dcd5
core: make_struct: Nicer gc layout.
* src/struct.c (make_struct): Use STRUCT TYPE PRINTER FIELD0 ... FIELDN.
2019-11-02 21:32:46 +01:00
Jan Nieuwenhuizen 803b679d15
core: make-vector: Move to core.
* src/vector.c (make_vector_): Rename from make_vector__.  Add
parameter.  Fix double allocation.
(make_vector): Rename from make_vector_.  Use arity n.  Update users.
2019-11-02 21:32:46 +01:00
Jan Nieuwenhuizen b6198799cb
check: DUPE 2019-11-02 21:32:46 +01:00
Jan Nieuwenhuizen 366cdf90e4
mescc: Mes C Library: Add M2-Planet support.
Mes can now be built with M2-Planet by running

    kaem --verbose --strict

* include/linux/x86/syscall.h (SYS_getcwd, SYS_dup, SYS_dup2,
SYS_unlilnk, SYS_gettimeofday, SYS_clock_gettime, SYS_time): Move to
libc section.  Add M2-Planet constants.
* include/m2/lib.h (struct timezone, struct timespec): struct timeval):
Define.  Add M2-Planet flavor prototypes for mes libc.
* include/mes/m2.h: Remove macros.
* include/mes/mes.h (g_start_time, __gettimeofday_time,
__get_internal_run_time_ts): Declare.
* src/mes.c (init): Initialize them.
* src/posix.c: Use them.
* lib/linux/_getcwd.c: Support M2-Planet.
* lib/linux/access.c: Likewise.
* lib/linux/chmod.c: Likewise.
* lib/linux/clock_gettime.c: Likewise.
* lib/linux/dup.c: Likewise.
* lib/linux/dup2.c: Likewise.
* lib/linux/gettimeofday.c: Likewise.
* lib/linux/read.c: Likewise.
* lib/linux/unlink.c: Likewise.
* lib/mes/fdgetc.c: Likewise.
* lib/mes/fdputc.c: Likewise.
* lib/posix/getenv.c: Likewise.
* lib/posix/setenv.c: Likewise.
* lib/stdlib/realloc.c: Likewise.
* lib/string/memcmp.c: Likewise.
* lib/string/memcpy.c: Likewise.
* lib/m2/abtol.c: New file.
* lib/m2/chmod.c: New file.
* lib/m2/clock_gettime.c: New file.
* lib/m2/execv.c: New file.
* lib/m2/execve.c: New file.
* lib/m2/exit.c: New file.
* lib/m2/getcwd.c: New file.
* lib/m2/ioctl.c: New file.
* lib/m2/isatty.c: New file.
* lib/m2/ntoab.c: New file.
* lib/m2/strncmp.c: New file.
* lib/m2/time.c: New file.
* lib/m2/waitpid.c: New file.
* simple.make: Use them.  Remove macro preprocessing for M2-Planet.
* kaem.run: New file.
2019-11-02 21:32:46 +01:00
Jan Nieuwenhuizen 74f95a3b67
core: posix: Prepare for M2-Planet.
* src/posix.c (access_p): Prepare for M2-Planet.
2019-11-02 21:32:46 +01:00
Jan Nieuwenhuizen ed9da00343
mescc: Mes C Library: Add waitpid for M2-Planet.
* lib/m2/waitpid.c: New file.
2019-11-02 21:32:45 +01:00
Jan Nieuwenhuizen 2fe6beeb89
mescc: Mes C Library: Add time for M2-Planet.
* lib/m2/time.c: New file.
2019-11-02 21:32:45 +01:00
Jan Nieuwenhuizen 8e63f6a1ee
mescc: Mes C Library: Add strncmp for M2-Planet.
* lib/m2/strncmp.c: New file.
2019-11-02 21:32:45 +01:00
Jan Nieuwenhuizen 084602e255
mescc: Mes C Library: Add ntoab for M2-Planet.
* lib/m2/ntoab.c: New file.
2019-11-02 21:32:45 +01:00
Jan Nieuwenhuizen d3b1702889
mescc: Mes C Library: Add isatty for M2-Planet.
* lib/m2/isatty.c: New file.
2019-11-02 21:32:45 +01:00
Jan Nieuwenhuizen 85a9799f1d
mescc: Mes C Library: Add ioctl for M2-Planet.
* lib/m2/ioctl.c: New file.
2019-11-02 21:32:45 +01:00
Jan Nieuwenhuizen dfa2a2313a
mescc: Mes C Library: Add getcwd for M2-Planet.
* lib/m2/getcwd.c: New file.
2019-11-02 21:32:45 +01:00
Jan Nieuwenhuizen 93c39de2a5
mescc: Mes C Library: Add exit for M2-Planet.
* lib/m2/exit.c: New file.
2019-11-02 21:32:44 +01:00
Jan Nieuwenhuizen e1ca7a322e
mescc: Mes C Library: Add execve for M2-Planet.
* lib/m2/execve.c: New file.
2019-11-02 21:32:44 +01:00
Jan Nieuwenhuizen 7d4ae93fd2
mescc: Mes C Library: Add execv for M2-Planet.
* lib/m2/execv.c: New file.
2019-11-02 21:32:44 +01:00
Jan Nieuwenhuizen cbd0f648fe
mescc: Mes C Library: Add clock_gettime for M2-Planet.
* lib/m2/clock_gettime.c: New file.
2019-11-02 21:32:44 +01:00
Jan Nieuwenhuizen 04aae72a82
mescc: Mes C Library: Add chmod for M2-Planet.
* lib/m2/chmod.c: New file.
2019-11-02 21:32:44 +01:00
Jan Nieuwenhuizen fd1d7c8b0e
mescc: Mes C Library: Add abtol for M2-Planet.
* lib/m2/abtol.c: New file.
2019-11-02 21:32:44 +01:00
Jan Nieuwenhuizen f9d2fc1252
mescc: Mes C Library: Add M2-Planet support.
Mes can now be built with M2-Planet by running

    kaem --verbose --strict

* include/linux/x86/syscall.h (SYS_getcwd, SYS_dup, SYS_dup2,
SYS_unlilnk, SYS_gettimeofday, SYS_clock_gettime, SYS_time): Move to
libc section.  Add M2-Planet constants.
* include/m2/lib.h (struct timezone, struct timespec): struct timeval):
Define.  Add M2-Planet flavor prototypes for mes libc.
* include/mes/m2.h: Remove macros.
* include/mes/mes.h (g_start_time, __gettimeofday_time,
__get_internal_run_time_ts): Declare.
* src/mes.c (init): Initialize them.
* src/posix.c: Use them.
* simple.make: Use them.  Remove macro preprocessing for M2-Planet.
* kaem.run: New file.
2019-11-02 21:32:44 +01:00
Jan Nieuwenhuizen db831b9b87
mescc: Mes C Library: Prepare for M2-Planet: realloc.
* lib/stdlib/realloc.c (realloc): Prepare for M2-Planet.
2019-11-02 21:27:36 +01:00
Jan Nieuwenhuizen 340ad674f5
mescc: Mes C Library: Prepare for M2-Planet: fdputc.
* lib/mes/fdputc.c (fdputc): Prepare for M2-Planet.
2019-11-02 21:27:36 +01:00
Jan Nieuwenhuizen d00e41d1b1
mescc: Mes C Library: Prepare for M2-Planet: unlink.
* lib/linux/unlink.c (unlink): Prepare for M2-Planet.
2019-11-02 21:27:36 +01:00
Jan Nieuwenhuizen 0dce43bf4b
mescc: Mes C Library: Prepare for M2-Planet: read.
* lib/linux/read.c (read): Prepare for M2-Planet.
2019-11-02 21:27:36 +01:00
Jan Nieuwenhuizen 50cab9bd5c
mescc: Mes C Library: Prepare for M2-Planet: gettimeofday.
* lib/linux/gettimeofday.c (gettimeofday): Prepare for M2-Planet.
2019-11-02 21:27:36 +01:00
Jan Nieuwenhuizen 77d39cf0d6
mescc: Mes C Library: Prepare for M2-Planet: dup2.
* lib/linux/dup2.c (dup2): Prepare for M2-Planet.
2019-11-02 21:27:36 +01:00
Jan Nieuwenhuizen 2dde5d60b7
mescc: Mes C Library: Prepare for M2-Planet: dup.
* lib/linux/dup.c (dup): Prepare for M2-Planet.
2019-11-02 21:27:36 +01:00
Jan Nieuwenhuizen 5dd22c1ad2
mescc: Mes C Library: Prepare for M2-Planet: clock_gettime.
* lib/linux/clock_gettime.c (clock_gettime): Prepare for M2-Planet.
2019-11-02 21:27:35 +01:00
Jan Nieuwenhuizen 49d4e89335
mescc: Mes C Library: Prepare for M2-Planet: chmod.
* lib/linux/chmod.c (chmod): Prepare for M2-Planet.
2019-11-02 21:27:35 +01:00
Jan Nieuwenhuizen 7f8c6ec204
mescc: Mes C Library: Prepare for M2-Planet: access.
* lib/linux/access.c (access): Prepare for M2-Planet.
2019-11-02 21:27:35 +01:00
Jan Nieuwenhuizen 8a40e1bf27
mescc: Mes C Library: Prepare for M2-Planet: _getcwd.
* lib/linux/_getcwd.c (_getcwd): Prepare for M2-Planet.
2019-11-02 21:27:35 +01:00
Jan Nieuwenhuizen 91277b44c9
core: Split-out stack.c
* src/lib.c (exit_, frame_printer, make_frame_type, make_frame,
make_stack_type, make_stack, stack_length, stack_ref_): Move to ..
* src/posix.c (exit_): Here and to ..
* src/core.c: New file.
* build-aux/build-mes.sh (mes_sources): Add it.
* simple.make (LIBMES_SOURCES): Likewise.
2019-11-02 21:27:35 +01:00
Jan Nieuwenhuizen 68c09f880c
core: Split-off core.c.
* src/mes.c (assoc_string, car, cdr, list, null_p, eq_p, values, acons,
length__, length, error, append2, append_reverse, reverse_x_, assq,
assoc): Move to ...
* src/core.c: New file.
* build-aux/build-mes.sh (mes_sources): Likewise.
* simple.make (MES_SOURCES): Add it..
2019-11-02 21:27:35 +01:00
Jan Nieuwenhuizen 3193e2608c
kaem: scaffold/read.kaem.
* .gitignore: Update.
* include/linux/x86/syscall.h: Update for M2-Planet.
* scaffold/read.c: Update for M2-Planet.
* lib/stdlib/malloc.c (malloc): Remove cast for M2-Planet.
* lib/string/memset.c (memset): Update for M2-Planet.
* lib/linux/brk.c (brk): Remove cast for M2-Planet.
2019-11-02 21:27:35 +01:00
Jan Nieuwenhuizen 314dadd569
kaem: scaffold/argv.kaem.
* scaffold/argv.c (strcmp): Remove.
(main): Update.
* scaffold/argv.kaem: New file.
2019-11-02 19:13:15 +01:00
Jan Nieuwenhuizen c65d20dcc0
kaem: scaffold/hello.kaem.
* include/m2/lib.h: New file.
* scaffold/hello.kaem: New file.
2019-11-02 19:13:15 +01:00
Jan Nieuwenhuizen fe4ac6e18e
kaem: scaffold/main.kaem.
* .gitignore: Update.
* lib/linux/x86-mes-m2/crt1.M1: New file.
* lib/linux/x86-mes-m2/crt1.c: New file.
* lib/m2/x86/x86_defs.M1: New file.  Import from stage0.
* scaffold/main.c: Update for M2-Planet.
2019-11-02 19:13:15 +01:00
Jan Nieuwenhuizen 403c173c36
core: Prepare for M2-Planet: if (foo).
Rewrite C-constructs not supported by M2-Planet

    if (foo)              -> if (foo != 0)

* src/posix.c: Rewrite C-constructs not supported by M2-Planet.
(current_input_port): Likewise.
* src/display.c (display_helper): : Likewise.
* src/eval-apply.c (expand_variable_): : Likewise.
(eval_apply): : Likewise.
* src/mes.c (open_boot): : Likewise.
* src/reader.c (reader_read_identifier_or_number): : Likewise.
* src/symbols.c (init_symbol): : Likewise.
2019-11-02 19:13:15 +01:00
Jan Nieuwenhuizen a0971af6ab
core: Outline hashq_get_handle, hash_set_x_.
* src/hash.c (hashq_ref): Use hashq_get_handle.
(hashq_set_x_): Enable.
(hash_set_x): Use it.
2019-11-02 19:13:15 +01:00
Jan Nieuwenhuizen 4ae116d7ff
core: Prepare for M2-Planet: continue.
Rewrite C-constructs not supported by M2-Planet

    continue              -> goto LABEL

* src/eval-apply.c (eval_apply): Add label: begin_expand_while.  Use it
instead of continue.
2019-11-02 19:13:15 +01:00
Jan Nieuwenhuizen 5e445ce773
core: Prepare for M2-Planet: VALUE/TYPE indirections.
Rewrite C-constructs not supported by M2-Planet

    VALUE (CAR (foo))           -> SCM a = CAR (foo); VALUE (a)
    TYPE (CAR (foo))            -> SCM t = CAR (foo); TYPE (a)

* src/builtins.c (builtin_function): Use VALUE indirections.
(builtin_printer): Likewise.
* src/eval-apply.c (apply_builtin): Likewise.
(get_macro): Likewise.
(expand_variable_): Likewise.
(eval_apply): Likewise.
* src/hash.c (hashq_get_handle): Likewise.
(hashq_ref): Likewise.
(hash_ref): Likewise.
(hash_set_x): Likewise.
(hash_table_printer): Likewise.
* src/math.c (greater_p): Likewise.
(less_p): Likewise.
(is_p): Likewise.
(minus): Likewise.
(plus): Likewise.
(divide): Likewise.
(multiply): Likewise.
(logand): Likewise.
(logior): Likewise.
(logxor): Likewise.
* src/posix.c (current_input_port): Likewise.
(set_current_output_port): Likewise.
* src/reader.c (reader_read_list): Likewise.
(reader_read_character): Likewise.
(reader_read_string): Likewise.
* src/string.c (list_to_cstring): Likewise.
(read_string): Likewise.
2019-11-02 19:13:15 +01:00
Jan Nieuwenhuizen 9f80a7c566
core: Prepare for M2-Planet: M2_CELL_SIZE.
* src/gc.c (M2_CELL_SIZE): Hack for missing pointer arithmetic in
M2-Planet.
(gc_init, alloc, make_cell, gc_up_arena, gc_copy, gc_loop, gc_): Use it.
2019-11-02 19:13:15 +01:00
Jan Nieuwenhuizen 481a7fa17a
core: Use unique assert_msg.
* src/mes.c (error): Use unique assert_msg.
2019-11-02 19:13:14 +01:00
Jan Nieuwenhuizen d2cf928890
core: read_string: Prepare for M2-Planet.
* src/string.c (read_string): Prepare for M2-Planet.
2019-11-02 19:13:14 +01:00
Jan Nieuwenhuizen beec989d66
core: string_equal_p: Prepare for M2-Planet.
* src/string.c (string_equal_p): Prepare for M2-Planet.
2019-11-02 19:13:14 +01:00
Jan Nieuwenhuizen 03accfc7ac
core: reader_read_block_comment: Prepare for M2-Planet.
* src/reader.c (reader_read_block_comment): Prepare for M2-Planet.
2019-11-02 19:13:14 +01:00
Jan Nieuwenhuizen 3fdfad333e
core: reader_eat_whitespace: Prepare for M2-Planet.
* src/reader.c (reader_eat_whitespace): Prepare for M2-Planet.
2019-11-02 19:13:14 +01:00
Jan Nieuwenhuizen 4e123d5133
core: reader_read_sexp_: Prepare for M2-Planet.
* src/reader.c (reader_read_sexp_): Prepare for M2-Planet.
2019-11-02 19:13:14 +01:00
Jan Nieuwenhuizen ecc1db6b88
core: reader_read_identifier_or_number: Prepare for M2-Planet.
* src/reader.c (reader_read_identifier_or_number): Prepare for M2-Planet.
2019-11-02 19:13:14 +01:00
Jan Nieuwenhuizen 1fedea5db6
core: open_output_file: Prepare for M2-Planet.
* src/posix.c (open_output_file): Prepare for M2-Planet.
2019-11-02 19:13:13 +01:00
Jan Nieuwenhuizen a48c4eabbd
core: current_input_port: Prepare for M2-Planet.
* src/posix.c (current_input_port): Prepare for M2-Planet.
2019-11-02 19:13:13 +01:00
Jan Nieuwenhuizen abe12e1929
core: write_byte: Prepare for M2-Planet.
* src/posix.c (write_byte): Prepare for M2-Planet.
2019-11-02 19:13:13 +01:00
Jan Nieuwenhuizen 57b2686a91
core: read_char: Prepare for M2-Planet.
* src/posix.c (read_char): Prepare for M2-Planet.
2019-11-02 19:13:13 +01:00
Jan Nieuwenhuizen 242a26e0db
core: last_pair: Prepare for M2-Planet.
* src/lib.c (last_pair): Prepare for M2-Planet.
2019-11-02 19:13:13 +01:00
Jan Nieuwenhuizen facc3a2af6
core: memq: Prepare for M2-Planet.
* src/lib.c (memq): Prepare for M2-Planet.
2019-11-02 19:13:13 +01:00
Jan Nieuwenhuizen 1cb7e13d42
core: xassq: Prepare for M2-Planet.
* src/lib.c (xassq): Prepare for M2-Planet.
2019-11-02 19:13:13 +01:00
Jan Nieuwenhuizen d5521e333a
core: hash_cstring: Prepare for M2-Planet.
* src/hash.c (hash_cstring): Prepare for M2-Planet.
2019-11-02 19:13:12 +01:00
Jan Nieuwenhuizen 1b377559a3
core: eval_apply: Prepare for M2-Planet.
* src/eval-apply.c (eval_apply): Prepare for M2-Planet.
2019-11-02 19:13:12 +01:00
Jan Nieuwenhuizen 1db58afa0a
core: apply_builtin: Prepare for M2-Planet.
* src/eval-apply.c (apply_builtin): Prepare for M2-Planet.
2019-11-02 19:13:12 +01:00
Jan Nieuwenhuizen ab99db5f9f
core: formal_p: Prepare for M2-Planet.
* src/eval-apply.c (formal_p): Prepare for M2-Planet.
2019-11-02 19:13:12 +01:00
Jan Nieuwenhuizen e83a67a107
core: builtin_p: Prepare for M2-Planet.
* src/builtins.c (builtin_p): Prepare for M2-Planet.
2019-11-02 19:13:12 +01:00
Jan Nieuwenhuizen ef8bc0fe5e
core: assoc: Prepare for M2-Planet.
* src/mes.c (assoc): Prepare for M2-Planet.
2019-11-02 19:13:12 +01:00
Jan Nieuwenhuizen 441b342de9
core: assq: Prepare for M2-Planet.
* src/mes.c (assq): Prepare for M2-Planet.
2019-11-02 19:13:12 +01:00
Jan Nieuwenhuizen 540e42c2ad
core: eq_p: Prepare for M2-Planet.
* src/mes.c (eq_p): Prepare for M2-Planet.
2019-11-02 19:13:11 +01:00
Jan Nieuwenhuizen 0705320f53
core: assoc_string: Prepare for M2-Planet.
src/mes.c (assoc_string): Prepare for M2-Planet.
2019-11-02 19:13:11 +01:00
Jan Nieuwenhuizen d46e9dc7a2
build: Add pointer.sh.
* build-aux/pointer.sh: New script.
2019-11-02 19:13:11 +01:00
Jan Nieuwenhuizen 5d18e30b5a
core: Prepare for pointer cells.
* include/mes/cc.h: Prepare for pointer-based cells.
* include/mes/macros.h[POINTER_CELLS]: Alternative set of macros.
* include/mes/mes.h (struct scm)[POINTER_CELLS]: Alternative definition.
* src/gc.c (copy_cell, copy_news): New function.
* include/mes/mes.h: Declare them.
2019-11-02 19:13:11 +01:00
Jan Nieuwenhuizen ad68e7fc60
core: gc: FRAME_SIZE.
* src/gc.c (FRAME_SIZE): New constant.
(gc_loop, gc_): Use it.
2019-11-02 19:13:11 +01:00
Jan Nieuwenhuizen aed4d977ed
core: gc: Fixes.
* src/gc.c (gc_init, gc_up_arena, gc_flip): Change to void function.
Fixes 0 returns.
(make_bytes): Use plain.
(make_string): Add 1 to length, for zero-terminated C strings.
(gc_copy): Use plain bytes length.
(gc_loop): Manually reformat.
2019-11-02 19:13:11 +01:00
Jan Nieuwenhuizen 5b59534f13
core: Create symbols dynamically.
* include/mes/symbols.h: New file.
* include/mes/mes.hh: Include it.
* include/mes/constants.h: Remove symbol constants.
* src/symbols.c (init_symbols): Create symbols dynamically.
2019-11-02 19:13:11 +01:00
Jan Nieuwenhuizen 28d7152cad
core: Remove CBYTES, CSTRING, NCBYTES macros.
* src/gc.c (cell_bytes, news_bytes): New function.
* include/mes/macros.h (CBYTES, CSTRING, NCBYTES): Remove.  Update
users.
* include/mes/m2.h: Likewise.
2019-11-02 19:13:10 +01:00
Jan Nieuwenhuizen 1baa53f089
core: Prepare for conversion to pointer cells.
* src/posix.c (execl_): Prepare for conversion to pointer cells.
2019-11-02 19:13:10 +01:00
Jan Nieuwenhuizen 6dab5cb856
core: Remove dead macros.
* include/mes/macros.h (CSTRING_STRUCT, START, LEN): Remove.
2019-11-02 19:13:10 +01:00
Jan Nieuwenhuizen 95902000fc
core: Remove macros from cell creation: make_char .. make_string.
* src/gc.c (make_char, make_continuation, make_macro, make_number,
make_ref, make_string0, make_string_port): New function.
(make_string): Move from string.c.
* include/mes/macros.h (MAKE_CHAR, MAKE_CONTINUATION, MAKE_MACRO,
MAKE_NUMBER, MAKE_REF, MAKE_STRING0, MAKE_STRING_PORT): Remove macro.
Update users.
* include/mes/m2.h: Likewise.
2019-11-02 19:13:10 +01:00
Jan Nieuwenhuizen 5cbccdbf81
core: Remove macros from cell creation: make_bytes.
* src/gc.c (bytes_cells, make_bytes): Move from string.c.
* include/mes/macros.h (MAKE_BYTES0, NAME_SYMBOL): Remove.
* include/mes/m2.h: Likewise.
2019-11-02 19:13:10 +01:00
Jan Nieuwenhuizen 48c9568386
core: Remove core:make-cell.
* src/gc.c (alloc, make_cell, cons): Move from mes.c
* src/mes.c: (make_cell_): Remove.
* src/lib.c (char_to_integer, integer_to_char): New function.
* src/builtins.c (mes_builtins): Add them; remove make_cell_.
* mes/module/mes/type-0.mes (char->integer, integer->char): Remove.
2019-11-02 19:13:10 +01:00
Jan Nieuwenhuizen 5d76886f4c
core: Refactor display. 2019-11-02 19:13:09 +01:00
Jan Nieuwenhuizen 3b96cc6a5a
core: Upcase register names.
* include/mes/mes.h (R0, R1, R2, R3, M0): Rename from lower case.
Update users.
2019-11-02 19:13:09 +01:00
Jan Nieuwenhuizen de00f08614
core: Split-out symbol.c.
* src/mes.c (init_symbol, mes_symbols): Move to ..
* src/symbol.c: New file.
* simple.make: Add it.
* src/eval.c (assert_defined): Likewise.
* include/mes/mes.h: Declare init_symbols.
2019-11-02 19:13:09 +01:00
Jan Nieuwenhuizen 585f5cf741
core: Split-out display.c.
* src/lib.c (display_helper, display_, display_error_, display_port_,
write_, write_error_, write_port_, fdisplay_): Move to ..
* src/display.c: New file.
* simple.make: Add it.
* src/eval.c (assert_defined): Likewise.
2019-11-02 19:13:09 +01:00
Jan Nieuwenhuizen 1a1a4e4a3a
core: Split-out eval-apply.c.
* src/mes.c (check_formals, check_apply, pairlis, set_car_x, set_cdr_x,
set_env_x, call_lambda, make_closure_, make_variable_, macro_get_handle,
get_macro, macro_set_x, push_cc, add_formals, formal_p,
expand_variable_, expand_variable, apply_builtin, eval_apply, apply):
Move to ..
* src/eval-apply.c: New file.
* simple.make: Add it.
* src/eval.c (assert_defined): Likewise.
2019-11-02 19:13:09 +01:00
Jan Nieuwenhuizen b34613c960
build: Update mes-snarf.
* build-aux/snarf.sh: Support C-style annotations.
2019-11-02 19:13:09 +01:00
Jan Nieuwenhuizen eab429a2b9
mescc: Mes C Library: Prepare for M2-Planet: setenv.
* lib/posix/setenv.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 19:13:09 +01:00
Jan Nieuwenhuizen 3eb67a9cf3
mescc: Mes C Library: Prepare for M2-Planet: getenv.
* lib/posix/getenv.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 19:13:08 +01:00
Jan Nieuwenhuizen 5d64189bc2
mescc: Mes C Library: Prepare for M2-Planet: ntoab.
* lib/mes/ntoab.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 19:13:08 +01:00
Jan Nieuwenhuizen f6396cc15e
mescc: Mes C Library: Prepare for M2-Planet: malloc.
* lib/stdlib/malloc.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 19:13:08 +01:00
Jan Nieuwenhuizen ae19ddbb47
mescc: Mes C Library: Prepare for M2-Planet: fdungetc.
* lib/mes/fdungetc.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 19:13:08 +01:00
Jan Nieuwenhuizen 4ed9ef7085
mescc: Mes C Library: Prepare for M2-Planet: fdgetc.
* lib/mes/fdgetc.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 19:13:08 +01:00
Jan Nieuwenhuizen 53b00e8f4f
mescc: Mes C Library: Prepare for M2-Planet: abtol.
* lib/mes/abtol.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 19:13:07 +01:00
Jan Nieuwenhuizen b45bd942ef
mescc: Mes C Library: Prepare for M2-Planet: memcmp.
* lib/string/memcmp.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 19:13:07 +01:00
Jan Nieuwenhuizen c3292b8bce
mescc: Mes C Library: Prepare for M2-Planet: memcpy.
* lib/string/memcpy.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 19:13:07 +01:00
Jan Nieuwenhuizen 62a3c67030
mescc: Mes C Library: Prepare for M2-Planet: memchr.
* lib/string/memchr.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 13:54:03 +01:00
Jan Nieuwenhuizen 923fa91960
mescc: Mes C Library: Prepare for M2-Planet: strncmp.
* lib/string/strncmp.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 13:54:03 +01:00
Jan Nieuwenhuizen 7133038b50
mescc: Mes C Library: Prepare for M2-Planet: strlen.
* lib/string/strlen.c: : Rewrite C-constructs not supported by M2-Planet.
2019-11-02 13:54:03 +01:00
Jan Nieuwenhuizen dadc4a0927
mescc: Mes C Library: Prepare for M2-Planet: strcpy.
* lib/string/strcpy.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 13:54:03 +01:00
Jan Nieuwenhuizen aaee701eb1
mescc: Mes C Library: Prepare for M2-Planet: strcmp.
* lib/string/strcmp.c: Rewrite C-constructs not supported by M2-Planet.
2019-11-02 13:54:03 +01:00
Jan Nieuwenhuizen adde421a0e
mescc: Mes C Library: Prepare for M2-Planet: __assert_fail.
Rewrite C-constructs not supported by M2-Planet, such as

    foo ? bar : baz;       -> if (foo) bar; else baz;
    static char foo[1024]  -> __func_buf = malloc (1024); ... char *foo = __func_buf;
    *foo                   -> foo[0]
    foo++                  -> foo = foo + 1   TODO: pointer arithmetic
    foo += 1;              -> foo = foo + 1
    for (int foo = ;       -> int foo; for (foo=
    if (foo)               -> if (foo != 0)
    if (!foo)              -> if (foo == 0)
    ;                      -> 0;

* lib/mes/__assert_fail.c: Rewrite C-constructs not supported by
M2-Planet.
2019-11-02 13:54:03 +01:00
Jan Nieuwenhuizen ec66f33631
core: Use assert_msg.
* src/mes.c: Use assert_msg instead of assert.
* src/gc.c: Likewise.
* src/hash.c: Likewise.
* src/lib.c: Likewise.
* src/math.c: Likewise.
* src/module.c: Likewise.
* src/posix.c: Likewise.
* src/reader.c: Likewise.
* src/string.c: Likewise.
* src/struct.c: Likewise.
* src/vector.c: Likewise.
* simple.make (LIB_SOURCES): Add lib/mes/assert_msg.c.
2019-11-02 13:54:02 +01:00
Jan Nieuwenhuizen 6c94a05c95
mescc: Mes C Library: Add assert_msg.
* lib/mes/assert_msg.c: New file.
2019-11-02 13:54:02 +01:00
Jan Nieuwenhuizen 1765da6764
core: Prepare for M2-Planet: vector.c.
* src/vector.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:02 +01:00
Jan Nieuwenhuizen 1984322f01
core: Prepare for M2-Planet: struct.c.
* src/struct.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:02 +01:00
Jan Nieuwenhuizen a2c15661e9
core: Prepare for M2-Planet: string.c.
* src/string.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:02 +01:00
Jan Nieuwenhuizen 3daaab5f50
core: Prepare for M2-Planet: reader.c.
* src/reader.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:02 +01:00
Jan Nieuwenhuizen 9a453ec38a
core: Prepare for M2-Planet: posix.c.
* src/posix.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:01 +01:00
Jan Nieuwenhuizen e2d357408c
core: Prepare for M2-Planet: module.c.
* src/module.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:01 +01:00
Jan Nieuwenhuizen 5d4976ccfb
core: Prepare for M2-Planet: math.c.
* src/math.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:01 +01:00
Jan Nieuwenhuizen ba83a177d2
core: Prepare for M2-Planet: lib.c.
* src/lib.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:01 +01:00
Jan Nieuwenhuizen a0e73c52f2
core: Prepare for M2-Planet: hash.c.
* src/hash.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:01 +01:00
Jan Nieuwenhuizen 06bb5ff419
core: Prepare for M2-Planet: gc.c.
* src/gc.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:01 +01:00
Jan Nieuwenhuizen fd02098d52
core: Prepare for M2-Planet: builtins.c.
* src/builtins.c: Rewrite C constructs not supported by M2-Planet.
2019-11-02 13:54:00 +01:00
Jan Nieuwenhuizen b40a98582a
core: Prepare for M2-Planet: mes.c.
Rewrite C-constructs not supported by M2-Planet, such as

    foo ? bar : baz;       -> if (foo) bar; else baz;
    static char foo[1024]  -> __func_buf = malloc (1024); ... char *foo = __func_buf;
    *foo                   -> foo[0]
    foo++                  -> foo = foo + 1   TODO: pointer arithmetic
    foo += 1;              -> foo = foo + 1
    for (int foo = ;       -> int foo; for (foo=
    if (foo)               -> if (foo != 0)
    if (!foo)              -> if (foo == 0)
    ;                      -> 0;
    // ...                 -> /* ... */

* src/mes.c: Rewrite C constructs not supported by M2-Planet.
* include/mes/mes.h (__execl_c_argv, __getcwd_buf, __open_boot_buf,
__open_boot_file_name, __setenv_buf, __reader_read_char_buf): Declare
buffers.
(init): Initialize them.
* include/mes/macros.h(__M2_PLANET__): Temporary M2 macros.
2019-11-02 13:54:00 +01:00
Jan Nieuwenhuizen 64184055a1
mescc: stack: unbump WIP 2019-11-02 13:53:24 +01:00
Jan Nieuwenhuizen 9001e2aee6
build: Run indent for M2.
* src/gc.c: Indented.
* src/string.c: Likewise.
2019-11-02 13:53:24 +01:00
Jan Nieuwenhuizen 7d3ae63a57
build: mes-snarf.scm: Resurrect.
* build-aux/mes-snarf.scm (snarf-functions): Strip whitespace from
parameter list.
(function->source): Use function-scm-name, add (function1_t).
* build-aux/snarf.sh: Resurrect, combined dump to s, h, c.
* include/mes/builtins.h:
2019-11-02 13:53:24 +01:00
Jan Nieuwenhuizen 28edf91357
core: Split-out builtins.c.
* src/mes.c make_builtin_type, make_builtin, builtin_name,
builtin_arity, builtin_function, builtin_p, builtin_printer,
init_builtin, mes_builtins): Move to ..
* src/builtins.c: New file.
* build-aux/build-mes.sh (mes_sources): Add it.
* build-aux/snarf.sh: Likewise.
* include/mes/builtins.h: Remove constants.
* include/mes/mes.h: Add prototypes.
* include/mes/constants.h (cell_symbol_test): Rename from cell_test.
* simple.make: New file.
2019-11-02 13:53:24 +01:00
Jan Nieuwenhuizen 26243d5373
build: simple.make.
* simple.make: New file.
2019-11-02 13:53:23 +01:00
Jan Nieuwenhuizen cde8681e7e
tests: Add gc.test.
* tests/gc.test: New file.
* build-aux/check-mes.sh (TESTS): Add it.
* scaffold/gc-test.scm: Remove.
2019-11-02 13:53:23 +01:00
Jan Nieuwenhuizen dabb424e65
m2: Add scripts/m2-merge.scm.
* scripts/m2-merge.scm.in: New file.
* configure: Substitute it.
* .gitignore: Update.
2019-10-21 21:43:04 +02:00
Jan Nieuwenhuizen 60339608dc
doc update 2019-10-21 21:43:04 +02:00
Jan Nieuwenhuizen 1d1dcdfe40
mescc: Mes C Libray: Fix off_t.
* include/sys/types.h (off_t): Drop unsigned.
2019-10-21 21:43:04 +02:00
Danny Milosavljevic 738264c3bb
Add missing #include.
* lib/stdlib/mbstowcs.c: Add missing #include.
2019-10-21 21:43:04 +02:00
Danny Milosavljevic 30d362321e
Fix dtoab.
* lib/mes/dtoab.c (dtoab): Fix it.
* lib/tests/mes/90-dtoab.c (main): Fix test.
* build-aux/check-mescc.sh (XFAIL_TESTS: Remove it.
2019-10-21 21:43:03 +02:00
Danny Milosavljevic 11542affea
va_align: Fix compiler warning.
Follow-up to 49b0cd7d2e6952044d7436260d6ba950e40ee05f.

* include/stdarg.h: Fix compiler warning.
2019-10-05 17:38:20 +02:00
Danny Milosavljevic fce055e9da
Add missing #include.
* lib/tests/mes/90-abtod.c (main): Add missing #include.
2019-10-05 17:38:20 +02:00
Danny Milosavljevic a840c5398f
Fix variable argument list traversal for doubles.
* include/stdarg.h (va_align): New macro.
(va_arg8): New macro.
* lib/stdio/vfprintf.c (vfprintf): Use it.
* lib/stdio/vsnprintf.c (vsnprintf): Use it.
2019-10-05 17:38:19 +02:00
Jan Nieuwenhuizen 52b9dd2b0e
build: Improve --with-system-libc support.
* build-aux/build-lib.sh: Avoid building libc for --with-system-libc.
Make libmes richer.
build-aux/check-mescc.sh: Enable 50-malloc test.
* include/dirstream.h: Use HAVE_DIRSTREAM_H to cater for non-existing
dirstream.h.
* include/grp.h[SYSTEM_LIBC]: Typo.
* include/mes/lib.h (__brk, __call_at_exit)[SYSTEM_LIBC]: Declare.
* include/stdlib.h (comparison_fn_t)[SYSTEM_LIBC]: Declare.
* include/time.h (mktime): Return time_t.
* lib/posix/isatty.c [SYSTEM_LIBC]: Do not (re)declare termios.
* lib/stub/mktime.c (mktime): Return time_t.
* lib/tests/scaffold/41-ternary.c (main): Remove assumption that
locals are initialized.
* lib/tests/scaffold/70-stdarg.c: Cater for SYSTEM_LIBC.
* lib/tests/setjmp/80-setjmp.c: Declare jmp buf.
* lib/*/*.c: Add missing mes/lib.h, errno.h includes.
2019-10-05 17:38:15 +02:00
Jan Nieuwenhuizen 7181d3dd9a
mescc: Mes C Library: vfprintf, vsnprintf: Pad floats with space.
* lib/stdio/vfprintf.c (vfprintf): Pad floats with space.
* lib/stdio/vsnprintf.c (vsnprintf): Pad floats with space.
* lib/tests/stdio/90-sprintf.c: Test it.
2019-10-05 17:37:28 +02:00
Jan Nieuwenhuizen f4d6851c63
mescc: Mes C Library: vsscanf: Increase count for scanned float.
* lib/stdio/vsscanf.c (vsscanf): Increase count for scanned float.
2019-10-05 17:37:05 +02:00
Jan Nieuwenhuizen 36e9f532be
mescc: Mes C Library: Support GNU Tar: Fix getpwnam, getpwuid stubs.
* lib/stub/getpwnam.c (getpwnam): Return pointer to static struct
passwd.
* lib/stub/getpwuid.c (getpwuid): Likewise.
2019-10-05 17:37:04 +02:00
Jan Nieuwenhuizen eff0077d63
mescc: Mes C Library: Support GNU Tar: Add getgrgid, getgrnam, setgrent stub.
* include/grp.h: New file.
* lib/stub/getgrgid.c: New file.
* lib/stub/getgrnam.c: New file.
* lib/stub/setgrent.c: New file.
* lib/libc+gnu.c: Include them.
2019-10-05 17:37:04 +02:00
Jan Nieuwenhuizen a0efce35a0
mescc: Mes C Library: Support GNU Awk: Add wchar_t.
* include/sys/types.h (wchar_t): New typedef.
2019-10-05 17:37:04 +02:00
Jan Nieuwenhuizen 4cbdc75bb4
mescc: Mes C Library: Support GNU Awk: Add getpgid, getpgrp stubs.
* include/unistd.h (getpgid, getpgrp): Declare.
* lib/stub/getpgid.c: New file.
* lib/stub/getpgrp.c: New file.
* lib/libc+gnu.c: Include them.
2019-10-05 17:37:04 +02:00
Jan Nieuwenhuizen 1f21136539
mescc: Mes C Library: Support GNU Tar: Add mktime stub, fix localtime stub.
* include/time.h (mktime): Declare.
* lib/stub/mktime.c: New stub.
* lib/libc+gnu.c: Include it.
* lib/stub/localtime.c (localtime): Return pointer to static struct
tm.  Avoids segfaults.
2019-10-05 17:37:04 +02:00
Jan Nieuwenhuizen 18adda19fd
mescc: Mes C Library: Support GNU Tar: Add creat, mknod.
* include/linux/x86_64/syscall.h (SYS_mknod): New macro.
* include/linux/x86/syscall.h (SYS_mknod): New macro.
* lib/linux/mknod.c: New file.
* build-aux/configure-lib.sh (libc_gnu_SOURCES): Add it.
* include/sys/stat.h (mknod): Declare it.
* include/fcntl.h (creat): New macro.
2019-10-05 17:37:04 +02:00
Jan Nieuwenhuizen dfdaaa092b
mescc: Mes C Library: Support GNU Tar: Add missing defines.
* include/errno.h (ENXIO): New macro.
* include/sys/stat.h (S_IFIFO, S_ISFIFO): New macro.
2019-10-05 17:37:04 +02:00
Jan Nieuwenhuizen 9d29892750
mescc: Mes C Library: Support GNU Bash: Add struct winsize.
* include/termio.h (struct winsize): New type.
2019-10-05 17:37:03 +02:00
Jan Nieuwenhuizen 8b2e2cebde
mescc: Mes C Library: Support GNU Awk: Implement atof.
* lib/stdlib/atoi.c: Update.
* lib/stdlib/atof.c: Rename from stub/atof.c; Implement.
* lib/libc+gnu.c: Update include.
* lib/libg.c: Update include.
2019-10-05 17:37:03 +02:00
Jan Nieuwenhuizen 92e6a8e323
mescc: Mes C Library: Support GNU Awk: Add dtoab, %f in vfprintf, vsnprintf.
* include/libmes.h (dtoab): Declare.
* lib/mes/ntoab.c (ntoab): Update.
* lib/mes/dtoab.c: New file.
* build-aux/configure-lib.sh (libmes_SOURCES, libc_tcc_SOURCES): Add
it.
* lib/tests/mes/90-dtoab.c: Test it.
* lib/tests/stdio/90-sprintf.c: Test it.
* build-aux/check-mescc.sh (tests): Run it, against...
* lib/tests/mes/90-dtoab.stdout: ...baseline.
* lib/stdio/vfprintf.c (vfprintf): Support %f, even more naive support
for %e, %E, %g, %G.
* lib/stdio/vsnprintf.c (vsnprintf): Likewise.
2019-10-05 17:37:03 +02:00
Jan Nieuwenhuizen 5d40ba08b6
mescc: Mes C Library: Support GNU Awk: Add abtod, implementing strtod.
* include/libmes.h (abtod): Declare.
* lib/mes/abtod.c: New file.
* build-aux/configure-lib.sh (libmes_SOURCES, libc_tcc_SOURCES): Add
it.
* lib/mes/abtol.c: Update.
* lib/stdlib/strtod.c: Use it to implement; move from stub/strtod.
* lib/tests/mes/90-abtod.c: Test it.
* lib/tests/mes/90-abtod.stdout: Baseline.
* build-aux/check-mescc.sh (tests): Run it.
2019-10-05 17:37:03 +02:00
Jan Nieuwenhuizen e7e69fff7b
mescc: Mes C Library: Support GNU Awk: vsscanf: Support %f.
* lib/stdio/vsscanf.c (vsscanf): Support %f.
2019-10-05 17:37:03 +02:00
Jan Nieuwenhuizen 3f74342f36
mescc: Mes C Library: Support GNU Awk: Do not flush std files.
* lib/stdio/fflush.c (fflush): Do not flush std files.
2019-10-05 17:37:03 +02:00
Jan Nieuwenhuizen 5dfe2459c8
mescc: Mes C Library: Support GNU Awk: Add isgraph.
* lib/ctype/isgraph.c: New file.
* lib/libc+gnu.c: Include it.
* include/ctype.h: Add missing prototypes.
2019-10-05 17:37:03 +02:00
Jan Nieuwenhuizen 396b666b38
mescc: Mes C Library: Support GNU Tar: Add readlink, readlink.
* lib/linux/gnu.c (readlink, symlink): New function.
* include/unistd.h (readlink, symlink): Declare.
* include/linux/x86/syscall.h (SYS_readlink, SYS_symlink): New macro.
* include/linux/x86_64/syscall.h (SYS_symlink, SYS_readlink): New
macro.
2019-10-05 17:37:03 +02:00
Jan Nieuwenhuizen 30e931920d
mescc: Mes C Library: Support GNU Tar: Add execlp.
* lib/posix/execl.c (vexec): New function.
(execl): Use it.
* lib/posix/execlp.c: New file.
* build-aux/configure-lib.sh (libc_tcc_SOURCES): Add it.
* lib/libc+gnu.c: Include it.
* include/unistd.h (execlp): Declare.
* lib/tests/posix/90-execlp.c: New file.
* lib/tests/posix/90-execlp.stdout: New file.
* build-aux/check-mescc.sh: Test it.
2019-10-05 17:37:02 +02:00
Jan Nieuwenhuizen aae5f0f578
mescc: Mes C Library: Fix compile warnings.
* include/stdlib.h (abort): Add prototype.
2019-10-05 17:37:02 +02:00
Jan Nieuwenhuizen e086d0456d
mescc: Bump stack. WIP.
* scripts/mescc.in (MES_MAX_ARENA): Also set.
(MES_STACK): Bump to 10000000.
* build-aux/bootstrap.sh.in (MES_STACK): Likewise.  Export them.
2019-10-01 19:21:52 +02:00
Jan Nieuwenhuizen 0c542fe3f6
build: Split-out build-source-lib.sh from build-lib.sh.
* build-aux/build-lib.sh: Remove building of source lib.
* build-aux/build-source-lib.sh: New file.
* build-aux/build.sh.in: Invoke it.
* build-aux/bootstrap.sh.in: Likewise.
2019-10-01 19:21:52 +02:00
Jan Nieuwenhuizen a3a53037c8
build: Avoid tar --exclude=.
* build-aux/install.sh.in: Only use `tar --exclude=' if we also have .go
files compiled by Guile.
2019-10-01 19:21:52 +02:00
Jan Nieuwenhuizen 5492fffe04
build: mesar: Remove bashisms.
* scripts/mesar.in: Remove bashisms.
2019-10-01 19:21:51 +02:00
Jan Nieuwenhuizen 732530d9f9
configure.sh: Cleanup argument parsing. Thanks, Timothy!
* configure.sh: Cleanup argument parsing.
2019-10-01 19:21:51 +02:00
Jan Nieuwenhuizen 5de5853c76
configure.sh: Remove bashisms.
* configure.sh: Remove bashisms.  Fixes running with Gash 0.1.
2019-09-20 19:44:30 +02:00
Jan Nieuwenhuizen 9405075e09
Revert "nyacc: 0.86.0 compatibility stub. WIP"
This reverts commit 0183cc1c42437fda27196e27b490285a61d47f59.

While it works to run Nyacc 0.86.0, it breaks running Nyacc 0.93 and
up.  This would need more thought and work, adding a nyacc-compat
directory or so.  Seems not worth the effort right now.
2019-09-20 19:43:24 +02:00
Jan Nieuwenhuizen 8bed92b7bd
nyacc: 0.86.0 compatibility stub. WIP
* mes/module/nyacc/lang/c99/util.scm: 0.86.0 compatibility stub.
2019-09-20 19:42:50 +02:00
Jan Nieuwenhuizen 2d7c2f9791
doc: Post-release update.
* doc/announce/ANNOUNCE-0.20: Update.
* guix/git/mes.scm (mes): Update.
2019-09-20 19:42:50 +02:00
173 changed files with 7963 additions and 4163 deletions

74
.gitignore vendored
View File

@ -33,32 +33,15 @@
*.mini-hex2 *.mini-hex2
*.a *.a
*.o *.o
*.h.m2
*.c.m2
*.seed-out *.seed-out
*.stderr *.stderr
*.stdout *.stdout
*.x86-out *.x86-out
*.x86-mes-E /TAGS
*.x86-mes-S
*.x86-mes-gcc-a
*.x86-mes-gcc-o
*.x86-mes-gcc-out
*.x86-mes-gcc-stdout
*.x86-mes-o
*.x86-mes-out
*.x86-mes-stdout
*.x86_64-mes-E
*.x86_64-mes-S
*.x86_64-mes-gcc-a
*.x86_64-mes-gcc-o
*.x86_64-mes-gcc-out
*.x86_64-mes-gcc-stdout
*.x86_64-mes-o
*.x86_64-mes-out
*.x86_64-mes-stdout
*.x86_64-out
/lib/x86-mes/0exit-42 /lib/x86-mes/0exit-42
/lib/x86-mes/exit-42 /lib/x86-mes/exit-42
@ -69,58 +52,30 @@
!/lib/tests/*/*.exit !/lib/tests/*/*.exit
!/lib/tests/*/*.stdout !/lib/tests/*/*.stdout
/scaffold/*.M1
/scaffold/*.m2
/scaffold/*.hex2
/scaffold/argv /scaffold/argv
/scaffold/hello /scaffold/hello
/scaffold/main /scaffold/main
/scaffold/micro-mes /scaffold/micro-mes
/scaffold/read
/scaffold/tiny-mes /scaffold/tiny-mes
/scaffold/x86-mes-* /scaffold/argv-m2
/scaffold/x86_64-mes-* /scaffold/hello-m2
/scaffold/main-m2
/scaffold/tests/x86-mes-* /scaffold/micro-mes-m2
/scaffold/tests/[0-9a][0-9a-z]-* /scaffold/read-m2
/scaffold/tests/t.* /scaffold/tiny-mes-m2
!/scaffold/tests/*.c
!/scaffold/tests/*.exit
!/scaffold/tests/*.stdout
/src/mes.mes.symbols.h
/src/gc.mes.h
/src/hash.mes.h
/src/lib.mes.h
/src/math.mes.h
/src/mes.mes.h
/src/module.mes.h
/src/posix.mes.h
/src/reader.mes.h
/src/strings.mes.h
/src/struct.mes.h
/src/vector.mes.h
/src/gc.mes.i
/src/hash.mes.i
/src/lib.mes.i
/src/math.mes.i
/src/mes.mes.i
/src/module.mes.i
/src/posix.mes.i
/src/reader.mes.i
/src/strings.mes.i
/src/struct.mes.i
/src/vector.mes.i
/src/mes /src/mes
/src/x86-mes-mes
/src/x86_64-mes-mes
/.config
/.config.make /.config.make
/.store /.store
/.tarball-version /.tarball-version
#keep this: bootstrap
#/mes.mes
/out
? ?
?.mes ?.mes
\#*# \#*#
@ -147,6 +102,7 @@
/install.sh /install.sh
/uninstall.sh /uninstall.sh
/mes/module/mes/boot-0.scm /mes/module/mes/boot-0.scm
/scripts/m2-merge.scm
/scripts/mesar /scripts/mesar
/scripts/mescc.scm /scripts/mescc.scm
/scripts/mescc /scripts/mescc

View File

@ -20,8 +20,11 @@
LANG= LANG=
MES_ARENA=${MES_ARENA-100000000} MES_ARENA=${MES_ARENA-100000000}
MES_MAX_ARENA=${MES_MAX_ARENA-100000000} export MES_ARENA
MES_STACK=${MES_STACK-500000} MES_MAX_ARENA=${MES_MAX_ARENA-${MES_ARENA}}
export MES_MAX_ARENA
MES_STACK=${MES_STACK-10000000}
export MES_STACK
. build-aux/configure-lib.sh . build-aux/configure-lib.sh
@ -81,3 +84,15 @@ for c in $mes_SOURCES; do
done done
echo "CCLD src/mes" echo "CCLD src/mes"
$CC -nostdlib -o src/mes -L mescc-lib mescc-lib/crt1.o $objects -lc $CC -nostdlib -o src/mes -L mescc-lib mescc-lib/crt1.o $objects -lc
(
mkdir -p gcc-lib
cp config.sh gcc-lib
cd gcc-lib
compiler=gcc
if test -z "$srcdest"; then
srcdest=../
srcdir=../
fi
@SHELL@ ${srcdest}build-aux/build-source-lib.sh
)

View File

@ -79,26 +79,3 @@ cp libgetopt.a $mes_cpu-mes
if test -e libgetopt.s; then if test -e libgetopt.s; then
cp libgetopt.s $mes_cpu-mes cp libgetopt.s $mes_cpu-mes
fi fi
cp ${srcdest}lib/$mes_kernel/$mes_cpu-mes-$compiler/crt*.c $mes_cpu-mes
rm -f libc+gnu.c
cat > libc+gnu.c <<EOF
// Generated from Mes -- do not edit
// compiler: $compiler
// cpu: $mes_cpu
// bits: $mes_bits
// libc: $mes_libc
// kernel: $mes_kernel
// system: $mes_system
EOF
for c in $libc_gnu_SOURCES; do
echo "// $c" >> libc+gnu.c
cat ${srcdest}$c >> libc+gnu.c
echo >> libc+gnu.c
done
cp libc+gnu.c $mes_cpu-mes
cp ${srcdest}lib/libtcc1.c $mes_cpu-mes
cp ${srcdest}lib/posix/getopt.c $mes_cpu-mes/libgetopt.c

View File

@ -35,6 +35,11 @@ trap 'test -f .log && cat .log' EXIT
srcdest=${srcdest-} srcdest=${srcdest-}
mes_sources=" mes_sources="
src/builtins.c
src/cc.c
src/core.c
src/display.c
src/eval-apply.c
src/gc.c src/gc.c
src/hash.c src/hash.c
src/lib.c src/lib.c
@ -43,8 +48,10 @@ src/mes.c
src/module.c src/module.c
src/posix.c src/posix.c
src/reader.c src/reader.c
src/stack.c
src/string.c src/string.c
src/struct.c src/struct.c
src/symbol.c
src/vector.c src/vector.c
" "

View File

@ -0,0 +1,53 @@
#! /bin/sh
# GNU Mes --- Maxwell Equations of Software
# Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
#
# This file is part of GNU Mes.
#
# GNU Mes is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or (at
# your option) any later version.
#
# GNU Mes is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
set -e
if test "$V" = 2; then
set -x
fi
set -u
srcdest=${srcdest-}
. ${srcdest}build-aux/configure-lib.sh
mkdir -p $mes_cpu-mes
cp ${srcdest}lib/$mes_kernel/$mes_cpu-mes-$compiler/crt*.c $mes_cpu-mes
rm -f libc+gnu.c
cat > libc+gnu.c <<EOF
// Generated from Mes -- do not edit
// compiler: $compiler
// cpu: $mes_cpu
// bits: $mes_bits
// libc: $mes_libc
// kernel: $mes_kernel
// system: $mes_system
EOF
for c in $libc_gnu_SOURCES; do
echo "// $c" >> libc+gnu.c
cat ${srcdest}$c >> libc+gnu.c
echo >> libc+gnu.c
done
cp libc+gnu.c $mes_cpu-mes
cp ${srcdest}lib/libtcc1.c $mes_cpu-mes
cp ${srcdest}lib/posix/getopt.c $mes_cpu-mes/libgetopt.c

View File

@ -87,15 +87,15 @@ export CPPFLAGS
export LDFLAGS export LDFLAGS
export LIBS export LIBS
if test $compiler = gcc; then (
( mkdir -p gcc-lib
mkdir -p gcc-lib cp config.sh gcc-lib
cp config.sh gcc-lib cd gcc-lib
cd gcc-lib if test -z "$srcdest"; then
if test -z "$srcdest"; then srcdest=../
srcdest=../ srcdir=../
srcdir=../ fi
fi if test $compiler = gcc; then
CPPFLAGS=" CPPFLAGS="
-D HAVE_CONFIG_H=1 -D HAVE_CONFIG_H=1
-I include -I include
@ -104,8 +104,9 @@ if test $compiler = gcc; then
" "
${SHELL} ${srcdest}build-aux/build-lib.sh ${SHELL} ${srcdest}build-aux/build-lib.sh
cp crt1.o .. cp crt1.o ..
) fi
fi compiler=gcc ${SHELL} ${srcdest}build-aux/build-source-lib.sh
)
( (
if test $compiler = gcc; then if test $compiler = gcc; then
@ -145,4 +146,5 @@ fi
AR="${srcdest}pre-inst-env mesar" AR="${srcdest}pre-inst-env mesar"
CC="${srcdest}pre-inst-env mescc -m $mes_bits" CC="${srcdest}pre-inst-env mescc -m $mes_bits"
${SHELL} ${srcdest}build-aux/build-lib.sh ${SHELL} ${srcdest}build-aux/build-lib.sh
${SHELL} ${srcdest}build-aux/build-source-lib.sh
) )

View File

@ -77,7 +77,6 @@ scaffold/boot/2g-vector.scm
scaffold/boot/30-capture.scm scaffold/boot/30-capture.scm
scaffold/boot/31-capture-define.scm scaffold/boot/31-capture-define.scm
scaffold/boot/32-capture-modify-close.scm scaffold/boot/32-capture-modify-close.scm
scaffold/boot/32-capture-modify-close.scm
scaffold/boot/33-procedure-override-close.scm scaffold/boot/33-procedure-override-close.scm
scaffold/boot/34-cdr-override-close.scm scaffold/boot/34-cdr-override-close.scm
scaffold/boot/35-closure-modify.scm scaffold/boot/35-closure-modify.scm
@ -111,6 +110,7 @@ scaffold/boot/50-primitive-load.scm
scaffold/boot/53-closure-display.scm scaffold/boot/53-closure-display.scm
scaffold/boot/60-let-syntax.scm scaffold/boot/60-let-syntax.scm
scaffold/boot/call-cc.scm scaffold/boot/call-cc.scm
scaffold/boot/gc.scm
scaffold/boot/memory.scm scaffold/boot/memory.scm
scaffold/boot/numbers.scm scaffold/boot/numbers.scm
" "

View File

@ -27,6 +27,7 @@ tests/boot.test
tests/read.test tests/read.test
tests/srfi-0.test tests/srfi-0.test
tests/macro.test tests/macro.test
tests/gc.test
tests/perform.test tests/perform.test
tests/base.test tests/base.test
tests/quasiquote.test tests/quasiquote.test

View File

@ -200,12 +200,16 @@ if test -z "$bootstrap"; then
TESTS="$TESTS TESTS="$TESTS
lib/tests/dirent/90-readdir.c lib/tests/dirent/90-readdir.c
lib/tests/io/90-stat.c lib/tests/io/90-stat.c
lib/tests/mes/90-abtod.c
lib/tests/mes/90-dtoab.c
lib/tests/posix/90-execlp.c
lib/tests/posix/90-unsetenv.c lib/tests/posix/90-unsetenv.c
lib/tests/signal/90-signal.c lib/tests/signal/90-signal.c
lib/tests/stdio/90-fopen.c lib/tests/stdio/90-fopen.c
lib/tests/stdio/90-fopen-append.c lib/tests/stdio/90-fopen-append.c
lib/tests/stdio/90-fread-fwrite.c lib/tests/stdio/90-fread-fwrite.c
lib/tests/stdio/90-fseek.c lib/tests/stdio/90-fseek.c
lib/tests/stdio/90-sprintf.c
lib/tests/stdlib/90-strtol.c lib/tests/stdlib/90-strtol.c
lib/tests/string/90-snprintf.c lib/tests/string/90-snprintf.c
lib/tests/string/90-strpbrk.c lib/tests/string/90-strpbrk.c
@ -222,7 +226,7 @@ lib/tests/scaffold/a1-global-no-clobber.c
fi fi
XFAIL_TESTS=" XFAIL_TESTS="
lib/tests/stdio/90-sprintf.c lib/tests/mes/90-abtod.c
lib/tests/stdio/90-sprintf.c lib/tests/stdio/90-sprintf.c
" "
@ -232,6 +236,7 @@ lib/tests/scaffold/17-compare-unsigned-char-le.c
lib/tests/scaffold/17-compare-unsigned-short-le.c lib/tests/scaffold/17-compare-unsigned-short-le.c
lib/tests/scaffold/66-local-char-array.c lib/tests/scaffold/66-local-char-array.c
lib/tests/scaffold/72-typedef-struct-def-local.c lib/tests/scaffold/72-typedef-struct-def-local.c
lib/tests/mes/90-dtoab.c
lib/tests/scaffold/90-goto-var.c lib/tests/scaffold/90-goto-var.c
lib/tests/scaffold/91-goto-array.c lib/tests/scaffold/91-goto-array.c
" "
@ -248,11 +253,6 @@ lib/tests/scaffold/a0-call-trunc-int.c
fi fi
fi fi
if test $mes_cpu = x86; then
XFAIL_TESTS="$XFAIL_TESTS
"
fi
if test $mes_cpu = x86_64; then if test $mes_cpu = x86_64; then
XFAIL_TESTS="$XFAIL_TESTS XFAIL_TESTS="$XFAIL_TESTS
lib/tests/stdio/70-printf-stdarg.c lib/tests/stdio/70-printf-stdarg.c
@ -261,10 +261,12 @@ fi
if test $compiler = gcc; then if test $compiler = gcc; then
XFAIL_TESTS="$XFAIL_TESTS XFAIL_TESTS="$XFAIL_TESTS
lib/tests/mes/90-abtod.c
" "
if test $mes_cpu = x86; then if test $mes_cpu = x86; then
XFAIL_TESTS="$XFAIL_TESTS XFAIL_TESTS="$XFAIL_TESTS
lib/tests/mes/90-dtoab.c
" "
fi fi

View File

@ -76,6 +76,7 @@ if test $mes_libc = mes; then
lib/ctype/isdigit.c lib/ctype/isdigit.c
lib/ctype/isspace.c lib/ctype/isspace.c
lib/ctype/isxdigit.c lib/ctype/isxdigit.c
lib/mes/assert_msg.c
lib/posix/write.c lib/posix/write.c
lib/stdlib/atoi.c lib/stdlib/atoi.c
" "
@ -86,6 +87,8 @@ lib/linux/lseek.c
fi fi
else else
libmes_SOURCES="$libmes_SOURCES libmes_SOURCES="$libmes_SOURCES
lib/mes/abtod.c
lib/mes/dtoab.c
" "
fi fi
@ -156,6 +159,8 @@ lib/ctype/islower.c
lib/ctype/isupper.c lib/ctype/isupper.c
lib/ctype/tolower.c lib/ctype/tolower.c
lib/ctype/toupper.c lib/ctype/toupper.c
lib/mes/abtod.c
lib/mes/dtoab.c
lib/mes/search-path.c lib/mes/search-path.c
lib/posix/execvp.c lib/posix/execvp.c
lib/stdio/fclose.c lib/stdio/fclose.c
@ -180,6 +185,7 @@ lib/stdio/vsprintf.c
lib/stdio/vsscanf.c lib/stdio/vsscanf.c
lib/stdlib/calloc.c lib/stdlib/calloc.c
lib/stdlib/qsort.c lib/stdlib/qsort.c
lib/stdlib/strtod.c
lib/stdlib/strtof.c lib/stdlib/strtof.c
lib/stdlib/strtol.c lib/stdlib/strtol.c
lib/stdlib/strtold.c lib/stdlib/strtold.c
@ -199,7 +205,6 @@ lib/stub/ldexp.c
lib/stub/mprotect.c lib/stub/mprotect.c
lib/stub/localtime.c lib/stub/localtime.c
lib/stub/sigemptyset.c lib/stub/sigemptyset.c
lib/stub/strtod.c
lib/$mes_cpu-mes-$compiler/setjmp.c lib/$mes_cpu-mes-$compiler/setjmp.c
" "
@ -217,6 +222,7 @@ lib/ctype/isalnum.c
lib/ctype/isalpha.c lib/ctype/isalpha.c
lib/ctype/isascii.c lib/ctype/isascii.c
lib/ctype/iscntrl.c lib/ctype/iscntrl.c
lib/ctype/isgraph.c
lib/ctype/isprint.c lib/ctype/isprint.c
lib/ctype/ispunct.c lib/ctype/ispunct.c
lib/dirent/__getdirentries.c lib/dirent/__getdirentries.c
@ -227,6 +233,7 @@ lib/math/fabs.c
lib/mes/fdgets.c lib/mes/fdgets.c
lib/posix/alarm.c lib/posix/alarm.c
lib/posix/execl.c lib/posix/execl.c
lib/posix/execlp.c
lib/posix/mktemp.c lib/posix/mktemp.c
lib/posix/raise.c lib/posix/raise.c
lib/posix/sbrk.c lib/posix/sbrk.c
@ -243,6 +250,7 @@ lib/stdlib/abort.c
lib/stdlib/abs.c lib/stdlib/abs.c
lib/stdlib/alloca.c lib/stdlib/alloca.c
lib/stdlib/atexit.c lib/stdlib/atexit.c
lib/stdlib/atof.c
lib/stdlib/atol.c lib/stdlib/atol.c
lib/stdlib/mbstowcs.c lib/stdlib/mbstowcs.c
lib/string/bcmp.c lib/string/bcmp.c
@ -263,14 +271,20 @@ lib/stub/ctime.c
lib/stub/fpurge.c lib/stub/fpurge.c
lib/stub/freadahead.c lib/stub/freadahead.c
lib/stub/frexp.c lib/stub/frexp.c
lib/stub/getgrgid.c
lib/stub/getgrnam.c
lib/stub/getlogin.c lib/stub/getlogin.c
lib/stub/getpgid.c
lib/stub/getpgrp.c
lib/stub/getpwnam.c lib/stub/getpwnam.c
lib/stub/getpwuid.c lib/stub/getpwuid.c
lib/stub/gmtime.c lib/stub/gmtime.c
lib/stub/mktime.c
lib/stub/pclose.c lib/stub/pclose.c
lib/stub/popen.c lib/stub/popen.c
lib/stub/rand.c lib/stub/rand.c
lib/stub/setbuf.c lib/stub/setbuf.c
lib/stub/setgrent.c
lib/stub/setlocale.c lib/stub/setlocale.c
lib/stub/setvbuf.c lib/stub/setvbuf.c
lib/stub/sigaddset.c lib/stub/sigaddset.c
@ -303,14 +317,17 @@ lib/linux/kill.c
lib/linux/link.c lib/linux/link.c
lib/linux/lstat.c lib/linux/lstat.c
lib/linux/mkdir.c lib/linux/mkdir.c
lib/linux/mknod.c
lib/linux/nanosleep.c lib/linux/nanosleep.c
lib/linux/pipe.c lib/linux/pipe.c
lib/linux/readlink.c
lib/linux/rename.c lib/linux/rename.c
lib/linux/setgid.c lib/linux/setgid.c
lib/linux/settimer.c lib/linux/settimer.c
lib/linux/setuid.c lib/linux/setuid.c
lib/linux/signal.c lib/linux/signal.c
lib/linux/sigprogmask.c lib/linux/sigprogmask.c
lib/linux/symlink.c
" "
fi fi

View File

@ -19,3 +19,4 @@
# along with GNU Mes. If not, see <http://www.gnu.org/licenses/>. # along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
for i in $(find . -name '*.c' -o -name '*.h' -o -name '*.i'); do indent $i --no-tabs --line-length 110 --honour-newlines; done for i in $(find . -name '*.c' -o -name '*.h' -o -name '*.i'); do indent $i --no-tabs --line-length 110 --honour-newlines; done
rm -f $(find . -name '*~')

View File

@ -77,13 +77,15 @@ else
cp $_v ChangeLog ${DESTDIR}${docdir} cp $_v ChangeLog ${DESTDIR}${docdir}
fi fi
if test -f module/mescc.go; then
__exclude_go=--exclude='*.go'
__exclude_scm=--exclude='*.scm'
fi
mkdir -p $DESTDIR$libdir mkdir -p $DESTDIR$libdir
mkdir -p $DESTDIR$pkgdatadir mkdir -p $DESTDIR$pkgdatadir
# rm -f $(find lib -type f -a -executable)
# rm -f $(find scaffold -type f -a -executable)
tar -cf- -C ${srcdir} include lib/$mes_cpu-mes | tar -${v}xf- -C $DESTDIR$prefix tar -cf- -C ${srcdir} include lib/$mes_cpu-mes | tar -${v}xf- -C $DESTDIR$prefix
if test -z "$srcdest"; then if test -z "$srcdest"; then
tar -cf- --exclude='*.go' module | tar -${v}xf- -C $DESTDIR$pkgdatadir tar -cf- $__exclude_go module | tar -${v}xf- -C $DESTDIR$pkgdatadir
else else
tar -cf- -C ${srcdest} module | tar -${v}xf- -C $DESTDIR$pkgdatadir tar -cf- -C ${srcdest} module | tar -${v}xf- -C $DESTDIR$pkgdatadir
fi fi
@ -97,8 +99,8 @@ fi
mkdir -p ${DESTDIR}${guile_site_dir} mkdir -p ${DESTDIR}${guile_site_dir}
mkdir -p ${DESTDIR}${guile_site_ccache_dir} mkdir -p ${DESTDIR}${guile_site_ccache_dir}
tar -cf- -C ${srcdest}module --exclude='*.go' . | tar -${v}xf- -C ${DESTDIR}${guile_site_dir} tar -cf- -C ${srcdest}module $__exclude_go . | tar -${v}xf- -C ${DESTDIR}${guile_site_dir}
tar -cf- -C module --exclude='*.scm' . | tar -${v}xf- -C ${DESTDIR}${guile_site_ccache_dir} tar -cf- -C module $__exclude_scm . | tar -${v}xf- -C ${DESTDIR}${guile_site_ccache_dir}
if test -f doc/mes.info; then if test -f doc/mes.info; then
mkdir -p ${DESTDIR}${infodir} mkdir -p ${DESTDIR}${infodir}

View File

@ -4,7 +4,7 @@ exec ${GUILE-guile} --no-auto-compile -L $(dirname $0) -C $(dirname $0) -e '(mes
!# !#
;;; GNU Mes --- Maxwell Equations of Software ;;; GNU Mes --- Maxwell Equations of Software
;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> ;;; Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;; ;;;
;;; mes-snarf.scm: This file is part of GNU Mes. ;;; mes-snarf.scm: This file is part of GNU Mes.
;;; ;;;
@ -85,8 +85,7 @@ exec ${GUILE-guile} --no-auto-compile -L $(dirname $0) -C $(dirname $0) -e '(mes
(cut string-replace-string <> "_to_" "->") (cut string-replace-string <> "_to_" "->")
(cut string-replace-suffix <> "_x" "!") (cut string-replace-suffix <> "_x" "!")
(cut string-replace-suffix <> "_x_" "!-") (cut string-replace-suffix <> "_x_" "!-")
(cut string-replace-suffix <> "_p" "?") (cut string-replace-suffix <> "_p" "?"))
)
(function.name f)))) (function.name f))))
(if (not (string-suffix? "-" name)) name (if (not (string-suffix? "-" name)) name
(string-append "core:" (string-drop-right name 1)))))) (string-append "core:" (string-drop-right name 1))))))
@ -117,7 +116,7 @@ exec ${GUILE-guile} --no-auto-compile -L $(dirname $0) -C $(dirname $0) -e '(mes
(if (string-null? (function.formals f)) 0 (if (string-null? (function.formals f)) 0
(length (string-split (function.formals f) #\,))))) (length (string-split (function.formals f) #\,)))))
(n (if (eq? arity 'n) -1 arity))) (n (if (eq? arity 'n) -1 arity)))
(format #f " a = init_builtin (builtin_type, ~s, ~a, &~a, a);\n" (function.name f) n (function.name f)))) (format #f " a = init_builtin (builtin_type, ~s, ~a, &~a, a);\n" (function-scm-name f) n (function.name f))))
(define (disjoin . predicates) (define (disjoin . predicates)
(lambda (. arguments) (lambda (. arguments)
@ -150,9 +149,16 @@ exec ${GUILE-guile} --no-auto-compile -L $(dirname $0) -C $(dirname $0) -e '(mes
(not (string-prefix? "/" function)) (not (string-prefix? "/" function))
rest rest
(receive (parameter-list annotation) (receive (parameter-list annotation)
(apply values (string-split-string rest " ///")) (apply values (string-split-string rest " /*:"))
(let* ((parameters (string-drop parameter-list 1)) (let* ((parameters (string-trim-both parameter-list))
(parameters (string-drop parameters 1))
(parameters (string-drop-right parameters 1)) (parameters (string-drop-right parameters 1))
(annotation (if (string? annotation) (string-trim-both annotation)
annotation))
(annotation (if (and (string? annotation)
(string-suffix? "*/" annotation))
(string-drop-right annotation 2)
annotation))
(formals (if (string-null? parameters) '() (formals (if (string-null? parameters) '()
(string-split parameters #\,))) (string-split parameters #\,)))
(formals (map string-trim formals))) (formals (map string-trim formals)))

71
build-aux/pointer.sh Executable file
View File

@ -0,0 +1,71 @@
#! /bin/sh
set -x
ptr_once='s,([^N])(MACRO|NAME|VALUE) \(([^()]*)\),\1\3->\L\2,'
ptr_once='s,([^N])(BYTES|CAR|CDR|CLOSURE|CONTINUATION|LENGTH|MACRO|NAME|PORT|REF|STRING|STRUCT|TYPE|VALUE|VARIABLE|VECTOR) \(([^()]*)\),\1\3->\L\2,'
n_once='s,N(TYPE|CAR|CDR|LENGTH|VALUE|VECTOR) \(([^()]*)\),\2->\L\1,'
ncbytes='s,NC(BYTES) \(([^()]*)\),news_\L\1 (\2),'
cbytes='s,([^N])C(BYTES) \(([^()]*)\),\1cell_\L\2 (\3),'
cstring='s,C(STRING) \(([^()]*)\),cell_bytes (STRING (\2)),'
struct='s,SCM,struct scm*,g'
sed -ri \
-e 's,POINTER_CELLS=0,POINTER_CELLS=1', \
-e 's,#define POINTER_CELLS 0,#define POINTER_CELLS 1', \
-e "$ncbytes" \
-e "$cbytes" \
-e "$cstring" \
\
-e "$ncbytes" \
-e "$cbytes" \
-e "$cstring" \
\
-e "$ptr_once" \
-e "$ptr_once" \
-e "$ptr_once" \
-e 's,->\<struct\>,->structure,g' \
-e "$struct" \
\
-e "$n_once" \
-e "$n_once" \
\
-e 's,CAR \(([^()]*)\),\1->cdr,' \
-e 's,CAAR \(([^()]*)\),\1->car->car,' \
-e 's,CADR \(([^()]*)\),\1->cdr->car,' \
-e 's,CDAR \(([^()]*)\),\1->car->cdr,' \
-e 's,CDDR \(([^()]*)\),\1->cdr->cdr,' \
-e 's,CADAR \(([^()]*)\),\1->car->cdr->car,' \
-e 's,CADDR \(([^()]*)\),\1->cdr->cdr->car,' \
-e 's,CDADR \(([^()]*)\),\1->cdr->car->cdr,' \
-e 's,CDDDR \(([^()]*)\),\1->cdr->cdr->cdr,' \
-e 's,CDDAR \(([^()]*)\),\1->car->cdr->cdr,' \
-e 's,CDADAR \(([^()]*)\),\1->cdr->car->cdr->car,' \
\
include/mes/builtins.h \
include/mes/mes.h \
include/mes/symbols.h \
include/mes/builtins.h \
include/m2/lib.h \
include/mes/m2.h \
src/builtins.c \
src/cc.c \
src/core.c \
src/display.c \
src/eval-apply.c \
src/gc.c \
src/hash.c \
src/lib.c \
src/m2.c \
src/math.c \
src/mes.c \
src/module.c \
src/posix.c \
src/reader.c \
src/stack.c \
src/string.c \
src/struct.c \
src/symbol.c \
src/vector.c \
src/test/gc.c \
simple.make \

View File

@ -1,7 +1,7 @@
#! /bin/sh #! /bin/sh
# GNU Mes --- Maxwell Equations of Software # GNU Mes --- Maxwell Equations of Software
# Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> # Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
# #
# This file is part of GNU Mes. # This file is part of GNU Mes.
# #
@ -20,17 +20,43 @@
set -e set -e
. ${srcdest}build-aux/config.sh srcdest=${srcdest-./}
. ${srcdest}config.sh
. ${srcdest}build-aux/trace.sh . ${srcdest}build-aux/trace.sh
trace "SNARF$snarf gc.c" ${srcdest}build-aux/mes-snarf.scm src/gc.c trace "SNARF$snarf builtins.c" ${srcdest}build-aux/mes-snarf.scm src/builtins.c
trace "SNARF$snarf hash.c" ${srcdest}build-aux/mes-snarf.scm src/hash.c trace "SNARF$snarf core.c" ${srcdest}build-aux/mes-snarf.scm src/core.c
trace "SNARF$snarf lib.c" ${srcdest}build-aux/mes-snarf.scm src/lib.c trace "SNARF$snarf display.c" ${srcdest}build-aux/mes-snarf.scm src/display.c
trace "SNARF$snarf math.c" ${srcdest}build-aux/mes-snarf.scm src/math.c trace "SNARF$snarf eval-apply.c" ${srcdest}build-aux/mes-snarf.scm src/eval-apply.c
trace "SNARF$snarf mes.c" ${srcdest}build-aux/mes-snarf.scm src/mes.c trace "SNARF$snarf gc.c" ${srcdest}build-aux/mes-snarf.scm src/gc.c
trace "SNARF$snarf module.c" ${srcdest}build-aux/mes-snarf.scm src/module.c trace "SNARF$snarf hash.c" ${srcdest}build-aux/mes-snarf.scm src/hash.c
trace "SNARF$snarf posix.c" ${srcdest}build-aux/mes-snarf.scm src/posix.c trace "SNARF$snarf lib.c" ${srcdest}build-aux/mes-snarf.scm src/lib.c
trace "SNARF$snarf reader.c" ${srcdest}build-aux/mes-snarf.scm src/reader.c trace "SNARF$snarf math.c" ${srcdest}build-aux/mes-snarf.scm src/math.c
trace "SNARF$snarf strings.c" ${srcdest}build-aux/mes-snarf.scm src/string.c trace "SNARF$snarf mes.c" ${srcdest}build-aux/mes-snarf.scm src/mes.c
trace "SNARF$snarf struct.c" ${srcdest}build-aux/mes-snarf.scm src/struct.c trace "SNARF$snarf module.c" ${srcdest}build-aux/mes-snarf.scm src/module.c
trace "SNARF$snarf vector.c" ${srcdest}build-aux/mes-snarf.scm src/vector.c trace "SNARF$snarf posix.c" ${srcdest}build-aux/mes-snarf.scm src/posix.c
trace "SNARF$snarf reader.c" ${srcdest}build-aux/mes-snarf.scm src/reader.c
trace "SNARF$snarf stack.c" ${srcdest}build-aux/mes-snarf.scm src/string.c
trace "SNARF$snarf strings.c" ${srcdest}build-aux/mes-snarf.scm src/string.c
trace "SNARF$snarf struct.c" ${srcdest}build-aux/mes-snarf.scm src/struct.c
trace "SNARF$snarf symbol.c" ${srcdest}build-aux/mes-snarf.scm src/symbol.c
trace "SNARF$snarf vector.c" ${srcdest}build-aux/mes-snarf.scm src/vector.c
for i in src/*.symbols.h; do
n=$(basename $i .symbols.h)
echo "/* src/$n.c */"
cat $i
mv $i $(basename $i .symbols.h).s
done > s
for i in src/*.h; do
n=$(basename $i .h)
echo "/* src/$n.c */"
cat $i
done > h
for i in src/*.i; do
n=$(basename $i .i)
echo " /* src/$n.c */"
cat $i
done > c

2
configure vendored
View File

@ -632,11 +632,13 @@ See \"Porting GNU Mes\" in the manual, or try --with-courage\n" mes-system)
"build-aux/install.sh.in" "build-aux/install.sh.in"
"build-aux/pre-inst-env.in" "build-aux/pre-inst-env.in"
"build-aux/uninstall.sh.in" "build-aux/uninstall.sh.in"
"scripts/m2-merge.scm.in"
"scripts/mesar.in" "scripts/mesar.in"
"scripts/mescc.scm.in" "scripts/mescc.scm.in"
"scripts/mescc.in" "scripts/mescc.in"
)) ))
(chmod "pre-inst-env" #o755) (chmod "pre-inst-env" #o755)
(chmod "scripts/m2-merge.scm" #o755)
(chmod "scripts/mesar" #o755) (chmod "scripts/mesar" #o755)
(chmod "scripts/mescc" #o755) (chmod "scripts/mescc" #o755)
(chmod "scripts/mescc.scm" #o755) (chmod "scripts/mescc.scm" #o755)

View File

@ -24,65 +24,35 @@ VERSION=0.20
srcdir=${srcdir-$(dirname $0)} srcdir=${srcdir-$(dirname $0)}
. ${srcdest}build-aux/trace.sh . ${srcdest}build-aux/trace.sh
# parse --with-system-libc # parse arguments
cmdline=$(echo " $@") while [ $# -gt 0 ]; do
p=${cmdline/ --with-system-libc/} case $1 in
if test "$p" != "$cmdline"; then (--with-courage)
mes_libc=${mes_libc-system} courageous=true
else ;;
mes_libc=mes (--with-system-libc)
fi mes_libc=system
;;
(--build=*)
build=${1#--build=}
;;
(--host=*)
host=${1#--host=}
;;
(--prefix=*)
prefix=${1#--prefix=}
;;
(--program-prefix=*)
program_prefix=${1#--program-prefix=}
;;
esac
shift
done
# parse --with-courage prefix=${prefix-/usr/local}
cmdline=$(echo " $@") mes_libc=${mes_libc-mes}
p=${cmdline/ --with-courage/} courageous=${courageous-false}
if test "$p" != "$cmdline"; then host=${host-$build}
courageous=true
else
courageous=false
fi
# parse --prefix=PREFIX
p=${cmdline/ --prefix=/ -prefix=}
if test "$p" != "$cmdline"; then
p=${p##* -prefix=}
p=${p% *}
p=${p% -*}
prefix=${p-/usr/local}
else
prefix=${prefix-/usr/local}
fi
# parse --build=BUILD
p=${cmdline/ --build=/ -build=}
if [ "$p" != "$cmdline" ]; then
p=${p##* -build=}
p=${p% *}
p=${p% -*}
build=${p-$build}
else
build=$build
fi
# parse --host=HOST
p=${cmdline/ --host=/ -host=}
if [ "$p" != "$cmdline" ]; then
p=${p##* -host=}
p=${p% *}
p=${p% -*}
host=${p-$build}
elif test -n "$build"; then
host=${host-$build}
fi
# parse --program-prefix=
p=${cmdline/ --program-prefix=/ -program-prefix=}
if test "$p" != "$cmdline"; then
p=${p##* -program-prefix=}
p=${p% *}
p=${p% -*}
program_prefix=$p
fi
AR=${AR-$(command -v ar)} || true AR=${AR-$(command -v ar)} || true
BASH=${BASH-$(command -v bash)} BASH=${BASH-$(command -v bash)}

View File

@ -7,7 +7,9 @@ We are pleased to announce the release of GNU Mes 0.20, representing
147 commits over 38 weeks. 147 commits over 38 weeks.
Mes has now brought the Reduced Binary Seed bootstrap to Guix (bootstrap Mes has now brought the Reduced Binary Seed bootstrap to Guix (bootstrap
a GNU/Linux system without binary GNU toolchain or equivalent). a GNU/Linux system without binary GNU toolchain or equivalent). It
should land in Guix master any day now: a big thank you to everyone who
helped, notably Ludovic and Mark.
This release is a step towards the upcoming Scheme-only bootstrap and This release is a step towards the upcoming Scheme-only bootstrap and
bringing Mes into NixOS and Debian. This effort is now sponsored by bringing Mes into NixOS and Debian. This effort is now sponsored by
@ -67,8 +69,8 @@ Packages are available in Guix master.
Here are the MD5 and SHA1 checksums: Here are the MD5 and SHA1 checksums:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx mes-0.20.tar.gz df839a83e4a2ad6c2a4accc5bf17b1a7 mes-0.20.tar.gz
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx mes-0.20.tar.gz 38d4cb3fa28fa1f5fc57fea9e046d4d8052bbb8c mes-0.20.tar.gz
[*] Use a .sig file to verify that the corresponding file (without the [*] Use a .sig file to verify that the corresponding file (without the
.sig suffix) is intact. First, be sure to download both the .sig file .sig suffix) is intact. First, be sure to download both the .sig file
@ -83,6 +85,11 @@ Packages are available in Guix master.
and rerun the 'gpg --verify' command. and rerun the 'gpg --verify' command.
* Get informed, get involved
See https://bootstrappable.org
Join #bootstrappable on irc.freenode.net.
* Changes in 0.20 since 0.19 * Changes in 0.20 since 0.19
** Core ** Core
*** The build system has been simplified, again. *** The build system has been simplified, again.
@ -108,6 +115,9 @@ Packages are available in Guix master.
*** string->number now support #x hex-prefix. *** string->number now support #x hex-prefix.
*** ungetc now has a buffer per file handle. *** ungetc now has a buffer per file handle.
Greetings,
janneke and Danny.
[0] https://www.gnu.org/software/mes [0] https://www.gnu.org/software/mes
[1] http://joyofsource.com/reduced-binary-seed-bootstrap.html [1] http://joyofsource.com/reduced-binary-seed-bootstrap.html
[2] https://www.gnu.org/software/guix [2] https://www.gnu.org/software/guix
@ -119,5 +129,5 @@ Packages are available in Guix master.
[8] https://www.nongnu.org/nyacc [8] https://www.nongnu.org/nyacc
[9] https://gitlab.com/janneke/tinycc [9] https://gitlab.com/janneke/tinycc
[10] http://www.softwarepreservation.org/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf [10] http://www.softwarepreservation.org/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf
[11] https://github.com/oriansj/stage0 [11] https://savannah.nongnu.org/projects/stage0
[12] https://nlnet.nl/project/GNUMes [12] https://nlnet.nl/project/GNUMes

View File

@ -131,7 +131,7 @@ extensive examples, including parsers for the Javascript and C99 languages.")
(uri (string-append (uri (string-append
"https://ftp.gnu.org/pub/gnu/mes/mes-" version ".tar.gz")) "https://ftp.gnu.org/pub/gnu/mes/mes-" version ".tar.gz"))
(sha256 (sha256
(base32 #!mes!# "06qkwkahcpzk5v4qydpvcvzm7lx8g8pflc48f9l7bpjz6hl5lk4s")))) (base32 #!mes!# "04pajp8v31na34ls4730ig5f6miiplhdvkmsb9ls1b8bbmw2vb4n"))))
(build-system gnu-build-system) (build-system gnu-build-system)
(supported-systems '("i686-linux" "x86_64-linux")) (supported-systems '("i686-linux" "x86_64-linux"))
(propagated-inputs (propagated-inputs

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software * GNU Mes --- Maxwell Equations of Software
* Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of GNU Mes. * This file is part of GNU Mes.
* *
@ -35,6 +35,7 @@ int isalpha (int c);
int isascii (int c); int isascii (int c);
int iscntrl (int c); int iscntrl (int c);
int isdigit (int c); int isdigit (int c);
int isgraph (int c);
int islower (int c); int islower (int c);
int isnumber (int c, int base); int isnumber (int c, int base);
int isprint (int c); int isprint (int c);

View File

@ -38,14 +38,16 @@ int errno;
#define ENOENT 2 #define ENOENT 2
#define EINTR 4 #define EINTR 4
#define EIO 5 #define EIO 5
#define ENXIO 6
#define E2BIG 7 #define E2BIG 7
#define ENOEXEC 8 #define ENOEXEC 8
#define EBADF 9 #define EBADF 9
#define ECHILD 10 #define ECHILD 10
#define EAGAIN 11 #define EAGAIN 11
#define ENOMEM 12 #define ENOMEM 12
#define EACCES 13 #define EACCES 13
#define EEXIST 17 #define EEXIST 17
#define EXDEV 18
#define ENOTDIR 20 #define ENOTDIR 20
#define EISDIR 21 #define EISDIR 21
#define EINVAL 22 #define EINVAL 22

View File

@ -48,6 +48,7 @@
#define F_GETFL 3 #define F_GETFL 3
#define F_SETFL 4 #define F_SETFL 4
#define creat(file_name, mode) open (file_name, O_WRONLY | O_CREAT | O_TRUNC, mode)
int dup (int old); int dup (int old);
int dup2 (int old, int new); int dup2 (int old, int new);
int fcntl (int filedes, int command, ...); int fcntl (int filedes, int command, ...);

View File

@ -20,34 +20,61 @@
#ifndef __MES_LINUX_X86_SYSCALL_H #ifndef __MES_LINUX_X86_SYSCALL_H
#define __MES_LINUX_X86_SYSCALL_H 1 #define __MES_LINUX_X86_SYSCALL_H 1
// libc-mini /* libc-mini */
// #define SYS_exit 0x01 #ifndef SYS_exit
// #define SYS_write 0x04 // CONSTANT SYS_exit 0x01
#define SYS_exit 0x01
#endif
#ifndef SYS_write
// CONSTANT SYS_write 0x04
#define SYS_write 0x04
#endif
// libc /* libc */
// CONSTANT SYS_fork 0x02
#define SYS_fork 0x02 #define SYS_fork 0x02
// CONSTANT SYS_read 0x03
#define SYS_read 0x03 #define SYS_read 0x03
// CONSTANT SYS_open 0x05
#define SYS_open 0x05 #define SYS_open 0x05
// CONSTANT SYS_waitpid 0x07
#define SYS_waitpid 0x07 #define SYS_waitpid 0x07
// CONSTANT SYS_wait4 0x72
#define SYS_wait4 0x72 #define SYS_wait4 0x72
// CONSTANT SYS_execve 0x0b
#define SYS_execve 0x0b #define SYS_execve 0x0b
// CONSTANT SYS_chmod 0x0f
#define SYS_chmod 0x0f #define SYS_chmod 0x0f
// CONSTANT SYS_access 0x21
#define SYS_access 0x21 #define SYS_access 0x21
// CONSTANT SYS_brk 0x2d
#define SYS_brk 0x2d #define SYS_brk 0x2d
// CONSTANT SYS_ioctl 0x36
#define SYS_ioctl 0x36 #define SYS_ioctl 0x36
// CONSTANT SYS_fsync 0x76
#define SYS_fsync 0x76 #define SYS_fsync 0x76
// CONSTANT SYS_getcwd 0xb7
// libc+tcc
#define SYS_close 0x06
#define SYS_time 0x0d
#define SYS_lseek 0x13
#define SYS_unlink 0x0a
#define SYS_rmdir 0x28
#define SYS_gettimeofday 0x4e
#define SYS_stat 0x6a
#define SYS_getcwd 0xb7 #define SYS_getcwd 0xb7
// CONSTANT SYS_dup 0x29
#define SYS_dup 0x29
// CONSTANT SYS_dup2 0x3f
#define SYS_dup2 0x3f
// CONSTANT SYS_unlink 0x0a
#define SYS_unlink 0x0a
// CONSTANT SYS_gettimeofday 0x4e
#define SYS_gettimeofday 0x4e
// CONSTANT SYS_clock_gettime 0x109
#define SYS_clock_gettime 0x109
// CONSTANT SYS_time 0x0d
#define SYS_time 0x0d
// libc+gnu /* libc+tcc */
#define SYS_close 0x06
#define SYS_lseek 0x13
#define SYS_rmdir 0x28
#define SYS_stat 0x6a
/* libc+gnu */
#define SYS_chdir 0x0c #define SYS_chdir 0x0c
#define SYS_link 0x09 #define SYS_link 0x09
@ -56,7 +83,6 @@
#define SYS_kill 0x25 #define SYS_kill 0x25
#define SYS_rename 0x26 #define SYS_rename 0x26
#define SYS_mkdir 0x27 #define SYS_mkdir 0x27
#define SYS_dup 0x29
#define SYS_pipe 0x2a #define SYS_pipe 0x2a
#define SYS_getgid 0x2f #define SYS_getgid 0x2f
#define SYS_signal 0x30 #define SYS_signal 0x30
@ -64,23 +90,26 @@
#define SYS_rt_sigaction 0xae #define SYS_rt_sigaction 0xae
#define SYS_signal 0x30 #define SYS_signal 0x30
#define SYS_fcntl 0x37 #define SYS_fcntl 0x37
#define SYS_dup2 0x3f
#define SYS_getrusage 0x4d #define SYS_getrusage 0x4d
#define SYS_lstat 0x6b #define SYS_lstat 0x6b
#define SYS_setitimer 0x68 #define SYS_setitimer 0x68
#define SYS_fstat 0x6c #define SYS_fstat 0x6c
#define SYS_nanosleep 0xa2 #define SYS_nanosleep 0xa2
#define SYS_getdents 0x8d #define SYS_getdents 0x8d
#define SYS_clock_gettime 0x109
// bash /* bash */
#define SYS_setuid 0x17 #define SYS_setuid 0x17
#define SYS_geteuid 0x31 #define SYS_geteuid 0x31
#define SYS_getegid 0x32 #define SYS_getegid 0x32
#define SYS_setgid 0x3e #define SYS_setgid 0x3e
#define SYS_getppid 0x40 #define SYS_getppid 0x40
// make+POSIX /* make+POSIX */
#define SYS_sigprocmask 0x7e #define SYS_sigprocmask 0x7e
#endif // __MES_LINUX_X86_SYSCALL_H /* tar */
#define SYS_symlink 0x53
#define SYS_readlink 0x55
#define SYS_mknod 0x0e
#endif /* __MES_LINUX_X86_SYSCALL_H */

View File

@ -80,4 +80,9 @@
// make+SYSTEM_LIBC // make+SYSTEM_LIBC
#define SYS_rt_sigprocmask 0x0e #define SYS_rt_sigprocmask 0x0e
// tar
#define SYS_symlink 0x58
#define SYS_readlink 0x59
#define SYS_mknod 0x85
#endif // __MES_LINUX_X86_64_SYSCALL_H #endif // __MES_LINUX_X86_64_SYSCALL_H

64
include/m2/lib.h Normal file
View File

@ -0,0 +1,64 @@
/*
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __M2_LIB_H
#define __M2_LIB_H
char **environ;
int __stdin;
int __stdout;
int __stderr;
int errno;
// CONSTANT EOF 0xffffffff
// CONSTANT __FILEDES_MAX 512
char *itoa (int number);
char *ltoa (long number);
int __ungetc_p (int filedes);
int eputs (char *s);
int oputs (char *s);
int puts (char *s);
size_t strlen (char *s);
ssize_t _write ();
ssize_t write (int filedes, void *buffer, size_t size);
void __ungetc_clear (int filedes);
void __ungetc_init ();
void __ungetc_set (int filedes, int c);
struct timezone
{
int tz_minuteswest;
int tz_dsttime;
};
struct timespec
{
long tv_sec;
long tv_nsec;
};
struct timeval
{
long tv_sec;
long tv_usec;
};
#endif /* __M2_LIB_H */

View File

@ -21,396 +21,166 @@
#ifndef __MES_BUILTINS_H #ifndef __MES_BUILTINS_H
#define __MES_BUILTINS_H #define __MES_BUILTINS_H
// src/gc.mes /* src/builtins.c */
SCM gc_check (); struct scm* make_builtin (struct scm* builtin_type, struct scm* name, struct scm* arity, struct scm* function);
SCM gc (); struct scm* builtin_name (struct scm* builtin);
// src/hash.mes struct scm* builtin_arity (struct scm* builtin);
SCM hashq (SCM x, SCM size); struct scm* builtin_p (struct scm* x);
SCM hash (SCM x, SCM size); struct scm* builtin_printer (struct scm* builtin);
SCM hashq_get_handle (SCM table, SCM key, SCM dflt); /* src/display.c */
SCM hashq_ref (SCM table, SCM key, SCM dflt); struct scm* display_ (struct scm* x);
SCM hash_ref (SCM table, SCM key, SCM dflt); struct scm* display_error_ (struct scm* x);
SCM hashq_set_x (SCM table, SCM key, SCM value); struct scm* display_port_ (struct scm* x, struct scm* p);
SCM hash_set_x (SCM table, SCM key, SCM value); struct scm* write_ (struct scm* x);
SCM hash_table_printer (SCM table); struct scm* write_error_ (struct scm* x);
SCM make_hash_table (SCM x); struct scm* write_port_ (struct scm* x, struct scm* p);
// src/lib.mes /* src/eval-apply.c */
SCM procedure_name_ (SCM x); struct scm* pairlis (struct scm* x, struct scm* y, struct scm* a);
SCM display_ (SCM x); struct scm* set_car_x (struct scm* x, struct scm* e);
SCM display_error_ (SCM x); struct scm* set_cdr_x (struct scm* x, struct scm* e);
SCM display_port_ (SCM x, SCM p); struct scm* set_env_x (struct scm* x, struct scm* e, struct scm* a);
SCM write_ (SCM x); struct scm* macro_get_handle (struct scm* name);
SCM write_error_ (SCM x); struct scm* add_formals (struct scm* formals, struct scm* x);
SCM write_port_ (SCM x, SCM p); struct scm* eval_apply ();
SCM exit_ (SCM x); /* src/gc.c */
SCM frame_printer (SCM frame); struct scm* gc_check ();
SCM make_stack (SCM stack); struct scm* gc ();
SCM stack_length (SCM stack); /* src/hash.c */
SCM stack_ref (SCM stack, SCM index); struct scm* hashq (struct scm* x, struct scm* size);
SCM xassq (SCM x, SCM a); struct scm* hash (struct scm* x, struct scm* size);
SCM memq (SCM x, SCM a); struct scm* hashq_get_handle (struct scm* table, struct scm* key, struct scm* dflt);
SCM equal2_p (SCM a, SCM b); struct scm* hashq_ref (struct scm* table, struct scm* key, struct scm* dflt);
SCM last_pair (SCM x); struct scm* hash_ref (struct scm* table, struct scm* key, struct scm* dflt);
SCM pair_p (SCM x); struct scm* hashq_set_x (struct scm* table, struct scm* key, struct scm* value);
// src/math.mes struct scm* hash_set_x (struct scm* table, struct scm* key, struct scm* value);
SCM greater_p (SCM x); struct scm* hash_table_printer (struct scm* table);
SCM less_p (SCM x); struct scm* make_hash_table (struct scm* x);
SCM is_p (SCM x); /* src/lib.c */
SCM minus (SCM x); struct scm* exit_ (struct scm* x);
SCM plus (SCM x); struct scm* frame_printer (struct scm* frame);
SCM divide (SCM x); struct scm* make_stack (struct scm* stack);
SCM modulo (SCM a, SCM b); struct scm* stack_length (struct scm* stack);
SCM multiply (SCM x); struct scm* stack_ref (struct scm* stack, struct scm* index);
SCM logand (SCM x); struct scm* xassq (struct scm* x, struct scm* a);
SCM logior (SCM x); struct scm* memq (struct scm* x, struct scm* a);
SCM lognot (SCM x); struct scm* equal2_p (struct scm* a, struct scm* b);
SCM logxor (SCM x); struct scm* last_pair (struct scm* x);
SCM ash (SCM n, SCM count); struct scm* pair_p (struct scm* x);
// src/mes.mes struct scm* char_to_integer (struct scm* x);
SCM make_cell_ (SCM type, SCM car, SCM cdr); struct scm* integer_to_char (struct scm* x);
SCM type_ (SCM x); /* src/math.mes */
SCM car_ (SCM x); struct scm* greater_p (struct scm* x);
SCM cdr_ (SCM x); struct scm* less_p (struct scm* x);
SCM arity_ (SCM x); struct scm* is_p (struct scm* x);
SCM cons (SCM x, SCM y); struct scm* minus (struct scm* x);
SCM car (SCM x); struct scm* plus (struct scm* x);
SCM cdr (SCM x); struct scm* divide (struct scm* x);
SCM list (SCM x); struct scm* modulo (struct scm* a, struct scm* b);
SCM null_p (SCM x); struct scm* multiply (struct scm* x);
SCM eq_p (SCM x, SCM y); struct scm* logand (struct scm* x);
SCM values (SCM x); struct scm* logior (struct scm* x);
SCM acons (SCM key, SCM value, SCM alist); struct scm* lognot (struct scm* x);
SCM length (SCM x); struct scm* logxor (struct scm* x);
SCM error (SCM key, SCM x); struct scm* ash (struct scm* n, struct scm* count);
SCM append2 (SCM x, SCM y); /* src/mes.c */
SCM append_reverse (SCM x, SCM y); struct scm* make_cell_ (struct scm* type, struct scm* car, struct scm* cdr);
SCM reverse_x_ (SCM x, SCM t); struct scm* type_ (struct scm* x);
SCM pairlis (SCM x, SCM y, SCM a); struct scm* car_ (struct scm* x);
SCM call (SCM fn, SCM x); struct scm* cdr_ (struct scm* x);
SCM assq (SCM x, SCM a); struct scm* cons (struct scm* x, struct scm* y);
SCM assoc (SCM x, SCM a); struct scm* car (struct scm* x);
SCM set_car_x (SCM x, SCM e); struct scm* cdr (struct scm* x);
SCM set_cdr_x (SCM x, SCM e); struct scm* list (struct scm* x);
SCM set_env_x (SCM x, SCM e, SCM a); struct scm* null_p (struct scm* x);
SCM macro_get_handle (SCM name); struct scm* eq_p (struct scm* x, struct scm* y);
SCM add_formals (SCM formals, SCM x); struct scm* values (struct scm* x);
SCM eval_apply (); struct scm* acons (struct scm* key, struct scm* value, struct scm* alist);
SCM make_builtin_type (); struct scm* length (struct scm* x);
SCM make_builtin (SCM builtin_type, SCM name, SCM arity, SCM function); struct scm* error (struct scm* key, struct scm* x);
SCM builtin_arity (SCM builtin); struct scm* append2 (struct scm* x, struct scm* y);
SCM builtin_p (SCM x); struct scm* append_reverse (struct scm* x, struct scm* y);
SCM builtin_printer (SCM builtin); struct scm* reverse_x_ (struct scm* x, struct scm* t);
// CONSTANT cell_nil 1 struct scm* assq (struct scm* x, struct scm* a);
#define cell_nil 1 struct scm* assoc (struct scm* x, struct scm* a);
// CONSTANT cell_f 2 struct scm* set_car_x (struct scm* x, struct scm* e);
#define cell_f 2 struct scm* set_cdr_x (struct scm* x, struct scm* e);
// CONSTANT cell_t 3 struct scm* set_env_x (struct scm* x, struct scm* e, struct scm* a);
#define cell_t 3 struct scm* add_formals (struct scm* formals, struct scm* x);
// CONSTANT cell_dot 4 struct scm* eval_apply ();
#define cell_dot 4 /* src/module.c */
// CONSTANT cell_arrow 5 struct scm* make_module_type ();
#define cell_arrow 5 struct scm* module_printer (struct scm* module);
// CONSTANT cell_undefined 6 struct scm* module_variable (struct scm* module, struct scm* name);
#define cell_undefined 6 struct scm* module_ref (struct scm* module, struct scm* name);
// CONSTANT cell_unspecified 7 struct scm* module_define_x (struct scm* module, struct scm* name, struct scm* value);
#define cell_unspecified 7 /* src/posix.c */
// CONSTANT cell_closure 8 struct scm* peek_byte ();
#define cell_closure 8 struct scm* read_byte ();
// CONSTANT cell_circular 9 struct scm* unread_byte (struct scm* i);
#define cell_circular 9 struct scm* peek_char ();
// CONSTANT cell_begin 10 struct scm* read_char (struct scm* port);
#define cell_begin 10 struct scm* unread_char (struct scm* i);
// CONSTANT cell_call_with_current_continuation 11 struct scm* write_char (struct scm* i);
#define cell_call_with_current_continuation 11 struct scm* write_byte (struct scm* x);
// CONSTANT cell_vm_apply 12 struct scm* getenv_ (struct scm* s);
#define cell_vm_apply 12 struct scm* setenv_ (struct scm* s, struct scm* v);
// CONSTANT cell_vm_apply2 13 struct scm* access_p (struct scm* file_name, struct scm* mode);
#define cell_vm_apply2 13 struct scm* current_input_port ();
// CONSTANT cell_vm_begin 14 struct scm* open_input_file (struct scm* file_name);
#define cell_vm_begin 14 struct scm* open_input_string (struct scm* string);
// CONSTANT cell_vm_begin_eval 15 struct scm* set_current_input_port (struct scm* port);
#define cell_vm_begin_eval 15 struct scm* current_output_port ();
// CONSTANT cell_vm_begin_expand 16 struct scm* current_error_port ();
#define cell_vm_begin_expand 16 struct scm* open_output_file (struct scm* x);
// CONSTANT cell_vm_begin_expand_eval 17 struct scm* set_current_output_port (struct scm* port);
#define cell_vm_begin_expand_eval 17 struct scm* set_current_error_port (struct scm* port);
// CONSTANT cell_vm_begin_expand_macro 18 struct scm* chmod_ (struct scm* file_name, struct scm* mode);
#define cell_vm_begin_expand_macro 18 struct scm* isatty_p (struct scm* port);
// CONSTANT cell_vm_begin_expand_primitive_load 19 struct scm* primitive_fork ();
#define cell_vm_begin_expand_primitive_load 19 struct scm* execl_ (struct scm* file_name, struct scm* args);
// CONSTANT cell_vm_begin_primitive_load 20 struct scm* waitpid_ (struct scm* pid, struct scm* options);
#define cell_vm_begin_primitive_load 20 struct scm* current_time ();
// CONSTANT cell_vm_begin_read_input_file 21 struct scm* gettimeofday_ ();
#define cell_vm_begin_read_input_file 21 struct scm* get_internal_run_time ();
// CONSTANT cell_vm_call_with_current_continuation2 22 struct scm* getcwd_ ();
#define cell_vm_call_with_current_continuation2 22 struct scm* dup_ (struct scm* port);
// CONSTANT cell_vm_call_with_values2 23 struct scm* dup2_ (struct scm* old, struct scm* new);
#define cell_vm_call_with_values2 23 struct scm* delete_file (struct scm* file_name);
// CONSTANT cell_vm_eval 24 /* src/reader.c */
#define cell_vm_eval 24 struct scm* read_input_file_env_ (struct scm* e, struct scm* a);
// CONSTANT cell_vm_eval2 25 struct scm* read_input_file_env (struct scm* a);
#define cell_vm_eval2 25 struct scm* read_env (struct scm* a);
// CONSTANT cell_vm_eval_check_func 26 struct scm* reader_read_sexp (struct scm* c, struct scm* s, struct scm* a);
#define cell_vm_eval_check_func 26 struct scm* reader_read_character ();
// CONSTANT cell_vm_eval_define 27 struct scm* reader_read_binary ();
#define cell_vm_eval_define 27 struct scm* reader_read_octal ();
// CONSTANT cell_vm_eval_macro_expand_eval 28 struct scm* reader_read_hex ();
#define cell_vm_eval_macro_expand_eval 28 struct scm* reader_read_string ();
// CONSTANT cell_vm_eval_macro_expand_expand 29 /* src/string.c */
#define cell_vm_eval_macro_expand_expand 29 struct scm* string_equal_p (struct scm* a, struct scm* b);
// CONSTANT cell_vm_eval_pmatch_car 30 struct scm* symbol_to_string (struct scm* symbol);
#define cell_vm_eval_pmatch_car 30 struct scm* symbol_to_keyword (struct scm* symbol);
// CONSTANT cell_vm_eval_pmatch_cdr 31 struct scm* keyword_to_string (struct scm* keyword);
#define cell_vm_eval_pmatch_cdr 31 struct scm* string_to_symbol (struct scm* string);
// CONSTANT cell_vm_eval_set_x 32 struct scm* make_symbol (struct scm* string);
#define cell_vm_eval_set_x 32 struct scm* string_to_list (struct scm* string);
// CONSTANT cell_vm_evlis 33 struct scm* list_to_string (struct scm* list);
#define cell_vm_evlis 33 struct scm* read_string (struct scm* port);
// CONSTANT cell_vm_evlis2 34 struct scm* string_append (struct scm* x);
#define cell_vm_evlis2 34 struct scm* string_length (struct scm* string);
// CONSTANT cell_vm_evlis3 35 struct scm* string_ref (struct scm* str, struct scm* k);
#define cell_vm_evlis3 35 /* src/struct.c */
// CONSTANT cell_vm_if 36 struct scm* make_struct (struct scm* type, struct scm* fields, struct scm* printer);
#define cell_vm_if 36 struct scm* struct_length (struct scm* x);
// CONSTANT cell_vm_if_expr 37 struct scm* struct_ref (struct scm* x, struct scm* i);
#define cell_vm_if_expr 37 struct scm* struct_set_x (struct scm* x, struct scm* i, struct scm* e);
// CONSTANT cell_vm_macro_expand 38 /* src/vector.c */
#define cell_vm_macro_expand 38 struct scm* make_vector (struct scm* x);
// CONSTANT cell_vm_macro_expand_car 39 struct scm* vector_length (struct scm* x);
#define cell_vm_macro_expand_car 39 struct scm* vector_ref (struct scm* x, struct scm* i);
// CONSTANT cell_vm_macro_expand_cdr 40 struct scm* vector_entry (struct scm* x);
#define cell_vm_macro_expand_cdr 40 struct scm* vector_set_x (struct scm* x, struct scm* i, struct scm* e);
// CONSTANT cell_vm_macro_expand_define 41 struct scm* list_to_vector (struct scm* x);
#define cell_vm_macro_expand_define 41 struct scm* vector_to_list (struct scm* v);
// CONSTANT cell_vm_macro_expand_define_macro 42
#define cell_vm_macro_expand_define_macro 42
// CONSTANT cell_vm_macro_expand_lambda 43
#define cell_vm_macro_expand_lambda 43
// CONSTANT cell_vm_macro_expand_set_x 44
#define cell_vm_macro_expand_set_x 44
// CONSTANT cell_vm_return 45
#define cell_vm_return 45
// CONSTANT cell_symbol_dot 46
#define cell_symbol_dot 46
// CONSTANT cell_symbol_lambda 47
#define cell_symbol_lambda 47
// CONSTANT cell_symbol_begin 48
#define cell_symbol_begin 48
// CONSTANT cell_symbol_if 49
#define cell_symbol_if 49
// CONSTANT cell_symbol_quote 50
#define cell_symbol_quote 50
// CONSTANT cell_symbol_define 51
#define cell_symbol_define 51
// CONSTANT cell_symbol_define_macro 52
#define cell_symbol_define_macro 52
// CONSTANT cell_symbol_quasiquote 53
#define cell_symbol_quasiquote 53
// CONSTANT cell_symbol_unquote 54
#define cell_symbol_unquote 54
// CONSTANT cell_symbol_unquote_splicing 55
#define cell_symbol_unquote_splicing 55
// CONSTANT cell_symbol_syntax 56
#define cell_symbol_syntax 56
// CONSTANT cell_symbol_quasisyntax 57
#define cell_symbol_quasisyntax 57
// CONSTANT cell_symbol_unsyntax 58
#define cell_symbol_unsyntax 58
// CONSTANT cell_symbol_unsyntax_splicing 59
#define cell_symbol_unsyntax_splicing 59
// CONSTANT cell_symbol_set_x 60
#define cell_symbol_set_x 60
// CONSTANT cell_symbol_sc_expand 61
#define cell_symbol_sc_expand 61
// CONSTANT cell_symbol_macro_expand 62
#define cell_symbol_macro_expand 62
// CONSTANT cell_symbol_portable_macro_expand 63
#define cell_symbol_portable_macro_expand 63
// CONSTANT cell_symbol_sc_expander_alist 64
#define cell_symbol_sc_expander_alist 64
// CONSTANT cell_symbol_call_with_values 65
#define cell_symbol_call_with_values 65
// CONSTANT cell_symbol_call_with_current_continuation 66
#define cell_symbol_call_with_current_continuation 66
// CONSTANT cell_symbol_boot_module 67
#define cell_symbol_boot_module 67
// CONSTANT cell_symbol_current_module 68
#define cell_symbol_current_module 68
// CONSTANT cell_symbol_primitive_load 69
#define cell_symbol_primitive_load 69
// CONSTANT cell_symbol_read_input_file 70
#define cell_symbol_read_input_file 70
// CONSTANT cell_symbol_write 71
#define cell_symbol_write 71
// CONSTANT cell_symbol_display 72
#define cell_symbol_display 72
// CONSTANT cell_symbol_car 73
#define cell_symbol_car 73
// CONSTANT cell_symbol_cdr 74
#define cell_symbol_cdr 74
// CONSTANT cell_symbol_not_a_number 75
#define cell_symbol_not_a_number 75
// CONSTANT cell_symbol_not_a_pair 76
#define cell_symbol_not_a_pair 76
// CONSTANT cell_symbol_system_error 77
#define cell_symbol_system_error 77
// CONSTANT cell_symbol_throw 78
#define cell_symbol_throw 78
// CONSTANT cell_symbol_unbound_variable 79
#define cell_symbol_unbound_variable 79
// CONSTANT cell_symbol_wrong_number_of_args 80
#define cell_symbol_wrong_number_of_args 80
// CONSTANT cell_symbol_wrong_type_arg 81
#define cell_symbol_wrong_type_arg 81
// CONSTANT cell_symbol_buckets 82
#define cell_symbol_buckets 82
// CONSTANT cell_symbol_builtin 83
#define cell_symbol_builtin 83
// CONSTANT cell_symbol_frame 84
#define cell_symbol_frame 84
// CONSTANT cell_symbol_hashq_table 85
#define cell_symbol_hashq_table 85
// CONSTANT cell_symbol_module 86
#define cell_symbol_module 86
// CONSTANT cell_symbol_procedure 87
#define cell_symbol_procedure 87
// CONSTANT cell_symbol_record_type 88
#define cell_symbol_record_type 88
// CONSTANT cell_symbol_size 89
#define cell_symbol_size 89
// CONSTANT cell_symbol_stack 90
#define cell_symbol_stack 90
// CONSTANT cell_symbol_argv 91
#define cell_symbol_argv 91
// CONSTANT cell_symbol_mes_prefix 92
#define cell_symbol_mes_prefix 92
// CONSTANT cell_symbol_mes_version 93
#define cell_symbol_mes_version 93
// CONSTANT cell_symbol_internal_time_units_per_second 94
#define cell_symbol_internal_time_units_per_second 94
// CONSTANT cell_symbol_compiler 95
#define cell_symbol_compiler 95
// CONSTANT cell_symbol_arch 96
#define cell_symbol_arch 96
// CONSTANT cell_symbol_pmatch_car 97
#define cell_symbol_pmatch_car 97
// CONSTANT cell_symbol_pmatch_cdr 98
#define cell_symbol_pmatch_cdr 98
// CONSTANT cell_type_bytes 99
#define cell_type_bytes 99
// CONSTANT cell_type_char 100
#define cell_type_char 100
// CONSTANT cell_type_closure 101
#define cell_type_closure 101
// CONSTANT cell_type_continuation 102
#define cell_type_continuation 102
// CONSTANT cell_type_function 103
#define cell_type_function 103
// CONSTANT cell_type_keyword 104
#define cell_type_keyword 104
// CONSTANT cell_type_macro 105
#define cell_type_macro 105
// CONSTANT cell_type_number 106
#define cell_type_number 106
// CONSTANT cell_type_pair 107
#define cell_type_pair 107
// CONSTANT cell_type_port 108
#define cell_type_port 108
// CONSTANT cell_type_ref 109
#define cell_type_ref 109
// CONSTANT cell_type_special 110
#define cell_type_special 110
// CONSTANT cell_type_string 111
#define cell_type_string 111
// CONSTANT cell_type_struct 112
#define cell_type_struct 112
// CONSTANT cell_type_symbol 113
#define cell_type_symbol 113
// CONSTANT cell_type_values 114
#define cell_type_values 114
// CONSTANT cell_type_variable 115
#define cell_type_variable 115
// CONSTANT cell_type_vector 116
#define cell_type_vector 116
// CONSTANT cell_type_broken_heart 117
#define cell_type_broken_heart 117
// CONSTANT cell_symbol_test 118
#define cell_symbol_test 118
// src/module.mes
SCM make_module_type ();
SCM module_printer (SCM module);
SCM module_variable (SCM module, SCM name);
SCM module_ref (SCM module, SCM name);
SCM module_define_x (SCM module, SCM name, SCM value);
// src/posix.mes
SCM peek_byte ();
SCM read_byte ();
SCM unread_byte (SCM i);
SCM peek_char ();
SCM read_char (SCM port);
SCM unread_char (SCM i);
SCM write_char (SCM i);
SCM write_byte (SCM x);
SCM getenv_ (SCM s);
SCM setenv_ (SCM s, SCM v);
SCM access_p (SCM file_name, SCM mode);
SCM current_input_port ();
SCM open_input_file (SCM file_name);
SCM open_input_string (SCM string);
SCM set_current_input_port (SCM port);
SCM current_output_port ();
SCM current_error_port ();
SCM open_output_file (SCM x);
SCM set_current_output_port (SCM port);
SCM set_current_error_port (SCM port);
SCM force_output (SCM p);
SCM chmod_ (SCM file_name, SCM mode);
SCM isatty_p (SCM port);
SCM primitive_fork ();
SCM execl_ (SCM file_name, SCM args);
SCM waitpid_ (SCM pid, SCM options);
SCM current_time ();
SCM gettimeofday_ ();
SCM get_internal_run_time ();
SCM getcwd_ ();
SCM dup_ (SCM port);
SCM dup2_ (SCM old, SCM new);
SCM delete_file (SCM file_name);
// src/reader.mes
SCM read_input_file_env_ (SCM e, SCM a);
SCM read_input_file_env (SCM a);
SCM read_env (SCM a);
SCM reader_read_sexp (SCM c, SCM s, SCM a);
SCM reader_read_character ();
SCM reader_read_binary ();
SCM reader_read_octal ();
SCM reader_read_hex ();
SCM reader_read_string ();
// src/strings.mes
SCM string_equal_p (SCM a, SCM b);
SCM symbol_to_string (SCM symbol);
SCM symbol_to_keyword (SCM symbol);
SCM keyword_to_string (SCM keyword);
SCM string_to_symbol (SCM string);
SCM make_symbol (SCM string);
SCM string_to_list (SCM string);
SCM list_to_string (SCM list);
SCM read_string (SCM port);
SCM string_append (SCM x);
SCM string_length (SCM string);
SCM string_ref (SCM str, SCM k);
// src/struct.mes
SCM make_struct (SCM type, SCM fields, SCM printer);
SCM struct_length (SCM x);
SCM struct_ref (SCM x, SCM i);
SCM struct_set_x (SCM x, SCM i, SCM e);
// src/vector.mes
SCM make_vector_ (SCM n);
SCM vector_length (SCM x);
SCM vector_ref (SCM x, SCM i);
SCM vector_entry (SCM x);
SCM vector_set_x (SCM x, SCM i, SCM e);
SCM list_to_vector (SCM x);
SCM vector_to_list (SCM v);
#endif //__MES_BUILTINS_H #endif /* __MES_BUILTINS_H */

42
include/mes/cc.h Normal file
View File

@ -0,0 +1,42 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __MES_CC_H
#define __MES_CC_H
typedef struct scm* SCM;
#if __MESC__
typedef long FUNCTION;
typedef long function0_t;
typedef long function1_t;
typedef long function2_t;
typedef long function3_t;
typedef long functionn_t;
#else // !__MESC__
typedef SCM (*FUNCTION) (void);
typedef SCM (*function0_t) (void);
typedef SCM (*function1_t) (SCM);
typedef SCM (*function2_t) (SCM, SCM);
typedef SCM (*function3_t) (SCM, SCM, SCM);
typedef SCM (*functionn_t) (SCM);
#endif // !__MESC__
#endif //__MES_CC_H

View File

@ -21,263 +21,13 @@
#ifndef __MES_CONSTANTS_H #ifndef __MES_CONSTANTS_H
#define __MES_CONSTANTS_H #define __MES_CONSTANTS_H
/* Symbols */
// CONSTANT cell_nil 1
#define cell_nil 1
// CONSTANT cell_f 2
#define cell_f 2
// CONSTANT cell_t 3
#define cell_t 3
// CONSTANT cell_dot 4
#define cell_dot 4
// CONSTANT cell_arrow 5
#define cell_arrow 5
// CONSTANT cell_undefined 6
#define cell_undefined 6
// CONSTANT cell_unspecified 7
#define cell_unspecified 7
// CONSTANT cell_closure 8
#define cell_closure 8
// CONSTANT cell_circular 9
#define cell_circular 9
// CONSTANT cell_begin 10
#define cell_begin 10
// CONSTANT cell_call_with_current_continuation 11
#define cell_call_with_current_continuation 11
// CONSTANT cell_vm_apply 12
#define cell_vm_apply 12
// CONSTANT cell_vm_apply2 13
#define cell_vm_apply2 13
// CONSTANT cell_vm_begin 14
#define cell_vm_begin 14
// CONSTANT cell_vm_begin_eval 15
#define cell_vm_begin_eval 15
// CONSTANT cell_vm_begin_expand 16
#define cell_vm_begin_expand 16
// CONSTANT cell_vm_begin_expand_eval 17
#define cell_vm_begin_expand_eval 17
// CONSTANT cell_vm_begin_expand_macro 18
#define cell_vm_begin_expand_macro 18
// CONSTANT cell_vm_begin_expand_primitive_load 19
#define cell_vm_begin_expand_primitive_load 19
// CONSTANT cell_vm_begin_primitive_load 20
#define cell_vm_begin_primitive_load 20
// CONSTANT cell_vm_begin_read_input_file 21
#define cell_vm_begin_read_input_file 21
// CONSTANT cell_vm_call_with_current_continuation2 22
#define cell_vm_call_with_current_continuation2 22
// CONSTANT cell_vm_call_with_values2 23
#define cell_vm_call_with_values2 23
// CONSTANT cell_vm_eval 24
#define cell_vm_eval 24
// CONSTANT cell_vm_eval2 25
#define cell_vm_eval2 25
// CONSTANT cell_vm_eval_check_func 26
#define cell_vm_eval_check_func 26
// CONSTANT cell_vm_eval_define 27
#define cell_vm_eval_define 27
// CONSTANT cell_vm_eval_macro_expand_eval 28
#define cell_vm_eval_macro_expand_eval 28
// CONSTANT cell_vm_eval_macro_expand_expand 29
#define cell_vm_eval_macro_expand_expand 29
// CONSTANT cell_vm_eval_pmatch_car 30
#define cell_vm_eval_pmatch_car 30
// CONSTANT cell_vm_eval_pmatch_cdr 31
#define cell_vm_eval_pmatch_cdr 31
// CONSTANT cell_vm_eval_set_x 32
#define cell_vm_eval_set_x 32
// CONSTANT cell_vm_evlis 33
#define cell_vm_evlis 33
// CONSTANT cell_vm_evlis2 34
#define cell_vm_evlis2 34
// CONSTANT cell_vm_evlis3 35
#define cell_vm_evlis3 35
// CONSTANT cell_vm_if 36
#define cell_vm_if 36
// CONSTANT cell_vm_if_expr 37
#define cell_vm_if_expr 37
// CONSTANT cell_vm_macro_expand 38
#define cell_vm_macro_expand 38
// CONSTANT cell_vm_macro_expand_car 39
#define cell_vm_macro_expand_car 39
// CONSTANT cell_vm_macro_expand_cdr 40
#define cell_vm_macro_expand_cdr 40
// CONSTANT cell_vm_macro_expand_define 41
#define cell_vm_macro_expand_define 41
// CONSTANT cell_vm_macro_expand_define_macro 42
#define cell_vm_macro_expand_define_macro 42
// CONSTANT cell_vm_macro_expand_lambda 43
#define cell_vm_macro_expand_lambda 43
// CONSTANT cell_vm_macro_expand_set_x 44
#define cell_vm_macro_expand_set_x 44
// CONSTANT cell_vm_return 45
#define cell_vm_return 45
// CONSTANT cell_symbol_dot 46
#define cell_symbol_dot 46
// CONSTANT cell_symbol_lambda 47
#define cell_symbol_lambda 47
// CONSTANT cell_symbol_begin 48
#define cell_symbol_begin 48
// CONSTANT cell_symbol_if 49
#define cell_symbol_if 49
// CONSTANT cell_symbol_quote 50
#define cell_symbol_quote 50
// CONSTANT cell_symbol_define 51
#define cell_symbol_define 51
// CONSTANT cell_symbol_define_macro 52
#define cell_symbol_define_macro 52
// CONSTANT cell_symbol_quasiquote 53
#define cell_symbol_quasiquote 53
// CONSTANT cell_symbol_unquote 54
#define cell_symbol_unquote 54
// CONSTANT cell_symbol_unquote_splicing 55
#define cell_symbol_unquote_splicing 55
// CONSTANT cell_symbol_syntax 56
#define cell_symbol_syntax 56
// CONSTANT cell_symbol_quasisyntax 57
#define cell_symbol_quasisyntax 57
// CONSTANT cell_symbol_unsyntax 58
#define cell_symbol_unsyntax 58
// CONSTANT cell_symbol_unsyntax_splicing 59
#define cell_symbol_unsyntax_splicing 59
// CONSTANT cell_symbol_set_x 60
#define cell_symbol_set_x 60
// CONSTANT cell_symbol_sc_expand 61
#define cell_symbol_sc_expand 61
// CONSTANT cell_symbol_macro_expand 62
#define cell_symbol_macro_expand 62
// CONSTANT cell_symbol_portable_macro_expand 63
#define cell_symbol_portable_macro_expand 63
// CONSTANT cell_symbol_sc_expander_alist 64
#define cell_symbol_sc_expander_alist 64
// CONSTANT cell_symbol_call_with_values 65
#define cell_symbol_call_with_values 65
// CONSTANT cell_symbol_call_with_current_continuation 66
#define cell_symbol_call_with_current_continuation 66
// CONSTANT cell_symbol_boot_module 67
#define cell_symbol_boot_module 67
// CONSTANT cell_symbol_current_module 68
#define cell_symbol_current_module 68
// CONSTANT cell_symbol_primitive_load 69
#define cell_symbol_primitive_load 69
// CONSTANT cell_symbol_read_input_file 70
#define cell_symbol_read_input_file 70
// CONSTANT cell_symbol_write 71
#define cell_symbol_write 71
// CONSTANT cell_symbol_display 72
#define cell_symbol_display 72
// CONSTANT cell_symbol_car 73
#define cell_symbol_car 73
// CONSTANT cell_symbol_cdr 74
#define cell_symbol_cdr 74
// CONSTANT cell_symbol_not_a_number 75
#define cell_symbol_not_a_number 75
// CONSTANT cell_symbol_not_a_pair 76
#define cell_symbol_not_a_pair 76
// CONSTANT cell_symbol_system_error 77
#define cell_symbol_system_error 77
// CONSTANT cell_symbol_throw 78
#define cell_symbol_throw 78
// CONSTANT cell_symbol_unbound_variable 79
#define cell_symbol_unbound_variable 79
// CONSTANT cell_symbol_wrong_number_of_args 80
#define cell_symbol_wrong_number_of_args 80
// CONSTANT cell_symbol_wrong_type_arg 81
#define cell_symbol_wrong_type_arg 81
// CONSTANT cell_symbol_buckets 82
#define cell_symbol_buckets 82
// CONSTANT cell_symbol_builtin 83
#define cell_symbol_builtin 83
// CONSTANT cell_symbol_frame 84
#define cell_symbol_frame 84
// CONSTANT cell_symbol_hashq_table 85
#define cell_symbol_hashq_table 85
// CONSTANT cell_symbol_module 86
#define cell_symbol_module 86
// CONSTANT cell_symbol_procedure 87
#define cell_symbol_procedure 87
// CONSTANT cell_symbol_record_type 88
#define cell_symbol_record_type 88
// CONSTANT cell_symbol_size 89
#define cell_symbol_size 89
// CONSTANT cell_symbol_stack 90
#define cell_symbol_stack 90
// CONSTANT cell_symbol_argv 91
#define cell_symbol_argv 91
// CONSTANT cell_symbol_mes_datadir 92
#define cell_symbol_mes_datadir 92
// CONSTANT cell_symbol_mes_version 93
#define cell_symbol_mes_version 93
// CONSTANT cell_symbol_internal_time_units_per_second 94
#define cell_symbol_internal_time_units_per_second 94
// CONSTANT cell_symbol_compiler 95
#define cell_symbol_compiler 95
// CONSTANT cell_symbol_arch 96
#define cell_symbol_arch 96
// CONSTANT cell_symbol_pmatch_car 97
#define cell_symbol_pmatch_car 97
// CONSTANT cell_symbol_pmatch_cdr 98
#define cell_symbol_pmatch_cdr 98
// CONSTANT cell_type_bytes 99
#define cell_type_bytes 99
// CONSTANT cell_type_char 100
#define cell_type_char 100
// CONSTANT cell_type_closure 101
#define cell_type_closure 101
// CONSTANT cell_type_continuation 102
#define cell_type_continuation 102
// CONSTANT cell_type_function 103
#define cell_type_function 103
// CONSTANT cell_type_keyword 104
#define cell_type_keyword 104
// CONSTANT cell_type_macro 105
#define cell_type_macro 105
// CONSTANT cell_type_number 106
#define cell_type_number 106
// CONSTANT cell_type_pair 107
#define cell_type_pair 107
// CONSTANT cell_type_port 108
#define cell_type_port 108
// CONSTANT cell_type_ref 109
#define cell_type_ref 109
// CONSTANT cell_type_special 110
#define cell_type_special 110
// CONSTANT cell_type_string 111
#define cell_type_string 111
// CONSTANT cell_type_struct 112
#define cell_type_struct 112
// CONSTANT cell_type_symbol 113
#define cell_type_symbol 113
// CONSTANT cell_type_values 114
#define cell_type_values 114
// CONSTANT cell_type_variable 115
#define cell_type_variable 115
// CONSTANT cell_type_vector 116
#define cell_type_vector 116
// CONSTANT cell_type_broken_heart 117
#define cell_type_broken_heart 117
// CONSTANT cell_test 118
#define cell_test 118
/* Cell types */ /* Cell types */
// CONSTANT TBYTES 0 // CONSTANT TCHAR 0
#define TBYTES 0 #define TCHAR 0
// CONSTANT TCHAR 1
#define TCHAR 1 // CONSTANT TBYTES 1
#define TBYTES 1
// CONSTANT TCLOSURE 2 // CONSTANT TCLOSURE 2
#define TCLOSURE 2 #define TCLOSURE 2
// CONSTANT TCONTINUATION 3 // CONSTANT TCONTINUATION 3
@ -318,7 +68,31 @@
// CONSTANT STRUCT_PRINTER 1 // CONSTANT STRUCT_PRINTER 1
#define STRUCT_PRINTER 1 #define STRUCT_PRINTER 1
// CONSTANT FRAME_SIZE 5
#define FRAME_SIZE 5 #define FRAME_SIZE 5
// CONSTANT FRAME_PROCEDURE 4
#define FRAME_PROCEDURE 4 #define FRAME_PROCEDURE 4
#endif //__MES_CONSTANTS_H // CONSTANT STDIN 0
// CONSTANT STDOUT 1
// CONSTANT STDERR 2
/* Unknown type 1
// CONSTANT EOF -1
*/
// CONSTANT O_RDONLY 0
// CONSTANT O_WRONLY 1
// CONSTANT O_CREAT 0x40
// CONSTANT O_TRUNC 0x200
// CONSTANT PATH_MAX 1024
// CONSTANT __FILEDES_MAX 512
// CONSTANT S_IRUSR 00400
// CONSTANT S_IWUSR 00200
// CONSTANT CLOCK_PROCESS_CPUTIME_ID 2
#endif /* __MES_CONSTANTS_H */

View File

@ -28,7 +28,9 @@ void __ungetc_init ();
void __ungetc_clear (int filedes); void __ungetc_clear (int filedes);
void __ungetc_set (int filedes, int c); void __ungetc_set (int filedes, int c);
int __ungetc_p (int filedes); int __ungetc_p (int filedes);
double abtod (char const **p, int base);
long abtol (char const **p, int base); long abtol (char const **p, int base);
char *dtoab (double number, int base, int signed_p);
char *itoa (int number); char *itoa (int number);
char *ltoa (long number); char *ltoa (long number);
char *ltoab (long x, int base); char *ltoab (long x, int base);
@ -50,6 +52,7 @@ int oputc (int c);
int oputs (char const *s); int oputs (char const *s);
char *search_path (char const *file_name); char *search_path (char const *file_name);
ssize_t _read (int fd, void *buffer, size_t size); ssize_t _read (int fd, void *buffer, size_t size);
void assert_msg (int check, char *msg);
extern char *__brk; extern char *__brk;
extern void (*__call_at_exit) (void); extern void (*__call_at_exit) (void);

24
include/mes/m2.h Normal file
View File

@ -0,0 +1,24 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __MES_M2_H
#define __MES_M2_H
#endif /* __MES_M2_H */

View File

@ -21,53 +21,38 @@
#ifndef __MES_MACROS_H #ifndef __MES_MACROS_H
#define __MES_MACROS_H #define __MES_MACROS_H
#define TYPE(x) g_cells[x].type #define TYPE(x) g_cells[x - g_cells].type
#define CAR(x) g_cells[x].car #define CAR(x) g_cells[x - g_cells].car
#define CDR(x) g_cells[x].cdr #define CDR(x) g_cells[x - g_cells].cdr
#define NTYPE(x) g_news[x].type #define NTYPE(x) g_news[x - g_news].type
#define NCAR(x) g_news[x].car #define NCAR(x) g_news[x - g_news].car
#define NCDR(x) g_news[x].cdr #define NCDR(x) g_news[x - g_news].cdr
#define BYTES(x) g_cells[x].car #define STYPE(x) TYPE (g_stack_array[x])
#define LENGTH(x) g_cells[x].car #define SCAR(x) CAR (g_stack_array[x])
#define REF(x) g_cells[x].car #define SCDR(x) CDR (g_stack_arraynews[x])
#define START(x) (g_cells[x].car >> 16)
#define LEN(x) (g_cells[x].car & 0xffff)
#define VARIABLE(x) g_cells[x].car
#define CLOSURE(x) g_cells[x].cdr #define BYTES(x) g_cells[x - g_cells].bytes
#define CONTINUATION(x) g_cells[x].cdr #define LENGTH(x) g_cells[x - g_cells].length
#define MACRO(x) g_cells[x - g_cells].macro
#define PORT(x) g_cells[x - g_cells].port
#define REF(x) g_cells[x - g_cells].ref
#define VARIABLE(x) g_cells[x - g_cells].variable
#define CBYTES(x) (char*)&g_cells[x].cdr #define CLOSURE(x) g_cells[x - g_cells].closure
#define CSTRING_STRUCT(x) (char*)&g_cells[x.cdr].cdr #define CONTINUATION(x) g_cells[x - g_cells].continuation
#define MACRO(x) g_cells[x].car #define NAME(x) g_cells[x - g_cells].name
#define NAME(x) g_cells[x].cdr #define STRING(x) g_cells[x - g_cells].string
#define PORT(x) g_cells[x].car #define STRUCT(x) g_cells[x - g_cells].structure
#define STRING(x) g_cells[x].cdr #define VALUE(x) g_cells[x - g_cells].value
#define STRUCT(x) g_cells[x].cdr #define VECTOR(x) g_cells[x - g_cells].vector
#define VALUE(x) g_cells[x].cdr
#define VECTOR(x) g_cells[x].cdr
#define NLENGTH(x) g_news[x].car #define NLENGTH(x) g_news[x - g_news].length
#define NCBYTES(x) (char*)&g_news[x].cdr #define NVALUE(x) g_news[x - g_news].value
#define NVALUE(x) g_news[x].cdr #define NSTRING(x) g_news[x - g_news].string
#define NSTRING(x) g_news[x].cdr #define NVECTOR(x) g_news[x - g_news].vector
#define NVECTOR(x) g_news[x].cdr
#define CSTRING(x) CBYTES (STRING (x))
#define MAKE_BYTES0(x) make_bytes (x, strlen (x))
#define NAME_SYMBOL(symbol,name) {size_t s = strlen (name); CAR (symbol) = s; CDR (symbol) = make_bytes (name, s);}
#define MAKE_CHAR(n) make_cell__ (TCHAR, 0, n)
#define MAKE_CONTINUATION(n) make_cell__ (TCONTINUATION, n, g_stack)
#define MAKE_NUMBER(n) make_cell__ (TNUMBER, 0, (long)n)
#define MAKE_REF(n) make_cell__ (TREF, n, 0)
#define MAKE_STRING0(x) make_string (x, strlen (x))
#define MAKE_STRING_PORT(x) make_cell__ (TPORT, -length__ (g_ports) - 2, x)
#define MAKE_MACRO(name, x) make_cell__ (TMACRO, x, STRING (name))
#define CAAR(x) CAR (CAR (x)) #define CAAR(x) CAR (CAR (x))
#define CADR(x) CAR (CDR (x)) #define CADR(x) CAR (CDR (x))
@ -75,6 +60,7 @@
#define CDDR(x) CDR (CDR (x)) #define CDDR(x) CDR (CDR (x))
#define CADAR(x) CAR (CDR (CAR (x))) #define CADAR(x) CAR (CDR (CAR (x)))
#define CADDR(x) CAR (CDR (CDR (x))) #define CADDR(x) CAR (CDR (CDR (x)))
#define CDADAR(x) CAR (CDR (CAR (CDR (x)))) #define CDADR(x) CDR (CAR (CDR (x)))
#define CDDAR(x) CDR (CDR (CAR (x)))
#endif //__MES_MACROS_H #endif //__MES_MACROS_H

View File

@ -22,85 +22,146 @@
#define __MES_MES_H #define __MES_MES_H
#include <sys/types.h> #include <sys/types.h>
#include "mes/cc.h"
typedef long SCM;
struct scm struct scm
{ {
long type; long type;
SCM car; union
SCM cdr; {
struct scm* car;
char *bytes;
long length;
struct scm* ref;
struct scm* variable;
struct scm* macro;
long port;
};
union
{
struct scm* cdr;
struct scm* closure;
struct scm* continuation;
char *name;
struct scm* string;
struct scm* structure;
long value;
struct scm* vector;
};
}; };
// mes /* mes */
extern int g_debug; char *g_datadir;
extern char *g_buf; int g_debug;
extern SCM g_continuations; char *g_buf;
extern SCM g_symbols; struct scm* g_continuations;
extern SCM g_symbol_max; struct scm* g_symbols;
struct scm* g_symbol_max;
int g_mini;
// a/env /* a/env */
extern SCM r0; struct scm* R0;
// param 1 /* param 1 */
extern SCM r1; struct scm* R1;
// save 2 /* save 2 */
extern SCM r2; struct scm* R2;
// continuation /* continuation */
extern SCM r3; struct scm* R3;
// current-module /* current-module */
extern SCM m0; struct scm* M0;
// macro /* macro */
extern SCM g_macros; struct scm* g_macros;
extern SCM g_ports; struct scm* g_ports;
// gc /* gc */
extern long ARENA_SIZE; long ARENA_SIZE;
extern long MAX_ARENA_SIZE; long MAX_ARENA_SIZE;
extern long STACK_SIZE; long STACK_SIZE;
extern long JAM_SIZE; long JAM_SIZE;
extern long GC_SAFETY; long GC_SAFETY;
extern long MAX_STRING; long MAX_STRING;
extern char *g_arena; char *g_arena;
extern long g_free; struct scm* cell_arena;
extern SCM g_stack; struct scm* cell_zero;
extern SCM *g_stack_array;
extern struct scm *g_cells;
extern struct scm *g_news;
SCM alloc (long n); struct scm* g_free;
SCM apply (SCM f, SCM x, SCM a); struct scm* g_symbol;
SCM apply_builtin (SCM fn, SCM x);
SCM cstring_to_list (char const *s); struct scm* *g_stack_array;
SCM cstring_to_symbol (char const *s); struct scm *g_cells;
SCM display_ (SCM x); struct scm *g_news;
SCM fdisplay_ (SCM, int, int); long g_stack;
SCM gc_init ();
SCM gc_peek_frame (); char **__execl_c_argv;
SCM gc_pop_frame (); char *__getcwd_buf;
SCM gc_push_frame (); char *__open_boot_buf;
SCM init_time (SCM a); char *__open_boot_file_name;
SCM make_bytes (char const *s, size_t length); char *__setenv_buf;
SCM make_cell__ (long type, SCM car, SCM cdr); char *__reader_read_char_buf;
SCM make_hash_table_ (long size); struct timespec *g_start_time;
SCM make_hashq_type (); struct timeval *__gettimeofday_time;
SCM make_initial_module (SCM a); struct timespec *__get_internal_run_time_ts;
SCM make_string (char const *s, size_t length);
SCM make_vector__ (long k); struct scm* alloc (long n);
SCM read_input_file_env (SCM); struct scm* apply (struct scm* f, struct scm* x, struct scm* a);
SCM string_equal_p (SCM a, SCM b); struct scm* apply_builtin (struct scm* fn, struct scm* x);
SCM struct_ref_ (SCM x, long i); struct scm* apply_builtin0 (struct scm* fn);
SCM struct_set_x_ (SCM x, long i, SCM e); struct scm* apply_builtin1 (struct scm* fn, struct scm* x);
SCM vector_ref_ (SCM x, long i); struct scm* apply_builtin2 (struct scm* fn, struct scm* x, struct scm* y);
SCM vector_set_x_ (SCM x, long i, SCM e); struct scm* apply_builtin3 (struct scm* fn, struct scm* x, struct scm* y, struct scm* z);
struct scm* builtin_name (struct scm* builtin);
struct scm* cstring_to_list (char const *s);
struct scm* cstring_to_symbol (char const *s);
struct scm* cell_ref (struct scm* cell, long index);
struct scm* fdisplay_ (struct scm*, int, int);
struct scm* init_symbols ();
struct scm* init_time (struct scm* a);
struct scm* make_builtin_type ();
struct scm* make_bytes (char const *s, size_t length);
struct scm* make_cell (long type, struct scm* car, struct scm* cdr);
struct scm* make_char (int n);
struct scm* make_continuation (long n);
struct scm* make_hash_table_ (long size);
struct scm* make_hashq_type ();
struct scm* make_initial_module (struct scm* a);
struct scm* make_macro (struct scm* name, struct scm* x);
struct scm* make_number (long n);
struct scm* make_ref (struct scm* x);
struct scm* make_string (char const *s, size_t length);
struct scm* make_string0 (char const *s);
struct scm* make_string_port (struct scm* x);
struct scm* make_vector_ (long k, struct scm* e);
struct scm* mes_builtins (struct scm* a);
struct scm* push_cc (struct scm* p1, struct scm* p2, struct scm* a, struct scm* c);
struct scm* struct_ref_ (struct scm* x, long i);
struct scm* struct_set_x_ (struct scm* x, long i, struct scm* e);
struct scm* vector_ref_ (struct scm* x, long i);
struct scm* vector_set_x_ (struct scm* x, long i, struct scm* e);
FUNCTION builtin_function (struct scm* builtin);
char *cell_bytes (struct scm* x);
char *news_bytes (struct scm* x);
int peekchar (); int peekchar ();
int readchar (); int readchar ();
int unreadchar (); int unreadchar ();
long length__ (SCM x); long gc_free ();
long length__ (struct scm* x);
size_t bytes_cells (size_t length); size_t bytes_cells (size_t length);
void assert_max_string (size_t i, char const *msg, char *string); void assert_max_string (size_t i, char const *msg, char *string);
void assert_msg (int check, char *msg);
void assert_number (char const *name, struct scm* x);
void copy_cell (struct scm* to, struct scm* from);
void gc_ ();
void gc_dump_arena (struct scm *cells, long size);
void gc_init ();
void gc_peek_frame ();
void gc_pop_frame ();
void gc_push_frame ();
void gc_stats_ (char const* where);
void init_symbols_ ();
#include "mes/builtins.h" #include "mes/builtins.h"
#include "mes/constants.h" #include "mes/constants.h"
#include "mes/macros.h" #include "mes/macros.h"
#include "mes/symbols.h"
#endif //__MES_MES_H #endif /* __MES_MES_H */

150
include/mes/symbols.h Normal file
View File

@ -0,0 +1,150 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __MES_SYMBOLS_H
#define __MES_SYMBOLS_H
struct scm* cell_nil;
struct scm* cell_f;
struct scm* cell_t;
struct scm* cell_dot;
struct scm* cell_arrow;
struct scm* cell_undefined;
struct scm* cell_unspecified;
struct scm* cell_closure;
struct scm* cell_circular;
struct scm* cell_vm_apply;
struct scm* cell_vm_apply2;
struct scm* cell_vm_begin;
struct scm* cell_vm_begin_eval;
struct scm* cell_vm_begin_expand;
struct scm* cell_vm_begin_expand_eval;
struct scm* cell_vm_begin_expand_macro;
struct scm* cell_vm_begin_expand_primitive_load;
struct scm* cell_vm_begin_primitive_load;
struct scm* cell_vm_begin_read_input_file;
struct scm* cell_vm_call_with_current_continuation2;
struct scm* cell_vm_call_with_values2;
struct scm* cell_vm_eval;
struct scm* cell_vm_eval2;
struct scm* cell_vm_eval_check_func;
struct scm* cell_vm_eval_define;
struct scm* cell_vm_eval_macro_expand_eval;
struct scm* cell_vm_eval_macro_expand_expand;
struct scm* cell_vm_eval_pmatch_car;
struct scm* cell_vm_eval_pmatch_cdr;
struct scm* cell_vm_eval_set_x;
struct scm* cell_vm_evlis;
struct scm* cell_vm_evlis2;
struct scm* cell_vm_evlis3;
struct scm* cell_vm_if;
struct scm* cell_vm_if_expr;
struct scm* cell_vm_macro_expand;
struct scm* cell_vm_macro_expand_car;
struct scm* cell_vm_macro_expand_cdr;
struct scm* cell_vm_macro_expand_define;
struct scm* cell_vm_macro_expand_define_macro;
struct scm* cell_vm_macro_expand_lambda;
struct scm* cell_vm_macro_expand_set_x;
struct scm* cell_vm_return;
struct scm* cell_symbol_lambda;
struct scm* cell_symbol_begin;
struct scm* cell_symbol_if;
struct scm* cell_symbol_quote;
struct scm* cell_symbol_define;
struct scm* cell_symbol_define_macro;
struct scm* cell_symbol_quasiquote;
struct scm* cell_symbol_unquote;
struct scm* cell_symbol_unquote_splicing;
struct scm* cell_symbol_syntax;
struct scm* cell_symbol_quasisyntax;
struct scm* cell_symbol_unsyntax;
struct scm* cell_symbol_unsyntax_splicing;
struct scm* cell_symbol_set_x;
struct scm* cell_symbol_sc_expand;
struct scm* cell_symbol_macro_expand;
struct scm* cell_symbol_portable_macro_expand;
struct scm* cell_symbol_sc_expander_alist;
struct scm* cell_symbol_call_with_values;
struct scm* cell_symbol_call_with_current_continuation;
struct scm* cell_symbol_boot_module;
struct scm* cell_symbol_current_module;
struct scm* cell_symbol_primitive_load;
struct scm* cell_symbol_car;
struct scm* cell_symbol_cdr;
struct scm* cell_symbol_not_a_number;
struct scm* cell_symbol_not_a_pair;
struct scm* cell_symbol_system_error;
struct scm* cell_symbol_throw;
struct scm* cell_symbol_unbound_variable;
struct scm* cell_symbol_wrong_number_of_args;
struct scm* cell_symbol_wrong_type_arg;
struct scm* cell_symbol_buckets;
struct scm* cell_symbol_builtin;
struct scm* cell_symbol_frame;
struct scm* cell_symbol_hashq_table;
struct scm* cell_symbol_module;
struct scm* cell_symbol_procedure;
struct scm* cell_symbol_record_type;
struct scm* cell_symbol_size;
struct scm* cell_symbol_stack;
struct scm* cell_symbol_argv;
struct scm* cell_symbol_mes_datadir;
struct scm* cell_symbol_mes_version;
struct scm* cell_symbol_internal_time_units_per_second;
struct scm* cell_symbol_compiler;
struct scm* cell_symbol_arch;
struct scm* cell_symbol_pmatch_car;
struct scm* cell_symbol_pmatch_cdr;
struct scm* cell_type_bytes;
struct scm* cell_type_char;
struct scm* cell_type_closure;
struct scm* cell_type_continuation;
struct scm* cell_type_function;
struct scm* cell_type_keyword;
struct scm* cell_type_macro;
struct scm* cell_type_number;
struct scm* cell_type_pair;
struct scm* cell_type_port;
struct scm* cell_type_ref;
struct scm* cell_type_special;
struct scm* cell_type_string;
struct scm* cell_type_struct;
struct scm* cell_type_symbol;
struct scm* cell_type_values;
struct scm* cell_type_variable;
struct scm* cell_type_vector;
struct scm* cell_type_broken_heart;
struct scm* cell_symbol_program;
struct scm* cell_symbol_test;
// CONSTANT SYMBOL_MAX 114
#define SYMBOL_MAX 114
// CONSTANT CELL_UNSPECIFIED 7
#define CELL_UNSPECIFIED 7
// CONSTANT CELL_SYMBOL_RECORD_TYPE 82
#define CELL_SYMBOL_RECORD_TYPE 82
#endif /* __MES_SYMBOLS_H */

View File

@ -34,6 +34,8 @@
typedef char *va_list; typedef char *va_list;
#define va_start(ap, last) (void)((ap) = (char*)(&(last) + 1)) #define va_start(ap, last) (void)((ap) = (char*)(&(last) + 1))
#define va_arg(ap, type) (type)(((long*)((ap) = ((ap) + sizeof (void*))))[-1]) #define va_arg(ap, type) (type)(((long*)((ap) = ((ap) + sizeof (void*))))[-1])
#define va_align(ap, alignment) ((char*)((((unsigned long) (ap)) + (alignment) - 1) &~ ((alignment) - 1)))
#define va_arg8(ap, type) (type)(((double*)((ap) = (va_align((ap), 8) + sizeof(double))))[-1])
#define va_end(ap) (void)((ap) = 0) #define va_end(ap) (void)((ap) = 0)
#define va_copy(dest, src) dest = src #define va_copy(dest, src) dest = src

View File

@ -36,6 +36,7 @@ typedef int (*comparison_fn_t) (void const *, void const *);
#include <sys/types.h> #include <sys/types.h>
#include <alloca.h> #include <alloca.h>
void abort (void);
double atof (char const *s); double atof (char const *s);
int atoi (char const *s); int atoi (char const *s);
int atexit (void (*function) (void)); int atexit (void (*function) (void));

View File

@ -85,10 +85,12 @@ struct stat
int chmod (char const *file_name, mode_t mode); int chmod (char const *file_name, mode_t mode);
int fstat (int filedes, struct stat *buf); int fstat (int filedes, struct stat *buf);
int mkdir (char const *file_name, mode_t mode); int mkdir (char const *file_name, mode_t mode);
int mknod (char const *file_name, mode_t mode, dev_t dev);
int chown (char const *file_name, uid_t owner, gid_t group); int chown (char const *file_name, uid_t owner, gid_t group);
int rmdir (char const *file_name); int rmdir (char const *file_name);
int stat (char const *file_name, struct stat *buf); int stat (char const *file_name, struct stat *buf);
#define S_IFIFO 0010000
#define S_IFCHR 0020000 #define S_IFCHR 0020000
#define S_IFDIR 0040000 #define S_IFDIR 0040000
#define S_IFBLK 0060000 #define S_IFBLK 0060000
@ -96,6 +98,7 @@ int stat (char const *file_name, struct stat *buf);
#define S_IFLNK 0120000 #define S_IFLNK 0120000
#define S_IFMT 0170000 #define S_IFMT 0170000
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)

View File

@ -87,7 +87,7 @@ typedef unsigned long uintptr_t;
#ifndef __MES_OFF_T #ifndef __MES_OFF_T
#define __MES_OFF_T #define __MES_OFF_T
#undef off_t #undef off_t
typedef unsigned long off_t; typedef long off_t;
#endif #endif
#ifndef __MES_OFF64_T #ifndef __MES_OFF64_T
@ -138,6 +138,15 @@ typedef long ssize_t;
typedef unsigned uid_t; typedef unsigned uid_t;
#endif #endif
#ifndef __WCHAR_T
#define __WCHAR_T
#ifndef __MES_WCHAR_T
#define __MES_WCHAR_T
#undef wchar_t
typedef int wchar_t;
#endif
#endif
#endif // ! SYSTEM_LIBC #endif // ! SYSTEM_LIBC
#endif // __MES_SYS_TYPES_H #endif // __MES_SYS_TYPES_H

View File

@ -49,6 +49,14 @@
#define CS8 0000060 #define CS8 0000060
#define PARENB 0000400 #define PARENB 0000400
struct winsize
{
unsigned short ws_row;
unsigned short ws_col;
unsigned short ws_xpixel;
unsigned short ws_ypixel;
};
struct termio struct termio
{ {
unsigned short c_iflag; unsigned short c_iflag;

View File

@ -59,6 +59,7 @@ struct timespec
int clock_gettime (clockid_t clk_id, struct timespec *tp); int clock_gettime (clockid_t clk_id, struct timespec *tp);
struct tm *localtime (time_t const *timep); struct tm *localtime (time_t const *timep);
struct tm *gmtime (time_t const *time); struct tm *gmtime (time_t const *time);
time_t mktime (struct tm *broken_time);
int nanosleep (struct timespec const *requested_time, struct timespec const *remaining); int nanosleep (struct timespec const *requested_time, struct timespec const *remaining);
time_t time (time_t * tloc); time_t time (time_t * tloc);

View File

@ -62,6 +62,7 @@ unsigned int alarm (unsigned int seconds);
int close (int fd); int close (int fd);
int execv (char const *file_name, char *const argv[]); int execv (char const *file_name, char *const argv[]);
int execl (char const *file_name, char const *arg, ...); int execl (char const *file_name, char const *arg, ...);
int execlp (char const *file_name, char const *arg, ...);
int execve (char const *file, char *const argv[], char *const env[]); int execve (char const *file, char *const argv[], char *const env[]);
int execvp (char const *file, char *const argv[]); int execvp (char const *file, char *const argv[]);
int fork (void); int fork (void);
@ -73,21 +74,24 @@ int setgid (gid_t newgid);
int setuid (uid_t newuid); int setuid (uid_t newuid);
uid_t geteuid (void); uid_t geteuid (void);
gid_t getegid (void); gid_t getegid (void);
pid_t getpgrp (void);
pid_t getpid (void); pid_t getpid (void);
pid_t getppid (void); pid_t getppid (void);
int getpgid (pid_t pid);
int isatty (int fd); int isatty (int fd);
int link (char const *oldname, char const *newname); int link (char const *old_name, char const *new_name);
off_t lseek (int fd, off_t offset, int whence); off_t lseek (int fd, off_t offset, int whence);
ssize_t read (int fd, void *buffer, size_t size); ssize_t read (int fd, void *buffer, size_t size);
ssize_t readlink (char const *file_name, char *buffer, size_t size);
#if __SBRK_CHAR_PTRDIFF #if __SBRK_CHAR_PTRDIFF
/* xmalloc in binutils <= 2.10.1 uses this old prototype */ /* xmalloc in binutils <= 2.10.1 uses this old prototype */
char *sbrk (ptrdiff_t delta); char *sbrk (ptrdiff_t delta);
#else #else
void *sbrk (intptr_t delta); void *sbrk (intptr_t delta);
#endif #endif
int symlink (char const *old_name, char const *new_name);
int unlink (char const *file_name); int unlink (char const *file_name);
ssize_t write (int filedes, void const *buffer, size_t size); ssize_t write (int filedes, void const *buffer, size_t size);
pid_t getpid (void);
#endif // ! SYSTEM_LIBC #endif // ! SYSTEM_LIBC

140
kaem.run Normal file
View File

@ -0,0 +1,140 @@
#!/bin/bash
# Copyright (C) 2019 Jeremiah Orians <jeremiah@pdp10.guru>
# Copyright (C) 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
# This file is part of Gnu Mes
#
# Gnu Mes is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Gnu Mes is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Gnu Mes. If not, see <http://www.gnu.org/licenses/>.
# Usage:
# kaem --verbose --strict
./build-aux/pointer.sh
./build-aux/pointer.sh
./build-aux/pointer.sh
./build-aux/pointer.sh
./build-aux/pointer.sh
M2-Planet \
--debug \
--architecture x86 \
-f include/m2/lib.h \
-f lib/linux/x86-mes-m2/crt1.c \
-f lib/linux/x86-mes-m2/mini.c \
-f lib/m2/exit.c \
-f lib/mes/write.c \
-f lib/linux/x86-mes-m2/syscall.c \
-f include/linux/x86/syscall.h \
-f lib/linux/brk.c \
-f lib/stdlib/malloc.c \
-f lib/string/memset.c \
-f lib/m2/read.c \
-f lib/mes/fdgetc.c \
-f lib/stdio/getchar.c \
-f lib/stdio/putchar.c \
-f lib/m2/open.c \
-f lib/m2/mes_open.c \
-f lib/string/strlen.c \
-f lib/mes/eputs.c \
-f lib/mes/fdputc.c \
-f lib/mes/eputc.c \
\
-f include/mes/mes.h \
-f include/mes/m2.h \
-f include/mes/builtins.h \
-f include/mes/constants.h \
-f include/mes/symbols.h \
\
-f lib/mes/__assert_fail.c \
-f lib/mes/assert_msg.c \
\
-f lib/mes/fdputc.c \
-f lib/string/strncmp.c \
-f lib/posix/getenv.c \
-f lib/mes/fdputs.c \
-f lib/m2/ntoab.c \
-f lib/ctype/isdigit.c \
-f lib/ctype/isxdigit.c \
-f lib/ctype/isspace.c \
-f lib/ctype/isnumber.c \
-f lib/mes/abtol.c \
-f lib/stdlib/atoi.c \
-f lib/string/memcpy.c \
-f lib/stdlib/free.c \
-f lib/stdlib/realloc.c \
-f lib/string/strcpy.c \
-f lib/mes/itoa.c \
-f lib/mes/ltoa.c \
-f lib/mes/fdungetc.c \
-f lib/posix/setenv.c \
-f lib/linux/access.c \
-f lib/m2/chmod.c \
-f lib/m2/ioctl.c \
-f lib/m2/isatty.c \
-f lib/linux/fork.c \
-f lib/m2/execve.c \
-f lib/m2/execv.c \
-f lib/m2/waitpid.c \
-f lib/linux/gettimeofday.c \
-f lib/m2/clock_gettime.c \
-f lib/m2/time.c \
-f lib/linux/_getcwd.c \
-f lib/m2/getcwd.c \
-f lib/linux/dup.c \
-f lib/linux/dup2.c \
-f lib/string/strcmp.c \
-f lib/string/memcmp.c \
-f lib/linux/unlink.c \
-f src/builtins.c \
-f src/core.c \
-f src/display.c \
-f src/eval-apply.c \
-f src/gc.c \
-f src/hash.c \
-f src/lib.c \
-f src/m2.c \
-f src/math.c \
-f src/mes.c \
-f src/module.c \
-f src/posix.c \
-f src/reader.c \
-f src/stack.c \
-f src/string.c \
-f src/struct.c \
-f src/symbol.c \
-f src/vector.c \
-o bin/mes.M1
blood-elf -f bin/mes.M1 -o bin/mes.blood-elf-M1
M1 \
--LittleEndian \
--architecture x86 \
-f lib/m2/x86/x86_defs.M1 \
-f lib/x86-mes/x86.M1 \
-f lib/linux/x86-mes-m2/crt1.M1 \
-f bin/mes.M1 \
-f bin/mes.blood-elf-M1 \
-o bin/mes.hex2
hex2 \
--LittleEndian \
--architecture x86 \
--BaseAddress 0x1000000 \
--exec_enable \
-f lib/x86-mes/elf32-header.hex2 \
-f bin/mes.hex2 \
-o bin/mes-m2
echo Running mes-m2
./bin/mes-m2 -c '(display "Hello Mes-M2\n")'

27
lib/ctype/isgraph.c Normal file
View File

@ -0,0 +1,27 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <ctype.h>
int
isgraph (int c)
{
return c > 32 && c < 127;
}

View File

@ -25,7 +25,7 @@
char * char *
_getcwd (char *buffer, size_t size) _getcwd (char *buffer, size_t size)
{ {
int r = _sys_call2 (SYS_getcwd, (long) buffer, (long) size); int r = _sys_call2 (SYS_getcwd, buffer, size);
if (r >= 0) if (r >= 0)
return buffer; return buffer;
return 0; return 0;

View File

@ -24,5 +24,7 @@
int int
access (char const *file_name, int how) access (char const *file_name, int how)
{ {
return _sys_call2 (SYS_access, (long) file_name, (int) how); long long_file_name = file_name;
long long_how = how;
return _sys_call2 (SYS_access, long_file_name, long_how);
} }

View File

@ -24,5 +24,5 @@
long long
brk (void *addr) brk (void *addr)
{ {
return _sys_call1 (SYS_brk, (long) addr); return _sys_call1 (SYS_brk, addr);
} }

View File

@ -25,5 +25,7 @@
int int
chmod (char const *file_name, mode_t mask) chmod (char const *file_name, mode_t mask)
{ {
return _sys_call2 (SYS_chmod, (long) file_name, (long) mask); long long_file_name = file_name;
long long_mask = mask;
return _sys_call2 (SYS_chmod, long_file_name, long_mask);
} }

View File

@ -25,5 +25,7 @@
int int
clock_gettime (clockid_t clk_id, struct timespec *tp) clock_gettime (clockid_t clk_id, struct timespec *tp)
{ {
return _sys_call2 (SYS_clock_gettime, (long) clk_id, (long) tp); long long_clk_id = clk_id;
long long_tp = tp;
return _sys_call2 (SYS_clock_gettime, clk_id, tp);
} }

View File

@ -24,5 +24,6 @@
int int
dup (int old) dup (int old)
{ {
return _sys_call1 (SYS_dup, (int) old); long long_old = old;
return _sys_call1 (SYS_dup, long_old);
} }

View File

@ -24,5 +24,7 @@
int int
dup2 (int old, int new) dup2 (int old, int new)
{ {
return _sys_call2 (SYS_dup2, (int) old, (int) new); long long_old = old;
long long_new = new;
return _sys_call2 (SYS_dup2, long_old, long_new);
} }

View File

@ -25,5 +25,7 @@
int int
gettimeofday (struct timeval *tv, struct timezone *tz) gettimeofday (struct timeval *tv, struct timezone *tz)
{ {
return _sys_call2 (SYS_gettimeofday, (long) tv, (long) tz); long long_tv = tv;
long long_tz = tz;
return _sys_call2 (SYS_gettimeofday, long_tv, long_tz);
} }

29
lib/linux/mknod.c Normal file
View File

@ -0,0 +1,29 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
#include <sys/stat.h>
int
mknod (char const *file_name, mode_t mode, dev_t dev)
{
return _sys_call3 (SYS_mknod, (long) file_name, (long) mode, (long) dev);
}

View File

@ -26,21 +26,23 @@
ssize_t ssize_t
read (int filedes, void *buffer, size_t size) read (int filedes, void *buffer, size_t size)
{ {
ssize_t bytes = _sys_call3 (SYS_read, (int) filedes, (long) buffer, (long) size); long long_filedes = filedes;
ssize_t bytes = _sys_call3 (SYS_read, long_filedes, buffer, size);
if (__mes_debug () > 4) if (__mes_debug () > 4)
{ {
if (bytes == 1) if (bytes == 1)
{ {
eputs ("read fd="); eputs ("read fd=");
eputs (itoa ((int) filedes)); eputs (itoa (filedes));
eputs (" c="); eputs (" c=");
eputc (*(char *) buffer); char *s = buffer;
eputc (s[0]);
eputs ("\n"); eputs ("\n");
} }
else else
{ {
eputs ("read fd="); eputs ("read fd=");
eputs (itoa ((int) filedes)); eputs (itoa (filedes));
eputs (" bytes="); eputs (" bytes=");
eputs (itoa (bytes)); eputs (itoa (bytes));
eputs ("\n"); eputs ("\n");

29
lib/linux/readlink.c Normal file
View File

@ -0,0 +1,29 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
#include <sys/stat.h>
ssize_t
readlink (char const *file_name, char *buffer, size_t size)
{
return _sys_call3 (SYS_readlink, (long) file_name, (long) buffer, (long) size);
}

29
lib/linux/symlink.c Normal file
View File

@ -0,0 +1,29 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
#include <unistd.h>
int
symlink (char const *old_name, char const *new_name)
{
return _sys_call2 (SYS_symlink, (long) old_name, (long) new_name);
}

View File

@ -24,5 +24,5 @@
int int
unlink (char const *file_name) unlink (char const *file_name)
{ {
return _sys_call1 (SYS_unlink, (long) file_name); return _sys_call1 (SYS_unlink, file_name);
} }

View File

@ -0,0 +1,43 @@
DEFINE mov____%edi,%ebp 89fd
DEFINE mov____%esp,%edi 89e7
:_start
push___%ebp
mov____%esp,%ebp
sub____$i32,%esp %0x1054
mov____$i8,%eax !0
mov____%eax,0x32 &GLOBAL___stdin
mov____$i8,%eax !1
mov____%eax,0x32 &GLOBAL___stdout
mov____$i8,%eax !2
mov____%eax,0x32 &GLOBAL___stderr
mov____%ebp,%eax
add____$i8,%eax !4
movzbl_(%eax),%eax
add____$i8,%eax !3
shl____$i8,%eax !0x02
add____%ebp,%eax
mov____%eax,0x32 &GLOBAL_environ
mov____%esp,%edi ; M2-Planet calling convention pushes forward
mov____%ebp,%eax ; argc
add____$i8,%eax !4
movzbl_(%eax),%eax
push___%eax
mov____%ebp,%eax ; argv
add____$i8,%eax !8
push___%eax
mov____0x32,%eax &GLOBAL_environ
push___%eax
mov____%edi,%ebp ; M2-Planet calling convention
call32 %FUNCTION_main
add____$i8,%esp !0x0
test___%eax,%eax
mov____%eax,%ebx
mov____$i32,%eax %1
int____$0x80
hlt
leave
ret

View File

@ -0,0 +1,68 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include "mes/lib-mini.h"
int __stdin;
int __stdout;
int __stderr;
char **environ;
int main (int argc, char **argv, char **envp);
/* FIXME: this is going to be called `FUNCTION__start'
int
_start ()
{
asm ("mov____$i8,%eax !0");
asm ("mov____%eax,0x32 &GLOBAL___stdin");
asm ("mov____$i8,%eax !1");
asm ("mov____%eax,0x32 &GLOBAL___stdout");
asm ("mov____$i8,%eax !2");
asm ("mov____%eax,0x32 &GLOBAL___stderr");
asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !4");
asm ("movzbl_(%eax),%eax");
asm ("add____$i8,%eax !3");
asm ("shl____$i8,%eax !0x02");
asm ("add____%ebp,%eax");
asm ("mov____%eax,0x32 &GLOBAL_environ");
asm ("push___%eax");
asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !8");
asm ("push___%eax");
asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !4");
asm ("movzbl_(%eax),%eax");
asm ("push___%eax");
main ();
asm ("mov____%eax,%ebx");
asm ("mov____$i32,%eax %1");
asm ("int____$0x80");
asm ("hlt");
}
*/

View File

@ -0,0 +1,37 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
void
_exit ()
{
asm ("mov____$i32,%eax SYS_exit");
asm ("mov____0x8(%ebp),%ebx !-4");
asm ("int____$0x80");
}
void
_write (int filedes, void *buffer, int size)
{
asm ("mov____$i32,%eax SYS_write");
asm ("mov____0x8(%ebp),%ebx !-4");
asm ("mov____0x8(%ebp),%ecx !-8");
asm ("mov____0x8(%ebp),%edx !-12");
asm ("int____$0x80");
}

View File

@ -0,0 +1,139 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <errno.h>
#include <linux/x86/syscall.h>
int errno;
int
__sys_call (int sys_call)
{
asm ("mov____0x8(%ebp),%eax !-4");
asm ("int____$0x80");
}
int
__sys_call1 (int sys_call, int one)
{
asm ("mov____0x8(%ebp),%eax !-4");
asm ("mov____0x8(%ebp),%ebx !-8");
asm ("int____$0x80");
}
int
__sys_call2 (int sys_call, int one, int two)
{
asm ("mov____0x8(%ebp),%eax !-4");
asm ("mov____0x8(%ebp),%ebx !-8");
asm ("mov____0x8(%ebp),%ecx !-12");
asm ("int____$0x80");
}
int
__sys_call3 (int sys_call, int one, int two, int three)
{
asm ("mov____0x8(%ebp),%eax !-4");
asm ("mov____0x8(%ebp),%ebx !-8");
asm ("mov____0x8(%ebp),%ecx !-12");
asm ("mov____0x8(%ebp),%edx !-16");
asm ("int____$0x80");
}
int
__sys_call4 (int sys_call, int one, int two, int three, int four)
{
asm ("mov____0x8(%ebp),%eax !-4");
asm ("mov____0x8(%ebp),%ebx !-8");
asm ("mov____0x8(%ebp),%ecx !-12");
asm ("mov____0x8(%ebp),%edx !-16");
asm ("mov____0x8(%ebp),%esi !-24");
asm ("int____$0x80");
}
int
_sys_call (int sys_call)
{
int r = __sys_call (sys_call);
if (r < 0)
{
errno = -r;
r = -1;
}
else
errno = 0;
return r;
}
int
_sys_call1 (int sys_call, int one)
{
int r = __sys_call1 (sys_call, one);
if (r < 0)
{
errno = -r;
r = -1;
}
else
errno = 0;
return r;
}
int
_sys_call2 (int sys_call, int one, int two)
{
int r = __sys_call2 (sys_call, one, two);
if (r < 0)
{
errno = -r;
r = -1;
}
else
errno = 0;
return r;
}
int
_sys_call3 (int sys_call, int one, int two, int three)
{
int r = __sys_call3 (sys_call, one, two, three);
if (r < 0)
{
errno = -r;
r = -1;
}
else
errno = 0;
return r;
}
int
_sys_call4 (int sys_call, int one, int two, int three, int four)
{
int r = __sys_call4 (sys_call, one, two, three, four);
if (r < 0)
{
errno = -r;
r = -1;
}
else
errno = 0;
return r;
}

55
lib/m2/abtol.c Normal file
View File

@ -0,0 +1,55 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
#include <ctype.h>
long
abtol (char **p, int base)
{
char *s = p[0];
int i = 0;
int sign_p = 0;
if (base == 0)
base = 10;
while (isspace (s[0]) != 0)
s = s + 1;
if (s[0] != 0 && s[0] == '+')
s = s + 1;
if (s[0] != 0 && s[0] == '-')
{
sign_p = 1;
s = s + 1;
}
while (isnumber (s[0], base) != 0)
{
i = i * base;
int m = '0';
if (s[0] > '9')
m = 'a' - 10;
i = i + s[0] - m;
s = s + 1;
}
p[0] = s;
if (sign_p != 0)
return -i;
return i;
}

31
lib/m2/chmod.c Normal file
View File

@ -0,0 +1,31 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
#include <sys/stat.h>
int
chmod (char const *file_name, int mask)
{
long long_file_name = file_name;
long long_mask = mask;
return _sys_call2 (SYS_chmod, long_file_name, long_mask);
}

30
lib/m2/clock_gettime.c Normal file
View File

@ -0,0 +1,30 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
#include <time.h>
int
clock_gettime (long clk_id, struct timespec *tp)
{
long long_tp = tp;
return _sys_call2 (SYS_clock_gettime, clk_id, tp);
}

25
lib/m2/execv.c Normal file
View File

@ -0,0 +1,25 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
int
execv (char *file_name, char **argv)
{
return execve (file_name, argv, environ);
}

31
lib/m2/execve.c Normal file
View File

@ -0,0 +1,31 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
int
execve (char const *file_name, char **argv, char **env)
{
long long_file_name = file_name;
long long_argv = argv;
long long_env = env;
return _sys_call3 (SYS_execve, file_name, argv, env);
}

29
lib/m2/exit.c Normal file
View File

@ -0,0 +1,29 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
void _exit (int code);
void
exit (int code)
{
_exit (code);
}

37
lib/m2/getcwd.c Normal file
View File

@ -0,0 +1,37 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
#include <limits.h>
#include <sys/types.h>
#include <mes/lib.h>
// CONSTANT PATH_MAX 1024
char *
getcwd (char *buffer, int size)
{
if (__getcwd_buf == 0)
__getcwd_buf = malloc (PATH_MAX);
char *buf = __itoa_buf;
if (buffer != 0)
return _getcwd (buffer, size);
return _getcwd (buf, PATH_MAX);
}

34
lib/m2/ioctl.c Normal file
View File

@ -0,0 +1,34 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
#include <stdarg.h>
#include <sys/ioctl.h>
int
ioctl (int filedes, long command, int data)
{
long long_filedes = filedes;
long long_command = command;
long long_data = data;
int r = _sys_call3 (SYS_ioctl, long_filedes, long_command, long_data);
return r;
}

54
lib/m2/isatty.c Normal file
View File

@ -0,0 +1,54 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <string.h>
#include <termio.h>
// CONSTANT TCGETS 0x5401
#define TCGETS 0x5401
// CONSTANT NCCS 19
#define NCCS 19
struct ktermios
{
unsigned c_iflag;
unsigned c_oflag;
unsigned c_cflag;
unsigned c_lflag;
char c_line;
char c_cc[NCCS];
unsigned c_ispeed;
unsigned c_ospeed;
};
struct ktermios *__isatty_kernel_termios;
int
isatty (int filedes)
{
if (__isatty_kernel_termios == 0)
__isatty_kernel_termios = malloc (sizeof (struct ktermios));
int r = ioctl (filedes, TCGETS, __isatty_kernel_termios);
return r == 0;
}

29
lib/m2/mes_open.c Normal file
View File

@ -0,0 +1,29 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
int
mes_open (char *file_name, int flags, int mask)
{
__ungetc_init ();
int filedes = open (file_name, flags, mask);
if (filedes > 2)
__ungetc_clear (filedes);
return filedes;
}

69
lib/m2/ntoab.c Normal file
View File

@ -0,0 +1,69 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
#include <assert.h>
#include <string.h>
char *__itoa_buf;
char *
ntoab (long x, int base, int signed_p)
{
if (__itoa_buf == 0)
__itoa_buf = malloc (20);
char *buf = __itoa_buf;
char *p = buf + 11;
p[0] = 0;
p = p - 1;
assert_msg (base > 0, "base > 0");
int sign_p = 0;
unsigned u;
if (signed_p != 0 && x < 0)
{
sign_p = 1;
u = -x;
}
else
u = x;
do
{
unsigned i;
i = u % base;
u = u / base;
if (i > 9)
p[0] = 'a' + i - 10;
else
p[0] = '0' + i;
p = p - 1;
}
while (u != 0);
if (sign_p && p[1] != '0')
{
p[0] = '-';
p = p - 1;
}
return p + 1;
}

33
lib/m2/open.c Normal file
View File

@ -0,0 +1,33 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
#include <fcntl.h>
#include <stdarg.h>
int
open (char *file_name, int flags, int mask)
{
int r = _sys_call3 (SYS_open, file_name, flags, mask);
__ungetc_init ();
if (r > 2)
__ungetc_clear (r);
return r;
}

31
lib/m2/read.c Normal file
View File

@ -0,0 +1,31 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* aSCM with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
#include <mes/lib.h>
#include <fcntl.h>
SCM
read (int filedes, void *buffer, SCM size)
{
SCM bytes = _sys_call3 (SYS_read, filedes, buffer, size);
return bytes;
}

35
lib/m2/strncmp.c Normal file
View File

@ -0,0 +1,35 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
int
strncmp (char const *a, char const *b, size_t size)
{
if (size == 0)
return 0;
while (a[0] != 0 && b[0] != 0 && a[0] == b[0] && size > 1)
{
size = size - 1;
a = a + 1;
b = b + 1;
}
return a[0] - b[0];
}

29
lib/m2/time.c Normal file
View File

@ -0,0 +1,29 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
#include <time.h>
long
time (long *result)
{
return _sys_call1 (SYS_time, result);
}

38
lib/m2/waitpid.c Normal file
View File

@ -0,0 +1,38 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/syscall.h>
#include <syscall.h>
#include <sys/types.h>
int
waitpid (int pid, int *status_ptr, int options)
{
long long_pid = pid;
long long_status_ptr = status_ptr;
long long_options = options;
#if __i386__
return _sys_call3 (SYS_waitpid, long_pid, long_status_ptr, long_options);
#elif __x86_64__
return _sys_call4 (SYS_wait4, long_pid, long_status_ptr, long_options, 0);
#else
#error arch not supported
#endif
}

90
lib/m2/x86/x86_defs.M1 Normal file
View File

@ -0,0 +1,90 @@
## Copyright (C) 2017 Jeremiah Orians
## This file is part of M2-Planet.
##
## M2-Planet is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
##
## M2-Planet is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with M2-Planet. If not, see <http://www.gnu.org/licenses/>.
DEFINE ADD_IMMEDIATE_to_eax 81C0
DEFINE ADD_IMMEDIATE_to_ebp 81C5
DEFINE ADD_eax_to_ebx 01C3
DEFINE ADD_ebp_to_eax 01E8
DEFINE ADD_ebx_to_eax 01D8
DEFINE AND_eax_ebx 21D8
DEFINE CALL_IMMEDIATE E8
DEFINE CALL_eax FFD0
DEFINE CMP 39C3
DEFINE COPY_eax_to_ebx 89C3
DEFINE COPY_eax_to_ecx 89C1
DEFINE COPY_ebp_to_eax 89E8
DEFINE COPY_ebx_to_eax 89D8
DEFINE COPY_ebx_to_edx 89DA
DEFINE COPY_ecx_to_ebp 89CD
DEFINE COPY_edi_to_ebp 89fd
DEFINE COPY_esp_to_ebp 89E5
DEFINE COPY_esp_to_ecx 89E1
DEFINE COPY_esp_to_edi 89E7
DEFINE DIVIDE_eax_by_ebx_into_eax F7FB
DEFINE INT_80 CD80
DEFINE JUMP E9
DEFINE JUMP_EQ 0F84
DEFINE JUMP_NE 0F85
DEFINE JUMP_EQ8 74
DEFINE JUMP_NE8 75
DEFINE LOAD_BASE_ADDRESS_eax 8D85
DEFINE LOAD_BYTE 0FBE00
DEFINE LOAD_EFFECTIVE_ADDRESS 8D8424
DEFINE LOAD_EFFECTIVE_ADDRESS_ebx 8D9C24
DEFINE LOAD_EFFECTIVE_ADDRESS_ecx 8D8C24
DEFINE LOAD_EFFECTIVE_ADDRESS_edx 8D9424
DEFINE LOAD_ESP_IMMEDIATE_into_eax 8B8424
DEFINE LOAD_IMMEDIATE_eax B8
DEFINE LOAD_IMMEDIATE_ebx BB
DEFINE LOAD_IMMEDIATE_edx BA
DEFINE LOAD_INTEGER 8B00
DEFINE LOAD_INTEGER_ebx 8B1B
DEFINE LOAD_INTEGER_ecx 8B09
DEFINE LOAD_INTEGER_edx 8B12
DEFINE MODULUS_eax_from_ebx_into_ebx F7FB
DEFINE MOVEZBL 0FB6C0
DEFINE MOVE_ebx_to_eax 89D8
DEFINE MOVE_ecx_to_eax 89C8
DEFINE MOVE_edx_to_eax 89D0
DEFINE MULTIPLY_eax_by_ebx_into_eax F7E3
DEFINE NOP 00000000
DEFINE NOT_eax F7D0
DEFINE OR_eax_ebx 09D8
DEFINE POP_eax 58
DEFINE POP_ebx 5B
DEFINE POP_ebp 5D
DEFINE POP_edi 5F
DEFINE PUSH_eax 50
DEFINE PUSH_ebx 53
DEFINE PUSH_ebp 55
DEFINE PUSH_edi 57
DEFINE RETURN C3
DEFINE SAL_eax_Immediate8 C1E0
DEFINE SAL_eax_cl D3E0
DEFINE SAR_eax_cl D3F8
DEFINE SETE 0F94C0
DEFINE SETLE 0F9EC0
DEFINE SETL 0F9CC0
DEFINE SETGE 0F9DC0
DEFINE SETG 0F9FC0
DEFINE SETNE 0F95C0
DEFINE STORE_CHAR 8803
DEFINE STORE_INTEGER 8903
DEFINE SUBTRACT_eax_from_ebx_into_ebx 29C3
DEFINE TEST 85C0
DEFINE XCHG_eax_ebx 93
DEFINE XOR_ebx_eax_into_eax 31D8

View File

@ -28,5 +28,5 @@ __assert_fail (char *s)
eputs ("\n"); eputs ("\n");
char *fail = s; char *fail = s;
fail = 0; fail = 0;
*fail = 0; fail[0] = 0;
} }

53
lib/mes/abtod.c Normal file
View File

@ -0,0 +1,53 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
double
abtod (char const **p, int base)
{
char const *s = *p;
double d = 0;
int sign_p = 0;
if (!base)
base = 10;
double dbase = base;
long i = abtol (&s, base);
long f = 0;
long e = 0;
if (*s == '.')
{
s++;
f = abtol (&s, base);
}
if (*s == 'e')
{
s++;
e = abtol (&s, base);
}
d = i + f / dbase;
if (e < 0)
while (e++)
d = d / dbase;
while (e--)
d = d * dbase;
*p = s;
return sign_p ? -d : d;
}

View File

@ -24,23 +24,32 @@
long long
abtol (char const **p, int base) abtol (char const **p, int base)
{ {
char const *s = *p; char const *s = p[0];
int i = 0; int i = 0;
int sign = 1; int sign_p = 0;
if (!base) if (base == 0)
base = 10; base = 10;
if (*s && *s == '-') while (isspace (s[0]) != 0)
s = s + 1;
if (s[0] != 0 && s[0] == '+')
s = s + 1;
if (s[0] != 0 && s[0] == '-')
{ {
sign = -1; sign_p = 1;
s++; s = s + 1;
} }
while (isnumber (*s, base)) while (isnumber (s[0], base) != 0)
{ {
i *= base; i = i * base;
int m = *s > '9' ? 'a' - 10 : '0'; int m = '0';
i += *s - m; if (s[0] > '9')
s++; m = 'a' - 10;
i = i + s[0] - m;
s = s + 1;
} }
*p = s; p[0] = s;
return i * sign; if (sign_p != 0)
return -i;
return i;
} }

30
lib/mes/assert_msg.c Normal file
View File

@ -0,0 +1,30 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2019 Jeremiah Orians <jeremiah@pdp10.guru>
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
#include <stdlib.h>
void
assert_msg (int bool, char *msg)
{
if (bool == 0)
__assert_fail (msg);
}

46
lib/mes/dtoab.c Normal file
View File

@ -0,0 +1,46 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
#include <limits.h>
#include <string.h>
char *
dtoab (double d, int base, int signed_p)
{
static char dtoa_buf[40];
long i = (long) d;
char *p = ntoab (i, base, signed_p);
strcpy (dtoa_buf, p);
long f = (d - (double) i) * (double) 100000000;
if (f)
{
if (f < 0)
f = -f;
strcat (dtoa_buf, ".");
p = ntoab (f, base, 1);
strcat (dtoa_buf, p);
p = strchr (dtoa_buf, 0);
p--;
while (*p && *p == '0')
*p-- = 0;
}
return dtoa_buf;
}

View File

@ -19,12 +19,15 @@
*/ */
#include <mes/lib.h> #include <mes/lib.h>
#include <errno.h>
#include <limits.h> #include <limits.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <unistd.h> #include <unistd.h>
int __ungetc_buf[__FILEDES_MAX + 1] = { 0 }; int errno;
int *__ungetc_buf;
int int
__ungetc_p (int filedes) __ungetc_p (int filedes)
@ -35,8 +38,13 @@ __ungetc_p (int filedes)
void void
__ungetc_init () __ungetc_init ()
{ {
if (__ungetc_buf[__FILEDES_MAX] == 0) if (__ungetc_buf == 0)
memset (__ungetc_buf, -1, (__FILEDES_MAX + 1) * sizeof (int)); {
int save_errno = errno;
__ungetc_buf = malloc ((__FILEDES_MAX + 1) * sizeof (int));
errno = save_errno;
memset (__ungetc_buf, -1, (__FILEDES_MAX + 1) * sizeof (int));
}
} }
void void
@ -65,10 +73,10 @@ fdgetc (int fd)
int r = read (fd, &c, 1); int r = read (fd, &c, 1);
if (r < 1) if (r < 1)
return -1; return -1;
i = (int) c; i = c;
} }
if (i < 0) if (i < 0)
i += 256; i = i + 256;
return i; return i;
} }

View File

@ -23,6 +23,7 @@
int int
fdputc (int c, int fd) fdputc (int c, int fd)
{ {
write (fd, (char *) &c, 1); char *p = &c;
write (fd, p, 1);
return 0; return 0;
} }

View File

@ -19,7 +19,6 @@
*/ */
#include <mes/lib.h> #include <mes/lib.h>
#include <assert.h>
int int
fdungetc (int c, int fd) fdungetc (int c, int fd)
@ -32,7 +31,7 @@ fdungetc (int c, int fd)
eputs (" ***MES C LIB*** fdungetc ungetc buffer overflow fd="); eputs (" ***MES C LIB*** fdungetc ungetc buffer overflow fd=");
eputs (itoa (fd)); eputs (itoa (fd));
eputs ("\n"); eputs ("\n");
assert (0); assert_msg (0, "0");
} }
__ungetc_set (fd, c); __ungetc_set (fd, c);
return c; return c;

View File

@ -18,20 +18,32 @@
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>. * along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <assert.h>
#include <mes/lib.h> #include <mes/lib.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
char *__itoa_buf;
char * char *
ntoab (long x, int base, int signed_p) ntoab (long x, int base, int signed_p)
{ {
static char itoa_buf[20]; #if 0
char *p = itoa_buf + 11; if (! __itoa_buf)
*p-- = 0; __itoa_buf = malloc (20);
assert(base > 0); p = __itoa_buf + 11;
#else
static char buf[20];
char *p = buf + 19;
#endif
p[0] = 0;
p = p - 1;
assert_msg (base > 0, "base > 0");
int sign_p = 0; int sign_p = 0;
unsigned long u; unsigned long u;
if (signed_p && x < 0) if (signed_p != 0 && x < 0)
{ {
sign_p = 1; sign_p = 1;
u = -x; u = -x;
@ -48,12 +60,19 @@ ntoab (long x, int base, int signed_p)
i = u % base; i = u % base;
u = u / base; u = u / base;
#endif #endif
*p-- = i > 9 ? 'a' + i - 10 : '0' + i; if (i > 9)
p[0] = 'a' + i - 10;
else
p[0] = '0' + i;
p = p - 1;
} }
while (u); while (u != 0);
if (sign_p && *(p + 1) != '0') if (sign_p && p[1] != '0')
*p-- = '-'; {
p[0] = '-';
p = p - 1;
}
return p + 1; return p + 1;
} }

View File

@ -23,22 +23,13 @@
#include <unistd.h> #include <unistd.h>
int int
execl (char const *file_name, char const *arg, ...) vexec (char const *file_name, va_list ap)
{ {
if (__mes_debug () > 2) char *arg = va_arg (ap, char *);
{
eputs ("execl ");
eputs (file_name);
eputs ("\n");
}
char *argv[1000]; // POSIX minimum 4096 char *argv[1000]; // POSIX minimum 4096
int i = 0; int i = 0;
va_list ap; argv[i++] = (char *) file_name;
va_start (ap, arg);
argv[i++] = (char *)file_name;
arg = va_arg (ap, char const *);
while (arg) while (arg)
{ {
argv[i++] = arg; argv[i++] = arg;
@ -57,3 +48,20 @@ execl (char const *file_name, char const *arg, ...)
va_end (ap); va_end (ap);
return r; return r;
} }
int
execl (char const *file_name, char const *arg, ...)
{
va_list ap;
int r;
va_start (ap, arg);
if (__mes_debug () > 2)
{
eputs ("execl ");
eputs (file_name);
eputs ("\n");
}
r = vexec (file_name, ap);
va_end (ap);
return r;
}

47
lib/posix/execlp.c Normal file
View File

@ -0,0 +1,47 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of GNU Mes.
*
* GNU Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* GNU Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
#include <errno.h>
#include <stdarg.h>
int
execlp (char const *file_name, char const *arg, ...)
{
va_list ap;
int r;
va_start (ap, arg);
if (file_name[0] != '/')
file_name = search_path (file_name);
if (__mes_debug () > 2)
{
eputs ("execlp ");
eputs (file_name ? file_name : "0");
eputs ("\n");
}
if (!file_name)
{
errno = ENOENT;
return -1;
}
r = vexec (file_name, ap);
va_end (ap);
return r;
}

View File

@ -1,4 +1,4 @@
/* -*-comment-start: "//";comment-end:""-*- /*
* GNU Mes --- Maxwell Equations of Software * GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
@ -22,16 +22,30 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
// CONSTANT M2_PTR_SIZE 4
#define M2_PTR_SIZE 1
char * char *
getenv (char const *s) getenv (char const *s)
{ {
/* eputs ("\ngetenv s="); eputs (s); eputs ("\n"); */
char **p = environ; char **p = environ;
int length = strlen (s); int length = strlen (s);
while (*p)
while (p[0] != 0)
{ {
if (!strncmp (s, *p, length) && *(*p + length) == '=') /* eputs ("getenv p[0]="); eputs (p[0]); eputs ("\n"); */
return (*p + length + 1); if (strncmp (s, p[0], length) == 0)
p++; {
/* eputs ("found!\n"); */
char *q = p[0] + length;
if (q[0] == '=')
return q + 1;
}
/* else */
/* eputs ("not found!\n"); */
p = p + M2_PTR_SIZE;
} }
return 0; return 0;
} }

View File

@ -22,25 +22,34 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
// CONSTANT M2_PTR_SIZE 4
#define M2_PTR_SIZE 1
int int
setenv (char const *s, char const *v, int overwrite_p) setenv (char const *s, char const *v, int overwrite_p)
{ {
char **p = environ; char **p = environ;
int length = strlen (s); int length = strlen (s);
while (*p)
while (p[0] != 0)
{ {
if (!strncmp (s, *p, length) && *(*p + length) == '=') if (strncmp (s, p[0], length) == 0)
break; {
p++; char *q = p[0] + length;
if (q[0] == '=')
break;
}
p = p + M2_PTR_SIZE;
} }
char *entry = malloc (length + strlen (v) + 2); char *entry = malloc (length + strlen (v) + 2);
int end_p = *p == 0; int end_p = p[0] == 0;
*p = entry; p[0] = entry;
strcpy (entry, s); strcpy (entry, s);
strcpy (entry + length, "="); strcpy (entry + length, "=");
strcpy (entry + length + 1, v); strcpy (entry + length + 1, v);
*(entry + length + strlen (v) + 2) = 0; entry[length + strlen (v) + 2] = 0;
if (end_p) if (end_p != 0)
*++p = 0; p[1] = 0;
return 0; return 0;
} }

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software * GNU Mes --- Maxwell Equations of Software
* Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of GNU Mes. * This file is part of GNU Mes.
* *
@ -25,5 +25,8 @@
int int
fflush (FILE * stream) fflush (FILE * stream)
{ {
fsync ((long) stream); int filedes = (long) stream;
if (filedes < 3)
return 0;
return fsync (filedes);
} }

View File

@ -23,6 +23,7 @@
int int
putchar (int c) putchar (int c)
{ {
write (STDOUT, (char *) &c, 1); char *p = &c;
write (__stdout, p, 1);
return 0; return 0;
} }

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software * GNU Mes --- Maxwell Equations of Software
* Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of GNU Mes. * This file is part of GNU Mes.
* *
@ -33,7 +33,7 @@ vfprintf (FILE * f, char const *format, va_list ap)
if (*p != '%') if (*p != '%')
{ {
count++; count++;
fputc (*p++, fd); fputc (*p++, f);
} }
else else
{ {
@ -88,7 +88,7 @@ vfprintf (FILE * f, char const *format, va_list ap)
{ {
case '%': case '%':
{ {
fputc (*p, fd); fputc (*p, f);
count++; count++;
break; break;
} }
@ -96,7 +96,7 @@ vfprintf (FILE * f, char const *format, va_list ap)
{ {
char _c; char _c;
_c = va_arg (ap, long); _c = va_arg (ap, long);
fputc (_c, fd); fputc (_c, f);
break; break;
} }
case 'd': case 'd':
@ -108,7 +108,7 @@ vfprintf (FILE * f, char const *format, va_list ap)
{ {
long d = va_arg (ap, long); long d = va_arg (ap, long);
int base = c == 'o' ? 8 : c == 'x' || c == 'X' ? 16 : 10; int base = c == 'o' ? 8 : c == 'x' || c == 'X' ? 16 : 10;
char const *s = ntoab (d, base, c != 'u' && c != 'x' && c != 'X'); char *s = ntoab (d, base, c != 'u' && c != 'x' && c != 'X');
if (c == 'X') if (c == 'X')
strupr (s); strupr (s);
int length = strlen (s); int length = strlen (s);
@ -182,6 +182,50 @@ vfprintf (FILE * f, char const *format, va_list ap)
} }
break; break;
} }
case 'f':
case 'e':
case 'E':
case 'g':
case 'G':
{
double d = va_arg8 (ap, double);
char *s = dtoab (d, 10, 1);
if (c == 'E' || c == 'G')
strupr (s);
int length = strlen (s);
if (precision == -1)
precision = length;
if (!left_p)
{
while (width-- > precision)
{
fputc (pad, f);
count++;
}
while (precision > length)
{
fputc (' ', f);
precision--;
width--;
count++;
}
}
while (*s)
{
if (precision-- <= 0)
break;
width--;
fputc (*s++, f);
count++;
}
while (width > 0)
{
width--;
fputc (pad, f);
count++;
}
break;
}
case 'n': case 'n':
{ {
int *n = va_arg (ap, int *); int *n = va_arg (ap, int *);

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software * GNU Mes --- Maxwell Equations of Software
* Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of GNU Mes. * This file is part of GNU Mes.
* *
@ -114,7 +114,7 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap)
{ {
long d = va_arg (ap, long); long d = va_arg (ap, long);
int base = c == 'o' ? 8 : c == 'x' || c == 'X' ? 16 : 10; int base = c == 'o' ? 8 : c == 'x' || c == 'X' ? 16 : 10;
char const *s = ntoab (d, base, c != 'u' && c != 'x' && c != 'X'); char *s = ntoab (d, base, c != 'u' && c != 'x' && c != 'X');
if (c == 'X') if (c == 'X')
strupr (s); strupr (s);
int length = strlen (s); int length = strlen (s);
@ -198,6 +198,55 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap)
} }
break; break;
} }
case 'f':
case 'e':
case 'E':
case 'g':
case 'G':
{
double d = va_arg8 (ap, double);
char *s = dtoab (d, 10, 1);
if (c == 'E' || c == 'G')
strupr (s);
int length = strlen (s);
if (precision == -1)
precision = length;
if (!left_p)
{
while (width-- > precision)
{
if (count < size)
*str++ = pad;
count++;
}
while (precision > length)
{
if (count < size)
*str++ = ' ';
precision--;
width--;
count++;
}
}
while (*s)
{
if (precision-- <= 0)
break;
width--;
c = *s++;
if (count < size)
*str++ = c;
count++;
}
while (width > 0)
{
width--;
if (count < size)
*str++ = pad;
count++;
}
break;
}
case 'n': case 'n':
{ {
int *n = va_arg (ap, int *); int *n = va_arg (ap, int *);

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software * GNU Mes --- Maxwell Equations of Software
* Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of GNU Mes. * This file is part of GNU Mes.
* *
@ -66,6 +66,17 @@ vsscanf (char const *s, char const *template, va_list ap)
count++; count++;
break; break;
} }
case 'e':
case 'f':
case 'g':
case 'E':
case 'G':
{
float *f = va_arg (ap, float *);
*f = strtod (p, &p);
count++;
break;
}
default: default:
{ {
eputs ("vsscanf: not supported: %:"); eputs ("vsscanf: not supported: %:");

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software * GNU Mes --- Maxwell Equations of Software
* Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of GNU Mes. * This file is part of GNU Mes.
* *
@ -18,6 +18,8 @@
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>. * along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <stdlib.h>
int int
__exit (int status) __exit (int status)
{ {

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software * GNU Mes --- Maxwell Equations of Software
* Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of GNU Mes. * This file is part of GNU Mes.
* *
@ -18,6 +18,8 @@
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>. * along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <stdlib.h>
void void
abort (void) abort (void)
{ {

View File

@ -20,12 +20,9 @@
#include <mes/lib.h> #include <mes/lib.h>
int double
atof (int x) atof (char const *string)
{ {
static int stub = 0; char const *p = string;
if (__mes_debug () && !stub) return abtod (&p, 0);
eputs ("atof stub\n");
stub = 1;
return 0;
} }

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software * GNU Mes --- Maxwell Equations of Software
* Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of GNU Mes. * This file is part of GNU Mes.
* *
@ -21,8 +21,8 @@
#include <mes/lib.h> #include <mes/lib.h>
int int
atoi (char const *s) atoi (char const *string)
{ {
char const *p = s; char const *p = string;
return abtol (&p, 0); return abtol (&p, 0);
} }

View File

@ -27,10 +27,10 @@ void *
malloc (size_t size) malloc (size_t size)
{ {
if (!__brk) if (!__brk)
__brk = (char *) brk (0); __brk = brk (0);
if (brk (__brk + size) == -1) if (brk (__brk + size) == -1)
return 0; return 0;
char *p = __brk; char *p = __brk;
__brk += size; __brk = __brk + size;
return p; return p;
} }

View File

@ -18,10 +18,10 @@
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>. * along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <mes/lib.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#if !__MESC__
typedef char wchar_t[];
size_t size_t
mbstowcs (wchar_t * wstring, char const *string, size_t size) mbstowcs (wchar_t * wstring, char const *string, size_t size)
@ -33,4 +33,3 @@ mbstowcs (wchar_t * wstring, char const *string, size_t size)
strcpy (wstring, string); strcpy (wstring, string);
return strlen (string); return strlen (string);
} }
#endif

Some files were not shown because too many files have changed in this diff Show More