Added missing ikarus-errno.c
This commit is contained in:
parent
53905b9eea
commit
c377d43b92
|
@ -0,0 +1,181 @@
|
||||||
|
/*
|
||||||
|
* Ikarus Scheme -- A compiler for R6RS Scheme.
|
||||||
|
* Copyright (C) 2006,2007,2008 Abdulaziz Ghuloum
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 3 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "ikarus-data.h"
|
||||||
|
|
||||||
|
typedef struct errno_info {
|
||||||
|
int n;
|
||||||
|
char* s;
|
||||||
|
ikptr c;
|
||||||
|
} errno_info;
|
||||||
|
|
||||||
|
static errno_info errno_table[] = {
|
||||||
|
/* errnos from POSIX IEEE Std 1003.1 2004 Edition */
|
||||||
|
{E2BIG, "E2BIG", fix(-1)},
|
||||||
|
{EACCES, "EACCES", fix(-2)},
|
||||||
|
{EADDRINUSE, "EADDRINUSE", fix(-3)},
|
||||||
|
{EADDRNOTAVAIL, "EADDRNOTAVAIL", fix(-4)},
|
||||||
|
{EAFNOSUPPORT, "EAFNOSUPPORT", fix(-5)},
|
||||||
|
{EAGAIN, "EAGAIN", fix(-6)},
|
||||||
|
{EALREADY, "EALREADY", fix(-7)},
|
||||||
|
{EBADF, "EBADF", fix(-8)},
|
||||||
|
{EBADMSG, "EBADMSG", fix(-9)},
|
||||||
|
{EBUSY, "EBUSY", fix(-10)},
|
||||||
|
{ECANCELED, "ECANCELED", fix(-11)},
|
||||||
|
{ECHILD, "ECHILD", fix(-12)},
|
||||||
|
{ECONNABORTED, "ECONNABORTED", fix(-13)},
|
||||||
|
{ECONNREFUSED, "ECONNREFUSED", fix(-14)},
|
||||||
|
{ECONNRESET, "ECONNRESET", fix(-15)},
|
||||||
|
{EDEADLK, "EDEADLK", fix(-16)},
|
||||||
|
{EDESTADDRREQ, "EDESTADDRREQ", fix(-17)},
|
||||||
|
{EDOM, "EDOM", fix(-18)},
|
||||||
|
{EDQUOT, "EDQUOT", fix(-19)},
|
||||||
|
{EEXIST, "EEXIST", fix(-20)},
|
||||||
|
{EFAULT, "EFAULT", fix(-21)},
|
||||||
|
{EFBIG, "EFBIG", fix(-22)},
|
||||||
|
{EHOSTUNREACH, "EHOSTUNREACH", fix(-23)},
|
||||||
|
{EIDRM, "EIDRM", fix(-24)},
|
||||||
|
{EILSEQ, "EILSEQ", fix(-25)},
|
||||||
|
{EINPROGRESS, "EINPROGRESS", fix(-26)},
|
||||||
|
{EINTR, "EINTR", fix(-27)},
|
||||||
|
{EINVAL, "EINVAL", fix(-28)},
|
||||||
|
{EIO, "EIO", fix(-29)},
|
||||||
|
{EISCONN, "EISCONN", fix(-30)},
|
||||||
|
{EISDIR, "EISDIR", fix(-31)},
|
||||||
|
{ELOOP, "ELOOP", fix(-32)},
|
||||||
|
{EMFILE, "EMFILE", fix(-33)},
|
||||||
|
{EMLINK, "EMLINK", fix(-34)},
|
||||||
|
{EMSGSIZE, "EMSGSIZE", fix(-35)},
|
||||||
|
{EMULTIHOP, "EMULTIHOP", fix(-36)},
|
||||||
|
{ENAMETOOLONG, "ENAMETOOLONG", fix(-37)},
|
||||||
|
{ENETDOWN, "ENETDOWN", fix(-38)},
|
||||||
|
{ENETRESET, "ENETRESET", fix(-39)},
|
||||||
|
{ENETUNREACH, "ENETUNREACH", fix(-40)},
|
||||||
|
{ENFILE, "ENFILE", fix(-41)},
|
||||||
|
{ENOBUFS, "ENOBUFS", fix(-42)},
|
||||||
|
{ENODATA, "ENODATA", fix(-43)},
|
||||||
|
{ENODEV, "ENODEV", fix(-44)},
|
||||||
|
{ENOENT, "ENOENT", fix(-45)},
|
||||||
|
{ENOEXEC, "ENOEXEC", fix(-46)},
|
||||||
|
{ENOLCK, "ENOLCK", fix(-47)},
|
||||||
|
{ENOLINK, "ENOLINK", fix(-48)},
|
||||||
|
{ENOMEM, "ENOMEM", fix(-49)},
|
||||||
|
{ENOMSG, "ENOMSG", fix(-50)},
|
||||||
|
{ENOPROTOOPT, "ENOPROTOOPT", fix(-51)},
|
||||||
|
{ENOSPC, "ENOSPC", fix(-52)},
|
||||||
|
{ENOSR, "ENOSR", fix(-53)},
|
||||||
|
{ENOSTR, "ENOSTR", fix(-54)},
|
||||||
|
{ENOSYS, "ENOSYS", fix(-55)},
|
||||||
|
{ENOTCONN, "ENOTCONN", fix(-56)},
|
||||||
|
{ENOTDIR, "ENOTDIR", fix(-57)},
|
||||||
|
{ENOTEMPTY, "ENOTEMPTY", fix(-58)},
|
||||||
|
{ENOTSOCK, "ENOTSOCK", fix(-59)},
|
||||||
|
{ENOTSUP, "ENOTSUP", fix(-60)},
|
||||||
|
{ENOTTY, "ENOTTY", fix(-61)},
|
||||||
|
{ENXIO, "ENXIO", fix(-62)},
|
||||||
|
{EOPNOTSUPP, "EOPNOTSUPP", fix(-63)},
|
||||||
|
{EOVERFLOW, "EOVERFLOW", fix(-64)},
|
||||||
|
{EPERM, "EPERM", fix(-65)},
|
||||||
|
{EPIPE, "EPIPE", fix(-66)},
|
||||||
|
{EPROTO, "EPROTO", fix(-67)},
|
||||||
|
{EPROTONOSUPPORT, "EPROTONOSUPPORT", fix(-68)},
|
||||||
|
{EPROTOTYPE, "EPROTOTYPE", fix(-69)},
|
||||||
|
{ERANGE, "ERANGE", fix(-70)},
|
||||||
|
{EROFS, "EROFS", fix(-71)},
|
||||||
|
{ESPIPE, "ESPIPE", fix(-72)},
|
||||||
|
{ESRCH, "ESRCH", fix(-73)},
|
||||||
|
{ESTALE, "ESTALE", fix(-74)},
|
||||||
|
{ETIME, "ETIME", fix(-75)},
|
||||||
|
{ETIMEDOUT, "ETIMEDOUT", fix(-76)},
|
||||||
|
{ETXTBSY, "ETXTBSY", fix(-77)},
|
||||||
|
{EWOULDBLOCK, "EWOULDBLOCK", fix(-78)},
|
||||||
|
{EXDEV, "EXDEV", fix(-79)}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define errno_table_length 79
|
||||||
|
|
||||||
|
ikptr
|
||||||
|
ik_errno_num_to_code(int en){
|
||||||
|
/* Used by C to return Ikarus errno code to Scheme. */
|
||||||
|
errno_info* ei;
|
||||||
|
int i;
|
||||||
|
for(i=0; i < errno_table_length; i++){
|
||||||
|
ei = &errno_table[i];
|
||||||
|
if(ei->n == en){
|
||||||
|
return ei->c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n*** ikarus-errno.c: Don't know errno %d ***\n\n", en);
|
||||||
|
return fix(-99999); /* should always be less than last errno code */
|
||||||
|
}
|
||||||
|
|
||||||
|
ikptr
|
||||||
|
ik_errno_to_code(){
|
||||||
|
int en = errno;
|
||||||
|
return ik_errno_num_to_code(en);
|
||||||
|
}
|
||||||
|
|
||||||
|
ikptr
|
||||||
|
ikrt_errno_code_to_name(ikptr ec, ikpcb* pcb){
|
||||||
|
/* Used by Scheme to get the name of the errno corresponding
|
||||||
|
to the Ikarus errno code. */
|
||||||
|
errno_info* ei;
|
||||||
|
int i;
|
||||||
|
for(i=0; i < errno_table_length; i++){
|
||||||
|
ei = &errno_table[i];
|
||||||
|
if(ei->c == ec){
|
||||||
|
int len = strlen(ei->s);
|
||||||
|
ikptr bv = ik_safe_alloc(pcb, align(disp_bytevector_data+len+1))
|
||||||
|
+ bytevector_tag;
|
||||||
|
ref(bv, off_bytevector_length) = fix(len);
|
||||||
|
memcpy((char*)(bv+off_bytevector_data), ei->s, len+1);
|
||||||
|
return bv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
ikptr
|
||||||
|
ikrt_strerror(ikptr ec, ikpcb* pcb){
|
||||||
|
/* Used by Scheme to get the error message of the errno corresponding
|
||||||
|
to the Ikarus errno code. */
|
||||||
|
errno_info* ei;
|
||||||
|
int i;
|
||||||
|
for(i=0; i < errno_table_length; i++){
|
||||||
|
ei = &errno_table[i];
|
||||||
|
if(ei->c == ec){
|
||||||
|
errno = 0;
|
||||||
|
char* es = strerror(ei->n);
|
||||||
|
if(errno){
|
||||||
|
perror("ikrt_strerror: strerror failed");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
int len = strlen(es);
|
||||||
|
ikptr bv = ik_safe_alloc(pcb, align(disp_bytevector_data+len+1))
|
||||||
|
+ bytevector_tag;
|
||||||
|
ref(bv, off_bytevector_length) = fix(len);
|
||||||
|
memcpy((char*)(bv+off_bytevector_data), es, len+1);
|
||||||
|
return bv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false_object;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue