Ejemplo n.º 1
0
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++;
	}
    }
Ejemplo n.º 2
0
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;
    }
}
Ejemplo n.º 3
0
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;
	}
    }
}
Ejemplo n.º 4
0
void
s48_init_sysexits(void)
{
  /* For SRFI 22 */
  s48_define_exported_binding("EX_SOFTWARE", s48_enter_integer(EX_SOFTWARE));
}