diff --git a/libc/errno.lisp b/libc/errno.lisp index 0178116..c906472 100644 --- a/libc/errno.lisp +++ b/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) diff --git a/libc/include/ctype.h b/libc/include/ctype.h deleted file mode 100644 index e69de29..0000000 diff --git a/libc/include/math.h b/libc/include/math.h deleted file mode 100644 index e69de29..0000000 diff --git a/libc/include/stdio.h b/libc/include/stdio.h deleted file mode 100644 index fdb6e4b..0000000 --- a/libc/include/stdio.h +++ /dev/null @@ -1,19 +0,0 @@ -typedef T FILE; - -#define EOF -1 - -/* these constants are important but here defined arbitrarily */ -#define FILENAME_MAX 1024 -#define FOPEN_MAX 99999 -#define BUFSIZ 512 -#define L_tmpnam 16 -#define TMP_MAX 99999 -#define _IOFBF 1 -#define _IOLBF 2 -#define _IONBF 3 - -#define getchar() getc(stdin) -#define getc(f) fgetc(f) -#define putc(c, f) fputc(c, f) -#define putchar(c) putc(c, stdout) -#define setbuf(fd, buf) setvbuf(fd, buf, _IOFBF, BUFSIZ) diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h deleted file mode 100644 index 68a9742..0000000 --- a/libc/include/stdlib.h +++ /dev/null @@ -1,10 +0,0 @@ -/* - * stdlib.h for ZETA-C: General Utilities - */ - -int atoi(); -long atol(); -char *malloc(); -void *calloc(); -void free(); -void abort(), exit(); diff --git a/libc/include/string.h b/libc/include/string.h deleted file mode 100644 index f8c1ed1..0000000 --- a/libc/include/string.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - STRING.H for ZETA-C: declarations for string processing functions. - Note this file does not have a package specification, as it will be - read into (potentially) many different packages. - - This is identical to ZETA-C:Include;STRINGS.H. */ - -extern char *strcat(), *strchr(), *strcpy(), *strncat(), *strncpy(); -extern char *strpbrk(), *strrchr(), *strrpbrk(); -extern int strcmp(), strlen(), strcspn(), strncmp(), strpos(); -extern int strrpos(), strspn(); -extern void *memcpy(), *memmove(), *memset(), *memchr(); -extern int memcmp(); - - -/* End of STRING.H */ diff --git a/libc/stdio.lisp b/libc/stdio.lisp index 0fafe86..7cc5b5d 100644 --- a/libc/stdio.lisp +++ b/libc/stdio.lisp @@ -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 @@ -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) @@ -112,6 +105,12 @@ (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) @@ -119,6 +118,12 @@ (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))) @@ -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) diff --git a/libc/stdlib.lisp b/libc/stdlib.lisp index 4eac270..ed70286 100644 --- a/libc/stdlib.lisp +++ b/libc/stdlib.lisp @@ -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)) diff --git a/libc/string.c b/libc/string.c index 8a94a98..8a428e1 100644 --- a/libc/string.c +++ b/libc/string.c @@ -3,86 +3,6 @@ #define size_t int -char *strcpy(char *s1, const char *s2) { - char *s = s1; - while ( (*s++ = *s2++) != 0 ); - return s1; -} - -char *strncpy(char *s1, const char *s2, size_t n) { - char *s = s1; - - while (n) { - if ((*s = *s2) != 0) s2++; /* Need to fill tail with 0s. */ - ++s; - --n; - } - - return s1; -} - -char *strcat(char * s1, const char * s2) -{ - char *s = s1; - - while (*s++); - --s; - while ((*s++ = *s2++) != 0); - - return s1; -} - -char *strncat(char * s1, const char * s2, - size_t n) -{ - char *s = s1; - - while (*s++); - --s; - while (n && ((*s = *s2++) != 0)) { - --n; - ++s; - } - *s = 0; - - return s1; -} - -int strcmp( const char *s1, const char *s2) -{ - - int r; - - while (((r = ((int)(*((uchar *)s1))) - *((uchar *)s2++)) - == 0) && *s1++); - - return r; -} - -// yup, this is real code, formatting and all -int strncmp( const char *s1, const char *s2, size_t n) -{ - int r = 0; - - while (n-- - && ((r = ((int)(*((unsigned char *)s1))) - *((unsigned char *)s2++)) - == 0) - && *s1++); - - return r; -} - -char *strchr( const char *s, int c) -{ - do { - if (*s == ((char)c)) { - return (char *) s; /* silence the warning */ - } - } while (*s++); - - return NULL; -} - char *strrchr( const char *s, int c) { const char *p; @@ -146,12 +66,6 @@ char *strstr(const char *s1, const char *s2) } while (1); } -size_t strlen(const char *s) { - const char *p; - for (p=s ; *p ; p++); - return p - s; -} - char *strtok(char * s1, const char * s2) { static char *next_start; /* Initialized to 0 since in bss. */ return strtok_r(s1, s2, &next_start); @@ -173,3 +87,123 @@ char *strtok_r(char * s1, const char * s2, char ** next_start) { } return s; } + +// The following functions are from ZetaC + +// str functions + +char *strcpy (char *s1, char *s2) { + char *s1temp = s1; + + do *s1++ = *s2; while (*s2++); + return s1temp; +} + +char *strncpy (char *s1, char *s2, int n) { + char *s1temp = s1; + + while (--n >= 0) *s1++ = *s2 ? *s2++ : NULL; + return s1temp; +} + +char *strcat (char *s1, char *s2) { + strcpy (s1 + strlen (s1), s2); + return s1; +} + +char *strncat (char *s1, char *s2, int n) { + char *s1tmp; + + s1tmp = s1 + strlen (s1); /* Remember where the original string ended */ + strncpy (s1tmp, s2, n); /* The real work happens here */ + s1tmp[n] = NUL; /* Must guarantee that result ends in NUL */ + return s1; +} + +char *strchr (char *s, char *c) { + do if (*s == c) return s; while (*s++); + return NULL; +} + + +int strcmp (char *s1, char *s2) { + char c1, c2; + + while (*s1 || *s2) { + c1 = *s1++; + c2 = *s2++; + if (c1 < c2) return -1; + if (c1 > c2) return 1; + } + return 0; +} + +int strncmp (char *s1, char *s2, int n) { + char c1, c2; + + while (n-- > 0 && (*s1 || *s2)) { /* Just like strcmp, but for < n chars */ + c1 = *s1++; + c2 = *s2++; + if (c1 < c2) return -1; + if (c1 > c2) return 1; + } + return 0; +} + +int strlen (char *s) { + char *s0 = s; + + while (*s) s++; + return s - s0; +} + +int strcspn (char *s1, char *s2) { + int n = 0; + + while (s1[n] && /* WHILE not at the end of S1, and */ + !strchr(s2, s1[n])) /* not not at one of S2s chars */ + n++; + return n; +} + +// mem functions + +char *memcpy (char *dest, char *src, int nbytes) { + void *tdest = dest; + while (nbytes-- > 0) *dest++ = *src++; + return tdest; +} + +char *memmove (char *dest, char *src, int nbytes) { + void *tdest = destv; + + if (src > dest) while (nbytes-- > 0) *dest++ = *src++; + else { + src += nbytes; + dest += nbytes; + while (nbytes-- > 0) *--dest = *--src; + } + return tdest; +} + +char *memset (char *dest, char c, int nbytes) { + while (nbytes-- > 0) *dest++ = c; + return destv; +} + +void *memchr (char *sv, char c, int nbytes) { + while (nbytes-- > 0) if (*s++ == c) return (void *)(s - 1); + return (void *)NULL; +} + +int memcmp (char *m1v, char *m2v, int nbytes) { + char c1, c2; + + while (nbytes-- > 0) { + c1 = *m1++; + c2 = *m2++; + if (c1 < c2) return -1; + if (c1 > c2) return 1; + } + return 0; +} diff --git a/libc/string.lisp b/libc/string.lisp index 03c02e7..c59e8bf 100644 --- a/libc/string.lisp +++ b/libc/string.lisp @@ -2,4 +2,4 @@ (in-readtable vacietis) (defun strerror (errnum) - (string-to-char* "Some kind of error")) + (aref vacietis.libc.errno.h::errno-strings errnum))