/*
* $Date: 2007/12/10 22:13:07 $
* $Source: /cvsroot/videoteco/videoteco/tecparse.h,v $
* $Revision: 1.2 $
* $Locker: $
*/
/**
* \file tecparse.h
* \brief Definitions for TECO parser
*/
/*
*
* Copyright (C) 1985-2007 BY Paul Cantrell
*
* 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 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/**
* This structure holds the context which must be passed forward as the
* parse progresses. We split it out of the cmd_token structure so that
* it can be easily duplicated.
*/
struct cmd_context {
char state;
char flags;
char pnest;
char inest;
char cnest;
unsigned go_flag : 1;
unsigned iarg1_flag : 1;
unsigned iarg2_flag : 1;
char delimeter;
long iarg1;
long iarg2;
char *carg;
long tmpval;
int return_state;
struct cmd_token *caller_token;
};
/**
* Define the structure which we use to describe commands
*/
struct cmd_token {
char opcode;
char input_byte;
char q_register;
char flags;
int execute_state;
struct cmd_token *next_token;
struct cmd_token *prev_token;
struct undo_token *undo_list;
struct cmd_context ctx;
};
struct undo_token {
char opcode;
long iarg1;
long iarg2;
char *carg1;
struct undo_token *next_token;
};
#define TRACE_C_PARSE 1
#define TRACE_C_EXEC 2
#define TRACE_C_MACRO 3
#define TOK_M_EAT_TOKEN (1 << 0)
#define TOK_M_WORDBOUNDARY (1 << 1)
#define TOK_M_PARSELOAD_IARG1 (1 << 2)
#define TOK_M_PARSELOAD_IARG2 (1 << 3)
#define TOK_M_PARSELOAD_TMPVAL (1 << 4)
#define CTOK_M_COLON_SEEN (1 << 0)
#define CTOK_M_ATSIGN_SEEN (1 << 1)
#define CTOK_M_STATUS_PASSED (1 << 2)
#define TOK_C_UNUSED 0 /**< Value before it gets set */
#define TOK_C_FIRSTTOKEN 1 /**< The begining of it all */
#define TOK_C_INPUTCHAR 2 /**< An input character was recieved here */
#define TOK_C_COPYTOKEN 3 /**< A copy of a previous command token */
#define TOK_C_ITERATION_BEGIN 4 /**< Marks the begining of an iteration */
#define TOK_C_ITERATION_END 5 /**< Marks the end of an iteration */
#define TOK_C_CONDITIONAL_END 6 /**< Marks end of a conditional cmd */
#define TOK_C_LABEL_BEGIN 7 /**< Begining of a label tag !like this!*/
#define TOK_C_LABEL_END 8 /**< End of a label tag */
#define TOK_C_GOTO_BEGIN 9 /**< Begining of an \c Omumble\$ string */
#define TOK_C_GOTO_END 10 /**< End of an \c Omumble\$ string */
#define TOK_C_FINALTOKEN 11 /**< Like \c FINALSTATE */
#define TOK_C_INITIALSTATE 12 /**< Used by \c ^W to find begining of cmds */
#define TOK_C_CONDITIONAL_ELSE 13 /**< Marks begining of an ELSE clause */
#define STATE_C_INITIALSTATE 0
#define STATE_C_MAINCOMMANDS 1
#define STATE_C_ESCAPESEEN 2
#define STATE_C_ECOMMAND 3
#define STATE_C_ARG1 4
#define STATE_C_ARG2 5
#define STATE_C_EXPRESSION 6
#define STATE_C_OPERATOR 7
#define STATE_C_PLUS 8
#define STATE_C_MINUS 9
#define STATE_C_TIMES 10
#define STATE_C_DIVIDE 11
#define STATE_C_MINUSSEEN 14
#define STATE_C_SUBEXPRESSION 15
#define STATE_C_OPERAND 16
#define STATE_C_NUMBER_SUBSTATE 17
#define STATE_C_QOPERAND 18
#define STATE_C_INSERT 19
#define STATE_C_QUOTED_INSERT 20
#define STATE_C_UMINUS 21
#define STATE_C_LABEL 22
#define STATE_C_UQREGISTER 23
#define STATE_C_WRITEFILE 24
#define STATE_C_STRING 25
#define STATE_C_STRING1 26
#define STATE_C_SEARCH 27
#define STATE_C_FCOMMAND 28
#define STATE_C_FSPART1 29
#define STATE_C_FSPART2 30
#define STATE_C_EDITBUF 31
#define STATE_C_READFILE 32
#define STATE_C_XQREGISTER 33
#define STATE_C_GQREGISTER 34
#define STATE_C_MQREGISTER 35
#define STATE_C_VIEWBUF 36
#define STATE_C_FDCOMMAND 37
#define STATE_C_CONDITIONALS 38
#define STATE_C_GOTO 39
#define STATE_C_FRPART1 40
#define STATE_C_FRPART2 41
#define STATE_C_MESSAGE 42
#define STATE_C_FKCOMMAND 43
#define STATE_C_ECCOMMAND 44
#define STATE_C_SAVECOMMAND 45
#define STATE_C_PERCENT_OPERAND 46
#define STATE_C_ATINSERT 47
#define STATE_C_ATINSERT_PART2 48
#define STATE_C_ONE_EQUALS 49
#define STATE_C_TWO_EQUALS 50
#define STATE_C_SKIP_ELSE 51
#define STATE_C_PUSH_QREGISTER 52
#define STATE_C_POP_QREGISTER 53
#define STATE_C_NSEARCH 54
#define STATE_C_ACCEPT_ARGS 55
#define STATE_C_EQQREGISTER1 56
#define STATE_C_EQQREGISTER2 57
#define STATE_C_RADIX 58
#define STATE_C_HEX_NUMBER 59
#define STATE_C_OCTAL_NUMBER 60
#define STATE_C_HEX_NUMBER_SUBSTATE 61
#define STATE_C_OCTAL_NUMBER_SUBSTATE 62
#define STATE_C_BACKSLASH 63
#define STATE_C_DELAYED_MINUS 64
#define STATE_C_DELAYED_PLUS 65
#define STATE_C_FSPART3 66
#define STATE_C_FTAGS 67
#define STATE_C_RETURN 97
#define STATE_C_FINALSTATE 98
#define STATE_C_ERRORSTATE 99
/*
* Here we define the execution time states
*/
#define EXEC_C_NULLSTATE 0
#define EXEC_C_DOTARG1 1
#define EXEC_C_ZEEARG1 2
#define EXEC_C_HARGUMENT 3
#define EXEC_C_EXITCOMMAND 4
#define EXEC_C_UQREGISTER 5
#define EXEC_C_JUMP 8
#define EXEC_C_INSERT 9
#define EXEC_C_LINE 10
#define EXEC_C_CHAR 11
#define EXEC_C_RCHAR 12
#define EXEC_C_DELETE 13
#define EXEC_C_HVALUE 14
#define EXEC_C_DOTVALUE 15
#define EXEC_C_ZEEVALUE 16
#define EXEC_C_QVALUE 17
#define EXEC_C_EQUALS 18
#define EXEC_C_REDRAW_SCREEN 19
#define EXEC_C_STOREVAL 20
#define EXEC_C_STORE1 21
#define EXEC_C_STORE2 22
#define EXEC_C_UMINUS 23
#define EXEC_C_PLUS 24
#define EXEC_C_MINUS 25
#define EXEC_C_TIMES 26
#define EXEC_C_DIVIDE 27
#define EXEC_C_KILL 28
#define EXEC_C_WRITEFILE 29
#define EXEC_C_SEARCH 30
#define EXEC_C_SETSEARCH 31
#define EXEC_C_FSREPLACE1 32
#define EXEC_C_ITERATION_BEGIN 33
#define EXEC_C_ITERATION_END 34
#define EXEC_C_READFILE 35
#define EXEC_C_EDITBUF 36
#define EXEC_C_XQREGISTER 37
#define EXEC_C_GQREGISTER 38
#define EXEC_C_SEMICOLON 39
#define EXEC_C_MQREGISTER 40
#define EXEC_C_CLOSEBUF 41
#define EXEC_C_VIEWBUF 42
#define EXEC_C_FDCOMMAND 43
#define EXEC_C_ACOMMAND 44
#define EXEC_C_BACKSLASH 45
#define EXEC_C_BACKSLASHARG 46
#define EXEC_C_COND_GT 47
#define EXEC_C_COND_LT 48
#define EXEC_C_COND_EQ 49
#define EXEC_C_COND_NE 50
#define EXEC_C_COND_DIGIT 51
#define EXEC_C_COND_ALPHA 52
#define EXEC_C_COND_LOWER 53
#define EXEC_C_COND_UPPER 54
#define EXEC_C_COND_SYMBOL 55
#define EXEC_C_GOTO 56
#define EXEC_C_FRREPLACE 57
#define EXEC_C_MESSAGE 58
#define EXEC_C_RESET_MESSAGE 59
#define EXEC_C_OUTPUT_MESSAGE 60
#define EXEC_C_FKCOMMAND 61
#define EXEC_C_REMEMBER_DOT 62
#define EXEC_C_ECCOMMAND 63
#define EXEC_C_SAVECOMMAND 64
#define EXEC_C_SCROLL 65
#define EXEC_C_UPDATE_SCREEN 66
#define EXEC_C_SET_IMMEDIATE_MODE 67
#define EXEC_C_PERCENT_VALUE 68
#define EXEC_C_WORD 69
#define EXEC_C_TWO_EQUALS 70
#define EXEC_C_THREE_EQUALS 71
#define EXEC_C_SKIP_ELSE 72
#define EXEC_C_PUSH_QREGISTER 73
#define EXEC_C_POP_QREGISTER 74
#define EXEC_C_NSEARCH 75
#define EXEC_C_EQQREGISTER 76
#define EXEC_C_WINDOW_CONTROL 77
#define EXEC_C_NEXT_WINDOW 78
#define EXEC_C_RLINE 79
#define EXEC_C_DELWORD 80
#define EXEC_C_RDELWORD 81
#define EXEC_C_OPENBRACE 82
#define EXEC_C_CLOSEBRACE 83
#define EXEC_C_SKIPLABEL 84
#define EXEC_C_SETOPTIONS 85
#define EXEC_C_FSREPLACE2 86
#define EXEC_C_FSREPLACE3 87
#define EXEC_C_FTAGS 88
/*
* Define the UNDO symbols
*/
#define UNDO_C_UNUSED 0
#define UNDO_C_CHANGEDOT 1
#define UNDO_C_DELETE 2
#define UNDO_C_INSERT 3
#define UNDO_C_UQREGISTER 4
#define UNDO_C_MEMFREE 5
#define UNDO_C_SHORTEN_STRING 6
#define UNDO_C_SET_SEARCH_STRING 7
#define UNDO_C_CHANGEBUFF 8
#define UNDO_C_MACRO 9
#define UNDO_C_SHORTEN_MESSAGE 10
#define UNDO_C_BULK_INSERT 11
#define UNDO_C_SET_IMMEDIATE_MODE 12
#define UNDO_C_PUSH 13
#define UNDO_C_POP 14
#define UNDO_C_MODIFIED 15
#define UNDO_C_CLOSEBUFF 16
#define UNDO_C_WINDOW_SWITCH 17
#define UNDO_C_WINDOW_SPLIT 18
#define UNDO_C_REOPENBUFF 19
#define UNDO_C_RENAME_BUFFER 20
#define UNDO_C_PRESERVEARGS 21
#define UNDO_C_SETOPTIONS 22
#define UNDO_C_SET_SEARCH_GLOBALS 23
#define UNDO_C_LOAD_TAGS 24
#define UNDO_C_SELECT_TAGS 25
#define UNDO_C_SET_EXIT_FLAG 26
int cmd_oscmd(struct cmd_token *,int,unsigned long,unsigned long,char *);
int buff_insert_from_buffer_with_undo( struct cmd_token *,
struct buff_header *,unsigned long,struct buff_header *,unsigned long,size_t);
int buff_delete_with_undo( struct cmd_token *,struct buff_header *,unsigned long,unsigned long);
int buff_insert_with_undo( struct cmd_token *,
struct buff_header *,unsigned long,char *,unsigned long);
int rename_edit_buffer(struct buff_header *,char *,struct cmd_token *);
int cmd_setoptions(long,long,struct undo_token *);
void tag_dump_database(struct tags *tp,struct cmd_token *uct);
int buff_insert_char_with_undo(struct cmd_token *,
struct buff_header *,unsigned long,char);
int set_search_string_with_undo(char *,struct cmd_token *uct);
int cmd_tags(struct cmd_token *uct,int,int,int,char *);
int tecmacro(struct buff_header *,struct cmd_token *,struct cmd_token **);
void parser_cleanup_ctlist(struct cmd_token *);
void free_cmd_token(struct cmd_token *);
int parser_undo(struct undo_token *);
void free_undo_token(struct undo_token *);
void screen_reset_echo(struct cmd_token *);
int parse_special_character(struct cmd_token *,int);
void parse_input_character(struct cmd_token *,struct cmd_token *);
void trace_mode(int, struct cmd_token *, struct cmd_token *);
int execute_a_state(struct cmd_token *, struct cmd_token *);
void tecundo_cleanup(struct undo_token *);
int parse_any_arguments(struct cmd_token *,char *);
int parse_more_than_one_arg(struct cmd_token *,char *);
int parse_check_qname(struct cmd_token *,char);
struct cmd_token *allocate_cmd_token(struct cmd_token *old_token);
struct undo_token *allocate_undo_token(struct cmd_token *ct);
void buff_free_line_buffer(struct buff_line *);