Author: iratqq
Date: Mon Feb 2 01:49:53 2009
New Revision: 5792
Modified:
trunk/uim/uim-posix.c
Log:
* uim/uim-posix.c (poll_flags, c_file_poll_flags, c_file_poll):
- New function.
(uim_init_posix_subrs):
- Add (file-poll), (file-poll-flags?) poll-flags-alist.
Modified: trunk/uim/uim-posix.c
==============================================================================
--- trunk/uim/uim-posix.c (original)
+++ trunk/uim/uim-posix.c Mon Feb 2 01:49:53 2009
@@ -47,6 +47,14 @@
#include <assert.h>
#include <fcntl.h>
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#elif defined(HAVE_SYS_POLL_H)
+#include <sys/poll.h>
+#else
+#include "bsd-poll.h"
+#endif
+
#include "uim.h"
#include "uim-internal.h"
#include "uim-scm.h"
@@ -342,6 +350,21 @@
return ret_;
}
+static uim_lisp
+make_args_or(const opt_args *list, int flag)
+{
+ uim_lisp ret_;
+ int i = 0;
+
+ ret_ = uim_scm_null();
+ while (list[i].arg != 0) {
+ if (list[i].flag & flag)
+ ret_ = CONS(MAKE_SYM(list[i].arg), ret_);
+ i++;
+ }
+ return uim_scm_callf("reverse", "o", ret_);
+}
+
const static opt_args open_flags[] = {
{ O_CREAT, "$O_CREAT" },
{ O_EXCL, "$O_EXCL" },
@@ -462,6 +485,76 @@
return ret_;
}
+const static opt_args poll_flags[] = {
+ { POLLIN, "$POLLIN" },
+#ifdef POLLPRI
+ { POLLPRI, "$POLLPRI" },
+#endif
+ { POLLOUT, "$POLLOUT" },
+ { POLLERR, "$POLLERR" },
+#ifdef POLLHUP
+ { POLLHUP, "$POLLHUP"},
+#endif
+#ifdef POLLNVAL
+ { POLLNVAL, "$POLLNVAL"},
+#endif
+#ifdef POLLRDNORM
+ { POLLRDNORM, "$POLLRDNORM"},
+#endif
+#ifdef POLLNORM
+ { POLLNORM, "$POLLNORM"},
+#endif
+#ifdef POLLWRNORM
+ { POLLWRNORM, "$POLLWRNORM"},
+#endif
+#ifdef POLLRDBAND
+ { POLLRDBAND, "$POLLRDBAND"},
+#endif
+#ifdef POLLWRBAND
+ { POLLWRBAND, "$POLLWRBAND"},
+#endif
+};
+
+static uim_lisp uim_lisp_poll_flags;
+static uim_lisp
+c_file_poll_flags(void)
+{
+ return uim_lisp_poll_flags;
+}
+
+static uim_lisp
+c_file_poll(uim_lisp fds_, uim_lisp timeout_)
+{
+ struct pollfd *fds;
+ int timeout = C_INT(timeout_);
+ int nfds = uim_scm_length(fds_);
+ uim_lisp fd_ = uim_scm_f();
+ int i;
+ int ret;
+ uim_lisp ret_;
+
+ fds = uim_calloc(nfds, sizeof(struct pollfd));
+
+ for (i = 0; i < nfds; i++) {
+ fd_ = CAR(fds_);
+ fds[i].fd = C_INT(CAR(fd_));
+ fds[i].events = C_INT(CDR(fd_));
+ fds_ = CDR(fds_);
+ }
+
+ ret = poll(fds, nfds, timeout);
+ if (ret == -1)
+ return uim_scm_f();
+ else if (ret == 0)
+ return uim_scm_null();
+
+ ret_ = uim_scm_null();
+ for (i = 0; i < ret; i++)
+ ret_ = CONS(CONS(MAKE_INT(fds[i].fd), make_args_or(poll_flags,
fds[i].revents)), ret_);
+ free(fds);
+ return uim_scm_callf("reverse", "o", ret_);
+}
+
void
uim_init_posix_subrs(void)
@@ -500,4 +593,10 @@
uim_scm_init_proc1("file-close", c_file_close);
uim_scm_init_proc2("file-read", c_file_read);
uim_scm_init_proc2("file-write", c_file_write);
+
+ uim_scm_init_proc2("file-poll", c_file_poll);
+ uim_scm_init_proc0("file-poll-flags?", c_file_poll_flags);
+ uim_scm_gc_protect(&uim_lisp_poll_flags);
+ uim_lisp_poll_flags = make_arg_list(poll_flags);
+ uim_scm_eval_c_string("(define poll-flags-alist (file-poll-flags?))");
}