s48_value skip_chars(const char *skipchars, int fd, int *nread) { int nr = 0; /* Number of skip chars read. */ char c; while( 1 ) { int retval = read ( fd, &c, 1 ); if( retval == 0 ) { /* Terminal case: EOF. */ *nread = nr; return S48_FALSE; } if( retval == -1 ) { /* Terminal case: error. */ *nread = nr; return s48_enter_integer(errno); } else if( !skipchars[c] ) { /* Terminal case: non-skip char. */ *nread = nr; return s48_enter_char(c); } nr++; } }
s48_value get_lock(s48_value fd, s48_value cmd, s48_value type, s48_value whence, s48_value start, s48_value len) { struct flock lock; int ret; s48_value sch_type = S48_UNSPECIFIC; s48_value sch_whence = S48_UNSPECIFIC; s48_value sch_start = S48_UNSPECIFIC; s48_value sch_len = S48_UNSPECIFIC; s48_value sch_pid = S48_UNSPECIFIC; s48_value sch_retval = S48_UNSPECIFIC; S48_DECLARE_GC_PROTECT(6); S48_GC_PROTECT_6(sch_type, sch_whence, sch_start, sch_len, sch_pid, sch_retval); lock.l_type = s48_extract_integer (type); lock.l_whence = s48_extract_integer (whence); lock.l_start = s48_extract_integer (start); lock.l_len = s48_extract_integer (len); ret = fcntl(s48_extract_fixnum (fd), F_GETLK, &lock); if (ret == -1) { S48_GC_UNPROTECT(); s48_raise_os_error_6 (errno, fd, cmd, type, whence, start, len); } else { sch_type = s48_enter_integer (lock.l_type); sch_whence = s48_enter_integer (lock.l_whence); sch_start = s48_enter_integer (lock.l_start); sch_len = s48_enter_integer (lock.l_len); sch_pid = s48_enter_integer (lock.l_pid); sch_retval = s48_list_5(sch_type, sch_whence, sch_start, sch_len, sch_pid); S48_GC_UNPROTECT(); return sch_retval; } }
s48_value read_delim(const char *delims, char *buf, int fd, int start, int end, int *nread) { char *cptr = buf+start, /* Location of last char deposited. */ *bufend = buf+end -1; /* Last writeable position. */ int retval; char c; while( 1 ) { retval = read( fd, &c, 1 ); if( retval == 0 ) { /* Terminal case: EOF. */ *nread = cptr - buf - start; return S48_EOF; } else if( retval == -1 ) { /* Terminal case: error. */ *nread = cptr - buf - start; return s48_enter_integer(errno); } else if( delims[c] ) { /* Terminal case: delimiter char. */ *nread = cptr - buf - start; return s48_enter_char(c); } else if( cptr == bufend ) { /* Terminal case: buffer overflow. */ *cptr = c; *nread = end-start; return S48_FALSE; } else if ( cptr > bufend ){ fputs("cptr > bufend.\n", stderr); abort(); _exit(-1); } else { *cptr++ = c; } } }
void s48_init_sysexits(void) { /* For SRFI 22 */ s48_define_exported_binding("EX_SOFTWARE", s48_enter_integer(EX_SOFTWARE)); }