Using ferror instead of setting errno.

This commit is contained in:
Alex Shinn 2011-11-06 15:01:14 +09:00
parent a39b44e58b
commit 0e056cf7f0

12
vm.c
View file

@ -2,8 +2,6 @@
/* Copyright (c) 2009-2011 Alex Shinn. All rights reserved. */ /* Copyright (c) 2009-2011 Alex Shinn. All rights reserved. */
/* BSD-style license: http://synthcode.com/license.txt */ /* BSD-style license: http://synthcode.com/license.txt */
#include <errno.h>
#if SEXP_USE_DEBUG_VM > 1 #if SEXP_USE_DEBUG_VM > 1
static void sexp_print_stack (sexp ctx, sexp *stack, int top, int fp, sexp out) { static void sexp_print_stack (sexp ctx, sexp *stack, int top, int fp, sexp out) {
int i; int i;
@ -1728,7 +1726,6 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) {
if (! sexp_iportp(_ARG1)) if (! sexp_iportp(_ARG1))
sexp_raise("read-char: not an input-port", sexp_list1(ctx, _ARG1)); sexp_raise("read-char: not an input-port", sexp_list1(ctx, _ARG1));
sexp_context_top(ctx) = top; sexp_context_top(ctx) = top;
errno = 0;
i = sexp_read_char(ctx, _ARG1); i = sexp_read_char(ctx, _ARG1);
#if SEXP_USE_UTF8_STRINGS #if SEXP_USE_UTF8_STRINGS
if (i >= 0x80) if (i >= 0x80)
@ -1737,8 +1734,10 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) {
#endif #endif
if (i == EOF) { if (i == EOF) {
#if SEXP_USE_GREEN_THREADS #if SEXP_USE_GREEN_THREADS
if ((errno == EAGAIN) if (sexp_port_stream(_ARG1) && ferror(sexp_port_stream(_ARG1))
&& (errno == EAGAIN)
&& sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) { && sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) {
clearerr(sexp_port_stream(_ARG1));
sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG1); sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG1);
fuel = 0; fuel = 0;
ip--; /* try again */ ip--; /* try again */
@ -1754,12 +1753,13 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) {
if (! sexp_iportp(_ARG1)) if (! sexp_iportp(_ARG1))
sexp_raise("peek-char: not an input-port", sexp_list1(ctx, _ARG1)); sexp_raise("peek-char: not an input-port", sexp_list1(ctx, _ARG1));
sexp_context_top(ctx) = top; sexp_context_top(ctx) = top;
errno = 0;
i = sexp_read_char(ctx, _ARG1); i = sexp_read_char(ctx, _ARG1);
if (i == EOF) { if (i == EOF) {
#if SEXP_USE_GREEN_THREADS #if SEXP_USE_GREEN_THREADS
if ((errno == EAGAIN) if (sexp_port_stream(_ARG1) && ferror(sexp_port_stream(_ARG1))
&& (errno == EAGAIN)
&& sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) { && sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) {
clearerr(sexp_port_stream(_ARG1));
sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG1); sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG1);
fuel = 0; fuel = 0;
ip--; /* try again */ ip--; /* try again */