reorganize into multiple word lists & shrink bootstrap words

This commit is contained in:
Jesse D. McDonald 2020-10-23 19:39:29 -05:00
parent 4b98e19304
commit 92d806298b
2 changed files with 638 additions and 541 deletions

View File

@ -207,416 +207,6 @@ defconst __F_IMMED,F_IMMED,"F_IMMED"
defconst __F_HIDDEN,F_HIDDEN,"F_HIDDEN" defconst __F_HIDDEN,F_HIDDEN,"F_HIDDEN"
defconst __F_LENMASK,F_LENMASK,"F_LENMASK" defconst __F_LENMASK,F_LENMASK,"F_LENMASK"
/*
** x86 system call numbers
*/
defconst SYS_EXIT,__NR_exit
/* defconst SYS_FORK,__NR_fork */
defconst SYS_READ,__NR_read
defconst SYS_WRITE,__NR_write
/* defconst SYS_CLOSE,__NR_close */
/* defconst SYS_WAITPID,__NR_waitpid */
/* defconst SYS_CHDIR,__NR_chdir */
/* defconst SYS_TIME,__NR_time */
/* defconst SYS_CHMOD,__NR_chmod */
/* defconst SYS_LSEEK,__NR_lseek */
defconst SYS_GETPID,__NR_getpid
/* defconst SYS_MOUNT,__NR_mount */
/* defconst SYS_STIME,__NR_stime */
/* defconst SYS_PTRACE,__NR_ptrace */
/* defconst SYS_ALARM,__NR_alarm */
/* defconst SYS_PAUSE,__NR_pause */
/* defconst SYS_UTIME,__NR_utime */
/* defconst SYS_ACCESS,__NR_access */
/* defconst SYS_NICE,__NR_nice */
/* defconst SYS_SYNC,__NR_sync */
/* defconst SYS_KILL,__NR_kill */
/* defconst SYS_RMDIR,__NR_rmdir */
/* defconst SYS_DUP,__NR_dup */
/* defconst SYS_TIMES,__NR_times */
defconst SYS_BRK,__NR_brk
/* defconst SYS_SIGNAL,__NR_signal */
/* defconst SYS_UMOUNT2,__NR_umount2 */
defconst SYS_IOCTL,__NR_ioctl
/* defconst SYS_SETPGID,__NR_setpgid */
/* defconst SYS_UMASK,__NR_umask */
/* defconst SYS_CHROOT,__NR_chroot */
/* defconst SYS_USTAT,__NR_ustat */
/* defconst SYS_GETPPID,__NR_getppid */
/* defconst SYS_GETPGRP,__NR_getpgrp */
/* defconst SYS_SETSID,__NR_setsid */
/* defconst SYS_SGETMASK,__NR_sgetmask */
/* defconst SYS_SSETMASK,__NR_ssetmask */
/* defconst SYS_SETHOSTNAME,__NR_sethostname */
/* defconst SYS_SETRLIMIT,__NR_setrlimit */
/* defconst SYS_GETRLIMIT,__NR_getrlimit */
/* defconst SYS_GETRUSAGE,__NR_getrusage */
/* defconst SYS_GETTIMEOFDAY,__NR_gettimeofday */
/* defconst SYS_SETTIMEOFDAY,__NR_settimeofday */
/* defconst SYS_SELECT,__NR_select */
/* defconst SYS_SWAPON,__NR_swapon */
/* defconst SYS_REBOOT,__NR_reboot */
/* defconst SYS_READDIR,__NR_readdir */
defconst SYS_MUNMAP,__NR_munmap
/* defconst SYS_GETPRIORITY,__NR_getpriority */
/* defconst SYS_SETPRIORITY,__NR_setpriority */
/* defconst SYS_IOPERM,__NR_ioperm */
/* defconst SYS_SYSLOG,__NR_syslog */
/* defconst SYS_SETITIMER,__NR_setitimer */
/* defconst SYS_GETITIMER,__NR_getitimer */
/* defconst SYS_IOPL,__NR_iopl */
/* defconst SYS_VHANGUP,__NR_vhangup */
/* defconst SYS_IDLE,__NR_idle */
/* defconst SYS_WAIT4,__NR_wait4 */
/* defconst SYS_SWAPOFF,__NR_swapoff */
/* defconst SYS_SYSINFO,__NR_sysinfo */
/* defconst SYS_IPC,__NR_ipc */
/* defconst SYS_FSYNC,__NR_fsync */
/* defconst SYS_SETDOMAINNAME,__NR_setdomainname */
/* defconst SYS_UNAME,__NR_uname */
/* defconst SYS_MODIFY_LDT,__NR_modify_ldt */
/* defconst SYS_ADJTIMEX,__NR_adjtimex */
/* defconst SYS_MPROTECT,__NR_mprotect */
/* defconst SYS_INIT_MODULE,__NR_init_module */
/* defconst SYS_DELETE_MODULE,__NR_delete_module */
/* defconst SYS_QUOTACTL,__NR_quotactl */
/* defconst SYS_GETPGID,__NR_getpgid */
/* defconst SYS_FCHDIR,__NR_fchdir */
/* defconst SYS_SYSFS,__NR_sysfs */
/* defconst SYS_PERSONALITY,__NR_personality */
/* defconst SYS__LLSEEK,__NR__llseek */
/* defconst SYS__NEWSELECT,__NR__newselect */
/* defconst SYS_FLOCK,__NR_flock */
/* defconst SYS_MSYNC,__NR_msync */
/* defconst SYS_READV,__NR_readv */
/* defconst SYS_WRITEV,__NR_writev */
/* defconst SYS_GETSID,__NR_getsid */
/* defconst SYS_FDATASYNC,__NR_fdatasync */
/* defconst SYS__SYSCTL,__NR__sysctl */
/* defconst SYS_MUNLOCK,__NR_munlock */
/* defconst SYS_MLOCKALL,__NR_mlockall */
/* defconst SYS_MUNLOCKALL,__NR_munlockall */
/* defconst SYS_SCHED_SETPARAM,__NR_sched_setparam */
/* defconst SYS_SCHED_GETPARAM,__NR_sched_getparam */
/* defconst SYS_SCHED_SETSCHEDULER,__NR_sched_setscheduler */
/* defconst SYS_SCHED_GETSCHEDULER,__NR_sched_getscheduler */
/* defconst SYS_SCHED_YIELD,__NR_sched_yield */
/* defconst SYS_SCHED_GET_PRIORITY_MAX,__NR_sched_get_priority_max */
/* defconst SYS_SCHED_GET_PRIORITY_MIN,__NR_sched_get_priority_min */
/* defconst SYS_NANOSLEEP,__NR_nanosleep */
/* defconst SYS_MREMAP,__NR_mremap */
/* defconst SYS_VM86,__NR_vm86 */
/* defconst SYS_POLL,__NR_poll */
/* defconst SYS_PRCTL,__NR_prctl */
/* defconst SYS_RT_SIGRETURN,__NR_rt_sigreturn */
/* defconst SYS_RT_SIGACTION,__NR_rt_sigaction */
/* defconst SYS_RT_SIGPROCMASK,__NR_rt_sigprocmask */
/* defconst SYS_RT_SIGPENDING,__NR_rt_sigpending */
/* defconst SYS_RT_SIGQUEUEINFO,__NR_rt_sigqueueinfo */
/* defconst SYS_RT_SIGSUSPEND,__NR_rt_sigsuspend */
/* defconst SYS_PREAD64,__NR_pread64 */
/* defconst SYS_PWRITE64,__NR_pwrite64 */
/* defconst SYS_GETCWD,__NR_getcwd */
/* defconst SYS_CAPGET,__NR_capget */
/* defconst SYS_CAPSET,__NR_capset */
/* defconst SYS_SIGALTSTACK,__NR_sigaltstack */
/* defconst SYS_VFORK,__NR_vfork */
defconst SYS_MMAP2,__NR_mmap2
/* defconst SYS_TRUNCATE64,__NR_truncate64 */
/* defconst SYS_FTRUNCATE64,__NR_ftruncate64 */
/* defconst SYS_STAT64,__NR_stat64 */
/* defconst SYS_LSTAT64,__NR_lstat64 */
/* defconst SYS_LCHOWN32,__NR_lchown32 */
/* defconst SYS_GETUID32,__NR_getuid32 */
/* defconst SYS_GETGID32,__NR_getgid32 */
/* defconst SYS_GETEUID32,__NR_geteuid32 */
/* defconst SYS_GETEGID32,__NR_getegid32 */
/* defconst SYS_SETREUID32,__NR_setreuid32 */
/* defconst SYS_SETREGID32,__NR_setregid32 */
/* defconst SYS_GETGROUPS32,__NR_getgroups32 */
/* defconst SYS_SETGROUPS32,__NR_setgroups32 */
/* defconst SYS_SETRESUID32,__NR_setresuid32 */
/* defconst SYS_GETRESUID32,__NR_getresuid32 */
/* defconst SYS_SETRESGID32,__NR_setresgid32 */
/* defconst SYS_GETRESGID32,__NR_getresgid32 */
/* defconst SYS_CHOWN32,__NR_chown32 */
/* defconst SYS_SETUID32,__NR_setuid32 */
/* defconst SYS_SETGID32,__NR_setgid32 */
/* defconst SYS_SETFSUID32,__NR_setfsuid32 */
/* defconst SYS_SETFSGID32,__NR_setfsgid32 */
/* defconst SYS_PIVOT_ROOT,__NR_pivot_root */
/* defconst SYS_MINCORE,__NR_mincore */
/* defconst SYS_MADVISE,__NR_madvise */
/* defconst SYS_GETDENTS64,__NR_getdents64 */
/* defconst SYS_FCNTL64,__NR_fcntl64 */
defconst SYS_GETTID,__NR_gettid
/* defconst SYS_READAHEAD,__NR_readahead */
/* defconst SYS_SETXATTR,__NR_setxattr */
/* defconst SYS_LSETXATTR,__NR_lsetxattr */
/* defconst SYS_FSETXATTR,__NR_fsetxattr */
/* defconst SYS_GETXATTR,__NR_getxattr */
/* defconst SYS_LGETXATTR,__NR_lgetxattr */
/* defconst SYS_FGETXATTR,__NR_fgetxattr */
/* defconst SYS_LISTXATTR,__NR_listxattr */
/* defconst SYS_LLISTXATTR,__NR_llistxattr */
/* defconst SYS_FLISTXATTR,__NR_flistxattr */
/* defconst SYS_REMOVEXATTR,__NR_removexattr */
/* defconst SYS_LREMOVEXATTR,__NR_lremovexattr */
/* defconst SYS_FREMOVEXATTR,__NR_fremovexattr */
/* defconst SYS_SENDFILE64,__NR_sendfile64 */
/* defconst SYS_SCHED_SETAFFINITY,__NR_sched_setaffinity */
/* defconst SYS_SCHED_GETAFFINITY,__NR_sched_getaffinity */
/* defconst SYS_SET_THREAD_AREA,__NR_set_thread_area */
/* defconst SYS_GET_THREAD_AREA,__NR_get_thread_area */
/* defconst SYS_IO_SETUP,__NR_io_setup */
/* defconst SYS_IO_DESTROY,__NR_io_destroy */
/* defconst SYS_IO_GETEVENTS,__NR_io_getevents */
/* defconst SYS_IO_SUBMIT,__NR_io_submit */
/* defconst SYS_IO_CANCEL,__NR_io_cancel */
/* defconst SYS_EXIT_GROUP,__NR_exit_group */
/* defconst SYS_LOOKUP_DCOOKIE,__NR_lookup_dcookie */
/* defconst SYS_EPOLL_CTL,__NR_epoll_ctl */
/* defconst SYS_EPOLL_WAIT,__NR_epoll_wait */
/* defconst SYS_REMAP_FILE_PAGES,__NR_remap_file_pages */
/* defconst SYS_SET_TID_ADDRESS,__NR_set_tid_address */
/* defconst SYS_TIMER_CREATE,__NR_timer_create */
/* defconst SYS_TIMER_GETOVERRUN,__NR_timer_getoverrun */
/* defconst SYS_TIMER_DELETE,__NR_timer_delete */
/* defconst SYS_STATFS64,__NR_statfs64 */
/* defconst SYS_FSTATFS64,__NR_fstatfs64 */
defconst SYS_TGKILL,__NR_tgkill
/* defconst SYS_UTIMES,__NR_utimes */
/* defconst SYS_FADVISE64_64,__NR_fadvise64_64 */
/* defconst SYS_MBIND,__NR_mbind */
/* defconst SYS_GET_MEMPOLICY,__NR_get_mempolicy */
/* defconst SYS_SET_MEMPOLICY,__NR_set_mempolicy */
/* defconst SYS_MQ_OPEN,__NR_mq_open */
/* defconst SYS_MQ_UNLINK,__NR_mq_unlink */
/* defconst SYS_MQ_NOTIFY,__NR_mq_notify */
/* defconst SYS_MQ_GETSETATTR,__NR_mq_getsetattr */
/* defconst SYS_KEXEC_LOAD,__NR_kexec_load */
/* defconst SYS_WAITID,__NR_waitid */
/* defconst SYS_ADD_KEY,__NR_add_key */
/* defconst SYS_REQUEST_KEY,__NR_request_key */
/* defconst SYS_KEYCTL,__NR_keyctl */
/* defconst SYS_IOPRIO_SET,__NR_ioprio_set */
/* defconst SYS_IOPRIO_GET,__NR_ioprio_get */
/* defconst SYS_INOTIFY_ADD_WATCH,__NR_inotify_add_watch */
/* defconst SYS_INOTIFY_RM_WATCH,__NR_inotify_rm_watch */
/* defconst SYS_MIGRATE_PAGES,__NR_migrate_pages */
/* defconst SYS_MKDIRAT,__NR_mkdirat */
/* defconst SYS_MKNODAT,__NR_mknodat */
/* defconst SYS_FCHOWNAT,__NR_fchownat */
/* defconst SYS_FUTIMESAT,__NR_futimesat */
/* defconst SYS_FSTATAT64,__NR_fstatat64 */
/* defconst SYS_UNLINKAT,__NR_unlinkat */
/* defconst SYS_LINKAT,__NR_linkat */
/* defconst SYS_SYMLINKAT,__NR_symlinkat */
/* defconst SYS_READLINKAT,__NR_readlinkat */
/* defconst SYS_FCHMODAT,__NR_fchmodat */
/* defconst SYS_UNSHARE,__NR_unshare */
/* defconst SYS_SET_ROBUST_LIST,__NR_set_robust_list */
/* defconst SYS_GET_ROBUST_LIST,__NR_get_robust_list */
/* defconst SYS_SPLICE,__NR_splice */
/* defconst SYS_SYNC_FILE_RANGE,__NR_sync_file_range */
/* defconst SYS_TEE,__NR_tee */
/* defconst SYS_VMSPLICE,__NR_vmsplice */
/* defconst SYS_MOVE_PAGES,__NR_move_pages */
/* defconst SYS_GETCPU,__NR_getcpu */
/* defconst SYS_EPOLL_PWAIT,__NR_epoll_pwait */
/* defconst SYS_TIMERFD_CREATE,__NR_timerfd_create */
/* defconst SYS_FALLOCATE,__NR_fallocate */
/* defconst SYS_SIGNALFD4,__NR_signalfd4 */
/* defconst SYS_EVENTFD2,__NR_eventfd2 */
/* defconst SYS_EPOLL_CREATE1,__NR_epoll_create1 */
/* defconst SYS_DUP3,__NR_dup3 */
/* defconst SYS_PIPE2,__NR_pipe2 */
/* defconst SYS_INOTIFY_INIT1,__NR_inotify_init1 */
/* defconst SYS_RT_TGSIGQUEUEINFO,__NR_rt_tgsigqueueinfo */
/* defconst SYS_PERF_EVENT_OPEN,__NR_perf_event_open */
/* defconst SYS_FANOTIFY_INIT,__NR_fanotify_init */
/* defconst SYS_FANOTIFY_MARK,__NR_fanotify_mark */
/* defconst SYS_PRLIMIT64,__NR_prlimit64 */
/* defconst SYS_NAME_TO_HANDLE_AT,__NR_name_to_handle_at */
/* defconst SYS_OPEN_BY_HANDLE_AT,__NR_open_by_handle_at */
/* defconst SYS_SYNCFS,__NR_syncfs */
/* defconst SYS_SENDMMSG,__NR_sendmmsg */
/* defconst SYS_SETNS,__NR_setns */
/* defconst SYS_PROCESS_VM_READV,__NR_process_vm_readv */
/* defconst SYS_PROCESS_VM_WRITEV,__NR_process_vm_writev */
/* defconst SYS_KCMP,__NR_kcmp */
/* defconst SYS_FINIT_MODULE,__NR_finit_module */
/* defconst SYS_SCHED_SETATTR,__NR_sched_setattr */
/* defconst SYS_SCHED_GETATTR,__NR_sched_getattr */
/* defconst SYS_RENAMEAT2,__NR_renameat2 */
/* defconst SYS_SECCOMP,__NR_seccomp */
/* defconst SYS_GETRANDOM,__NR_getrandom */
/* defconst SYS_MEMFD_CREATE,__NR_memfd_create */
/* defconst SYS_BPF,__NR_bpf */
/* defconst SYS_EXECVEAT,__NR_execveat */
/* defconst SYS_SOCKET,__NR_socket */
/* defconst SYS_SOCKETPAIR,__NR_socketpair */
/* defconst SYS_BIND,__NR_bind */
/* defconst SYS_CONNECT,__NR_connect */
/* defconst SYS_LISTEN,__NR_listen */
/* defconst SYS_ACCEPT4,__NR_accept4 */
/* defconst SYS_GETSOCKOPT,__NR_getsockopt */
/* defconst SYS_SETSOCKOPT,__NR_setsockopt */
/* defconst SYS_GETSOCKNAME,__NR_getsockname */
/* defconst SYS_GETPEERNAME,__NR_getpeername */
/* defconst SYS_SENDTO,__NR_sendto */
/* defconst SYS_SENDMSG,__NR_sendmsg */
/* defconst SYS_RECVFROM,__NR_recvfrom */
/* defconst SYS_RECVMSG,__NR_recvmsg */
/* defconst SYS_SHUTDOWN,__NR_shutdown */
/* defconst SYS_USERFAULTFD,__NR_userfaultfd */
/* defconst SYS_MEMBARRIER,__NR_membarrier */
/* defconst SYS_MLOCK2,__NR_mlock2 */
/* defconst SYS_COPY_FILE_RANGE,__NR_copy_file_range */
/* defconst SYS_PREADV2,__NR_preadv2 */
/* defconst SYS_PWRITEV2,__NR_pwritev2 */
/* defconst SYS_PKEY_MPROTECT,__NR_pkey_mprotect */
/* defconst SYS_PKEY_ALLOC,__NR_pkey_alloc */
/* defconst SYS_PKEY_FREE,__NR_pkey_free */
/* defconst SYS_STATX,__NR_statx */
/* defconst SYS_ARCH_PRCTL,__NR_arch_prctl */
/* defconst SYS_RSEQ,__NR_rseq */
/* defconst SYS_SEMGET,__NR_semget */
/* defconst SYS_SEMCTL,__NR_semctl */
/* defconst SYS_SHMGET,__NR_shmget */
/* defconst SYS_SHMCTL,__NR_shmctl */
/* defconst SYS_SHMAT,__NR_shmat */
/* defconst SYS_SHMDT,__NR_shmdt */
/* defconst SYS_MSGGET,__NR_msgget */
/* defconst SYS_MSGSND,__NR_msgsnd */
/* defconst SYS_MSGRCV,__NR_msgrcv */
/* defconst SYS_MSGCTL,__NR_msgctl */
/* defconst SYS_CLOCK_GETTIME64,__NR_clock_gettime64 */
/* defconst SYS_CLOCK_SETTIME64,__NR_clock_settime64 */
/* defconst SYS_CLOCK_ADJTIME64,__NR_clock_adjtime64 */
/* defconst SYS_CLOCK_GETRES_TIME64,__NR_clock_getres_time64 */
/* defconst SYS_CLOCK_NANOSLEEP_TIME64,__NR_clock_nanosleep_time64 */
/* defconst SYS_TIMER_GETTIME64,__NR_timer_gettime64 */
/* defconst SYS_TIMER_SETTIME64,__NR_timer_settime64 */
/* defconst SYS_TIMERFD_GETTIME64,__NR_timerfd_gettime64 */
/* defconst SYS_TIMERFD_SETTIME64,__NR_timerfd_settime64 */
/* defconst SYS_UTIMENSAT_TIME64,__NR_utimensat_time64 */
/* defconst SYS_PSELECT6_TIME64,__NR_pselect6_time64 */
/* defconst SYS_PPOLL_TIME64,__NR_ppoll_time64 */
/* defconst SYS_IO_PGETEVENTS_TIME64,__NR_io_pgetevents_time64 */
/* defconst SYS_RECVMMSG_TIME64,__NR_recvmmsg_time64 */
/* defconst SYS_MQ_TIMEDSEND_TIME64,__NR_mq_timedsend_time64 */
/* defconst SYS_MQ_TIMEDRECEIVE_TIME64,__NR_mq_timedreceive_time64 */
/* defconst SYS_SEMTIMEDOP_TIME64,__NR_semtimedop_time64 */
/* defconst SYS_RT_SIGTIMEDWAIT_TIME64,__NR_rt_sigtimedwait_time64 */
/* defconst SYS_FUTEX_TIME64,__NR_futex_time64 */
/* defconst SYS_SCHED_RR_GET_INTERVAL_TIME64,__NR_sched_rr_get_interval_time64 */
/* defconst SYS_PIDFD_SEND_SIGNAL,__NR_pidfd_send_signal */
/* defconst SYS_IO_URING_SETUP,__NR_io_uring_setup */
/* defconst SYS_IO_URING_ENTER,__NR_io_uring_enter */
/* defconst SYS_IO_URING_REGISTER,__NR_io_uring_register */
/* defconst SYS_OPEN_TREE,__NR_open_tree */
/* defconst SYS_MOVE_MOUNT,__NR_move_mount */
/* defconst SYS_FSOPEN,__NR_fsopen */
/* defconst SYS_FSCONFIG,__NR_fsconfig */
/* defconst SYS_FSMOUNT,__NR_fsmount */
/* defconst SYS_FSPICK,__NR_fspick */
/* defconst SYS_PIDFD_OPEN,__NR_pidfd_open */
/* defconst SYS_CLONE3,__NR_clone3 */
/* defconst SYS_OPENAT2,__NR_openat2 */
/* defconst SYS_PIDFD_GETFD,__NR_pidfd_getfd */
/* defconst SYS_FACCESSAT2,__NR_faccessat2 */
/* Special dirfd for *at syscalls to resolve path relative to current directory */
/* defconst AT_FDCWD,-100 */
/*
** errno values
*/
/* defconst ERRNO_EPERM,1 */
/* defconst ERRNO_ENOENT,2 */
/* defconst ERRNO_ESRCH,3 */
defconst ERRNO_EINTR,4
/* defconst ERRNO_EIO,5 */
/* defconst ERRNO_ENXIO,6 */
/* defconst ERRNO_E2BIG,7 */
/* defconst ERRNO_ENOEXEC,8 */
/* defconst ERRNO_EBADF,9 */
/* defconst ERRNO_ECHILD,10 */
/* defconst ERRNO_EAGAIN,11 */
/* defconst ERRNO_ENOMEM,12 */
/* defconst ERRNO_EACCES,13 */
/* defconst ERRNO_EFAULT,14 */
/* defconst ERRNO_ENOTBLK,15 */
/* defconst ERRNO_EBUSY,16 */
/* defconst ERRNO_EEXIST,17 */
/* defconst ERRNO_EXDEV,18 */
/* defconst ERRNO_ENODEV,19 */
/* defconst ERRNO_ENOTDIR,20 */
/* defconst ERRNO_EISDIR,21 */
/* defconst ERRNO_EINVAL,22 */
/* defconst ERRNO_ENFILE,23 */
/* defconst ERRNO_EMFILE,24 */
/* defconst ERRNO_ENOTTY,25 */
/* defconst ERRNO_ETXTBSY,26 */
/* defconst ERRNO_EFBIG,27 */
/* defconst ERRNO_ENOSPC,28 */
/* defconst ERRNO_ESPIPE,29 */
/* defconst ERRNO_EROFS,30 */
/* defconst ERRNO_EMLINK,31 */
/* defconst ERRNO_EPIPE,32 */
/* defconst ERRNO_EDOM,33 */
/* defconst ERRNO_ERANGE,34 */
/*
** signal numbers
*/
/* defconst SIGHUP,1 */
/* defconst SIGINT,2 */
/* defconst SIGQUIT,3 */
/* defconst SIGILL,4 */
/* defconst SIGTRAP,5 */
defconst SIGABRT,6
/* defconst SIGIOT,6 */
/* defconst SIGBUS,7 */
/* defconst SIGFPE,8 */
/* defconst SIGKILL,9 */
/* defconst SIGUSR1,10 */
/* defconst SIGSEGV,11 */
/* defconst SIGUSR2,12 */
/* defconst SIGPIPE,13 */
/* defconst SIGALRM,14 */
/* defconst SIGTERM,15 */
/* defconst SIGSTKFLT,16 */
/* defconst SIGCHLD,17 */
/* defconst SIGCONT,18 */
/* defconst SIGSTOP,19 */
/* defconst SIGTSTP,20 */
/* defconst SIGTTIN,21 */
/* defconst SIGTTOU,22 */
/* defconst SIGURG,23 */
/* defconst SIGXCPU,24 */
/* defconst SIGXFSZ,25 */
/* defconst SIGVTALRM,26 */
/* defconst SIGPROF,27 */
/* defconst SIGWINCH,28 */
/* defconst SIGIO,29 */
/* defconst SIGPOLL,29 */
/* defconst SIGPWR,30 */
/* defconst SIGSYS,31 */
/*
** openat2() flags
*/
/* defconst __O_RDONLY,0,"O_RDONLY" */
/* defconst __O_WRONLY,1,"O_WRONLY" */
/* defconst __O_RDWR,2,"O_RDWR" */
/* defconst __O_CREAT,0100,"O_CREAT" */
/* defconst __O_EXCL,0200,"O_EXCL" */
/* defconst __O_TRUNC,01000,"O_TRUNC" */
/* defconst __O_APPEND,02000,"O_APPEND" */
/* defconst __O_NONBLOCK,04000,"O_NONBLOCK" */
/* NOTE: These are initialized in _start and read-only thereafter. */ /* NOTE: These are initialized in _start and read-only thereafter. */
defvalue C0 /* first byte of the heap */ defvalue C0 /* first byte of the heap */
defvalue S0 /* initial (empty) data stack pointer */ defvalue S0 /* initial (empty) data stack pointer */
@ -631,9 +221,6 @@ defvar IN,0,">IN"
defvar CP /* "compilation pointer", next free byte in the heap */ defvar CP /* "compilation pointer", next free byte in the heap */
defvar BRK /* the (current) end of the heap */ defvar BRK /* the (current) end of the heap */
/* The list of primitive (native code) words provided by this file */
defvar PRIMITIVE_WORDLIST,last_primitive,"PRIMITIVE-WORDLIST"
/* The list of basic non-primitive words used to bootstrap the startup.4th file */ /* The list of basic non-primitive words used to bootstrap the startup.4th file */
defvar BOOTSTRAP_WORDLIST,last_word,"BOOTSTRAP-WORDLIST" defvar BOOTSTRAP_WORDLIST,last_word,"BOOTSTRAP-WORDLIST"
@ -645,16 +232,6 @@ defvar FORTH_WORDLIST,last_primitive,"FORTH-WORDLIST"
/* The current compilation word list, initially FORTH-WORDLIST */ /* The current compilation word list, initially FORTH-WORDLIST */
defvar CURRENT,data_FORTH_WORDLIST defvar CURRENT,data_FORTH_WORDLIST
.section .data
.align 4
/* This is a linked list; initial_order points to the head of the list */
0: .int 0,data_BOOTSTRAP_WORDLIST
initial_order:
.int 0b,data_FORTH_WORDLIST
/* Head of the linked list representing the current search order */
defvar CURRENT_ORDER,initial_order,"CURRENT-ORDER"
/* ( a -- ) */ /* ( a -- ) */
defcode DROP defcode DROP
pop %eax pop %eax
@ -1541,11 +1118,11 @@ bootstrap_data_begin:
/* ( c-addr u -- "ccc" ) */ /* ( c-addr u -- "ccc" ) */
defword TYPE defword TYPE
.int LIT,1,NROT,SYS_WRITE,SYSCALL3,DROP,EXIT .int LIT,1,NROT,LIT,__NR_write,SYSCALL3,DROP,EXIT
/* ( c -- "c" ) */ /* ( c -- "c" ) */
defword EMIT defword EMIT
.int SPFETCH,LIT,1,SWAP,LIT,1,SYS_WRITE,SYSCALL3,TWODROP,EXIT .int SPFETCH,LIT,1,SWAP,LIT,1,LIT,__NR_write,SYSCALL3,TWODROP,EXIT
/* ( -- "<eol>" ) */ /* ( -- "<eol>" ) */
defword EOL defword EOL
@ -1556,7 +1133,7 @@ defword BAILOUT
.int BREAK .int BREAK
litstring "Fatal error\n" litstring "Fatal error\n"
.int TYPE .int TYPE
0: .int LIT,254,SYS_EXIT,SYSCALL1,DROP,BRANCH,(0b - .) 0: .int LIT,254,LIT,__NR_exit,SYSCALL1,DROP,BRANCH,(0b - .)
.int EXIT /* just to mark the end */ .int EXIT /* just to mark the end */
defword UNEXPECTED_EOF,"UNEXPECTED-EOF" defword UNEXPECTED_EOF,"UNEXPECTED-EOF"
@ -1568,13 +1145,9 @@ defword UNEXPECTED_EOF,"UNEXPECTED-EOF"
defword SOURCE defword SOURCE
.int LIT,startup_defs,LIT,(startup_defs_end - startup_defs),EXIT .int LIT,startup_defs,LIT,(startup_defs_end - startup_defs),EXIT
/* ( c-addr u1 u2 -- c-addr+u2 u1-u2 ) */
defword DROP_PREFIX,"DROP-PREFIX"
.int ROT,OVER,ADD,NROT,SUB,EXIT
/* ( -- c-addr u ) Current parse area (input buffer minus first >IN characters) */ /* ( -- c-addr u ) Current parse area (input buffer minus first >IN characters) */
defword PARSE_AREA,"PARSE-AREA" defword PARSE_AREA,"PARSE-AREA"
.int SOURCE,IN,FETCH,DROP_PREFIX,EXIT .int SOURCE,IN,FETCH,ROT,OVER,ADD,NROT,SUB,EXIT
/* ( "c" -- c ) Leaves c at the start of the parse area */ /* ( "c" -- c ) Leaves c at the start of the parse area */
defword PEEK_CHAR,"PEEK-CHAR" defword PEEK_CHAR,"PEEK-CHAR"
@ -1664,13 +1237,10 @@ defword ISBOOTSTRAP,"BOOTSTRAP?"
.int LIT,bootstrap_data_end,ULT,EXIT .int LIT,bootstrap_data_end,ULT,EXIT
0: .int DROP,FALSE,EXIT 0: .int DROP,FALSE,EXIT
/* Convert search order entry address to address of word list identifier field */ /* ( -- widn ... wid1 n ) Return the current search order */
defword ORDER_TWID,"ORDER>WID" /* Redefining this word with DEFER! will change the bootstrap search order */
.int CELL,ADD,EXIT defword GET_ORDER,"BOOTSTRAP-GET-ORDER"
.int BOOTSTRAP_WORDLIST,FORTH_WORDLIST,LIT,2,EXIT
/* Convert search order entry address to address of link field */
defword ORDER_TLINK,"ORDER>LINK"
.int EXIT
/* ( c-addr u wid -- 0 | xt 1 | xt -1 ) */ /* ( c-addr u wid -- 0 | xt 1 | xt -1 ) */
/* 0 = not found; 1 = non-immediate; -1 = immediate */ /* 0 = not found; 1 = non-immediate; -1 = immediate */
@ -1683,25 +1253,24 @@ defword SEARCH_WORDLIST,"SEARCH-WORDLIST"
.int STREQU,ZBRANCH,(3f - .) /* entry c-addr u */ .int STREQU,ZBRANCH,(3f - .) /* entry c-addr u */
.int TWODROP,DUP,ISIMMEDIATE,LIT,1,OR,EXIT /* entry 1 | entry -1 */ .int TWODROP,DUP,ISIMMEDIATE,LIT,1,OR,EXIT /* entry 1 | entry -1 */
3: .int ROT,BRANCH,(1b - .) /* c-addr u entry */ 3: .int ROT,BRANCH,(1b - .) /* c-addr u entry */
4: .int NIP,NIP,EXIT /* entry (= 0) */ 4: .int NIP,NIP,EXIT /* 0 */
/* ( c-addr u -- c-addr u 0 | xt 1 | xt -1 ) */ /* ( c-addr u -- c-addr u 0 | xt 1 | xt -1 ) */
defword FIND defword FIND
.int TWOTOR,CURRENT_ORDER .int TWOTOR,GET_ORDER
0: .int FETCH,QDUP,ZBRANCH,(1f - .) 0: .int DUP,ZBRANCH,(1f - .)
.int DUP,ORDER_TLINK,SWAP,ORDER_TWID,FETCH .int SUB1,SWAP,TWORFETCH,ROT,SEARCH_WORDLIST,QDUP,ZBRANCH,(0b - .)
.int TWORFETCH,ROT,SEARCH_WORDLIST,QDUP,ZBRANCH,(0b - .) .int TWORDROP,TWOTOR,NDROP,TWOFROMR,EXIT
.int TWORDROP,ROT,DROP,EXIT 1: .int TWOFROMR,ROT,EXIT
1: .int TWOFROMR,LIT,0,EXIT
/* ( c-addr u -- xt 1 | xt -1 ) */ /* ( c-addr u -- xt 1 | xt -1 ) */
defword FIND_OR_ABORT,"FIND-OR-ABORT" defword FIND_OR_BAILOUT,"FIND-OR-BAILOUT"
.int FIND,QDUP,ZBRANCH,(0f - .),EXIT .int FIND,QDUP,ZBRANCH,(0f - .),EXIT
0: litstring "Word not found: " 0: litstring "Word not found: "
.int TYPE,TYPE,EOL,BAILOUT,EXIT .int TYPE,TYPE,EOL,BAILOUT,EXIT
/* ( "<spaces>" -- ) */ /* ( "<spaces>" -- ) */
defword SKIPSPACE defword SKIP_SPACE,"SKIP-SPACE"
0: .int PARSE_AREA,ZBRANCH,(1f - .) 0: .int PARSE_AREA,ZBRANCH,(1f - .)
.int FETCHBYTE,ISSPACE,ZBRANCH,(2f - .) .int FETCHBYTE,ISSPACE,ZBRANCH,(2f - .)
.int LIT,1,IN,INCREMENT,BRANCH,(0b - .) .int LIT,1,IN,INCREMENT,BRANCH,(0b - .)
@ -1710,7 +1279,7 @@ defword SKIPSPACE
/* ( "<spaces?>ccc" -- c-addr u ) */ /* ( "<spaces?>ccc" -- c-addr u ) */
defword WORD defword WORD
.int SKIPSPACE .int SKIP_SPACE
.int PARSE_AREA,DROP,LIT,1 .int PARSE_AREA,DROP,LIT,1
.int NEXT_CHAR,DROP .int NEXT_CHAR,DROP
0: .int PARSE_AREA,ZBRANCH,(1f - .) 0: .int PARSE_AREA,ZBRANCH,(1f - .)
@ -1759,7 +1328,7 @@ defword PARSENUMBER
9: .int TRUE,EXIT 9: .int TRUE,EXIT
defword INTERPRET defword INTERPRET
.int SKIPSPACE .int SKIP_SPACE
.int PEEK_CHAR,LIT,34,EQU,ZBRANCH,(1f - .) .int PEEK_CHAR,LIT,34,EQU,ZBRANCH,(1f - .)
.int LIT,1,IN,INCREMENT .int LIT,1,IN,INCREMENT
.int STATE,FETCH,ZBRANCH,(0f - .) .int STATE,FETCH,ZBRANCH,(0f - .)
@ -1774,7 +1343,7 @@ defword INTERPRET
.int LIT,LIT,COMMA,COMMA .int LIT,LIT,COMMA,COMMA
2: .int EXIT 2: .int EXIT
/* ELSE */ /* ELSE */
3: .int FIND_OR_ABORT,DROP 3: .int FIND_OR_BAILOUT,DROP
.int STATE,FETCH,ZBRANCH,(4f - .) .int STATE,FETCH,ZBRANCH,(4f - .)
/* ( OR ) */ /* ( OR ) */
.int DUP,ISIMMEDIATE,ZBRANCH,(5f - .) .int DUP,ISIMMEDIATE,ZBRANCH,(5f - .)
@ -1812,19 +1381,19 @@ defword LBRACKET,"[",F_IMMED
defword RBRACKET,"]",F_IMMED defword RBRACKET,"]",F_IMMED
.int TRUE,STATE,STORE,EXIT .int TRUE,STATE,STORE,EXIT
defword SLASH,"\\",F_IMMED defword BACKSLASH,"\\",F_IMMED
0: .int NEXT_CHAR,LIT,10,EQU,ZBRANCH,(0b - .),EXIT 0: .int NEXT_CHAR,LIT,10,EQU,ZBRANCH,(0b - .),EXIT
defword PAREN,"(",F_IMMED defword OPENPAREN,"(",F_IMMED
0: .int NEXT_CHAR,LIT,')',EQU,ZBRANCH,(0b - .),EXIT 0: .int NEXT_CHAR,LIT,')',EQU,ZBRANCH,(0b - .),EXIT
defword COLON,":" defword COLON,":"
/* Make word & fetch address */ /* Make word & fetch address */
.int CREATE,LATEST .int CREATE
/* Set as hidden */ /* Set as hidden */
.int DUP,TFLAGS,DUP,FETCHBYTE,__F_HIDDEN,OR,SWAP,STOREBYTE .int LATEST,TFLAGS,DUP,FETCHBYTE,__F_HIDDEN,OR,SWAP,STOREBYTE
/* Convert to DOCOL codeword */ /* Convert to DOCOL codeword */
.int __DOCOL,SWAP,TCFA,STORE .int __DOCOL,LATEST,TCFA,STORE
/* Enter compilation mode */ /* Enter compilation mode */
.int TRUE,STATE,STORE,EXIT .int TRUE,STATE,STORE,EXIT
@ -1845,16 +1414,12 @@ defword CONSTANT
defword DEFERSTORE,"DEFER!" defword DEFERSTORE,"DEFER!"
.int __DODEFER,OVER,TCFA,STORE,TDFA,STORE,EXIT .int __DODEFER,OVER,TCFA,STORE,TDFA,STORE,EXIT
/* ( deferred-xt -- target-xt ) */
defword DEFERFETCH,"DEFER@"
.int TDFA,FETCH,EXIT
/* ( "<spaces>ccc" -- ) */ /* ( "<spaces>ccc" -- ) */
defword DEFER defword DEFER
.int CREATE,LIT,BAILOUT,LATEST,DEFERSTORE,EXIT .int CREATE,LIT,BAILOUT,LATEST,DEFERSTORE,EXIT
defword QUOTE,"'" defword QUOTE,"'"
.int WORD,FIND_OR_ABORT,DROP,EXIT .int WORD,FIND_OR_BAILOUT,DROP,EXIT
defword LITERAL,,F_IMMED defword LITERAL,,F_IMMED
.int LIT,LIT,COMMA,COMMA,EXIT .int LIT,LIT,COMMA,COMMA,EXIT
@ -1869,7 +1434,7 @@ defword COMPILE_CHAR,"[CHAR]",F_IMMED
.int CHAR,LITERAL,EXIT .int CHAR,LITERAL,EXIT
defword POSTPONE,,F_IMMED defword POSTPONE,,F_IMMED
.int WORD,FIND_OR_ABORT,ZGT,ZBRANCH,(0f - .) .int WORD,FIND_OR_BAILOUT,ZGT,ZBRANCH,(0f - .)
.int LITERAL .int LITERAL
/* this would compile bootstrap COMMA into the definition */ /* this would compile bootstrap COMMA into the definition */
/* .int LITERAL,LIT,COMMA,COMMA,EXIT */ /* .int LITERAL,LIT,COMMA,COMMA,EXIT */

View File

@ -1,3 +1,29 @@
\ Get and set the current compilation word list
: GET-CURRENT ( -- wid ) CURRENT @ ;
: SET-CURRENT ( wid -- ) CURRENT ! ;
\ Keep internal system definitions and ABI constants out of the main word list
CREATE SYSTEM-WORDLIST 0 ,
CREATE LINUX-WORDLIST 0 ,
SYSTEM-WORDLIST SET-CURRENT
\ Use this list until we get around to defining the real GET-ORDER
: STARTUP-ORDER BOOTSTRAP-WORDLIST LINUX-WORDLIST SYSTEM-WORDLIST FORTH-WORDLIST 4 ;
LATEST ' BOOTSTRAP-GET-ORDER DEFER!
\ Shorthand for selecting the current compilation word list
: >>SYSTEM SYSTEM-WORDLIST SET-CURRENT ;
: >>FORTH FORTH-WORDLIST SET-CURRENT ;
: >>LINUX LINUX-WORDLIST SET-CURRENT ;
>>FORTH
0 CONSTANT NULL
: KB 10 LSHIFT ;
: MB 20 LSHIFT ;
\ Shorthand for working with cell-aligned addresses \ Shorthand for working with cell-aligned addresses
: CELL+ ( addr1 -- addr2 ) CELL + ; : CELL+ ( addr1 -- addr2 ) CELL + ;
: CELL- ( addr1 -- addr2 ) CELL - ; : CELL- ( addr1 -- addr2 ) CELL - ;
@ -16,6 +42,8 @@
: ALIGNED-TO ( addr1 u -- addr2 ) : ALIGNED-TO ( addr1 u -- addr2 )
NATURALLY-ALIGNED TUCK 1- + SWAP NEGATE AND ; NATURALLY-ALIGNED TUCK 1- + SWAP NEGATE AND ;
>>SYSTEM
\ Field accessors for execution tokens \ Field accessors for execution tokens
: >CFA ( xt -- a-addr ) ; : >CFA ( xt -- a-addr ) ;
: >DFA ( xt -- a-addr ) CELL+ ; : >DFA ( xt -- a-addr ) CELL+ ;
@ -24,13 +52,21 @@
: >NAME ( xt -- c-addr u ) >FLAGS DUP 1+ SWAP C@ F_LENMASK AND ; : >NAME ( xt -- c-addr u ) >FLAGS DUP 1+ SWAP C@ F_LENMASK AND ;
: >BODY ( xt -- a-addr ) >NAME + ALIGNED ; : >BODY ( xt -- a-addr ) >NAME + ALIGNED ;
: IMMEDIATE? ( xt -- flag ) >FLAGS C@ F_IMMED AND 0<> ;
: HIDDEN? ( xt -- flag ) >FLAGS C@ F_HIDDEN AND 0<> ;
\ Set or clear the HIDDEN flag for word with the given execution token \ Set or clear the HIDDEN flag for word with the given execution token
: (HIDE) ( xt -- ) >FLAGS DUP C@ F_HIDDEN OR SWAP C! ; : (HIDE) ( xt -- ) >FLAGS DUP C@ F_HIDDEN OR SWAP C! ;
: (UNHIDE) ( xt -- ) >FLAGS DUP C@ F_HIDDEN INVERT AND SWAP C! ; : (UNHIDE) ( xt -- ) >FLAGS DUP C@ F_HIDDEN INVERT AND SWAP C! ;
\ Use GET-CURRENT and SET-CURRENT to manipulate the compilation word list
' CURRENT (HIDE)
\ This is only used during early startup
' STARTUP-ORDER (HIDE)
>>FORTH
: IMMEDIATE? ( xt -- flag ) >FLAGS C@ F_IMMED AND 0<> ;
: HIDDEN? ( xt -- flag ) >FLAGS C@ F_HIDDEN AND 0<> ;
\ Fetch and store the target of the deferred word denoted by deferred-xt \ Fetch and store the target of the deferred word denoted by deferred-xt
\ Note that this DEFER! can turn any word into a deferred word \ Note that this DEFER! can turn any word into a deferred word
: DEFER@ ( deferred-xt -- xt ) >DFA @ ; : DEFER@ ( deferred-xt -- xt ) >DFA @ ;
@ -43,7 +79,7 @@
-1 CONSTANT EXCP-ABORT -1 CONSTANT EXCP-ABORT
-2 CONSTANT EXCP-FAIL -2 CONSTANT EXCP-FAIL
-3 CONSTANT EXCP-STACK-OVERFLOW -3 CONSTANT EXCP-STACK-OVERFLOW
-4 CONSTANT EXCP-STACk-UNDERFLOW -4 CONSTANT EXCP-STACK-UNDERFLOW
-5 CONSTANT EXCP-RETURN-OVERFLOW -5 CONSTANT EXCP-RETURN-OVERFLOW
-6 CONSTANT EXCP-RETURN-UNDERFLOW -6 CONSTANT EXCP-RETURN-UNDERFLOW
-8 CONSTANT EXCP-DICTIONARY-OVERFLOW -8 CONSTANT EXCP-DICTIONARY-OVERFLOW
@ -54,15 +90,20 @@
\ Non-standard system error codes (-4095 ... -256) \ Non-standard system error codes (-4095 ... -256)
-256 CONSTANT EXCP-HEAP-OVERFLOW -256 CONSTANT EXCP-HEAP-OVERFLOW
>>SYSTEM
\ THROWN-STRING holds the address and size of the string passed to FAIL \ THROWN-STRING holds the address and size of the string passed to FAIL
\ It may also be used to hold context strings for other system exception codes \ It may also be used to hold context strings for other system exception codes
CREATE THROWN-STRING 0 , 0 , CREATE THROWN-STRING 2 CELLS ALLOT
0 0 THROWN-STRING 2!
\ This is called by THROW when n is nonzero \ This is called by THROW when n is nonzero
\ The initial value (DEFAULT-UNWIND) performs the function of ABORT \ The initial value (DEFAULT-UNWIND) performs the function of ABORT
\ CATCH saves and restores the current target and substitutes its own version \ CATCH saves and restores the current target and substitutes its own version
DEFER THROW-UNWIND ( k*x n -- i*x <noreturn> ) DEFER THROW-UNWIND ( k*x n -- i*x <noreturn> )
>>FORTH
\ If n is nonzero, return control to the nearest CATCH on the return stack \ If n is nonzero, return control to the nearest CATCH on the return stack
\ If there is no CATCH, perform the function of ABORT (clear data stack and QUIT) \ If there is no CATCH, perform the function of ABORT (clear data stack and QUIT)
\ Absent CATCH, whether a message is displayed depends on the value of n: \ Absent CATCH, whether a message is displayed depends on the value of n:
@ -94,11 +135,420 @@ DEFER THROW-UNWIND ( k*x n -- i*x <noreturn> )
: ?FAIL ( flag c-addr u -- <none> | <noreturn> ) : ?FAIL ( flag c-addr u -- <none> | <noreturn> )
ROT IF FAIL ELSE 2DROP THEN ; ROT IF FAIL ELSE 2DROP THEN ;
>>LINUX
\ x86 system call numbers
1 CONSTANT SYS_EXIT
2 CONSTANT SYS_FORK
3 CONSTANT SYS_READ
4 CONSTANT SYS_WRITE
6 CONSTANT SYS_CLOSE
7 CONSTANT SYS_WAITPID
12 CONSTANT SYS_CHDIR
13 CONSTANT SYS_TIME
15 CONSTANT SYS_CHMOD
19 CONSTANT SYS_LSEEK
20 CONSTANT SYS_GETPID
21 CONSTANT SYS_MOUNT
25 CONSTANT SYS_STIME
26 CONSTANT SYS_PTRACE
27 CONSTANT SYS_ALARM
29 CONSTANT SYS_PAUSE
30 CONSTANT SYS_UTIME
33 CONSTANT SYS_ACCESS
34 CONSTANT SYS_NICE
36 CONSTANT SYS_SYNC
37 CONSTANT SYS_KILL
40 CONSTANT SYS_RMDIR
41 CONSTANT SYS_DUP
43 CONSTANT SYS_TIMES
45 CONSTANT SYS_BRK
48 CONSTANT SYS_SIGNAL
52 CONSTANT SYS_UMOUNT2
54 CONSTANT SYS_IOCTL
57 CONSTANT SYS_SETPGID
60 CONSTANT SYS_UMASK
61 CONSTANT SYS_CHROOT
62 CONSTANT SYS_USTAT
64 CONSTANT SYS_GETPPID
65 CONSTANT SYS_GETPGRP
66 CONSTANT SYS_SETSID
68 CONSTANT SYS_SGETMASK
69 CONSTANT SYS_SSETMASK
74 CONSTANT SYS_SETHOSTNAME
75 CONSTANT SYS_SETRLIMIT
76 CONSTANT SYS_GETRLIMIT
77 CONSTANT SYS_GETRUSAGE
78 CONSTANT SYS_GETTIMEOFDAY
79 CONSTANT SYS_SETTIMEOFDAY
82 CONSTANT SYS_SELECT
87 CONSTANT SYS_SWAPON
88 CONSTANT SYS_REBOOT
89 CONSTANT SYS_READDIR
91 CONSTANT SYS_MUNMAP
96 CONSTANT SYS_GETPRIORITY
97 CONSTANT SYS_SETPRIORITY
101 CONSTANT SYS_IOPERM
103 CONSTANT SYS_SYSLOG
104 CONSTANT SYS_SETITIMER
105 CONSTANT SYS_GETITIMER
110 CONSTANT SYS_IOPL
111 CONSTANT SYS_VHANGUP
112 CONSTANT SYS_IDLE
114 CONSTANT SYS_WAIT4
115 CONSTANT SYS_SWAPOFF
116 CONSTANT SYS_SYSINFO
117 CONSTANT SYS_IPC
118 CONSTANT SYS_FSYNC
121 CONSTANT SYS_SETDOMAINNAME
122 CONSTANT SYS_UNAME
123 CONSTANT SYS_MODIFY_LDT
124 CONSTANT SYS_ADJTIMEX
125 CONSTANT SYS_MPROTECT
128 CONSTANT SYS_INIT_MODULE
129 CONSTANT SYS_DELETE_MODULE
131 CONSTANT SYS_QUOTACTL
132 CONSTANT SYS_GETPGID
133 CONSTANT SYS_FCHDIR
135 CONSTANT SYS_SYSFS
136 CONSTANT SYS_PERSONALITY
140 CONSTANT SYS__LLSEEK
142 CONSTANT SYS__NEWSELECT
143 CONSTANT SYS_FLOCK
144 CONSTANT SYS_MSYNC
145 CONSTANT SYS_READV
146 CONSTANT SYS_WRITEV
147 CONSTANT SYS_GETSID
148 CONSTANT SYS_FDATASYNC
149 CONSTANT SYS__SYSCTL
151 CONSTANT SYS_MUNLOCK
152 CONSTANT SYS_MLOCKALL
153 CONSTANT SYS_MUNLOCKALL
154 CONSTANT SYS_SCHED_SETPARAM
155 CONSTANT SYS_SCHED_GETPARAM
156 CONSTANT SYS_SCHED_SETSCHEDULER
157 CONSTANT SYS_SCHED_GETSCHEDULER
158 CONSTANT SYS_SCHED_YIELD
159 CONSTANT SYS_SCHED_GET_PRIORITY_MAX
160 CONSTANT SYS_SCHED_GET_PRIORITY_MIN
162 CONSTANT SYS_NANOSLEEP
163 CONSTANT SYS_MREMAP
166 CONSTANT SYS_VM86
168 CONSTANT SYS_POLL
172 CONSTANT SYS_PRCTL
173 CONSTANT SYS_RT_SIGRETURN
174 CONSTANT SYS_RT_SIGACTION
175 CONSTANT SYS_RT_SIGPROCMASK
176 CONSTANT SYS_RT_SIGPENDING
178 CONSTANT SYS_RT_SIGQUEUEINFO
179 CONSTANT SYS_RT_SIGSUSPEND
180 CONSTANT SYS_PREAD64
181 CONSTANT SYS_PWRITE64
183 CONSTANT SYS_GETCWD
184 CONSTANT SYS_CAPGET
185 CONSTANT SYS_CAPSET
186 CONSTANT SYS_SIGALTSTACK
190 CONSTANT SYS_VFORK
192 CONSTANT SYS_MMAP2
193 CONSTANT SYS_TRUNCATE64
194 CONSTANT SYS_FTRUNCATE64
195 CONSTANT SYS_STAT64
196 CONSTANT SYS_LSTAT64
198 CONSTANT SYS_LCHOWN32
199 CONSTANT SYS_GETUID32
200 CONSTANT SYS_GETGID32
201 CONSTANT SYS_GETEUID32
202 CONSTANT SYS_GETEGID32
203 CONSTANT SYS_SETREUID32
204 CONSTANT SYS_SETREGID32
205 CONSTANT SYS_GETGROUPS32
206 CONSTANT SYS_SETGROUPS32
208 CONSTANT SYS_SETRESUID32
209 CONSTANT SYS_GETRESUID32
210 CONSTANT SYS_SETRESGID32
211 CONSTANT SYS_GETRESGID32
212 CONSTANT SYS_CHOWN32
213 CONSTANT SYS_SETUID32
214 CONSTANT SYS_SETGID32
215 CONSTANT SYS_SETFSUID32
216 CONSTANT SYS_SETFSGID32
217 CONSTANT SYS_PIVOT_ROOT
218 CONSTANT SYS_MINCORE
219 CONSTANT SYS_MADVISE
220 CONSTANT SYS_GETDENTS64
221 CONSTANT SYS_FCNTL64
224 CONSTANT SYS_GETTID
225 CONSTANT SYS_READAHEAD
226 CONSTANT SYS_SETXATTR
227 CONSTANT SYS_LSETXATTR
228 CONSTANT SYS_FSETXATTR
229 CONSTANT SYS_GETXATTR
230 CONSTANT SYS_LGETXATTR
231 CONSTANT SYS_FGETXATTR
232 CONSTANT SYS_LISTXATTR
233 CONSTANT SYS_LLISTXATTR
234 CONSTANT SYS_FLISTXATTR
235 CONSTANT SYS_REMOVEXATTR
236 CONSTANT SYS_LREMOVEXATTR
237 CONSTANT SYS_FREMOVEXATTR
239 CONSTANT SYS_SENDFILE64
241 CONSTANT SYS_SCHED_SETAFFINITY
242 CONSTANT SYS_SCHED_GETAFFINITY
243 CONSTANT SYS_SET_THREAD_AREA
244 CONSTANT SYS_GET_THREAD_AREA
245 CONSTANT SYS_IO_SETUP
246 CONSTANT SYS_IO_DESTROY
247 CONSTANT SYS_IO_GETEVENTS
248 CONSTANT SYS_IO_SUBMIT
249 CONSTANT SYS_IO_CANCEL
252 CONSTANT SYS_EXIT_GROUP
253 CONSTANT SYS_LOOKUP_DCOOKIE
255 CONSTANT SYS_EPOLL_CTL
256 CONSTANT SYS_EPOLL_WAIT
257 CONSTANT SYS_REMAP_FILE_PAGES
258 CONSTANT SYS_SET_TID_ADDRESS
259 CONSTANT SYS_TIMER_CREATE
262 CONSTANT SYS_TIMER_GETOVERRUN
263 CONSTANT SYS_TIMER_DELETE
268 CONSTANT SYS_STATFS64
269 CONSTANT SYS_FSTATFS64
270 CONSTANT SYS_TGKILL
271 CONSTANT SYS_UTIMES
272 CONSTANT SYS_FADVISE64_64
274 CONSTANT SYS_MBIND
275 CONSTANT SYS_GET_MEMPOLICY
276 CONSTANT SYS_SET_MEMPOLICY
277 CONSTANT SYS_MQ_OPEN
278 CONSTANT SYS_MQ_UNLINK
281 CONSTANT SYS_MQ_NOTIFY
282 CONSTANT SYS_MQ_GETSETATTR
283 CONSTANT SYS_KEXEC_LOAD
284 CONSTANT SYS_WAITID
286 CONSTANT SYS_ADD_KEY
287 CONSTANT SYS_REQUEST_KEY
288 CONSTANT SYS_KEYCTL
289 CONSTANT SYS_IOPRIO_SET
290 CONSTANT SYS_IOPRIO_GET
292 CONSTANT SYS_INOTIFY_ADD_WATCH
293 CONSTANT SYS_INOTIFY_RM_WATCH
294 CONSTANT SYS_MIGRATE_PAGES
296 CONSTANT SYS_MKDIRAT
297 CONSTANT SYS_MKNODAT
298 CONSTANT SYS_FCHOWNAT
299 CONSTANT SYS_FUTIMESAT
300 CONSTANT SYS_FSTATAT64
301 CONSTANT SYS_UNLINKAT
303 CONSTANT SYS_LINKAT
304 CONSTANT SYS_SYMLINKAT
305 CONSTANT SYS_READLINKAT
306 CONSTANT SYS_FCHMODAT
310 CONSTANT SYS_UNSHARE
311 CONSTANT SYS_SET_ROBUST_LIST
312 CONSTANT SYS_GET_ROBUST_LIST
313 CONSTANT SYS_SPLICE
314 CONSTANT SYS_SYNC_FILE_RANGE
315 CONSTANT SYS_TEE
316 CONSTANT SYS_VMSPLICE
317 CONSTANT SYS_MOVE_PAGES
318 CONSTANT SYS_GETCPU
319 CONSTANT SYS_EPOLL_PWAIT
322 CONSTANT SYS_TIMERFD_CREATE
324 CONSTANT SYS_FALLOCATE
327 CONSTANT SYS_SIGNALFD4
328 CONSTANT SYS_EVENTFD2
329 CONSTANT SYS_EPOLL_CREATE1
330 CONSTANT SYS_DUP3
331 CONSTANT SYS_PIPE2
332 CONSTANT SYS_INOTIFY_INIT1
335 CONSTANT SYS_RT_TGSIGQUEUEINFO
336 CONSTANT SYS_PERF_EVENT_OPEN
338 CONSTANT SYS_FANOTIFY_INIT
339 CONSTANT SYS_FANOTIFY_MARK
340 CONSTANT SYS_PRLIMIT64
341 CONSTANT SYS_NAME_TO_HANDLE_AT
342 CONSTANT SYS_OPEN_BY_HANDLE_AT
344 CONSTANT SYS_SYNCFS
345 CONSTANT SYS_SENDMMSG
346 CONSTANT SYS_SETNS
347 CONSTANT SYS_PROCESS_VM_READV
348 CONSTANT SYS_PROCESS_VM_WRITEV
349 CONSTANT SYS_KCMP
350 CONSTANT SYS_FINIT_MODULE
351 CONSTANT SYS_SCHED_SETATTR
352 CONSTANT SYS_SCHED_GETATTR
353 CONSTANT SYS_RENAMEAT2
354 CONSTANT SYS_SECCOMP
355 CONSTANT SYS_GETRANDOM
356 CONSTANT SYS_MEMFD_CREATE
357 CONSTANT SYS_BPF
358 CONSTANT SYS_EXECVEAT
359 CONSTANT SYS_SOCKET
360 CONSTANT SYS_SOCKETPAIR
361 CONSTANT SYS_BIND
362 CONSTANT SYS_CONNECT
363 CONSTANT SYS_LISTEN
364 CONSTANT SYS_ACCEPT4
365 CONSTANT SYS_GETSOCKOPT
366 CONSTANT SYS_SETSOCKOPT
367 CONSTANT SYS_GETSOCKNAME
368 CONSTANT SYS_GETPEERNAME
369 CONSTANT SYS_SENDTO
370 CONSTANT SYS_SENDMSG
371 CONSTANT SYS_RECVFROM
372 CONSTANT SYS_RECVMSG
373 CONSTANT SYS_SHUTDOWN
374 CONSTANT SYS_USERFAULTFD
375 CONSTANT SYS_MEMBARRIER
376 CONSTANT SYS_MLOCK2
377 CONSTANT SYS_COPY_FILE_RANGE
378 CONSTANT SYS_PREADV2
379 CONSTANT SYS_PWRITEV2
380 CONSTANT SYS_PKEY_MPROTECT
381 CONSTANT SYS_PKEY_ALLOC
382 CONSTANT SYS_PKEY_FREE
383 CONSTANT SYS_STATX
384 CONSTANT SYS_ARCH_PRCTL
386 CONSTANT SYS_RSEQ
393 CONSTANT SYS_SEMGET
394 CONSTANT SYS_SEMCTL
395 CONSTANT SYS_SHMGET
396 CONSTANT SYS_SHMCTL
397 CONSTANT SYS_SHMAT
398 CONSTANT SYS_SHMDT
399 CONSTANT SYS_MSGGET
400 CONSTANT SYS_MSGSND
401 CONSTANT SYS_MSGRCV
402 CONSTANT SYS_MSGCTL
403 CONSTANT SYS_CLOCK_GETTIME64
404 CONSTANT SYS_CLOCK_SETTIME64
405 CONSTANT SYS_CLOCK_ADJTIME64
406 CONSTANT SYS_CLOCK_GETRES_TIME64
407 CONSTANT SYS_CLOCK_NANOSLEEP_TIME64
408 CONSTANT SYS_TIMER_GETTIME64
409 CONSTANT SYS_TIMER_SETTIME64
410 CONSTANT SYS_TIMERFD_GETTIME64
411 CONSTANT SYS_TIMERFD_SETTIME64
412 CONSTANT SYS_UTIMENSAT_TIME64
413 CONSTANT SYS_PSELECT6_TIME64
414 CONSTANT SYS_PPOLL_TIME64
416 CONSTANT SYS_IO_PGETEVENTS_TIME64
417 CONSTANT SYS_RECVMMSG_TIME64
418 CONSTANT SYS_MQ_TIMEDSEND_TIME64
419 CONSTANT SYS_MQ_TIMEDRECEIVE_TIME64
420 CONSTANT SYS_SEMTIMEDOP_TIME64
421 CONSTANT SYS_RT_SIGTIMEDWAIT_TIME64
422 CONSTANT SYS_FUTEX_TIME64
423 CONSTANT SYS_SCHED_RR_GET_INTERVAL_TIME64
424 CONSTANT SYS_PIDFD_SEND_SIGNAL
425 CONSTANT SYS_IO_URING_SETUP
426 CONSTANT SYS_IO_URING_ENTER
427 CONSTANT SYS_IO_URING_REGISTER
428 CONSTANT SYS_OPEN_TREE
429 CONSTANT SYS_MOVE_MOUNT
430 CONSTANT SYS_FSOPEN
431 CONSTANT SYS_FSCONFIG
432 CONSTANT SYS_FSMOUNT
433 CONSTANT SYS_FSPICK
434 CONSTANT SYS_PIDFD_OPEN
435 CONSTANT SYS_CLONE3
437 CONSTANT SYS_OPENAT2
438 CONSTANT SYS_PIDFD_GETFD
439 CONSTANT SYS_FACCESSAT2
\ Special dirfd for *at syscalls to resolve path relative to current directory
-100 CONSTANT AT_FDCWD
\ errno values
\ System calls return -errno in the range [-4095, -1]
1 CONSTANT ERRNO_EPERM
2 CONSTANT ERRNO_ENOENT
3 CONSTANT ERRNO_ESRCH
4 CONSTANT ERRNO_EINTR
5 CONSTANT ERRNO_EIO
6 CONSTANT ERRNO_ENXIO
7 CONSTANT ERRNO_E2BIG
8 CONSTANT ERRNO_ENOEXEC
9 CONSTANT ERRNO_EBADF
10 CONSTANT ERRNO_ECHILD
11 CONSTANT ERRNO_EAGAIN
12 CONSTANT ERRNO_ENOMEM
13 CONSTANT ERRNO_EACCES
14 CONSTANT ERRNO_EFAULT
15 CONSTANT ERRNO_ENOTBLK
16 CONSTANT ERRNO_EBUSY
17 CONSTANT ERRNO_EEXIST
18 CONSTANT ERRNO_EXDEV
19 CONSTANT ERRNO_ENODEV
20 CONSTANT ERRNO_ENOTDIR
21 CONSTANT ERRNO_EISDIR
22 CONSTANT ERRNO_EINVAL
23 CONSTANT ERRNO_ENFILE
24 CONSTANT ERRNO_EMFILE
25 CONSTANT ERRNO_ENOTTY
26 CONSTANT ERRNO_ETXTBSY
27 CONSTANT ERRNO_EFBIG
28 CONSTANT ERRNO_ENOSPC
29 CONSTANT ERRNO_ESPIPE
30 CONSTANT ERRNO_EROFS
31 CONSTANT ERRNO_EMLINK
32 CONSTANT ERRNO_EPIPE
33 CONSTANT ERRNO_EDOM
34 CONSTANT ERRNO_ERANGE
\ signal numbers
1 CONSTANT SIGHUP
2 CONSTANT SIGINT
3 CONSTANT SIGQUIT
4 CONSTANT SIGILL
5 CONSTANT SIGTRAP
6 CONSTANT SIGABRT
6 CONSTANT SIGIOT
7 CONSTANT SIGBUS
8 CONSTANT SIGFPE
9 CONSTANT SIGKILL
10 CONSTANT SIGUSR1
11 CONSTANT SIGSEGV
12 CONSTANT SIGUSR2
13 CONSTANT SIGPIPE
14 CONSTANT SIGALRM
15 CONSTANT SIGTERM
16 CONSTANT SIGSTKFLT
17 CONSTANT SIGCHLD
18 CONSTANT SIGCONT
19 CONSTANT SIGSTOP
20 CONSTANT SIGTSTP
21 CONSTANT SIGTTIN
22 CONSTANT SIGTTOU
23 CONSTANT SIGURG
24 CONSTANT SIGXCPU
25 CONSTANT SIGXFSZ
26 CONSTANT SIGVTALRM
27 CONSTANT SIGPROF
28 CONSTANT SIGWINCH
29 CONSTANT SIGIO
29 CONSTANT SIGPOLL
30 CONSTANT SIGPWR
31 CONSTANT SIGSYS
\ openat2() access modes
0 CONSTANT O_RDONLY
1 CONSTANT O_WRONLY
2 CONSTANT O_RDWR
\ openat2() flags
1 6 LSHIFT CONSTANT O_CREAT
1 7 LSHIFT CONSTANT O_EXCL
1 9 LSHIFT CONSTANT O_TRUNC
1 10 LSHIFT CONSTANT O_APPEND
1 11 LSHIFT CONSTANT O_NONBLOCK
\ Names for the standard file descriptor numbers \ Names for the standard file descriptor numbers
0 CONSTANT STDIN 0 CONSTANT STDIN
1 CONSTANT STDOUT 1 CONSTANT STDOUT
2 CONSTANT STDERR 2 CONSTANT STDERR
>>FORTH
\ Write one character to FD 1 (stdout) \ Write one character to FD 1 (stdout)
: EMIT ( c -- "c" ) : EMIT ( c -- "c" )
SP@ 2DUP C! STDOUT SWAP 1 SYS_WRITE SYSCALL3 2DROP ; SP@ 2DUP C! STDOUT SWAP 1 SYS_WRITE SYSCALL3 2DROP ;
@ -126,15 +576,12 @@ DEFER THROW-UNWIND ( k*x n -- i*x <noreturn> )
: TYPE ( c-addr u -- "ccc" ) STDOUT TYPE-FD ; : TYPE ( c-addr u -- "ccc" ) STDOUT TYPE-FD ;
: TYPE-ERR ( c-addr u -- "ccc" ) STDERR TYPE-FD ; : TYPE-ERR ( c-addr u -- "ccc" ) STDERR TYPE-FD ;
\ Get and set the current compilation word list
: GET-CURRENT ( -- wid ) CURRENT @ ;
: SET-CURRENT ( wid -- ) CURRENT ! ;
' CURRENT (HIDE)
\ Get the execution token of the most recent word in the compilation word list \ Get the execution token of the most recent word in the compilation word list
\ If the word list is empty the result will be zero \ If the word list is empty the result will be zero
: LATEST ( -- xt | 0 ) GET-CURRENT @ ; : LATEST ( -- xt | 0 ) GET-CURRENT @ ;
>>SYSTEM
: LATEST! ( xt -- ) GET-CURRENT ! ; : LATEST! ( xt -- ) GET-CURRENT ! ;
>>FORTH
\ Set the latest defined word as immediate \ Set the latest defined word as immediate
\ Note that IMMEDIATE is itself an immediate word \ Note that IMMEDIATE is itself an immediate word
@ -212,6 +659,8 @@ DEFER THROW-UNWIND ( k*x n -- i*x <noreturn> )
: BYE ( -- <noreturn> ) : BYE ( -- <noreturn> )
BEGIN 0 SYS_EXIT SYSCALL1 DROP AGAIN ; BEGIN 0 SYS_EXIT SYSCALL1 DROP AGAIN ;
>>SYSTEM
\ With 32-bit cells, a double-cell number has 64 bits \ With 32-bit cells, a double-cell number has 64 bits
\ Space is reserved for binary output with a leading minus sign and a trailing space \ Space is reserved for binary output with a leading minus sign and a trailing space
\ The minimum pictured numeric output buffer size is thus 66 bytes \ The minimum pictured numeric output buffer size is thus 66 bytes
@ -222,12 +671,12 @@ CREATE PNO-BUFFER PNO-BUFFER-BYTES ALLOT
PNO-BUFFER PNO-BUFFER-BYTES + CONSTANT PNO-BUFFER-END PNO-BUFFER PNO-BUFFER-BYTES + CONSTANT PNO-BUFFER-END
CREATE PNO-POINTER PNO-BUFFER-END , CREATE PNO-POINTER PNO-BUFFER-END ,
>>FORTH
: <# ( -- ) PNO-BUFFER-END PNO-POINTER ! ; : <# ( -- ) PNO-BUFFER-END PNO-POINTER ! ;
: HOLD ( char -- ) PNO-POINTER 1 OVER -! @ C! ; : HOLD ( char -- ) PNO-POINTER 1 OVER -! @ C! ;
: #> ( xd -- c-addr u ) 2DROP PNO-BUFFER-END PNO-POINTER @ TUCK - ; : #> ( xd -- c-addr u ) 2DROP PNO-BUFFER-END PNO-POINTER @ TUCK - ;
' PNO-POINTER (HIDE)
: SIGN ( n -- ) 0< IF [CHAR] - HOLD THEN ; : SIGN ( n -- ) 0< IF [CHAR] - HOLD THEN ;
: #B ( ud1 u -- ud2 ) : #B ( ud1 u -- ud2 )
@ -272,9 +721,13 @@ CREATE DISPLAY-ITEM-LIMIT 6 ,
\ Return the next address in the compilation/data area \ Return the next address in the compilation/data area
: HERE ( -- addr ) CP @ ; : HERE ( -- addr ) CP @ ;
>>SYSTEM
\ When growing the data area, round the end address up to a multiple of this size \ When growing the data area, round the end address up to a multiple of this size
65536 CONSTANT DATA-SEGMENT-ALIGNMENT 65536 CONSTANT DATA-SEGMENT-ALIGNMENT
>>FORTH
\ Allocate n consecutive bytes from the end of the data area \ Allocate n consecutive bytes from the end of the data area
\ If necessary use the brk system call to grow the data area \ If necessary use the brk system call to grow the data area
\ The value n can be negative to release the most recently allocated space \ The value n can be negative to release the most recently allocated space
@ -496,6 +949,8 @@ CREATE CURRENT-SOURCE-ID -1 ,
DEFER QUIT ( -- <noreturn> ) DEFER QUIT ( -- <noreturn> )
' BAILOUT ' QUIT DEFER! ' BAILOUT ' QUIT DEFER!
>>SYSTEM
\ This function defines what happens when THROW is used outside of any CATCH \ This function defines what happens when THROW is used outside of any CATCH
: DEFAULT-UNWIND ( k*x n -- i*x <noreturn> ) : DEFAULT-UNWIND ( k*x n -- i*x <noreturn> )
CASE CASE
@ -518,7 +973,6 @@ DEFER QUIT ( -- <noreturn> )
S0 SP! QUIT ; S0 SP! QUIT ;
' DEFAULT-UNWIND ' THROW-UNWIND DEFER! ' DEFAULT-UNWIND ' THROW-UNWIND DEFER!
' DEFAULT-UNWIND (HIDE)
CREATE EXCEPTION-STACK 0 , CREATE EXCEPTION-STACK 0 ,
@ -535,6 +989,8 @@ CREATE EXCEPTION-STACK 0 ,
NR> RESTORE-INPUT DROP NR> RESTORE-INPUT DROP
R> SWAP >R SP! R> ; R> SWAP >R SP! R> ;
>>FORTH
\ Run xt while trapping calls to THROW, ABORT, FAIL, etc. \ Run xt while trapping calls to THROW, ABORT, FAIL, etc.
\ On success has the effect of xt and also leaves the value 0 on top of the stack \ On success has the effect of xt and also leaves the value 0 on top of the stack
\ On failure the stacks and input source are reverted and the THROW code is pushed \ On failure the stacks and input source are reverted and the THROW code is pushed
@ -566,12 +1022,10 @@ CREATE EXCEPTION-STACK 0 ,
\ We don't need the rest so just reset the RSP to where it was on entering CATCH \ We don't need the rest so just reset the RSP to where it was on entering CATCH
RSP! ; RSP! ;
' EXCEPTION-STACK (HIDE)
' CATCH-UNWIND (HIDE)
' THROW-UNWIND (HIDE)
: PARSE-AREA ( -- c-addr u ) SOURCE >IN @ /STRING ; : PARSE-AREA ( -- c-addr u ) SOURCE >IN @ /STRING ;
>>SYSTEM
: PARSE-EMPTY? ( -- flag ) SOURCE NIP >IN @ = ; : PARSE-EMPTY? ( -- flag ) SOURCE NIP >IN @ = ;
: PEEK-CHAR ( -- c ) : PEEK-CHAR ( -- c )
@ -584,6 +1038,8 @@ CREATE EXCEPTION-STACK 0 ,
: SKIP-SPACES ( "<spaces?>" -- ) : SKIP-SPACES ( "<spaces?>" -- )
BEGIN PARSE-EMPTY? OR-ELSE PEEK-CHAR SPACE? DUP IF SKIP-CHAR THEN 0= THEN UNTIL ; BEGIN PARSE-EMPTY? OR-ELSE PEEK-CHAR SPACE? DUP IF SKIP-CHAR THEN 0= THEN UNTIL ;
>>FORTH
\ Comments; ignore all characters until the next EOL or ) character, respectively \ Comments; ignore all characters until the next EOL or ) character, respectively
: \ ( "ccc<eol>" -- ) IMMEDIATE BEGIN NEXT-CHAR LF = UNTIL ; : \ ( "ccc<eol>" -- ) IMMEDIATE BEGIN NEXT-CHAR LF = UNTIL ;
: ( ( "ccc<closeparen>" -- ) IMMEDIATE BEGIN NEXT-CHAR [CHAR] ) = UNTIL ; : ( ( "ccc<closeparen>" -- ) IMMEDIATE BEGIN NEXT-CHAR [CHAR] ) = UNTIL ;
@ -609,13 +1065,17 @@ DEFER REFILL
REPEAT REPEAT
PARSE-AREA DROP OVER - ; PARSE-AREA DROP OVER - ;
: CREATE ( "<spaces>ccc" -- ) \ Use to create words programmatically without reading the name from the input
: (CREATE) ( c-addr u -- )
ALIGN HERE ALIGN HERE
DODATA , 0 , LATEST , DODATA , 0 , LATEST ,
WORD DUP C, HERE SWAP DUP ALLOT CMOVE -ROT DUP C, HERE SWAP DUP ALLOT CMOVE
ALIGN HERE OVER >DFA ! ALIGN HERE OVER >DFA !
LATEST! ; LATEST! ;
: CREATE ( "<spaces>ccc" -- )
WORD (CREATE) ;
\ Called when a word using DOES> is executed (not compiled) to set \ Called when a word using DOES> is executed (not compiled) to set
\ the runtime behavior of the most recently defined word \ the runtime behavior of the most recently defined word
: (DOES) ( dfa -- ) LATEST DODOES OVER >CFA ! >DFA ! ; : (DOES) ( dfa -- ) LATEST DODOES OVER >CFA ! >DFA ! ;
@ -629,6 +1089,7 @@ DEFER REFILL
' (DOES) (HIDE) ' (DOES) (HIDE)
\ Debugging aid; shows a label and the contents of the stacks at runtime
: (MARK) "-- " TYPE TYPE " --\n" TYPE .S R> .RS >R ; : (MARK) "-- " TYPE TYPE " --\n" TYPE .S R> .RS >R ;
: MARK IMMEDIATE WORD POSTPONE SLITERAL POSTPONE (MARK) ; : MARK IMMEDIATE WORD POSTPONE SLITERAL POSTPONE (MARK) ;
' (MARK) (HIDE) ' (MARK) (HIDE)
@ -681,7 +1142,7 @@ DEFER REFILL
\ Define an array of n double-cell elements \ Define an array of n double-cell elements
\ name Runtime: ( n -- a-addr ) Return the address of the double-cell at index n \ name Runtime: ( n -- a-addr ) Return the address of the double-cell at index n
: 2ARRAY ( n "<spaces>name" -- ) : 2ARRAY ( n "<spaces>name" -- )
CREATE CELLS 2* ALLOT DOES> SWAP [ 2 CELLS ] LITERAL * + ; CREATE 2* CELLS ALLOT DOES> SWAP [ 2 CELLS ] LITERAL * + ;
\ Define a threaded word which also displays its name and the data stack when called \ Define a threaded word which also displays its name and the data stack when called
: (TRACE) >NAME TYPE SPACE .S ; : (TRACE) >NAME TYPE SPACE .S ;
@ -757,7 +1218,7 @@ DEFER REFILL
\ Conditional compilation \ Conditional compilation
\ No effect if flag is true, otherwise skips words until matching [ELSE] or [THEN] \ No effect if flag is true, otherwise skips words until matching [ELSE] or [THEN]
\ Skips over nested [IF] … [THEN] or [IF] … [ELSE] … [THEN] structures \ Skips over nested [IF] … [THEN] or [IF] … [ELSE] … [THEN] structures
: [IF] IMMEDIATE RECURSIVE : [IF] IMMEDIATE
0= IF 0= IF
0 BEGIN 0 BEGIN
WORD 2>R WORD 2>R
@ -796,17 +1257,18 @@ DEFER REFILL
: [CHAR] ( Compilation: "<spaces>ccc" -- ) ( Runtime: -- c ) IMMEDIATE : [CHAR] ( Compilation: "<spaces>ccc" -- ) ( Runtime: -- c ) IMMEDIATE
CHAR POSTPONE LITERAL ; CHAR POSTPONE LITERAL ;
>>SYSTEM
\ Orders 0 ... 17 with sizes 32 bytes ... 4 MiB
32 CONSTANT BUDDY-MIN-BYTES 32 CONSTANT BUDDY-MIN-BYTES
18 CONSTANT BUDDY-ORDERS 18 CONSTANT BUDDY-ORDERS
: BUDDY-ORDER-BYTES ( order -- n-bytes ) BUDDY-MIN-BYTES SWAP LSHIFT ; : BUDDY-ORDER-BYTES ( order -- n-bytes ) BUDDY-MIN-BYTES SWAP LSHIFT ;
BUDDY-ORDERS 1- BUDDY-ORDER-BYTES CONSTANT BUDDY-MAX-BYTES BUDDY-ORDERS 1- BUDDY-ORDER-BYTES CONSTANT BUDDY-MAX-BYTES
BUDDY-ORDERS ARRAY BUDDY-HEADS BUDDY-ORDERS ARRAY BUDDY-HEADS
{ BUDDY-ORDERS 0 ?DO 0 I BUDDY-HEADS ! LOOP } EXECUTE
: INIT-BUDDY-HEADS ( -- )
BUDDY-ORDERS 0 ?DO 0 I BUDDY-HEADS ! LOOP ;
INIT-BUDDY-HEADS
: BUDDY-FREE ( order a-addr -- ) : BUDDY-FREE ( order a-addr -- )
OVER BUDDY-ORDERS U>= "order out of bounds" ?FAIL OVER BUDDY-ORDERS U>= "order out of bounds" ?FAIL
@ -864,10 +1326,7 @@ VARIABLE TOTAL
LOOP "total " TYPE TOTAL @ . EOL ; LOOP "total " TYPE TOTAL @ . EOL ;
' TOTAL (HIDE) ' TOTAL (HIDE)
0 CONSTANT NULL >>LINUX
: KB 10 LSHIFT ;
: MB 20 LSHIFT ;
4 KB CONSTANT PAGESIZE 4 KB CONSTANT PAGESIZE
@ -879,6 +1338,8 @@ VARIABLE TOTAL
2 CONSTANT MAP_PRIVATE 2 CONSTANT MAP_PRIVATE
32 CONSTANT MAP_ANONYMOUS 32 CONSTANT MAP_ANONYMOUS
>>SYSTEM
: MMAP-ALLOCATE ( size -- a-addr ) : MMAP-ALLOCATE ( size -- a-addr )
BEGIN BEGIN
NULL OVER PROT_READ PROT_WRITE OR NULL OVER PROT_READ PROT_WRITE OR
@ -902,6 +1363,8 @@ VARIABLE TOTAL
R@ OVER R@ - MUNMAP R@ OVER R@ - MUNMAP
DUP R> R@ 2* + SWAP R> + TUCK - MUNMAP ; DUP R> R@ 2* + SWAP R> + TUCK - MUNMAP ;
>>FORTH
: ALLOCATE ( size -- obj-addr ) : ALLOCATE ( size -- obj-addr )
CELL+ DUP BUDDY-MAX-BYTES U> IF CELL+ DUP BUDDY-MAX-BYTES U> IF
PAGESIZE ALIGNED-TO DUP MMAP-ALLOCATE TUCK ! CELL+ EXIT PAGESIZE ALIGNED-TO DUP MMAP-ALLOCATE TUCK ! CELL+ EXIT
@ -922,9 +1385,13 @@ VARIABLE TOTAL
NEGATE ERRNO_EINTR <> "munmap failed" ?FAIL NEGATE ERRNO_EINTR <> "munmap failed" ?FAIL
AGAIN ; AGAIN ;
>>SYSTEM
: OBJECT-SIZE ( obj-addr -- size ) : OBJECT-SIZE ( obj-addr -- size )
CELL- @ DUP BUDDY-ORDERS U< IF BUDDY-ORDER-BYTES THEN CELL- ; CELL- @ DUP BUDDY-ORDERS U< IF BUDDY-ORDER-BYTES THEN CELL- ;
>>FORTH
: RESIZE ( obj-addr1 size -- obj-addr1 | obj-addr2 ) : RESIZE ( obj-addr1 size -- obj-addr1 | obj-addr2 )
OVER OBJECT-SIZE CELL+ OVER CELL+ BUDDY-MIN-BYTES UMAX 2DUP U>= IF OVER OBJECT-SIZE CELL+ OVER CELL+ BUDDY-MIN-BYTES UMAX 2DUP U>= IF
\ Allocated space is larger than requested size, shrink if <= 50% used \ Allocated space is larger than requested size, shrink if <= 50% used
@ -942,14 +1409,43 @@ VARIABLE TOTAL
( S: obj-addr1 obj-addr2 copy-size R: obj-addr1 obj-addr2 ) ( S: obj-addr1 obj-addr2 copy-size R: obj-addr1 obj-addr2 )
CMOVE R> R> FREE ; CMOVE R> R> FREE ;
\ Field accessors for the search order linked list \ Basic type descriptors giving alignment and size for each type
: ORDER>LINK ( a-addr1 -- a-addr2 ) ; 1 1 2CONSTANT CHAR%
: ORDER>WID ( a-addr1 -- a-addr2 ) CELL+ ; 1 ALIGNED 1 CELLS 2CONSTANT CELL%
2 CELLS CONSTANT ORDER-ENTRY-BYTES 1 ALIGNED 2 CELLS 2CONSTANT 2CELL%
\ Structures begin with byte alignment and an offset of zero
1 0 2CONSTANT STRUCT
\ Within STRUCT … ENDSTRUCT, define a field with the given alignment and size
\ Each field word has runtime effect ( struct-addr -- field-addr)
\ If field offset is zero then the word is marked as immediate and generates no code
: FIELD ( align1 offset1 field-align field-bytes -- align2 offset2 )
-ROT NATURALLY-ALIGNED DUP >R ALIGNED-TO
DUP : ?DUP IF POSTPONE LITERAL POSTPONE + ELSE POSTPONE IMMEDIATE THEN POSTPONE ;
+ SWAP R> UMAX SWAP ;
\ Consume the final alignment and offset and define a type descriptor for the struct
: ENDSTRUCT ( align offset "<spaces?>name" -- )
OVER ALIGNED-TO 2CONSTANT ;
\ Reserve data or heap space for a data structure given alignment and size
: %ALLOT ( align bytes -- a-addr ) SWAP ALIGN-TO ALLOT ;
: %ALLOCATE ( align bytes -- a-addr ) NIP ALLOCATE ;
>>SYSTEM
\ This structure describes one entry in the search order linked list
STRUCT
CELL% FIELD ORDER>LINK
CELL% FIELD ORDER>WID
ENDSTRUCT ORDER%
VARIABLE CURRENT-ORDER VARIABLE CURRENT-ORDER
0 CURRENT-ORDER ! 0 CURRENT-ORDER !
>>FORTH
\ Return the current search order \ Return the current search order
: GET-ORDER ( -- widn ... wid1 n ) : GET-ORDER ( -- widn ... wid1 n )
0 CURRENT-ORDER @ 0 CURRENT-ORDER @
@ -958,8 +1454,29 @@ VARIABLE CURRENT-ORDER
( S: n ) ( R: wid1 ... widn ) ( S: n ) ( R: wid1 ... widn )
\ Shift the search order list from the return stack back to the data stack \ Shift the search order list from the return stack back to the data stack
DUP BEGIN ?DUP WHILE 1- R> -ROT REPEAT DUP BEGIN ?DUP WHILE 1- R> -ROT REPEAT
( S: widn ... wid1 n ) ( S: widn ... wid1 n ) ;
;
\ Add the word list wid as the first word list in the search order
\ Semantically equivalent to:
\ : PUSH-ORDER ( wid -- ) >R GET-ORDER R> SWAP 1+ SET-ORDER ;
: PUSH-ORDER ( wid -- )
ORDER% %ALLOCATE
TUCK ORDER>WID !
CURRENT-ORDER @ OVER ORDER>LINK !
CURRENT-ORDER ! ;
\ Remove and return the first word list in the search order
\ Semantically equivalent to:
\ : POP-ORDER ( -- wid ) GET-ORDER 1- SWAP >R SET-ORDER R> ;
: POP-ORDER ( -- wid | 0 )
CURRENT-ORDER @ DUP IF
DUP ORDER>LINK @ CURRENT-ORDER !
DUP ORDER>WID @ SWAP FREE
THEN ;
\ Return the first word list in the search order
: PEEK-ORDER ( -- wid | 0 )
CURRENT-ORDER @ DUP IF ORDER>WID @ THEN ;
\ Set the current search order \ Set the current search order
: SET-ORDER ( widn ... wid1 n | -n -- ) : SET-ORDER ( widn ... wid1 n | -n -- )
@ -967,29 +1484,13 @@ VARIABLE CURRENT-ORDER
\ Free the previous search order linked list \ Free the previous search order linked list
0 CURRENT-ORDER XCHG BEGIN ?DUP WHILE DUP ORDER>LINK @ SWAP FREE REPEAT 0 CURRENT-ORDER XCHG BEGIN ?DUP WHILE DUP ORDER>LINK @ SWAP FREE REPEAT
\ Build the new search order linked list \ Build the new search order linked list
CURRENT-ORDER SWAP 0 OVER ?DO I PICK PUSH-ORDER -1 +LOOP NDROP ;
BEGIN
( S: widn ... wid1 tail n )
?DUP
WHILE
1- -ROT
( S: widn ... wid1 n wid0 tail )
ORDER-ENTRY-BYTES ALLOCATE
DUP ROT ! \ Update the tail pointer with the address of this entry
TUCK ORDER>WID ! \ Store the word list identifier
ORDER>LINK SWAP \ Leave link field address under n for next iteration
REPEAT
\ Terminate the linked list
0 SWAP ! ;
\ Prepare the initial search order \ Prepare the initial search order
FORTH-WORDLIST 1 SET-ORDER BOOTSTRAP-GET-ORDER SET-ORDER
\ Abstract away the internals of the search order implementation \ Use the real search order as the bootstrap search order from now on
' CURRENT-ORDER (HIDE) ' GET-ORDER ' BOOTSTRAP-GET-ORDER DEFER!
' ORDER-ENTRY-BYTES (HIDE)
' ORDER>WID (HIDE)
' ORDER>LINK (HIDE)
\ Create a new wordlist \ Create a new wordlist
\ In this implementation a word list is just a pointer to the most recent word \ In this implementation a word list is just a pointer to the most recent word
@ -997,7 +1498,7 @@ FORTH-WORDLIST 1 SET-ORDER
ALIGN HERE 0 , ; ALIGN HERE 0 , ;
\ Make the first list in the search order the current compilation word list \ Make the first list in the search order the current compilation word list
: DEFINITIONS ( -- ) GET-ORDER SWAP SET-CURRENT 1- NDROP ; : DEFINITIONS ( -- ) PEEK-ORDER SET-CURRENT ;
\ Run a function for each word in the given wordlist \ Run a function for each word in the given wordlist
\ xt Execution: ( i*x word-xt -- stop-flag j*x ) \ xt Execution: ( i*x word-xt -- stop-flag j*x )
@ -1039,16 +1540,22 @@ FORTH-WORDLIST 1 SET-ORDER
} WITH-VISIBLE ; } WITH-VISIBLE ;
\ Search-Order extension words \ Search-Order extension words
: ALSO ( -- ) GET-ORDER >R DUP R> 1+ SET-ORDER ; : ALSO ( -- ) PEEK-ORDER PUSH-ORDER ;
: FORTH ( -- ) GET-ORDER NIP FORTH-WORDLIST SWAP SET-ORDER ;
: ONLY ( -- ) -1 SET-ORDER ; : ONLY ( -- ) -1 SET-ORDER ;
: ORDER ( -- ) : ORDER ( -- )
"ORDER:" TYPE GET-ORDER 0 ?DO SPACE U. LOOP EOL "ORDER:" TYPE GET-ORDER 0 ?DO SPACE U. LOOP EOL
"CURRENT: " TYPE GET-CURRENT U. EOL ; "CURRENT: " TYPE GET-CURRENT U. EOL ;
: PREVIOUS ( -- ) GET-ORDER ?DUP IF NIP 1- SET-ORDER THEN ; : PREVIOUS ( -- ) POP-ORDER DROP ;
\ Add the word list wid as the first word list in the search order \ Define a new named wordlist
: PUSH-ORDER ( wid -- ) >R GET-ORDER R> SWAP 1+ SET-ORDER ; \ Executing the word will replace the first item in the search order
: VOCABULARY WORDLIST CREATE , DOES> @ POP-ORDER DROP PUSH-ORDER ;
\ Names to select the predefined word lists
\ FORTH is a Search-Order extension word
\ SYSTEM-WORDLIST has been deliberately omitted here
: FORTH ( -- ) FORTH-WORDLIST POP-ORDER DROP PUSH-ORDER ;
: LINUX ( -- ) LINUX-WORDLIST POP-ORDER DROP PUSH-ORDER ;
\ Apply SEARCH-WORDLIST to each word list in the current search order \ Apply SEARCH-WORDLIST to each word list in the current search order
: FIND ( c-addr u -- c-addr u 0 | xt 1 | xt -1 ) : FIND ( c-addr u -- c-addr u 0 | xt 1 | xt -1 )
@ -1063,10 +1570,14 @@ FORTH-WORDLIST 1 SET-ORDER
REPEAT REPEAT
2R> 0 ; 2R> 0 ;
>>SYSTEM
\ Same as FIND except that unknown words are reported and result in a call to THROW \ Same as FIND except that unknown words are reported and result in a call to THROW
: FIND-OR-THROW ( c-addr u -- xt 1 | xt -1 ) : FIND-OR-THROW ( c-addr u -- xt 1 | xt -1 )
FIND ?DUP 0= IF EXCP-UNDEFINED-WORD -ROT THROW-STRING THEN ; FIND ?DUP 0= IF EXCP-UNDEFINED-WORD -ROT THROW-STRING THEN ;
>>FORTH
\ Read a word from the input (during runtime) and return its execution token \ Read a word from the input (during runtime) and return its execution token
\ Aborts if the word is not found in the current (runtime) search order list \ Aborts if the word is not found in the current (runtime) search order list
: ' ( "<spaces>ccc" -- xt ) WORD FIND-OR-THROW DROP ; : ' ( "<spaces>ccc" -- xt ) WORD FIND-OR-THROW DROP ;
@ -1105,6 +1616,8 @@ FORTH-WORDLIST 1 SET-ORDER
: :REPLACE ( "<spaces>ccc" -- ) : :REPLACE ( "<spaces>ccc" -- )
: LATEST DUP >NAME FIND-OR-THROW DROP DUP (HIDE) DEFER! ; : LATEST DUP >NAME FIND-OR-THROW DROP DUP (HIDE) DEFER! ;
>>SYSTEM
\ The size of this buffer will determine the maximum line length \ The size of this buffer will determine the maximum line length
4096 CONSTANT TERMINAL-BUFFER-BYTES 4096 CONSTANT TERMINAL-BUFFER-BYTES
TERMINAL-BUFFER-BYTES ALLOCATE CONSTANT TERMINAL-BUFFER TERMINAL-BUFFER-BYTES ALLOCATE CONSTANT TERMINAL-BUFFER
@ -1113,6 +1626,8 @@ TERMINAL-BUFFER-BYTES ALLOCATE CONSTANT TERMINAL-BUFFER
CREATE TIB-LEFTOVER 0 , CREATE TIB-LEFTOVER 0 ,
CREATE TIB-LEFTOVER-BYTES 0 , CREATE TIB-LEFTOVER-BYTES 0 ,
>>FORTH
\ Attempt to replace the parse area with the next line from the current source \ Attempt to replace the parse area with the next line from the current source
\ Return TRUE if the parse area was refilled, or FALSE otherwise \ Return TRUE if the parse area was refilled, or FALSE otherwise
\ REFILL always fails if the current source is a string (from EVALUATE) \ REFILL always fails if the current source is a string (from EVALUATE)
@ -1158,9 +1673,7 @@ CREATE TIB-LEFTOVER-BYTES 0 ,
DUP IF 0 >IN ! THEN DUP IF 0 >IN ! THEN
0<> ; 0<> ;
HIDE TIB-LEFTOVER >>SYSTEM
HIDE TIB-LEFTOVER-BYTES
HIDE TERMINAL-BUFFER
: ESCAPED-CHAR ( "<escapeseq>" | "c" -- c ) : ESCAPED-CHAR ( "<escapeseq>" | "c" -- c )
NEXT-CHAR DUP [CHAR] \ = IF NEXT-CHAR DUP [CHAR] \ = IF
@ -1244,6 +1757,8 @@ HIDE TERMINAL-BUFFER
THEN THEN
REPEAT ; REPEAT ;
>>FORTH
: EVALUATE ( i*x c-addr u -- j*x ) : EVALUATE ( i*x c-addr u -- j*x )
SAVE-INPUT N>R SAVE-INPUT N>R
SOURCE 2>R SOURCE 2>R
@ -1256,12 +1771,40 @@ HIDE TERMINAL-BUFFER
2R> INPUT-BUFFER 2! 2R> INPUT-BUFFER 2!
NR> RESTORE-INPUT DROP ; NR> RESTORE-INPUT DROP ;
36 CONSTANT STRUCT-TERMIOS-BYTES >>LINUX
: TYPEDEF 2CONSTANT ;
CHAR% TYPEDEF unsigned-char%
CHAR% TYPEDEF signed-char%
CELL% TYPEDEF unsigned-int%
CELL% TYPEDEF signed-int%
unsigned-char% TYPEDEF cc_t%
unsigned-int% TYPEDEF speed_t%
unsigned-int% TYPEDEF tcflag_t%
19 CONSTANT NCCS
STRUCT
tcflag_t% FIELD termios-c_iflag
tcflag_t% FIELD termios-c_oflag
tcflag_t% FIELD termios-c_cflag
tcflag_t% FIELD termios-c_lflag
cc_t% FIELD termios-c_line
cc_t% NCCS * FIELD termios-c_cc
ENDSTRUCT termios%
21505 CONSTANT IOCTL_TCGETS 21505 CONSTANT IOCTL_TCGETS
CREATE TERMIOS STRUCT-TERMIOS-BYTES ALLOT ALIGN
>>SYSTEM
CREATE SCRATCH-TERMIOS termios% %ALLOT
>>FORTH
: TTY? ( fd -- flag ) : TTY? ( fd -- flag )
IOCTL_TCGETS TERMIOS SYS_IOCTL SYSCALL3 0= ; IOCTL_TCGETS SCRATCH-TERMIOS SYS_IOCTL SYSCALL3 0= ;
STDIN TTY? CONSTANT INTERACTIVE? STDIN TTY? CONSTANT INTERACTIVE?
@ -1282,17 +1825,6 @@ STDIN TTY? CONSTANT INTERACTIVE?
HIDE BOOTSTRAP-WORDLIST HIDE BOOTSTRAP-WORDLIST
HIDE PNO-BUFFER
HIDE PNO-BUFFER-END
HIDE CURRENT-SOURCE-ID
HIDE INPUT-BUFFER
HIDE ESCAPED-CHAR
HIDE READSTRING
HIDE PARSENUMBER
HIDE INTERPRET
\ Switch to the interpreter defined in this startup file \ Switch to the interpreter defined in this startup file
\ Process the rest of the startup file and then switch to terminal input \ Process the rest of the startup file and then switch to terminal input
{ PARSE-AREA EVALUATE QUIT } EXECUTE { PARSE-AREA EVALUATE QUIT } EXECUTE
@ -1400,7 +1932,7 @@ HIDE INTERPRET
@(+) DUP WORD? IF "['] " TYPE .W ELSE . THEN SPACE @(+) DUP WORD? IF "['] " TYPE .W ELSE . THEN SPACE
ENDOF ENDOF
['] 2LIT OF ['] 2LIT OF
"[ " TYPE @(+) U. SPACE @(+) . " ] 2LITERAL " TYPE "[ " TYPE @(+) >R @(+) U. SPACE R> . " ] 2LITERAL " TYPE
ENDOF ENDOF
['] LITSTRING OF ['] LITSTRING OF
DUP 1+ SWAP C@ 2DUP "\"" TYPE TYPE-ESCAPED "\" " TYPE + ALIGNED DUP 1+ SWAP C@ 2DUP "\"" TYPE TYPE-ESCAPED "\" " TYPE + ALIGNED