SWIGINTERN SCM equalp_swig (SCM A, SCM B) { if (SCM_CELL_WORD_0(A) == SCM_CELL_WORD_0(B) && SCM_CELL_WORD_1(A) == SCM_CELL_WORD_1(B) && SCM_CELL_WORD_2(A) == SCM_CELL_WORD_2(B)) return SCM_BOOL_T; else return SCM_BOOL_F; }
/* create FPORT buffer with specified sizes (or -1 to use default size or 0 for no buffer. */ static void scm_fport_buffer_add (SCM port, long read_size, int write_size) #define FUNC_NAME "scm_fport_buffer_add" { scm_t_port *pt = SCM_PTAB_ENTRY (port); if (read_size == -1 || write_size == -1) { size_t default_size; #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE struct stat st; scm_t_fport *fp = SCM_FSTREAM (port); default_size = (fstat (fp->fdes, &st) == -1) ? default_buffer_size : st.st_blksize; #else default_size = default_buffer_size; #endif if (read_size == -1) read_size = default_size; if (write_size == -1) write_size = default_size; } if (SCM_INPUT_PORT_P (port) && read_size > 0) { pt->read_buf = scm_gc_malloc_pointerless (read_size, "port buffer"); pt->read_pos = pt->read_end = pt->read_buf; pt->read_buf_size = read_size; } else { pt->read_pos = pt->read_buf = pt->read_end = &pt->shortbuf; pt->read_buf_size = 1; } if (SCM_OUTPUT_PORT_P (port) && write_size > 0) { pt->write_buf = scm_gc_malloc_pointerless (write_size, "port buffer"); pt->write_pos = pt->write_buf; pt->write_buf_size = write_size; } else { pt->write_buf = pt->write_pos = &pt->shortbuf; pt->write_buf_size = 1; } pt->write_end = pt->write_buf + pt->write_buf_size; if (read_size > 0 || write_size > 0) SCM_SET_CELL_WORD_0 (port, SCM_CELL_WORD_0 (port) & ~SCM_BUF0); else SCM_SET_CELL_WORD_0 (port, SCM_CELL_WORD_0 (port) | SCM_BUF0); }
static SCM mu_port_mark (SCM port) { if (SCM_CELL_WORD_0 (port) & SCM_OPN) { struct mu_port *mp = MU_PORT (port); return mp->msg; } return SCM_BOOL_F; }
static void ioscm_init_memory_port (SCM port, CORE_ADDR start, CORE_ADDR end) { scm_t_port *pt; ioscm_memory_port *iomem; int buffered = (SCM_CELL_WORD_0 (port) & SCM_BUF0) == 0; gdb_assert (start <= end); iomem = (ioscm_memory_port *) scm_gc_malloc_pointerless (sizeof (*iomem), "memory port"); iomem->start = start; iomem->end = end; iomem->size = end - start; iomem->current = 0; if (buffered) { iomem->read_buf_size = default_read_buf_size; iomem->write_buf_size = default_write_buf_size; } else { iomem->read_buf_size = 1; iomem->write_buf_size = 1; } pt = SCM_PTAB_ENTRY (port); /* Match the expectation of `binary-port?'. */ pt->encoding = NULL; pt->rw_random = 1; pt->read_buf_size = iomem->read_buf_size; pt->write_buf_size = iomem->write_buf_size; if (buffered) { pt->read_buf = (unsigned char *) xmalloc (pt->read_buf_size); pt->write_buf = (unsigned char *) xmalloc (pt->write_buf_size); } else { pt->read_buf = &pt->shortbuf; pt->write_buf = &pt->shortbuf; } pt->read_pos = pt->read_end = pt->read_buf; pt->write_pos = pt->write_buf; pt->write_end = pt->write_buf + pt->write_buf_size; SCM_SETSTREAM (port, iomem); }
static void mu_port_alloc_buffer (SCM port, size_t read_size, size_t write_size) { scm_port *pt = SCM_PTAB_ENTRY (port); static char *s_mu_port_alloc_buffer = "mu_port_alloc_buffer"; if (!read_size) read_size = DEFAULT_BUF_SIZE; if (!write_size) write_size = DEFAULT_BUF_SIZE; if (SCM_INPUT_PORT_P (port)) { pt->read_buf = malloc (read_size); if (pt->read_buf == NULL) scm_memory_error (s_mu_port_alloc_buffer); pt->read_pos = pt->read_end = pt->read_buf; pt->read_buf_size = read_size; } else { pt->read_pos = pt->read_buf = pt->read_end = &pt->shortbuf; pt->read_buf_size = 1; } if (SCM_OUTPUT_PORT_P (port)) { pt->write_buf = malloc (write_size); if (pt->write_buf == NULL) scm_memory_error (s_mu_port_alloc_buffer); pt->write_pos = pt->write_buf; pt->write_buf_size = write_size; pt->write_end = pt->write_buf + pt->write_buf_size; } else { pt->write_buf = pt->write_pos = &pt->shortbuf; pt->write_buf_size = 1; } SCM_SET_CELL_WORD_0 (port, SCM_CELL_WORD_0 (port) & ~SCM_BUF0); }
static scm_t_off st_seek (SCM port, scm_t_off offset, int whence) { scm_t_port *pt = SCM_PTAB_ENTRY (port); scm_t_off target; if (pt->rw_active == SCM_PORT_READ && offset == 0 && whence == SEEK_CUR) /* special case to avoid disturbing the unread-char buffer. */ { if (pt->read_buf == pt->putback_buf) { target = pt->saved_read_pos - pt->saved_read_buf - (pt->read_end - pt->read_pos); } else { target = pt->read_pos - pt->read_buf; } } else /* all other cases. */ { if (pt->rw_active == SCM_PORT_READ) scm_end_input_unlocked (port); pt->rw_active = SCM_PORT_NEITHER; switch (whence) { case SEEK_CUR: target = pt->read_pos - pt->read_buf + offset; break; case SEEK_END: target = pt->read_end - pt->read_buf + offset; break; default: /* SEEK_SET */ target = offset; break; } if (target < 0) scm_misc_error ("st_seek", "negative offset", SCM_EOL); if (target >= pt->write_buf_size) { if (!(SCM_CELL_WORD_0 (port) & SCM_WRTNG)) { if (target > pt->write_buf_size) { scm_misc_error ("st_seek", "seek past end of read-only strport", SCM_EOL); } } else if (target == pt->write_buf_size) st_resize_port (pt, target * 2); } pt->read_pos = pt->write_pos = pt->read_buf + target; if (pt->read_pos > pt->read_end) { pt->read_end = (unsigned char *) pt->read_pos; pt->read_buf_size = pt->read_end - pt->read_buf; } } return target; }