Exemple #1
0
LISPTR lisp_print(LISPTR x, FILE* out)
{
	if (consp(x)) {
		fputwc('(', out);
		while (true) {
			lisp_print(car(x), out);
			x = cdr(x);
			if (!consp(x)) {
				if (x != NIL) {
					fputws(L" . ", out);
					lisp_print(x, out);
				}
				break;
			}
			fputwc(' ', out);
		}
		fputwc(')', out);
	} else if (symbolp(x)) {
		fputws(string_text(symbol_name(x)), out);
	} else if (numberp(x)) {
		fwprintf(out, L"%g", number_value(x));
	} else if (stringp(x)) {
		fputwc('"', out);
		fputws(string_text(x), out);
		fputwc('"', out);
	} else {
		fputws(L"*UNKOBJ*", out);
	}
	return x;
}
Exemple #2
0
void *tcl_gateway( void )
{
char **argp, *(args[102]);
Tcl_CmdInfo *info;
Tcl_Interp *interp;
char temp[1000], *d;
int i, rc;

    assert( arg_count_reg <= 100 );
    info = (Tcl_CmdInfo *)PTR_TO_DATAPTR(LEXREF0(0));
    interp = (Tcl_Interp *)OBJ_TO_RAW_PTR(LEXREF0(1));

    d = temp;
    argp = args;
    *argp++ = (char *)string_text( LEXREF0(2) );
    for (i=0; i<arg_count_reg; i++)
      {
	obj arg;

	arg = reg_ref(i);
	if (STRING_P(arg))
	  {
	    *argp++ = (char *)string_text(arg);
	  }
	else if (OBJ_ISA_FIXNUM(arg))
	  {
	    *argp++ = d;
	    sprintf( d, "%d", fx2int(arg) );
	    d += strlen(d) + 1;
	  }
	else if (SYMBOL_P(arg))
	  {
	    *argp++ = (char *)symbol_text(arg);
	  }
	else
	  {
	    scheme_error( "tcl_gateway: ~s invalid", 1, arg );
	  }
      }
    *argp++ = NULL;
    Tcl_ResetResult( interp );
    rc = info->proc( info->clientData,
		     interp,
		     arg_count_reg + 1,
		     args );
    if (rc)
      {
	REG0 = make_string( interp->result );
	REG1 = int2fx( rc );
	RETURN(2);
      }
    else
      {
	if (interp->result[0])
	  REG0 = make_string( interp->result );
	else
	  REG0 = TRUE_OBJ;
	RETURN1();
      }
}
Exemple #3
0
rs_bool BSOP_write( obj port, const char *src, UINT_32 len )
{
obj buf, fxpos;
char *ptr;
UINT_32 n, max, pos;

    buf = gvec_read( port, BSOP_BUFFER );
    fxpos = gvec_read( port, BSOP_INDEX );
    max = string_length(buf);

    assert( STRING_P(buf) );
    assert( OBJ_ISA_FIXNUM(fxpos) );

    pos = fx2int(fxpos);
    
    ptr = (char *)string_text(buf);

    if (pos + len > max)
    {
	n = max - pos;
	memcpy( ptr + pos, src, n );
	gvec_write_non_ptr( port, BSOP_INDEX, int2fx(max) );
	return NO;
    }

    memcpy( ptr + pos, src, len );
    pos += len;
    gvec_write_non_ptr( port, BSOP_INDEX, int2fx(pos) );
    return YES;
}
Exemple #4
0
obj basic_num_to_string_obj( obj a, unsigned radix )
{
    char buf[100];

    if (FIXNUM_P(a)) {
        return make_string( fixnum_to_string( &buf[100], a, radix ) );
    } else if (LONGFLOAT_P(a)) {
        snprintf( buf, 100, "%g", extract_float(a) );
        if (!strchr( buf,'.') && !strchr(buf,'e')) {
            strcat( buf, "." );
        }
        return make_string( buf );
    } else if (OBJ_ISA_PTR_OF_CLASS(a,bignum_class)) {
        return bignum_to_string_obj( a, radix );
    } else if (OBJ_ISA_PTR_OF_CLASS(a,mp_rational_class)) {
        return rational_to_string_obj( a, radix );
    } else if (OBJ_ISA_PTR_OF_CLASS(a,rect_complex_class)) {
        obj r;
        char *str;
        obj re = basic_num_to_string_obj( gvec_ref( a, SLOT(0) ), radix );
        obj im = basic_num_to_string_obj( gvec_ref( a, SLOT(1) ), radix );
        unsigned len = string_length(re) + string_length(im) + 1;

        if (string_text(im)[0] != '-') {
            len++;
        }
        r = bvec_alloc( len+1, string_class );
        str = string_text( r );

        memcpy( str, string_text( re ), string_length( re ) );
        str += string_length( re );
        if (string_text(im)[0] != '-') {
            *str++ = '+';
        }
        memcpy( str, string_text( im ), string_length( im ) );
        str += string_length( im );
        *str++ = 'i';
        *str = 0;
        return r;
    } else {
        return FALSE_OBJ;
    }
}
Exemple #5
0
obj SOP_flush( obj port, int closeq )
{
  int len;
  obj dst, overflow;
  char *endptr;
  const char *src;
  
  len = fx2int( gvec_read( port, SOP_INDEX ) );
  overflow = gvec_read( port, SOP_OVERFLOW );
  
  while (!EQ( overflow, NIL_OBJ ))
    {
      len += SIZEOF_PTR( pair_car( overflow ) );
      overflow = pair_cdr( overflow );
    }
  
  dst = bvec_alloc( len+1, string_class );
  endptr = ((char *)string_text( dst )) + len;
  *endptr = 0;
  
  src = (const char *)PTR_TO_DATAPTR( gvec_read( port, SOP_BUFFER ) );
  len = fx2int( gvec_read( port, SOP_INDEX ) );
  overflow = gvec_read( port, SOP_OVERFLOW );
  
  while (1)
    {
      endptr -= len;
      memcpy( endptr, src, len );
      if (EQ( overflow, NIL_OBJ ))
	break;
      
      src = (const char *)PTR_TO_DATAPTR( pair_car( overflow ) );
      len = SIZEOF_PTR( pair_car( overflow ) );
      overflow = pair_cdr( overflow );
    }
  if (closeq) {
    gvec_write( port, SOP_BUFFER, FALSE_OBJ );
    gvec_write( port, SOP_OVERFLOW, FALSE_OBJ );
  }
  return dst;
}
Exemple #6
0
static const char *scheme_generator( char *text, int state )
{
static obj current;
static int len;
obj item;
const char *name;

    if (state == 0)	/* restarting generation */
    {
	current = the_completions;
	len = strlen( text );
    }
    
    while (!EQ( current, NIL_OBJ ))
    {
        assert( PAIR_P(current) );
	item = pair_car( current );
	current = pair_cdr( current );

	if (STRING_P(item))
	{
	    name = string_text(item);
	}
	else
	{
	    assert( SYMBOL_P(item) );
	    name = symbol_text(item);
	}

	if (strncmp( name, text, len ) == 0)
	{
	char *name2;
	
	    name2 = (char *)malloc( strlen( name ) + 1 );
	    strcpy( name2, name );
	    return name2;
	}
    }
    return NULL;
}
Exemple #7
0
obj BSOP_flush( obj port, int closeq )
{
const char *src;
int len;
obj result;

    src = string_text( gvec_read( port, BSOP_BUFFER ) );
    len = fx2int( gvec_read( port, BSOP_INDEX ) );

    result = bvec_alloc( len+1, string_class );
    memcpy( PTR_TO_DATAPTR(result), src, len );
    /*
        We don't need to set the last byte to NUL because
	bvec_alloc sets the whole last UINT_32 to 0,
	even if (len+1) is a multiple of 4 bytes.
	
        PTR_TO_DATAPTR(result)[len] = NUL;
    */
    if (closeq) {
      gvec_write( port, BSOP_BUFFER, FALSE_OBJ );
    }
    
    return result;
}
Exemple #8
0
void rdln_add_history( obj str )
{
  add_history( string_text(str) );
}
Exemple #9
0
obj parse_format_string( obj str )
{
  obj entry, substr, prev, first, next;
  const char *begin, *s, *limit;
  int sharp_flag, star_flag, negative_flag;
  int pre_dot_lead_zero, pre_dot_num;
  int post_dot_digits, post_dot_num;
  obj at_flag, braced;

  prev = first = cons( FALSE_OBJ, NIL_OBJ );
  begin = s = string_text(str);
  limit = begin + string_length(str);
  while (s < limit)
    {
      if (s[0] == '~' && (s+1 < limit))
	{
	  if (begin != s)
	    {
	      /* flush the chars we've seen so far... */
	      substr = bvec_alloc( s - begin + 1, string_class );
	      memcpy( PTR_TO_DATAPTR(substr), (void*)begin, s - begin );
	      next = cons( substr, NIL_OBJ );
	      gvec_write_fresh_ptr( prev, SLOT(1), next );
	      prev = next;
	    }
	  begin = ++s;

	  pre_dot_lead_zero = 0;
	  post_dot_digits = -1;
	  pre_dot_num = -1;
	  post_dot_num = -1;

	  sharp_flag = 0;
	  star_flag = 0;
	  at_flag = FALSE_OBJ;
	  braced = FALSE_OBJ;

	another:
	  switch (*s)
	    {
	    case '#': 
	      sharp_flag = 1;
	      s++;
	      goto another;
	    case '*':
	      star_flag = 1;
	      s++;
	      goto another;
	    case '@':
	      at_flag = TRUE_OBJ;
	      s++;
	      goto another;
	    case '{':
	      {
		const char *sb = s;
		unsigned n;

		while ((s < limit) && (*s != '}'))
		  s++;

		n = s - sb - 1;

		braced = bvec_alloc( n+1, string_class );
		memcpy( string_text( braced ), sb+1, n );

		if (s < limit)
		  s++; /* skip the brace itself */
		goto another;
	      }
	    }

	  if (*s == '-')
	    {
	      s++;
	      negative_flag = 1;
	    }
	  else
	    negative_flag = 0;
	  if (isdigit(*(unsigned char *)s))
	    {
	      pre_dot_num = 0;
	      if (*s == '0')
		{
		  s++;
		  pre_dot_lead_zero = 1;
		}
	      while (isdigit(*(unsigned char *)s))
		{
		  pre_dot_num = (pre_dot_num * 10) + *s++ - '0';
		}
	    }
	  if (*s == '.')
	    {
	      s++;
	      post_dot_num = 0;
	      post_dot_digits = 0;
	      while (isdigit(*(unsigned char *)s))
		{
		  post_dot_digits++;
		  post_dot_num = (post_dot_num * 10) + *s++ - '0';
		}
	    }
	  if (begin == s)
	    {
	      entry = MAKE_ASCII_CHAR( *s );
	    }
	  else
	    {
	      entry = maken( vector_class,
			     10,
			     MAKE_ASCII_CHAR( *s ),
			     sharp_flag ? TRUE_OBJ : FALSE_OBJ,
			     star_flag ? TRUE_OBJ : FALSE_OBJ,
			     at_flag,
			     negative_flag ? TRUE_OBJ : FALSE_OBJ,
			     pre_dot_lead_zero ? TRUE_OBJ : FALSE_OBJ,
			     (pre_dot_num < 0) ? FALSE_OBJ 
			     : int2fx(pre_dot_num),
			     (post_dot_digits < 0) ? FALSE_OBJ 
			     : int2fx(post_dot_digits),
			     (post_dot_num < 0) ? FALSE_OBJ 
			     : int2fx(post_dot_num),
			     braced );
	    }
	  next = cons( entry, NIL_OBJ );
	  gvec_write_fresh_ptr( prev, SLOT(1), next );
	  prev = next;
	  begin = ++s;
	}
      else
	s++;
    }
  if (begin != s)
    {
      substr = bvec_alloc( s - begin + 1, string_class );
      memcpy( PTR_TO_DATAPTR(substr), (void*)begin, s - begin );
      next = cons( substr, NIL_OBJ );
      gvec_write_fresh_ptr( prev, SLOT(1), next );
    }
  return pair_cdr(first);
}
string MyLogStructure::wchar_t_pointerToString(const wchar_t*wchar_t_pointer_text)
{
    wstring wstring_text(wchar_t_pointer_text);
    string string_text(wstring_text.begin(), wstring_text.end());
    return string_text;
}
Exemple #11
0
obj rs_save_image_file( obj root, obj ref_vec, obj ref_names, 
			obj rplc, obj out_info )
{
  int i;
  obj *save, result, output_id;
  char *outfile_name = NULL;
  FILE *outfile_strm = NULL;

  /*  Phase 1 --- Setup  */

  if (STRING_P(out_info))
    {
      outfile_name = string_text(out_info);
      outfile_strm = fopen( outfile_name, "wb" );
      if (!outfile_strm)
	{
	  scheme_error( "~a: error opening image output", 1, out_info );
	}
    }

  for (i=0; i<NUM_CLASS_MODES; i++)
    hi_init_queue( &image_modes[i].queue );
  hi_init_queue( &used_refs );

  if (OBJ_ISA_PTR(rplc))
    setup_replacement_objects( rplc );

  save = setup_reference_objects( ref_vec );

  /*  Phase 2 --- Traversal  */

  spot_object( root );
  traverse_all();

  /*  Phase 3 --- Name Assignment  */

  output_id = OBJ(POINTER_TAG);

  output_id = assign_ref_queue_names( &used_refs, output_id );
  for (i=0; i<NUM_CLASS_MODES; i++)
    output_id = assign_queue_names( &image_modes[i].queue, output_id );

#if DEBUG_SAVE
  printf( "%u objects named in output\n", VAL(output_id)>>PRIMARY_TAG_SIZE );
#endif

  /*  Phase 4 --- Output  */

  if (outfile_strm)
    {
#if DEBUG_SAVE
      printf( "writing image to file: \"%s\"\n", outfile_name );
#endif
      do_file_output( outfile_strm, ref_vec, ref_names, root );
    }

  /*  Phase 5 --- Cleanup  */

  for (i=0; i<NUM_CLASS_MODES; i++)
    cleanup_queued_objects( &image_modes[i].queue );

  cleanup_reference_objects( ref_vec, save );
  cleanup_queued_objects( &rplc_queue );

  if (EQ(out_info,TRUE_OBJ))
    result = do_vector_output();
  else
    result = TRUE_OBJ;

  for (i=0; i<NUM_CLASS_MODES; i++)
    hi_free_queue( &image_modes[i].queue );
  clear_part_descr_labels( &used_refs );
  hi_free_queue( &used_refs );

  return result;
}
Exemple #12
0
int layout_text( struct text_rendition *info )
{
UINT_32 i, n, cur_w, last_line_start, last_line_end;
int base_x, base_y, sel_start_x, sel_end_x;
unsigned char *text_str;
unsigned *widths, w_temp[300];
struct line_layout *lines, *cur_ll, *ll_limit, ll_temp[30];

int line_height = info->line_height;
int line_width = info->line_width;
UINT_32 sel_from = info->sel_from;
UINT_32 sel_to = info->sel_to;

    n = string_length(info->text);
    if (n < 300)
      {
	widths = w_temp;
      }
    else
      {
	widths = (unsigned *)malloc( sizeof(unsigned) * n );
      }

    cur_ll = lines = ll_temp;
    ll_limit = lines + 30;

    text_str = (unsigned char *)string_text(info->text);
    
    PerCharWidths( info->font, text_str, widths, n );

    base_x = info->origin_x;
    base_y = info->origin_y;

    i = 0;
    cur_w = 0;
    last_line_start = last_line_end = 0;
    
    sel_start_x = sel_end_x = -1;

    while (i < n)
    {
    unsigned char ch = text_str[i];
    
        if (i == sel_from)
	  {
	    cur_ll->sel_start_x = cur_w;
	  }
        if (i == sel_to)
	  {
	    cur_ll->sel_end_x = cur_w;
	  }
	if (ch == '\n')
	{
	  cur_ll->base_x = base_x;
	  cur_ll->base_y = base_y;
	  cur_ll->line_start = last_line_start;
	  cur_ll->line_end = i;
	  cur_ll++;
	  base_y += line_height;
	  i++;
	  last_line_start = i;
	  cur_w = 0;
	}
	else if (ch == '\t' || ch == ' ')
	{
	    cur_w += widths[i];
	    i++;
	    last_line_end = i;
	}
	else
	{
	    cur_w += widths[i];
	    if (cur_w <= line_width)
	    {
		i++;
	    }
	    else if (last_line_start == last_line_end)
	    {
		/* break on characters 
		   -- there was no good place to break... */
	      cur_ll->base_x = base_x;
	      cur_ll->base_y = base_y;
	      cur_ll->line_start = last_line_start;
	      cur_ll->line_end = i;
	      cur_ll++;
		base_y += line_height;
		last_line_start = i;
		cur_w = 0;
	    }
	    else
	    {
		/* break on the last good place to break */
	      cur_ll->base_x = base_x;
	      cur_ll->base_y = base_y;
	      cur_ll->line_start = last_line_start;
	      cur_ll->line_end = last_line_end;
	      cur_ll++;
		base_y += line_height;
		last_line_start = last_line_end;
		i = last_line_end;
		cur_w = 0;
	    }
	}
    }
    if (n != last_line_start)
    {
	/* flush the current line */
      cur_ll->base_x = base_x;
      cur_ll->base_y = base_y;
      cur_ll->line_start = last_line_start;
      cur_ll->line_end = n;
      cur_ll++;
      base_y += line_height;
    }

    /* render the lines */

    ll_limit = cur_ll;

#if 0
    for (n=0, cur_ll=lines; cur_ll<ll_limit; cur_ll++,n++)
      {
	printf( "line[%u]: base=(%d,%d) line=(%u,%u) sel=(%d,%d)\n",
	        n, cur_ll->base_x, cur_ll->base_y,
	        cur_ll->line_start, cur_ll->line_end,
	        cur_ll->sel_start_x, cur_ll->sel_end_x );
      }
#endif
    if (truish(info->sel_bleed))
      {
	XSetForeground( info->ctx_dsp, info->ctx_gc, info->selection_color );
	
	for (cur_ll=lines; cur_ll<ll_limit; cur_ll++)
	  render_line_sel( info, cur_ll );
      }

    XSetForeground( info->ctx_dsp, info->ctx_gc, info->text_color );

    for (cur_ll=lines; cur_ll<ll_limit; cur_ll++)
      render_line( info, cur_ll );

    if (widths != w_temp)
	free(widths);
    if (lines != ll_temp)
        free(lines);
    return base_y;
}
Exemple #13
0
jump_addr gui_call( void )
{
Tcl_Interp *interp;
int rc = 0;

    COUNT_ARGS_AT_LEAST(1);
    if (EQ(REG0,FALSE_OBJ))
      {
	COUNT_ARGS(1);
	interp = Tcl_CreateInterp();
	REG0 = RAW_PTR_TO_OBJ( interp );
      }
    else if (arg_count_reg > 2 && EQ(REG1,int2fx(4)))
      {
	obj info;

	COUNT_ARGS(3);
	interp = (Tcl_Interp *)OBJ_TO_RAW_PTR(REG0);

	/* this hook creates a Scheme procedure 
	   for calling the given Tcl command
	   The arguments to the scheme procedure had
	   better be strings, fixnums, or symbols.
	   */
	info = bvec_alloc( sizeof(Tcl_CmdInfo), byte_vector_class );
	/*printf( "seeking info on `%s'\n", string_text(REG2) );*/
	if (!Tcl_GetCommandInfo( interp, 
				(char *)string_text(REG2),
				(Tcl_CmdInfo *)PTR_TO_DATAPTR(info) ))
	  {
	    REG0 = make_string( "command not found" );
	    REG1 = int2fx(1);
	    RETURN(1);
	  }

	REG0 = make2(closure_class,
		     make4(bindingenvt_class,
			   NIL_OBJ,
			   info,
			   RAW_PTR_TO_OBJ(interp),
			   REG2 ),
		     make2(template_class,
			   JUMP_ADDR_TO_OBJ(tcl_gateway),
			   ZERO));
	RETURN1();
      }
    else
      {
	COUNT_ARGS(2);
	interp = (Tcl_Interp *)OBJ_TO_RAW_PTR(REG0);

	if (EQ(REG1,int2fx(0)))
	  {
	    switch_hw_regs_back_to_os();
	    main_tk_win = Tk_CreateMainWindow( interp, NULL, "rs", "RScheme" );
	    if (!main_tk_win)
	    {
		switch_hw_regs_into_scheme();
		goto tcl_error;
	    }
	    printf( "main window = %#x\n", main_tk_win );
	    /*
	    Tk_GeometryRequest( main_tk_win, 200, 200 );
	    */
	    Tcl_SetVar(interp, "tcl_interactive","0", TCL_GLOBAL_ONLY);
	    Tcl_CreateCommand(interp,
			      "scheme-callback",
	    		      the_callback,
			      (ClientData)0, 
			      NULL);
	    switch_hw_regs_into_scheme();

	    if ((rc = Tcl_Init(interp)) == TCL_ERROR) {
		goto tcl_error;
	    }
	    if ((rc = Tk_Init(interp)) == TCL_ERROR) {
		goto tcl_error;
	    }
	}
	else if (EQ(REG1,int2fx(2)))
	{
	    Tk_MakeWindowExist( main_tk_win );
	    RETURN0();
	}
	else if (EQ(REG1,int2fx(1)))
	  {
	    evts = NIL_OBJ;
	    switch_hw_regs_back_to_os();
	    Tk_DoOneEvent(TK_ALL_EVENTS|TK_DONT_WAIT);
	    switch_hw_regs_into_scheme();
	    REG0 = evts;
	    RETURN(1);
	  }
	else if (EQ(REG1,int2fx(3)))
	{
	    evts = NIL_OBJ;
	    /* flush events */
	    switch_hw_regs_back_to_os();
	    while (Tk_DoOneEvent(TK_ALL_EVENTS|TK_DONT_WAIT));
	    switch_hw_regs_into_scheme();
	    REG0 = evts;
	    RETURN(1);
	}
	else
	  {
	    assert( STRING_P(REG1) );
	    rc = Tcl_Eval( interp, (char *)string_text(REG1) );
	  }
	REG0 = make_string( interp->result );
      }
    RETURN(1);
 tcl_error:
    REG0 = make_string( interp->result ); 
    REG1 = int2fx(rc);
    RETURN(2);
}