xref: /openbsd/bin/ksh/lex.h (revision 3dc0c5b1)
1 /*	$OpenBSD: lex.h,v 1.21 2018/01/15 14:58:05 jca Exp $	*/
2 
3 /*
4  * Source input, lexer and parser
5  */
6 
7 /* $From: lex.h,v 1.4 1994/05/31 13:34:34 michael Exp $ */
8 
9 #define	IDENT	64
10 
11 typedef struct source Source;
12 struct source {
13 	const char *str;	/* input pointer */
14 	int	type;		/* input type */
15 	const char *start;	/* start of current buffer */
16 	union {
17 		char **strv;	/* string [] */
18 		struct shf *shf; /* shell file */
19 		struct tbl *tblp; /* alias (SALIAS) */
20 		char *freeme;	/* also for SREREAD */
21 	} u;
22 	char	ugbuf[2];	/* buffer for ungetsc() (SREREAD) and
23 				 * alias (SALIAS) */
24 	int	line;		/* line number */
25 	int	cmd_offset;	/* line number - command number */
26 	int	errline;	/* line the error occurred on (0 if not set) */
27 	const char *file;	/* input file name */
28 	int	flags;		/* SF_* */
29 	Area	*areap;
30 	XString	xs;		/* input buffer */
31 	Source *next;		/* stacked source */
32 };
33 
34 /* Source.type values */
35 #define	SEOF		0	/* input EOF */
36 #define	SFILE		1	/* file input */
37 #define SSTDIN		2	/* read stdin */
38 #define	SSTRING		3	/* string */
39 #define	SWSTR		4	/* string without \n */
40 #define	SWORDS		5	/* string[] */
41 #define	SWORDSEP	6	/* string[] separator */
42 #define	SALIAS		7	/* alias expansion */
43 #define SREREAD		8	/* read ahead to be re-scanned */
44 
45 /* Source.flags values */
46 #define SF_ECHO		BIT(0)	/* echo input to shlout */
47 #define SF_ALIAS	BIT(1)	/* faking space at end of alias */
48 #define SF_ALIASEND	BIT(2)	/* faking space at end of alias */
49 #define SF_TTY		BIT(3)	/* type == SSTDIN & it is a tty */
50 
51 typedef union {
52 	int	i;
53 	char   *cp;
54 	char  **wp;
55 	struct op *o;
56 	struct ioword *iop;
57 } YYSTYPE;
58 
59 /* If something is added here, add it to tokentab[] in syn.c as well */
60 #define	LWORD	256
61 #define	LOGAND	257		/* && */
62 #define	LOGOR	258		/* || */
63 #define	BREAK	259		/* ;; */
64 #define	IF	260
65 #define	THEN	261
66 #define	ELSE	262
67 #define	ELIF	263
68 #define	FI	264
69 #define	CASE	265
70 #define	ESAC	266
71 #define	FOR	267
72 #define SELECT	268
73 #define	WHILE	269
74 #define	UNTIL	270
75 #define	DO	271
76 #define	DONE	272
77 #define	IN	273
78 #define	FUNCTION 274
79 #define	TIME	275
80 #define	REDIR	276
81 #define MDPAREN	277		/* (( )) */
82 #define BANG	278		/* ! */
83 #define DBRACKET 279		/* [[ .. ]] */
84 #define COPROC	280		/* |& */
85 #define	YYERRCODE 300
86 
87 /* flags to yylex */
88 #define	CONTIN	BIT(0)		/* skip new lines to complete command */
89 #define	ONEWORD	BIT(1)		/* single word for substitute() */
90 #define	ALIAS	BIT(2)		/* recognize alias */
91 #define	KEYWORD	BIT(3)		/* recognize keywords */
92 #define LETEXPR	BIT(4)		/* get expression inside (( )) */
93 #define VARASN	BIT(5)		/* check for var=word */
94 #define ARRAYVAR BIT(6)		/* parse x[1 & 2] as one word */
95 #define ESACONLY BIT(7)		/* only accept esac keyword */
96 #define CMDWORD BIT(8)		/* parsing simple command (alias related) */
97 #define HEREDELIM BIT(9)	/* parsing <<,<<- delimiter */
98 #define HEREDOC BIT(10)		/* parsing heredoc */
99 #define UNESCAPE BIT(11)	/* remove backslashes */
100 
101 #define	HERES	10		/* max << in line */
102 
103 extern Source  *source;		/* yyparse/yylex source */
104 extern YYSTYPE	yylval;		/* result from yylex */
105 extern struct ioword *heres[HERES], **herep;
106 extern char	ident[IDENT+1];
107 
108 #define HISTORYSIZE	500	/* size of saved history */
109 
110 extern char   **history;	/* saved commands */
111 extern char   **histptr;	/* last history item */
112 extern uint32_t	histsize;	/* history size */
113 
114 int	yylex(int);
115 void	yyerror(const char *, ...)
116 	    __attribute__((__noreturn__, __format__ (printf, 1, 2)));
117 Source * pushs(int, Area *);
118 void	set_prompt(int);
119 void	pprompt(const char *, int);
120