Skip to content

Commit

Permalink
more work on libc
Browse files Browse the repository at this point in the history
  • Loading branch information
Vladimir Sedach committed Aug 19, 2012
1 parent ce3391c commit c0f1d23
Show file tree
Hide file tree
Showing 10 changed files with 200 additions and 175 deletions.
75 changes: 41 additions & 34 deletions libc/errno.lisp
@@ -1,39 +1,46 @@
(in-package #:vacietis.libc.errno.h)
(in-readtable vacietis:vacietis)

(define EPERM 1 "Operation not permitted (POSIX.1)")
(define ENOENT 2 "No such file or directory (POSIX.1)")
(define ESRCH 3 "No such process (POSIX.1)")
(define EINTR 4 "Interrupted function call (POSIX.1)")
(define EIO 5 "Input/output error")
(define ENXIO 6 "No such device or address (POSIX.1)")
(define E2BIG 7 "Argument list too long (POSIX.1)")
(define ENOEXEC 8 "Exec format error (POSIX.1)")
(define EBADF 9 "Bad file descriptor (POSIX.1)")
(define ECHILD 10 "No child processes (POSIX.1)")
(define EAGAIN 11 "Resource temporarily unavailable (POSIX.1)")
(define ENOMEM 12 "Not enough space (POSIX.1)")
(define EACCES 13 "Permission denied (POSIX.1)")
(define EFAULT 14 "Bad address (POSIX.1)")
(define ENOTBLK 15 "Block device required")
(define EBUSY 16 "Device or resource busy (POSIX.1)")
(define EEXIST 17 "File exists (POSIX.1)")
(define EXDEV 18 "Improper link (POSIX.1)")
(define ENODEV 19 "No such device (POSIX.1)")
(define ENOTDIR 20 "Not a directory (POSIX.1)")
(define EISDIR 21 "Is a directory (POSIX.1)")
(define EINVAL 22 "Invalid argument (POSIX.1)")
(define ENFILE 23 "Too many open files in system (POSIX.1)")
(define EMFILE 24 "Too many open files (POSIX.1)")
(define ENOTTY 25 "Inappropriate I/O control operation (POSIX.1)")
(define ETXTBSY 26 "Text file busy (POSIX.1)")
(define EFBIG 27 "File too large (POSIX.1)")
(define ENOSPC 28 "No space left on device (POSIX.1)")
(define ESPIPE 29 "Invalid seek (POSIX.1)")
(define EROFS 30 "Read-only file system (POSIX.1)")
(define EMLINK 31 "Too many links (POSIX.1)")
(define EPIPE 32 "Broken pipe (POSIX.1)")
(define EDOM 33 "Mathematics argument out of domain of function (POSIX.1, C99)")
(define ERANGE 34 "Result too large (POSIX.1, C99)")
(defvar errno-strings (make-array 35))

(defmacro deferr (name number msg)
`(progn
(setf (aref errno-strings ,number) (string-to-char* ,msg))
(define ,name ,number ,msg)))

(deferr EPERM 1 "Operation not permitted (POSIX.1)")
(deferr ENOENT 2 "No such file or directory (POSIX.1)")
(deferr ESRCH 3 "No such process (POSIX.1)")
(deferr EINTR 4 "Interrupted function call (POSIX.1)")
(deferr EIO 5 "Input/output error")
(deferr ENXIO 6 "No such device or address (POSIX.1)")
(deferr E2BIG 7 "Argument list too long (POSIX.1)")
(deferr ENOEXEC 8 "Exec format error (POSIX.1)")
(deferr EBADF 9 "Bad file descriptor (POSIX.1)")
(deferr ECHILD 10 "No child processes (POSIX.1)")
(deferr EAGAIN 11 "Resource temporarily unavailable (POSIX.1)")
(deferr ENOMEM 12 "Not enough space (POSIX.1)")
(deferr EACCES 13 "Permission denied (POSIX.1)")
(deferr EFAULT 14 "Bad address (POSIX.1)")
(deferr ENOTBLK 15 "Block device required")
(deferr EBUSY 16 "Device or resource busy (POSIX.1)")
(deferr EEXIST 17 "File exists (POSIX.1)")
(deferr EXDEV 18 "Improper link (POSIX.1)")
(deferr ENODEV 19 "No such device (POSIX.1)")
(deferr ENOTDIR 20 "Not a directory (POSIX.1)")
(deferr EISDIR 21 "Is a directory (POSIX.1)")
(deferr EINVAL 22 "Invalid argument (POSIX.1)")
(deferr ENFILE 23 "Too many open files in system (POSIX.1)")
(deferr EMFILE 24 "Too many open files (POSIX.1)")
(deferr ENOTTY 25 "Inappropriate I/O control operation (POSIX.1)")
(deferr ETXTBSY 26 "Text file busy (POSIX.1)")
(deferr EFBIG 27 "File too large (POSIX.1)")
(deferr ENOSPC 28 "No space left on device (POSIX.1)")
(deferr ESPIPE 29 "Invalid seek (POSIX.1)")
(deferr EROFS 30 "Read-only file system (POSIX.1)")
(deferr EMLINK 31 "Too many links (POSIX.1)")
(deferr EPIPE 32 "Broken pipe (POSIX.1)")
(deferr EDOM 33 "Mathematics argument out of domain of function (POSIX.1, C99)")
(deferr ERANGE 34 "Result too large (POSIX.1, C99)")

(defvar errno 0)
Empty file removed libc/include/ctype.h
Empty file.
Empty file removed libc/include/math.h
Empty file.
19 changes: 0 additions & 19 deletions libc/include/stdio.h

This file was deleted.

10 changes: 0 additions & 10 deletions libc/include/stdlib.h

This file was deleted.

16 changes: 0 additions & 16 deletions libc/include/string.h

This file was deleted.

43 changes: 36 additions & 7 deletions libc/stdio.lisp
Expand Up @@ -19,9 +19,6 @@
(setf (feof fd) 0
(ferror fd) 0))

(defun perror (str)
(fprintf stderr "%s: %s\n" str "error message"))

;;; file operations

;; have to do something about EEXIST
Expand Down Expand Up @@ -97,10 +94,6 @@
(progn (replace str newname :end1 (length newname))
str))))

(defun setvbuf (fd# buf mode size)
(declare (ignore fd# buf mode size))
0)

;;; character I/O

(defun fgetc (fd)
Expand All @@ -112,13 +105,25 @@
(setf (ferror fd) EIO)
EOF)))

(defun getc (fd)
(fgetc fd))

(defun getchar ()
(getc stdin))

(defun fputc (c fd)
(handler-case (progn (write-char (code-char c) (fd-stream fd))
c)
(error ()
(setf (ferror fd) EIO)
EOF)))

(defun putc (c fd)
(fputc c fd))

(defun putchar (c)
(fputc c stdout))

(defun fgets-is-dumb (str n fd replace-newline?)
(handler-case
(let ((stream (fd-stream fd)))
Expand Down Expand Up @@ -251,3 +256,27 @@

(defun snprintf (string max-length fmt &rest args))

(defun perror (str)
(if (or (eql NULL str)
(eql 0 (aref (memptr-mem str) (memptr-ptr str))))
(fprintf stderr (string-to-char* "%s\\n") (strerror errno))
(fprintf stderr (string-to-char* "%s: %s\\n") str (strerror errno))))

;;; things that have no effect

(defun setvbuf (fd buf mode size)
(declare (ignore fd buf mode size))
0)

(defun setbuf (fd buf)
(declare (ignore fd buf))
0)

(define FILENAME_MAX 1024)
(define FOPEN_MAX 1024)
(define BUFSIZ 512)
(define L_tmpnam 16)
(define TMP_MAX 1024)
(define _IOFBF 1)
(define _IOLBF 2)
(define _IONBF 3)
4 changes: 2 additions & 2 deletions libc/stdlib.lisp
Expand Up @@ -108,8 +108,8 @@

;;; program environment

(defconstant EXIT_SUCCESS 0)
(defconstant EXIT_FAILURE 1)
(define EXIT_SUCCESS 0)
(define EXIT_FAILURE 1)

(defun abort ()
(throw 'vacietis::c-exit EXIT_FAILURE))
Expand Down

0 comments on commit c0f1d23

Please sign in to comment.