Author: iratqq
Date: Mon Feb  2 05:03:32 2009
New Revision: 5801

Modified:
   trunk/uim/uim-posix.c

Log:
* uim/uim-posix.c (waitpid_options, c_process_waitpid_options)
  (c_process_waitpid):
  - Add Functions.
  (uim_init_posix_subrs):
  - Add (process-waitpid), (process-waitpid-options?) and
    process-waitpid-options-alist.


Modified: trunk/uim/uim-posix.c
==============================================================================
--- trunk/uim/uim-posix.c       (original)
+++ trunk/uim/uim-posix.c       Mon Feb  2 05:03:32 2009
@@ -596,6 +596,43 @@
   return uim_scm_t();
 }

+const static opt_args waitpid_options[] = {
+#ifdef WCONTINUED
+  { WCONTINUED, "$WCONTINUED" },
+#endif
+#ifdef WNOHANG
+  { WNOHANG,    "$WNOHANG" },
+#endif
+#ifdef WUNTRACED
+  { WUNTRACED,  "$WUNTRACED" },
+#endif
+  { 0, 0 }
+};
+static uim_lisp uim_lisp_process_waitpid_options;
+static uim_lisp
+c_process_waitpid_options(void)
+{
+  return uim_lisp_process_waitpid_options;
+}
+static uim_lisp
+c_process_waitpid(uim_lisp pid_, uim_lisp options_)
+{
+  uim_lisp ret_ = uim_scm_null();
+  int status;
+
+  ret_ = MAKE_INT(waitpid(C_INT(pid_), &status, C_INT(options_)));
+  if (WIFEXITED(status))
+ return LIST5(ret_, uim_scm_t(), uim_scm_f(), uim_scm_f(), MAKE_INT(WEXITSTATUS(status)));
+  else if (WIFSIGNALED(status))
+ return LIST5(ret_, uim_scm_f(), uim_scm_t(), uim_scm_f(), MAKE_INT(WTERMSIG(status)));
+#ifdef WIFSTOPPED
+  else if (WIFSTOPPED(status))
+ return LIST5(ret_, uim_scm_f(), uim_scm_f(), uim_scm_t(), MAKE_INT(WSTOPSIG(status)));
+#endif
+
+ return LIST5(ret_, uim_scm_f(), uim_scm_f(), uim_scm_f(), MAKE_INT(status));
+}
+
 void
 uim_init_posix_subrs(void)
 {
@@ -646,4 +683,9 @@
   uim_scm_init_proc0("parent-process-id",  c_parent_process_id);
   uim_scm_init_proc0("process-fork", c_process_fork);
   uim_scm_init_proc1("_exit", c__exit);
+  uim_scm_init_proc2("process-waitpid", c_process_waitpid);
+ uim_scm_init_proc0("process-waitpid-options?", c_process_waitpid_options);
+  uim_scm_gc_protect(&uim_lisp_process_waitpid_options);
+  uim_lisp_process_waitpid_options = make_arg_list(waitpid_options);
+ uim_scm_eval_c_string("(define process-waitpid-options-alist (process-waitpid-options?))");
 }

Reply via email to