/* cmdshell.h */

/* Synchronet command shell/module constants and structure definitions */

/* $Id$ */

/****************************************************************************
 * @format.tab-size 4		(Plain Text/Source Code File Header)			*
 * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
 *																			*
 * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html		*
 *																			*
 * This program is free software; you can redistribute it and/or			*
 * modify it under the terms of the GNU General Public License				*
 * as published by the Free Software Foundation; either version 2			*
 * of the License, or (at your option) any later version.					*
 * See the GNU General Public License for more details: gpl.txt or			*
 * http://www.fsf.org/copyleft/gpl.html										*
 *																			*
 * Anonymous FTP access to the most recent released source is available at	*
 * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
 *																			*
 * Anonymous CVS access to the development source and modification history	*
 * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
 *     (just hit return, no password is necessary)							*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
 *																			*
 * For Synchronet coding style and modification guidelines, see				*
 * http://www.synchro.net/source.html										*
 *																			*
 * You are encouraged to submit any modifications (preferably in Unix diff	*
 * format) via e-mail to mods@synchro.net									*
 *																			*
 * Note: If this box doesn't appear square, then you need to fix your tabs.	*
 ****************************************************************************/

#include "gen_defs.h"

#ifndef _CMDSHELL_H_
#define _CMDSHELL_H_ 

/******************************/
/* Instructions and Functions */
/******************************/
enum {

/* Single byte instructions */

	 CS_IF_TRUE=0			// Same as IF_EQUAL
	,CS_IF_FALSE			// Same as IF_NOT_EQUAL
	,CS_ELSE
	,CS_ENDIF
	,CS_CMD_HOME
	,CS_CMD_POP
	,CS_END_CMD
	,CS_RETURN
	,CS_GETKEY
	,CS_GETKEYE
	,CS_UNGETKEY
	,CS_UNGETSTR
	,CS_PRINTKEY
	,CS_PRINTSTR
	,CS_HANGUP
	,CS_SYNC
	,CS_ASYNC
	,CS_CHKSYSPASS
	,CS_LOGKEY
	,CS_LOGKEY_COMMA
	,CS_LOGSTR
	,CS_CLS
	,CS_CRLF
	,CS_PAUSE
	,CS_PAUSE_RESET
	,CS_GETLINES
	,CS_GETFILESPEC
	,CS_FINDUSER
	,CS_CLEAR_ABORT
	,CS_SELECT_SHELL
	,CS_SET_SHELL
	,CS_SELECT_EDITOR
	,CS_SET_EDITOR			// 0x20
	,CS_INKEY
	,CS_RIOSYNC
	,CS_GETTIMELEFT
	,CS_SAVELINE
	,CS_RESTORELINE
	,CS_IF_GREATER
	,CS_IF_GREATER_OR_EQUAL
	,CS_IF_LESS
	,CS_IF_LESS_OR_EQUAL
	,CS_DEFAULT 			// 0x2a
	,CS_END_SWITCH
	,CS_END_CASE
	,CS_PUT_NODE
	,CS_GETCHAR
	,CS_ONE_MORE_BYTE=0x2f

/* Two byte instructions */

	,CS_CMDKEY=0x30
	,CS_NODE_ACTION
	,CS_GETSTR
	,CS_GETNAME
	,CS_GETSTRUPR
	,CS_SHIFT_STR
	,CS_COMPARE_KEY
	,CS_SETLOGIC
	,CS_SET_USER_LEVEL
	,CS_SET_USER_STRING
	,CS_GETLINE 			// 0x3a
	,CS_NODE_STATUS
	,CS_CMDCHAR
	,CS_COMPARE_CHAR
	,CS_TWO_MORE_BYTES=0x3f

/* Three byte instructions */

	,CS_GOTO=0x40
	,CS_CALL
	,CS_TOGGLE_NODE_MISC
	,CS_ADJUST_USER_CREDITS
	,CS_TOGGLE_USER_FLAG
	,CS_GETNUM
	,CS_COMPARE_NODE_MISC
	,CS_MSWAIT
	,CS_ADJUST_USER_MINUTES
	,CS_REVERT_TEXT
	,CS_THREE_MORE_BYTES=0x4f

/* String arg instructions */

	,CS_MENU=0x50
	,CS_PRINT
	,CS_PRINT_LOCAL
	,CS_PRINT_REMOTE
	,CS_PRINTFILE
	,CS_PRINTFILE_LOCAL
	,CS_PRINTFILE_REMOTE
	,CS_YES_NO
    ,CS_NO_YES
	,CS_COMPARE_STR
	,CS_COMPARE_WORD		// 0x5a
	,CS_EXEC
	,CS_EXEC_INT
	,CS_EXEC_BIN
	,CS_EXEC_XTRN
	,CS_GETCMD
	,CS_LOG 				// 0x60
	,CS_MNEMONICS
	,CS_SETSTR
	,CS_SET_MENU_DIR
	,CS_SET_MENU_FILE
	,CS_CMDSTR
	,CS_CHKFILE
	,CS_GET_TEMPLATE
	,CS_TRASHCAN
	,CS_CREATE_SIF
	,CS_READ_SIF			// 0x6a
	,CS_CMDKEYS
	,CS_COMPARE_KEYS
	,CS_STR_FUNCTION=0x6f

/* Var length instructions */

	,CS_COMPARE_ARS=0x70
	,CS_TOGGLE_USER_MISC
	,CS_COMPARE_USER_MISC
	,CS_REPLACE_TEXT
	,CS_TOGGLE_USER_CHAT
	,CS_COMPARE_USER_CHAT
	,CS_TOGGLE_USER_QWK
	,CS_COMPARE_USER_QWK
	,CS_SWITCH
	,CS_CASE
	,CS_USE_INT_VAR 		// 0x7a

/* File I/O Functions */

	,CS_FIO_FUNCTION=0x7e

/* Variable instruction sub-ops */

	,CS_VAR_INSTRUCTION=0x7f

/* Functions */

	,CS_MAIL_READ=0x80
	,CS_MAIL_READ_SENT
	,CS_MAIL_READ_ALL
	,CS_MAIL_SEND
	,CS_MAIL_SEND_BULK
	,CS_MAIL_SEND_FILE
	,CS_MAIL_SEND_FEEDBACK
	,CS_MAIL_SEND_NETMAIL
	,CS_MAIL_SEND_NETFILE
	,CS_LOGOFF
    ,CS_LOGOFF_FAST
	,CS_AUTO_MESSAGE
	,CS_MSG_SET_AREA
	,CS_MSG_SELECT_AREA
	,CS_MSG_SHOW_GROUPS
    ,CS_MSG_SHOW_SUBBOARDS
	,CS_MSG_GROUP_UP			// 0x90
    ,CS_MSG_GROUP_DOWN
    ,CS_MSG_SUBBOARD_UP
    ,CS_MSG_SUBBOARD_DOWN
	,CS_MSG_GET_SUB_NUM
	,CS_MSG_GET_GRP_NUM
	,CS_MSG_READ
	,CS_MSG_POST
	,CS_MSG_QWK
	,CS_MSG_PTRS_CFG
	,CS_MSG_PTRS_REINIT
	,CS_MSG_NEW_SCAN_CFG
	,CS_MSG_NEW_SCAN
	,CS_MSG_NEW_SCAN_ALL
	,CS_MSG_CONT_SCAN
	,CS_MSG_CONT_SCAN_ALL
	,CS_MSG_BROWSE_SCAN 		// 0xA0
	,CS_MSG_BROWSE_SCAN_ALL
	,CS_MSG_FIND_TEXT
	,CS_MSG_FIND_TEXT_ALL
	,CS_MSG_YOUR_SCAN_CFG
	,CS_MSG_YOUR_SCAN
	,CS_MSG_YOUR_SCAN_ALL
	,CS_MSG_NEW_SCAN_SUB
	,CS_MSG_SET_GROUP
	,CS_MSG_UNUSED4
	,CS_MSG_UNUSED3
	,CS_MSG_UNUSED2
	,CS_MSG_UNUSED1
	,CS_FILE_SET_AREA
	,CS_FILE_SELECT_AREA
	,CS_FILE_SHOW_LIBRARIES
	,CS_FILE_SHOW_DIRECTORIES	// 0xB0
	,CS_FILE_LIBRARY_UP
	,CS_FILE_LIBRARY_DOWN
	,CS_FILE_DIRECTORY_UP
	,CS_FILE_DIRECTORY_DOWN
	,CS_FILE_GET_DIR_NUM
	,CS_FILE_GET_LIB_NUM
	,CS_FILE_LIST
	,CS_FILE_LIST_EXTENDED
	,CS_FILE_VIEW
	,CS_FILE_UPLOAD
	,CS_FILE_UPLOAD_USER
	,CS_FILE_UPLOAD_SYSOP
	,CS_FILE_DOWNLOAD
	,CS_FILE_DOWNLOAD_USER
	,CS_FILE_DOWNLOAD_BATCH
	,CS_FILE_REMOVE 			//0xC0
	,CS_FILE_BATCH_SECTION
	,CS_FILE_TEMP_SECTION
	,CS_FILE_NEW_SCAN_CFG
	,CS_FILE_NEW_SCAN
	,CS_FILE_NEW_SCAN_ALL
	,CS_FILE_FIND_TEXT
	,CS_FILE_FIND_TEXT_ALL
	,CS_FILE_FIND_NAME
	,CS_FILE_FIND_NAME_ALL
	,CS_FILE_PTRS_CFG
	,CS_FILE_BATCH_ADD
	,CS_FILE_BATCH_CLEAR
	,CS_FILE_SET_LIBRARY
	,CS_FILE_SEND				//Like file_get, but no password needed
	,CS_FILE_BATCH_ADD_LIST
	,CS_FILE_UNUSED1			//0xD0
	,CS_NODELIST_ALL
	,CS_NODELIST_USERS
	,CS_CHAT_SECTION
	,CS_USER_DEFAULTS
	,CS_USER_EDIT
	,CS_TEXT_FILE_SECTION
	,CS_INFO_SYSTEM
	,CS_INFO_SUBBOARD
	,CS_INFO_DIRECTORY
	,CS_INFO_USER
	,CS_INFO_VERSION
	,CS_INFO_XFER_POLICY
	,CS_XTRN_EXEC
	,CS_XTRN_SECTION
	,CS_USERLIST_SUB
	,CS_USERLIST_DIR			//0xE0
	,CS_USERLIST_ALL
    ,CS_USERLIST_LOGONS
	,CS_PAGE_SYSOP
    ,CS_PRIVATE_CHAT
    ,CS_PRIVATE_MESSAGE
	,CS_MINUTE_BANK
	,CS_GURU_LOG
	,CS_ERROR_LOG
	,CS_SYSTEM_LOG
	,CS_SYSTEM_YLOG
	,CS_SYSTEM_STATS
	,CS_NODE_STATS
	,CS_SHOW_MEM
	,CS_CHANGE_USER
	,CS_ANSI_CAPTURE
	,CS_LIST_TEXT_FILE			//0xF0
	,CS_EDIT_TEXT_FILE
	,CS_FILE_SET_ALT_PATH
	,CS_FILE_RESORT_DIRECTORY
	,CS_FILE_GET
	,CS_FILE_PUT
	,CS_FILE_UPLOAD_BULK
	,CS_FILE_FIND_OLD
	,CS_FILE_FIND_OPEN
	,CS_FILE_FIND_OFFLINE
	,CS_FILE_FIND_OLD_UPLOADS
	,CS_INC_MAIN_CMDS
	,CS_INC_FILE_CMDS
	,CS_PRINTFILE_STR
	,CS_PAGE_GURU				//0xFE
	
	};

	/* Variable instructions (sub-op-code) */

enum {

	 SHOW_VARS						// Show all variables
	,PRINT_VAR						// Print a single variable
	,VAR_PRINTF 					// Print a formated line of text
	,VAR_RESERVED_4
	,VAR_RESERVED_3
	,VAR_RESERVED_2
	,VAR_RESERVED_1
	,DEFINE_STR_VAR 				// Define Local Variable
	,DEFINE_INT_VAR
	,VAR_RESERVED_A4
	,VAR_RESERVED_A3
	,VAR_RESERVED_A2
	,VAR_RESERVED_A1
	,DEFINE_GLOBAL_STR_VAR			// Define Global Variable
	,DEFINE_GLOBAL_INT_VAR
	,VAR_RESERVED_B4
	,VAR_RESERVED_B3	// 0x10
	,VAR_RESERVED_B2
	,VAR_RESERVED_B1
	,SET_STR_VAR					// Set string variable
	,SET_INT_VAR					// Set integer variable
	,VAR_RESERVED_C4
	,VAR_RESERVED_C3
	,VAR_RESERVED_C2
	,VAR_RESERVED_C1
	,COMPARE_STR_VAR				// Compare string variable (static)
	,COMPARE_INT_VAR				// Compare integer variable (static)
	,STRNCMP_VAR					// Compare n chars of str var (static)
	,STRSTR_VAR 					// Sub-string compare of str var (static)
	,VAR_RESERVED_D2
	,VAR_RESERVED_D1
	,COMPARE_VARS					// Compare two variables
	,STRNCMP_VARS		// 0x20 	// Compare n chars of str vars (dynamic)
	,STRSTR_VARS					// Sub-string compare between two str vars
	,VAR_RESERVED_E2
	,VAR_RESERVED_E1
	,COPY_VAR						// Copy from one variable to another
	,VAR_RESERVED_F4
	,VAR_RESERVED_F3
	,VAR_RESERVED_F2
	,VAR_RESERVED_F1
	,SWAP_VARS						// Swap two variables
	,VAR_RESERVED_G4
	,VAR_RESERVED_G3
	,VAR_RESERVED_G2
	,VAR_RESERVED_G1
	,CAT_STR_VAR					// Concatenate string variable (static)
    ,CAT_STR_VARS                   // Concatenate strint variable (dynamic)
	,FORMAT_STR_VAR 	// 0x30 	// Format string variable
	,TIME_STR						// Write formated date/time to string
	,DATE_STR						// Write MM/DD/YY to string
	,FORMAT_TIME_STR				// Create custom date/time string
	,SECOND_STR 					// Create a string in format hh:mm:ss
	,STRUPR_VAR 					// Convert string to upper case
	,STRLWR_VAR 					// Convert string to lower case
	,ADD_INT_VAR					// Add to int variable (static)
	,ADD_INT_VARS					// Add to int variable (dynamic)
	,VAR_RESERVED_I4
	,VAR_RESERVED_I3
	,VAR_RESERVED_I2
	,VAR_RESERVED_I1
	,SUB_INT_VAR					// Subtract from int variable (static)
	,SUB_INT_VARS					// Subtract from int variable (dynamic)
	,VAR_RESERVED_J4
	,VAR_RESERVED_J3	// 0x40
	,VAR_RESERVED_J2
	,VAR_RESERVED_J1
	,MUL_INT_VAR					// Multiply int variable (static)
	,MUL_INT_VARS					// Multiply int variable (dynamic)
	,VAR_RESERVED_K4
	,VAR_RESERVED_K3
	,VAR_RESERVED_K2
	,VAR_RESERVED_K1
	,DIV_INT_VAR					// Divide int variable (static)
	,DIV_INT_VARS					// Divide int variable (dynamic)
	,MOD_INT_VAR
	,MOD_INT_VARS
	,VAR_RESERVED_L2
	,VAR_RESERVED_L1
	,AND_INT_VAR					// Bit-wise AND int variable (static)
	,AND_INT_VARS		// 0x50 	// Bit-wise AND int variable (dynamic)
	,VAR_RESERVED_M4
	,VAR_RESERVED_M3
	,VAR_RESERVED_M2
	,VAR_RESERVED_M1
	,OR_INT_VAR 					// Bit-wise OR int variable (static)
	,OR_INT_VARS					// Bit-wise OR int variable (dynamic)
	,VAR_RESERVED_N4
	,VAR_RESERVED_N3
	,VAR_RESERVED_N2
	,VAR_RESERVED_N1
	,NOT_INT_VAR					// Bit-wise NOT int variable (static)
	,NOT_INT_VARS					// Bit-wise NOT int variable (dynamic)
	,VAR_RESERVED_O4
	,VAR_RESERVED_O3
	,VAR_RESERVED_O2
	,VAR_RESERVED_O1	// 0x60
	,XOR_INT_VAR					// XOR int variable (static)
	,XOR_INT_VARS					// XOR int variable (dynamic)
	,VAR_RESERVED_P4
	,VAR_RESERVED_P3
	,VAR_RESERVED_P2
	,VAR_RESERVED_P1
	,RANDOM_INT_VAR 				// Set integer to random number
	,TIME_INT_VAR					// Set integer to current time/date
	,DATE_STR_TO_INT				// Convert a date string to integer
	,STRLEN_INT_VAR 				// Set integer to length of str
	,CRC16_TO_INT					// Get CRC-16 of str var
	,CRC32_TO_INT					// Get CRC-32 of str var
	,FLENGTH_TO_INT 				// Put length of str var file into int
	,CHARVAL_TO_INT 				// Put character val of str var into int
	,GETNUM_VAR 					// Get number
	,GETSTR_VAR 		// 0x70 	// Get string
	,GETNAME_VAR					// Get string (upper/lower)
	,GETSTRUPR_VAR					// Get string (upper)
	,GETLINE_VAR					// Get string (input bar/line)
	,SHIFT_STR_VAR					// Shift str in variable
	,GETSTR_MODE					// Get string with various modes
	,TRUNCSP_STR_VAR				// Truncate space off end of str var
	,CHKFILE_VAR
	,PRINTFILE_VAR_MODE 			// Printfile str var with mode
	,PRINTTAIL_VAR_MODE 			// Print tail-end of str var with mode
	,CHKSUM_TO_INT					// Get CHKSUM of str var
	,STRIP_CTRL_STR_VAR 			// Strip ctrl chars from str var
	,SEND_FILE_VIA					// Send file (static) via protocol
	,SEND_FILE_VIA_VAR				// Send file (dynamic) via protocol
	,FTIME_TO_INT					// Put time of str var file into int
	,RECEIVE_FILE_VIA				// Receive file (static) via protocol
	,RECEIVE_FILE_VIA_VAR			// Receive file (dynamic) via protocol
	,TELNET_GATE_STR				// Run telnet gateway to static address with mode
	,TELNET_GATE_VAR				// Run telnet gateway to variable address with mode
	,COPY_FIRST_CHAR				// Copy first char of str var to int var
	,COMPARE_FIRST_CHAR				// Compare first char of str var to static char
	};

									// More string arg functions
enum {
	 CS_LOGIN						// Login/password prompt
	,CS_LOAD_TEXT					// Load alternative TEXT.DAT
	};

enum {								// More single byte instructions
	 CS_ONLINE						// Online execution only
	,CS_OFFLINE 					// Offline execution allowed
	,CS_NEWUSER 					// New user procedure
	,CS_LOGON						// Logon procedure
	,CS_LOGOUT						// Logout procedure
	,CS_EXIT						// Exit current module immediately
	};

enum {								// More two byte instructions
	 CS_USER_EVENT					// External user event
	};

enum {
	 FIO_OPEN						// Open file (static filename)
	,FIO_CLOSE						// Close file
	,FIO_READ						// Read from file
	,FIO_READ_VAR					// Read from file, variable # of bytes
	,FIO_WRITE						// Write to file
	,FIO_WRITE_VAR					// Write to file, variable # of bytes
	,FIO_GET_LENGTH 				// Get length
	,FIO_EOF						// Set logic to TRUE if eof
	,FIO_GET_POS					// Get current file position
	,FIO_SEEK						// Seek within file
	,FIO_SEEK_VAR					// Seek within file, variable offset
	,FIO_LOCK						// Lock a region
	,FIO_LOCK_VAR					// Lock a region, variable length
	,FIO_UNLOCK 					// Unlock a region
	,FIO_UNLOCK_VAR 				// Unlock a region, variable length
	,FIO_SET_LENGTH 				// Change size
	,FIO_SET_LENGTH_VAR 			// Change size, variable length
	,FIO_PRINTF 					// Write formated string to file
	,FIO_SET_ETX					// Set end-of-text character
	,FIO_GET_TIME					// Gets the current date/time of file
	,FIO_SET_TIME					// Sets the current date/time of file
	,FIO_OPEN_VAR					// Open a file (dynamic filename)
	,FIO_READ_LINE					// Read a single line from file
	,FIO_FLUSH						// Flush buffered output to disk
	,FIO_UNUSED8
	,FIO_UNUSED7
	,FIO_UNUSED6
	,FIO_UNUSED5
	,FIO_UNUSED4
	,FIO_UNUSED3
	,FIO_UNUSED2
	,FIO_UNUSED1
	,REMOVE_FILE					// Remove a file
	,RENAME_FILE					// Rename a file
	,COPY_FILE						// Copy a file to another file
	,MOVE_FILE						// Move a file to another file
	,GET_FILE_ATTRIB				// Get file attributes
	,SET_FILE_ATTRIB				// Set file attributes
	,MAKE_DIR						// Make directory
	,CHANGE_DIR 					// Change current directory
	,REMOVE_DIR 					// Remove directory
	,OPEN_DIR						// Open a directory
	,READ_DIR						// Read a directory entry
	,REWIND_DIR 					// Rewind an open directory
	,CLOSE_DIR						// Close an open directory
	};

enum {
	 USER_STRING_ALIAS
	,USER_STRING_REALNAME
	,USER_STRING_HANDLE
	,USER_STRING_COMPUTER
	,USER_STRING_NOTE
	,USER_STRING_ADDRESS
	,USER_STRING_LOCATION
	,USER_STRING_ZIPCODE
	,USER_STRING_PASSWORD
	,USER_STRING_BIRTHDAY
	,USER_STRING_PHONE
	,USER_STRING_MODEM
	,USER_STRING_COMMENT
	,USER_STRING_NETMAIL

	};

#define CS_ONE_BYTE 	CS_IF_TRUE
#define CS_TWO_BYTE 	CS_CMDKEY
#define CS_THREE_BYTE	CS_GOTO
#define CS_ASCIIZ		CS_MENU
#define CS_MISC 		CS_COMPARE_ARS
#define CS_FUNCTIONS	CS_MAIL_READ
#define CS_ELSEORENDIF	0xff
#define CS_NEXTCASE 	0xfe

#define CS_DIGIT		0xff
#define CS_EDIGIT		0xfe

									/* Bits for csi_t.misc */
#define CS_IN_SWITCH	(1L<<0) 	/* Inside active switch statement */
#define CS_OFFLINE_EXEC (1L<<1) 	/* Offline execution */

#define MAX_RETS		50	/* maximum nested call depth */
#define MAX_CMDRETS		50	/* maximum nested cmd depth */
#define MAX_STRVARS		26
#define MAX_INTVARS		26
#define MAX_STRLEN		81
#define MAX_FOPENS		10	/* maximum open files */
#define MAX_SYSVARS		16	/* maximum system variable saves */

#define LOGIC_LESS		-1
#define LOGIC_EQUAL 	0
#define LOGIC_GREATER	1
#define LOGIC_TRUE		LOGIC_EQUAL
#define LOGIC_FALSE 	LOGIC_LESS

typedef struct {					/* Command shell image */

	char*	str,					/* Current string */
			**str_var;				/* String variables */

	uchar	*cs,					/* Command shell image */
			*ip,					/* Instruction pointer */
			cmd,					/* Current command key */
			etx,					/* End-of-text character */
			*ret[MAX_RETS], 		/* Return address stack */
			rets,					/* Returns on stack */
			*cmdret[MAX_CMDRETS],	/* Command return address stack */
			cmdrets;				/* Command returns on stack */

	int 	logic;					/* Current logic */
	
	FILE	*file[MAX_FOPENS];		/* Each file ptr */

	uint	str_vars,				/* Total number of string variables */
			int_vars,				/* Total number of integer variables */
			files;					/* Open files */

	long	retval, 				/* Return value */
			misc,					/* Misc bits */
			switch_val, 			/* Current switch value */
			*int_var,				/* Integer variables */
			*str_var_name,			/* String variable names (CRC-32) */
			*int_var_name;			/* Integer variable names (CRC-32) */

	long	length; 				/* Length of image */

	} csi_t;

#endif /* End of CMDSHELL.H */