mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-11-14 11:40:13 +01:00
413 lines
17 KiB
C
413 lines
17 KiB
C
|
/* ***** BEGIN LICENSE BLOCK *****
|
||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||
|
*
|
||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||
|
* the License. You may obtain a copy of the License at
|
||
|
* http://www.mozilla.org/MPL/
|
||
|
*
|
||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||
|
* for the specific language governing rights and limitations under the
|
||
|
* License.
|
||
|
*
|
||
|
* The Original Code is lineterm.
|
||
|
*
|
||
|
* The Initial Developer of the Original Code is
|
||
|
* Ramalingam Saravanan.
|
||
|
* Portions created by the Initial Developer are Copyright (C) 1999
|
||
|
* the Initial Developer. All Rights Reserved.
|
||
|
*
|
||
|
* Contributor(s):
|
||
|
*
|
||
|
* Alternatively, the contents of this file may be used under the terms of
|
||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||
|
* of those above. If you wish to allow use of your version of this file only
|
||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||
|
* use your version of this file under the terms of the MPL, indicate your
|
||
|
* decision by deleting the provisions above and replace them with the notice
|
||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||
|
* the provisions above, a recipient may use your version of this file under
|
||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||
|
*
|
||
|
* ***** END LICENSE BLOCK ***** */
|
||
|
|
||
|
/* lineterm.h: Line terminal (LTERM) public interface header file
|
||
|
* LINETERM provides a "stream" interface to an XTERM-like terminal,
|
||
|
* using line-oriented input/output.
|
||
|
*/
|
||
|
|
||
|
#ifndef _LINETERM_H
|
||
|
|
||
|
#define _LINETERM_H 1
|
||
|
|
||
|
#include "unistring.h"
|
||
|
|
||
|
/* Define LTERM read callback function type */
|
||
|
#ifdef USE_GTK_WIDGETS
|
||
|
#include <gtk/gtk.h>
|
||
|
typedef void (*lterm_callback_func_t)(gpointer, gint, GdkInputCondition);
|
||
|
#else
|
||
|
typedef void* lterm_callback_func_t;
|
||
|
#endif
|
||
|
|
||
|
/* Unicode character style information (same type as UNICHAR) */
|
||
|
typedef UNICHAR UNISTYLE;
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/* lineterm functions */
|
||
|
|
||
|
/* LTERM module number (used for trace/log operations) */
|
||
|
#define LTERM_TLOG_MODULE 1
|
||
|
|
||
|
/** Initializes all LTERM operations;
|
||
|
* needs to be called before any calls to lterm_new.
|
||
|
* @return 0 on success, or -1 on error.
|
||
|
*
|
||
|
* MESSAGELEVEL specifies the diagnostic message display level:
|
||
|
* 0 => (normal) only fatal errors cause diagnostic messages to be printed.
|
||
|
* -1 => (silent) no diagnostic messages are printed, even for fatal errors.
|
||
|
* 1 => (warning) print non-fatal warning messages as well as error messages.
|
||
|
* >9 and <= 99 (debugging)
|
||
|
* print debugging messages at selected procedure levels/sublevels
|
||
|
* (See tracelog.h for more information on messageLevel)
|
||
|
*
|
||
|
* Returns 0 on successful initialization, -1 otherwise.
|
||
|
*/
|
||
|
|
||
|
int lterm_init(int messageLevel);
|
||
|
|
||
|
|
||
|
/** Creates a new LTERM object and returns its descriptor index but
|
||
|
* does not open it for I/O
|
||
|
* (documented in the LTERM interface)
|
||
|
* @return lterm descriptor index (>= 0) on success, or
|
||
|
* -1 on error
|
||
|
*/
|
||
|
|
||
|
int lterm_new();
|
||
|
|
||
|
/** Opens line terminal indexed by LTERM for input/output and creates
|
||
|
* a process attached to it to execute the command line contained in string
|
||
|
* array ARGV.
|
||
|
* Called from the adminstrative/output thread of LTERM.
|
||
|
* @return 0 on success, or -1 on error.
|
||
|
*
|
||
|
* COOKIE contains a cookie string used for stream security. If it is null,
|
||
|
* or a null string, all streams are considered insecure.
|
||
|
* (only MAXCOOKIESTR-1 characters of the cookie string are used for checking)
|
||
|
*
|
||
|
* INIT_COMMAND contains an initialization command string, if any (not echoed)
|
||
|
*
|
||
|
* PROMPT_REGEXP contains a REGEXP string describing the command prompt.
|
||
|
* (**NOTE** For the moment, only a list of prompt delimiters is accepted;
|
||
|
* a typical list of prompt delimiters would be "#$%>?")
|
||
|
*
|
||
|
* OPTIONS is a bitmask controlling the following options:
|
||
|
* LTERM_NOCANONICAL_FLAG disable TTY canonical mode
|
||
|
* LTERM_NOEDIT_FLAG disable input line editing
|
||
|
* LTERM_NOCOMPLETION_FLAG disable command line completion
|
||
|
* LTERM_NOMETA_FLAG disable meta input
|
||
|
* LTERM_NOMARKUP_FLAG disable HTML/XML element processing in command line
|
||
|
* LTERM_NOECHO_FLAG disable TTY echo
|
||
|
* LTERM_NOPTY_FLAG do not use pseudo-TTY
|
||
|
* LTERM_NONUL_FLAG do not process any NUL characters (discard them)
|
||
|
* LTERM_NOLINEWRAP_FLAG disable line wrapping
|
||
|
* LTERM_NOEXPORT_FLAG disable export of current environment to new process
|
||
|
* LTERM_STDERR_FLAG enable use of separate STDERR
|
||
|
* LTERM_PARTLINE_FLAG enable returning of partial line output
|
||
|
*
|
||
|
* Notes:
|
||
|
* -LTERM_STDERR_FLAG, although implemented, does not work properly at all
|
||
|
* -LTERM_PARTLINE_FLAG is not yet implemented
|
||
|
*
|
||
|
* PROCESS_TYPE specifies the subordinate process type, if set to one
|
||
|
* of the following:
|
||
|
* LTERM_DETERMINE_PROCESS
|
||
|
* LTERM_UNKNOWN_PROCESS
|
||
|
* LTERM_SH_PROCESS
|
||
|
* LTERM_KSH_PROCESS
|
||
|
* LTERM_BASH_PROCESS
|
||
|
* LTERM_CSH_PROCESS
|
||
|
* LTERM_TCSH_PROCESS
|
||
|
* If it is set to LTERM_DETERMINE_PROCESS, the process type is determined
|
||
|
* from the path name.
|
||
|
*
|
||
|
* ROWS, COLS contain the initial no. of rows/columns.
|
||
|
* X_PIXELS, Y_PIXELS contain the initial screen size in pixels
|
||
|
* (may be set to zero if screen size is unknown).
|
||
|
*
|
||
|
* CALLBACK_FUNC is a pointer to a GTK-style callback function,
|
||
|
* or NULL for no callback.
|
||
|
* The function is called whenever there is data available for
|
||
|
* LTERM_READ to process, with CALLBACK_DATA as the data argument.
|
||
|
* The callback function should call LTERM_READ immediately;
|
||
|
* otherwise the callback function will be called repeatedly.
|
||
|
* (The type LTERM_CALLBACK_FUNC_T is defined at the top of this include file)
|
||
|
*
|
||
|
* In canonical mode, no input line editing is permitted.
|
||
|
* In editing mode, EMACS-style keyboard line editing commands are allowed.
|
||
|
* In completion mode, incomplete command/file names are transmitted to
|
||
|
* the subordinate process for complettion, as in TCSH.
|
||
|
* Meta input refers to input lines that begin with a colon,
|
||
|
* or with a "protocol" name followed by a colon, such as
|
||
|
* "http: ...".
|
||
|
* Meta input lines are not sent to the subordinate process, but simply
|
||
|
* echoed as LTERM output through LTERM_READ for further processing.
|
||
|
* If command line completion is not disabled, incomplete meta input may
|
||
|
* also be echoed for completion. In this case, the completed meta input
|
||
|
* should be supplied to the LTERM through a call to LTERM_WRITE as if the
|
||
|
* user had entered it.
|
||
|
*/
|
||
|
|
||
|
int lterm_open(int lterm, char *const argv[],
|
||
|
const char* cookie, const char* init_command,
|
||
|
const UNICHAR* prompt_regexp, int options, int process_type,
|
||
|
int rows, int cols, int x_pixels, int y_pixels,
|
||
|
lterm_callback_func_t callback_func, void *callback_data);
|
||
|
|
||
|
|
||
|
/** Closes line terminal indexed by LTERM.
|
||
|
* The default action is to block until active calls to lterm_write
|
||
|
* and lterm_read to complete.
|
||
|
* Called from the administrative/output thread of LTERM.
|
||
|
* @return 0 on success, or -1 on error.
|
||
|
*/
|
||
|
int lterm_close(int lterm);
|
||
|
|
||
|
|
||
|
/** Deletes an LTERM object, closing it if necessary.
|
||
|
* @return 0 on success, or -1 on error.
|
||
|
*/
|
||
|
|
||
|
int lterm_delete(int lterm);
|
||
|
|
||
|
|
||
|
/** Closes all LTERMs, but does not delete them.
|
||
|
* This may be used to free any resources associated with LTERMs for clean up.
|
||
|
* The closed LTERMs should still be deleted, if possible.
|
||
|
*/
|
||
|
void lterm_close_all(void);
|
||
|
|
||
|
|
||
|
/** Set input echo flag for line terminal indexed by LTERM.
|
||
|
* Called from the output thread of LTERM.
|
||
|
* @return 0 on success, or -1 on error.
|
||
|
*/
|
||
|
|
||
|
int lterm_setecho(int lterm, int echo_flag);
|
||
|
|
||
|
|
||
|
/** Resizes the line terminal indexed by LTERM to new row/column count.
|
||
|
* Called from the output thread of LTERM.
|
||
|
* @return 0 on success, or -1 on error.
|
||
|
*/
|
||
|
|
||
|
int lterm_resize(int lterm, int rows, int cols);
|
||
|
|
||
|
|
||
|
/** Sets cursor position in line terminal indexed by LTERM.
|
||
|
* NOT YET IMPLEMENTED
|
||
|
* Row numbers increase upward, starting from 0.
|
||
|
* Column numbers increase rightward, starting from 0.
|
||
|
* Called from the output thread of LTERM.
|
||
|
* @return 0 on success, or -1 on error.
|
||
|
*/
|
||
|
|
||
|
int lterm_setcursor(int lterm, int row, int col);
|
||
|
|
||
|
|
||
|
/** Writes supplied to Unicode string in BUF of length COUNT to
|
||
|
* line terminal indexed by LTERM.
|
||
|
* (May be called from any thread, since it uses a pipe to communicate
|
||
|
* with the output thread.)
|
||
|
* DATATYPE may be set to one of the following values:
|
||
|
* LTERM_WRITE_PLAIN_INPUT Plain text user input
|
||
|
* LTERM_WRITE_XML_INPUT XML element user input
|
||
|
* LTERM_WRITE_PLAIN_OUTPUT Plain text server output
|
||
|
* LTERM_WRITE_CLOSE_MESSAGE End of file message
|
||
|
* NOTE: This is a non-blocking call
|
||
|
* Returns the number of characters written.
|
||
|
* Returns -1 on error, and
|
||
|
* -2 if pseudo-TTY has been closed.
|
||
|
* If the return value is less than COUNT, it usually indicates an error.
|
||
|
* If the return value is -1, any further operations on the LTERM,
|
||
|
* other than LTERM_CLOSE, will always fail with an error return value.
|
||
|
*/
|
||
|
|
||
|
int lterm_write(int lterm, const UNICHAR *buf, int count, int dataType);
|
||
|
|
||
|
|
||
|
/** Completes meta input in line terminal indexed by LTERM with the
|
||
|
* supplied to Unicode string in BUF of length COUNT.
|
||
|
* Called from the output thread of the LTERM.
|
||
|
* @return 0 on success, or -1 on error.
|
||
|
*/
|
||
|
|
||
|
int lterm_metacomplete(int lterm, const UNICHAR *buf, int count);
|
||
|
|
||
|
|
||
|
/** reads upto COUNT Unicode characters from a single line of output
|
||
|
* from line terminal indexed by LTERM into BUF.
|
||
|
* Called from the output thread of the LTERM.
|
||
|
* Returns the number of characters read (>=0) on a successful read.
|
||
|
* Returns -1 if an error occurred while reading,
|
||
|
* -2 if pseudo-TTY has been closed,
|
||
|
* -3 if more than COUNT characters are present in the line
|
||
|
* (in this case the first COUNT characters are returned in BUF,
|
||
|
* and the rest are discarded).
|
||
|
* If the return value is -1, any further operations on the LTERM,
|
||
|
* other than LTERM_CLOSE, will always fail with an error return value.
|
||
|
* (If return value is -2, it means that the subordinate process has closed
|
||
|
* the pseudo-TTY. In this case, the LTERM still needs to be explicitly
|
||
|
* closed by calling LTERM_CLOSE for proper clean-up.)
|
||
|
*
|
||
|
* TIMEOUT is the number of platform-dependent time units
|
||
|
* (usually milliseconds on Unix) to wait to read data.
|
||
|
* A zero value implies no waiting.
|
||
|
* A negative TIMEOUT value implies infinite timeout, i.e., a blocking read.
|
||
|
* Non-zero values of TIMEOUT should be used only when the output thread
|
||
|
* is allowed to block.
|
||
|
*
|
||
|
* STYLE should be an array of same length as BUF, and contains
|
||
|
* the style bits associated with each character on return (see below).
|
||
|
*
|
||
|
* OPCODES contains a bit mask describing the type of output (see below).
|
||
|
* Using Extended Backus-Naur Form notation:
|
||
|
*
|
||
|
* OPCODES ::= STREAMDATA NEWLINE? ERROR?
|
||
|
* COOKIESTR? DOCSTREAM? XMLSTREAM? JSSTREAM? WINSTREAM?
|
||
|
* if StreamMode data is being returned.
|
||
|
* (NEWLINE, if set, denotes that the stream has terminated;
|
||
|
* if ERROR is also set, it means that the stream has terminated abnormally.)
|
||
|
*
|
||
|
* OPCODES ::= SCREENDATA BELL? ( OUTPUT | CLEAR | INSERT | DELETE | SCROLL )?
|
||
|
* if ScreenMode data is being returned.
|
||
|
* If none of the flags OUTPUT ... SCROLL are set in screen mode,
|
||
|
* do nothing but position the cursor (and ring the bell, if need be).
|
||
|
*
|
||
|
* OPCODES ::= LINEDATA BELL? ( CLEAR
|
||
|
* | ( PROMPT | OUTPUT)? INPUT ( NEWLINE HIDE? )?
|
||
|
* | PROMPT? INPUT META ( COMPLETION | NEWLINE HIDE? )
|
||
|
* | PROMPT? OUTPUT NEWLINE? )
|
||
|
* if LineMode data is being returned.
|
||
|
*
|
||
|
* If OPCODES == 0, then it means that no data has been read.
|
||
|
*
|
||
|
* If the returned OPCODES has META and COMPLETION bits set, then the completed
|
||
|
* version of the meta input should be supplied through a call to
|
||
|
* LTERM_WRITE, with an input data type, as if the user had typed it.
|
||
|
*
|
||
|
* BUF_ROW and BUF_COL denote the row and starting column at which to
|
||
|
* display the data in BUF.
|
||
|
* (BUF_ROW and BUF_COL are not used for CLEAR option in screen/line mode)
|
||
|
* In ScreenMode or LineMode, CURSOR_ROW and CURSOR_COL denote the final
|
||
|
* cursor position after any data in BUF is displayed.
|
||
|
*
|
||
|
* The bottom left corner of the screen corresponds to row 0, column 0.
|
||
|
* BUF_COL, CURSOR_COL are always >= 0, with 0 denoting the leftmost column.
|
||
|
* (BUF_COL is always zero if NOPARTLINE flag is set for LTERM.)
|
||
|
* (CURRENT IMPLEMENTATION: BUF_COL is always zero.)
|
||
|
* BUF_ROW, CURSOR_ROW are always set to -1 when LTERM is in line mode,
|
||
|
* BUF_ROW, CURSOR_ROW are always >=0 when LTERM is in screen mode,
|
||
|
* with 0 denoting the bottom row.
|
||
|
*
|
||
|
* In ScreenMode:
|
||
|
* - OUTPUT denotes that a modifed row of data is being returned.
|
||
|
* - OPVALS contains the no. of lines to be inserted/deleted,
|
||
|
* for INSERT/DELETE/SCROLL operations
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
int lterm_read(int lterm, int timeout, UNICHAR *buf, int count,
|
||
|
UNISTYLE *style, int *opcodes, int *opvals,
|
||
|
int *buf_row, int *buf_col, int *cursor_row, int *cursor_col);
|
||
|
|
||
|
/* opcodes describing terminal operations:
|
||
|
*/
|
||
|
#define LTERM_STREAMDATA_CODE 0x0001U /* Stream mode */
|
||
|
#define LTERM_SCREENDATA_CODE 0x0002U /* Screen mode */
|
||
|
#define LTERM_LINEDATA_CODE 0x0004U /* Line mode */
|
||
|
#define LTERM_BELL_CODE 0x0008U /* Ring bell */
|
||
|
#define LTERM_CLEAR_CODE 0x0010U /* Clear screen */
|
||
|
#define LTERM_INSERT_CODE 0x0020U /* Insert lines above current line */
|
||
|
#define LTERM_DELETE_CODE 0x0040U /* Delete lines below current line */
|
||
|
#define LTERM_SCROLL_CODE 0x0080U /* Define scrolling region */
|
||
|
#define LTERM_INPUT_CODE 0x0100U /* Contains STDIN at end of line */
|
||
|
#define LTERM_PROMPT_CODE 0x0200U /* Contains prompt at beginning */
|
||
|
#define LTERM_OUTPUT_CODE 0x0400U /* Contains STDOUT/STDERR/ALTOUT */
|
||
|
#define LTERM_META_CODE 0x0800U /* Meta input */
|
||
|
#define LTERM_COMPLETION_CODE 0x1000U /* Completion requested */
|
||
|
#define LTERM_NEWLINE_CODE 0x2000U /* Complete (new) line */
|
||
|
#define LTERM_HIDE_CODE 0x4000U /* Hide output */
|
||
|
#define LTERM_ERROR_CODE 0x8000U /* Error in output */
|
||
|
|
||
|
#define LTERM_COOKIESTR_CODE 0x10000U /* Stream prefixed with cookie */
|
||
|
#define LTERM_DOCSTREAM_CODE 0x20000U /* Stream contains complete document */
|
||
|
#define LTERM_XMLSTREAM_CODE 0x40000U /* Stream contains XML, not HTML */
|
||
|
#define LTERM_JSSTREAM_CODE 0x80000U /* Stream contains Javascript */
|
||
|
#define LTERM_WINSTREAM_CODE 0x100000U /* Display stream in entire window */
|
||
|
|
||
|
|
||
|
/* LTERM/XTERM 16-bit style mask:
|
||
|
* PROMPT, STDIN, STDOUT, STDERR, ALTOUT are mutually exclusive.
|
||
|
* The markup styles apply to STDIN/STDOUT/ALTOUT data.
|
||
|
* The highlighting styles only apply to STDOUT data.
|
||
|
* The VT100 foreground and background styles are not implemented.
|
||
|
*/
|
||
|
|
||
|
#define LTERM_PROMPT_STYLE 0x0001UL /* prompt string */
|
||
|
#define LTERM_STDIN_STYLE 0x0002UL /* standard input */
|
||
|
#define LTERM_STDOUT_STYLE 0x0004UL /* standard output */
|
||
|
#define LTERM_STDERR_STYLE 0x0008UL /* standard error */
|
||
|
#define LTERM_ALTOUT_STYLE 0x0010UL /* alternate output */
|
||
|
|
||
|
#define LTERM_URI_STYLE 0x0020UL /* URI markup */
|
||
|
#define LTERM_HTML_STYLE 0x0040UL /* HTML markup */
|
||
|
#define LTERM_XML_STYLE 0x0080UL /* XML markup */
|
||
|
|
||
|
#define LTERM_BOLD_STYLE 0x0100UL /* boldface */
|
||
|
#define LTERM_ULINE_STYLE 0x0200UL /* underline */
|
||
|
#define LTERM_BLINK_STYLE 0x0400UL /* blink */
|
||
|
#define LTERM_INVERSE_STYLE 0x0800UL /* inverse video */
|
||
|
|
||
|
/* LTERM option flags */
|
||
|
#define LTERM_NOCANONICAL_FLAG 0x0001U
|
||
|
#define LTERM_NOEDIT_FLAG 0x0002U
|
||
|
#define LTERM_NOCOMPLETION_FLAG 0x0004U
|
||
|
#define LTERM_NOMETA_FLAG 0x0008U
|
||
|
#define LTERM_NOECHO_FLAG 0x0010U
|
||
|
#define LTERM_NOMARKUP_FLAG 0x0020U
|
||
|
#define LTERM_NOPTY_FLAG 0x0040U
|
||
|
#define LTERM_NONUL_FLAG 0x0080U
|
||
|
#define LTERM_NOLINEWRAP_FLAG 0x0100U
|
||
|
#define LTERM_NOEXPORT_FLAG 0x0200U
|
||
|
#define LTERM_STDERR_FLAG 0x0400U
|
||
|
#define LTERM_PARTLINE_FLAG 0x0800U
|
||
|
|
||
|
/* Process type codes */
|
||
|
#define LTERM_DETERMINE_PROCESS -1 /* Determine process type from name */
|
||
|
#define LTERM_UNKNOWN_PROCESS 0 /* Unknown process type */
|
||
|
#define LTERM_SH_PROCESS 1 /* Bourne shell */
|
||
|
#define LTERM_KSH_PROCESS 2 /* Korn shell */
|
||
|
#define LTERM_BASH_PROCESS 3 /* Bourne Again shell */
|
||
|
#define LTERM_CSH_PROCESS 4 /* C shell */
|
||
|
#define LTERM_TCSH_PROCESS 5 /* TC shell */
|
||
|
|
||
|
/* lterm_write data type codes (XML server output not permitted) */
|
||
|
#define LTERM_WRITE_PLAIN_INPUT 0 /* Plain text user input */
|
||
|
#define LTERM_WRITE_XML_INPUT 1 /* XML element user input */
|
||
|
#define LTERM_WRITE_PLAIN_OUTPUT 2 /* Plain text server output */
|
||
|
#define LTERM_WRITE_CLOSE_MESSAGE 3 /* End of file message */
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* _LINETERM_H */
|