;;; Dynamic memory management. Allocated with MALLOC and released with
;;; MUNMAP (see below)
- ;; ( size -- addr )
- ;; Allocates memory (using brk)
WORD p_malloc,'MALLOC',fasm
+ ;; ( size -- addr )
+ ;; Allocates memory (using mmap)
pushr rsi ; pretend it's a FORTH word since it
; ends via sys_mmap_asm
pop rax
push qword 0 ; address of mapping (suggestion)
push rax ; length of mapping
push qword 3 ; protection mode PROT_READ | PROT_WRITE
- push qword 8226 ; flags PRIVATE | ANONYMOUS | LOCKED
+ push qword 34 ; flags PRIVATE | ANONYMOUS
push qword -1 ; fd -1
push qword 0 ; offset
jmp sys_mmap_asm ; exit via sys_mmap
+ WORD p_realloc,'REALLOC',fasm
+ ;; ( addr old new -- )
+ ;; Try remapping a given MMAP region of old size to a new size
+ ;; mremap(void *old_address, size_t old_size,
+ ;; size_t new_size, int flags, ... /* void *new_address */);
+ pushr rsi
+ push 1 ; MREMAP_MAYMOVE
+ jmp sys_mmap_asm ; exit via sys_mmap
+
;;; ========================================
;;; Input stream handling.
;;;
WORD p_double_quote,'"',fasm ;; " (fool emacs)
;; ( -- char* n )
- ;; Scan to double quote in stream buffer, putting the string on PAD
+ ;; Scan to double quote in stream buffer, putting the string
+ ;; on PAD, plus an extra NUL, then copy that into a new temp
+ ;; object, but exclude the NUL from the returned count, n.
pushr rsi
push p_pad_DFA
push 0
p_double_quote_loop:
- DOFORTH p_stdin, p_read_stream_char
+ DOFORTH p_input, p_get, p_read_stream_char
pop rax
cmp rax,0
jl p_double_quote_endstream
jmp p_double_quote_loop
p_double_quote_endquote:
p_double_quote_endstream:
+ lea rdi,[p_pad_DFA]
+ add rdi,qword [rsp]
+ stosb
+ ;; copy PAD string into new temp object
+ inc qword [rsp]
+ DOFORTH p_str2temp
+ dec qword [rsp]
+ add qword [rsp+8],8 ; adjust pointer
popr rsi
next
WORD p_sp,'SP',dovalue
;; ( -- c )
;; Pushes a space character on the stack
- dq 10
+ dq 32
WORD p_digits,'DIGITS',dovariable
db '0123456789abcdef'