200 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			200 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*  $Id: console_i.h,v 1.1 2008-04-01 08:50:44 vsc Exp $
 | ||
|  | 
 | ||
|  |     Part of SWI-Prolog | ||
|  | 
 | ||
|  |     Author:        Jan Wielemaker and Anjo Anjewierden | ||
|  |     E-mail:        jan@swi.psy.uva.nl | ||
|  |     WWW:           http://www.swi-prolog.org
 | ||
|  |     Copyright (C): 1985-2002, University of Amsterdam | ||
|  | 
 | ||
|  |     This library is free software; you can redistribute it and/or | ||
|  |     modify it under the terms of the GNU Lesser General Public | ||
|  |     License as published by the Free Software Foundation; either | ||
|  |     version 2.1 of the License, or (at your option) any later version. | ||
|  | 
 | ||
|  |     This library is distributed in the hope that it will be useful, | ||
|  |     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||
|  |     Lesser General Public License for more details. | ||
|  | 
 | ||
|  |     You should have received a copy of the GNU Lesser General Public | ||
|  |     License along with this library; if not, write to the Free Software | ||
|  |     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||
|  | */ | ||
|  | 
 | ||
|  | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | ||
|  | Include file to share stuff inside this library. | ||
|  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
|  | 
 | ||
|  | 		 /*******************************
 | ||
|  | 		 *	       HISTORY		* | ||
|  | 		 *******************************/ | ||
|  | 
 | ||
|  | typedef struct _history | ||
|  | { int		size;			/* size of the history */ | ||
|  |   int		tail;			/* oldest position */ | ||
|  |   int		head;			/* newest position */ | ||
|  |   int		current;		/* for retrieval */ | ||
|  |   TCHAR **	lines;			/* the lines */ | ||
|  | } history, *History; | ||
|  | 
 | ||
|  | 
 | ||
|  | 		 /*******************************
 | ||
|  | 		 *	    CONSOLE DATA	* | ||
|  | 		 *******************************/ | ||
|  | 
 | ||
|  | #define ANSI_MAX_ARGC     10		/* Ansi-escape sequence argv */
 | ||
|  | #define MAXPROMPT         80		/* max size of prompt */
 | ||
|  | #define OQSIZE	     	4096		/* output queue size */
 | ||
|  | #define MAX_USER_VALUES	  10		/* max user data-handles */
 | ||
|  | 
 | ||
|  | typedef struct lqueued | ||
|  | { TCHAR *	  line;			/* Lines in queue */ | ||
|  |   struct lqueued* next;			/* Next in queue */ | ||
|  | } lqueued, *LQueued; | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { TCHAR *	 text;			/* the storage */ | ||
|  |   unsigned short size;			/* #characters in line */ | ||
|  |   unsigned	 adjusted : 1;		/* line has been adjusted? */ | ||
|  |   unsigned	 changed : 1;		/* line needs redraw */ | ||
|  |   unsigned	 softreturn : 1;	/* wrapped line */ | ||
|  | } text_line, *TextLine; | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { uintptr_t	data;			/* the data itself */ | ||
|  |   RlcFreeDataHook hook;			/* call when destroying console */ | ||
|  | } user_data; | ||
|  | 
 | ||
|  | #define RLC_MAGIC	0x3b75df1e	/* magic number to verify */
 | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { int		magic; | ||
|  |   int		height;			/* number of lines in buffer */ | ||
|  |   int		width;			/* #characters ler line */ | ||
|  |   int		first;			/* first line of ring */ | ||
|  |   int		last;			/* last line of ring */ | ||
|  |   int		caret_x;		/* cursor's x-position */ | ||
|  |   int		caret_y;		/* its line */ | ||
|  |   int		window_start;		/* start line of the window */ | ||
|  |   int		window_size;		/* #lines on the window */ | ||
|  |   TextLine 	lines;			/* the actual lines */ | ||
|  |   int		sel_unit;		/* SEL_CHAR, SEL_WORD, SEL_LINE */ | ||
|  |   int		sel_org_line;		/* line origin of the selection */ | ||
|  |   int		sel_org_char;		/* char origin of the selection */ | ||
|  |   int		sel_start_line;		/* starting line for selection */ | ||
|  |   int		sel_start_char;		/* starting char for selection */ | ||
|  |   int		sel_end_line;		/* ending line for selection */ | ||
|  |   int		sel_end_char;		/* ending char for selection */ | ||
|  |   int		cmdstat;		/* for parsing ANSI escape */ | ||
|  |   int		argstat;		/* argument status ANSI */ | ||
|  |   int		argc;			/* argument count for ANSI */ | ||
|  |   int		argv[ANSI_MAX_ARGC];	/* argument vector for ANSI */ | ||
|  |   int		scaret_x;		/* saved-caret X */ | ||
|  |   int		scaret_y;		/* saved-caret Y */ | ||
|  |   HWND		window;			/* MS-Window window handle */ | ||
|  |   int		has_focus;		/* Application has the focus */ | ||
|  |   HFONT		hfont;			/* Windows font handle */ | ||
|  |   int		fixedfont;		/* Font is fixed */ | ||
|  |   COLORREF	foreground;		/* Foreground (text) color */ | ||
|  |   COLORREF	background;		/* Background color */ | ||
|  |   COLORREF	sel_foreground;		/* Selection foreground */ | ||
|  |   COLORREF	sel_background;		/* Selection background */ | ||
|  |   int		cw;			/* character width */ | ||
|  |   int		ch;			/* character height */ | ||
|  |   int		cb;			/* baseline */ | ||
|  |   int		changed;		/* changes to the whole screen */ | ||
|  |   int		sb_lines;		/* #lines the scrollbar thinks */ | ||
|  |   int		sb_start;		/* start-line scrollbar thinks */ | ||
|  |   int		caret_is_shown;		/* is caret in the window? */ | ||
|  |   TCHAR		current_title[RLC_TITLE_MAX]; /* window title */ | ||
|  | 					/* status */ | ||
|  |   rlc_console_attr * create_attributes;	/* Creation attributes */ | ||
|  |   TCHAR	       *regkey_name;		/* last part of key */ | ||
|  |   int		win_x;			/* window top-left corner */ | ||
|  |   int		win_y;			/* window top-left corner */ | ||
|  | 					/* output queue */ | ||
|  |   TCHAR	        output_queue[OQSIZE];	/* The output queue */ | ||
|  |   int		output_queued;		/* # characters in the queue */ | ||
|  |   struct | ||
|  |   { TCHAR *line;			/* buffered line */ | ||
|  |     size_t length;			/* length of line */ | ||
|  |     size_t given;			/* how much we passed */ | ||
|  |   } read_buffer; | ||
|  | 					/* input queuing */ | ||
|  |   int		imode;			/* input mode */ | ||
|  |   int		imodeswitch;		/* switching imode */ | ||
|  |   RlcQueue	queue;			/* input stream */ | ||
|  |   LQueued	lhead;			/* line-queue head */ | ||
|  |   LQueued	ltail;			/* line-queue tail */ | ||
|  |   TCHAR		promptbuf[MAXPROMPT];	/* Buffer for building prompt */ | ||
|  |   TCHAR		prompt[MAXPROMPT];	/* The prompt */ | ||
|  |   int		promptlen;		/* length of the prompt */ | ||
|  |   int		closing;		/* closing status */ | ||
|  |   int		modified_options;	/* OPT_ */ | ||
|  |   history	history;		/* history for this console */ | ||
|  | 					/* Thread handles */ | ||
|  |   HANDLE	console_thread;		/* I/O thread  */ | ||
|  |   HANDLE	application_thread;	/* The application I work for */ | ||
|  |   DWORD		console_thread_id;	/* I/O thread id */ | ||
|  |   DWORD		application_thread_id; | ||
|  |   HWND		kill_window;		/* window in app thread for destroy */ | ||
|  |    | ||
|  |   user_data	values[MAX_USER_VALUES]; /* associated user data */ | ||
|  | } rlc_data, *RlcData; | ||
|  | 
 | ||
|  | 
 | ||
|  | 		 /*******************************
 | ||
|  | 		 *	       DATA		* | ||
|  | 		 *******************************/ | ||
|  | 
 | ||
|  | extern RlcData  _rlc_stdio;		/* global default console */ | ||
|  | 
 | ||
|  | 
 | ||
|  | 		 /*******************************
 | ||
|  | 		 *	    FUNCTIONS		* | ||
|  | 		 *******************************/ | ||
|  | 
 | ||
|  | extern void	rlc_assert(const TCHAR *msg); | ||
|  | int		rlc_at_head_history(RlcData b); | ||
|  | const TCHAR *	rlc_bwd_history(RlcData b); | ||
|  | const TCHAR *	rlc_fwd_history(RlcData b); | ||
|  | void		rlc_get_mark(rlc_console c, RlcMark mark); | ||
|  | void		rlc_goto_mark(rlc_console c, RlcMark mark, | ||
|  | 			      const TCHAR *data, size_t offset); | ||
|  | void		rlc_erase_from_caret(rlc_console c); | ||
|  | void		rlc_putchar(rlc_console c, int chr); | ||
|  | TCHAR *		rlc_read_screen(rlc_console c, | ||
|  | 				RlcMark from, RlcMark to); | ||
|  | void		rlc_update(rlc_console c); | ||
|  | const TCHAR *	rlc_prompt(rlc_console c, const TCHAR *prompt); | ||
|  | void		rlc_clearprompt(rlc_console c); | ||
|  | 
 | ||
|  | 
 | ||
|  | 		 /*******************************
 | ||
|  | 		 *	 INLINE FUNCTIONS	* | ||
|  | 		 *******************************/ | ||
|  | 
 | ||
|  | #ifdef _DEBUG
 | ||
|  | #define assert(g) if ( !(g) ) rlc_assert(_T(#g))
 | ||
|  | #else
 | ||
|  | #define assert(g) (void)0
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | static __inline RlcData | ||
|  | rlc_get_data(rlc_console c) | ||
|  | { if ( c ) | ||
|  |   { RlcData b = c; | ||
|  | 
 | ||
|  |     assert(b->magic == RLC_MAGIC); | ||
|  |     if ( b->magic == RLC_MAGIC ) | ||
|  |     { return b; | ||
|  |     } | ||
|  |     return NULL; | ||
|  |   } | ||
|  | 
 | ||
|  |   return _rlc_stdio; | ||
|  | } | ||
|  | 
 | ||
|  | 
 |