1*51343111Skre /* $NetBSD: syntax.c,v 1.8 2019/02/04 09:56:48 kre Exp $ */ 2bcf893f4Slukem 3bcf893f4Slukem #include <sys/cdefs.h> 4*51343111Skre __RCSID("$NetBSD: syntax.c,v 1.8 2019/02/04 09:56:48 kre Exp $"); 5f0177aebSdsl 6a080d612Schristos #include <limits.h> 7f0177aebSdsl #include "shell.h" 8f0177aebSdsl #include "syntax.h" 9f0177aebSdsl #include "parser.h" 10f0177aebSdsl 11f0177aebSdsl #if CWORD != 0 12f0177aebSdsl #error initialisation assumes 'CWORD' is zero 13f0177aebSdsl #endif 14f0177aebSdsl 15021ba509Skre #define ndx(ch) (ch + 2 - CHAR_MIN) 16f0177aebSdsl #define set(ch, val) [ndx(ch)] = val, 17f0177aebSdsl #define set_range(s, e, val) [ndx(s) ... ndx(e)] = val, 18f0177aebSdsl 19f0177aebSdsl /* syntax table used when not in quotes */ 20021ba509Skre const char basesyntax[258] = { CFAKE, CEOF, 21f0177aebSdsl set_range(CTL_FIRST, CTL_LAST, CCTL) 22*51343111Skre /* Note code assumes that only the above are CCTL in basesyntax */ 23f0177aebSdsl set('\n', CNL) 24f0177aebSdsl set('\\', CBACK) 25f0177aebSdsl set('\'', CSQUOTE) 26f0177aebSdsl set('"', CDQUOTE) 27f0177aebSdsl set('`', CBQUOTE) 28f0177aebSdsl set('$', CVAR) 29f0177aebSdsl set('}', CENDVAR) 30f0177aebSdsl set('<', CSPCL) 31f0177aebSdsl set('>', CSPCL) 32f0177aebSdsl set('(', CSPCL) 33f0177aebSdsl set(')', CSPCL) 34f0177aebSdsl set(';', CSPCL) 35f0177aebSdsl set('&', CSPCL) 36f0177aebSdsl set('|', CSPCL) 37f0177aebSdsl set(' ', CSPCL) 38f0177aebSdsl set('\t', CSPCL) 39f0177aebSdsl }; 40f0177aebSdsl 41f0177aebSdsl /* syntax table used when in double quotes */ 42021ba509Skre const char dqsyntax[258] = { CFAKE, CEOF, 43f0177aebSdsl set_range(CTL_FIRST, CTL_LAST, CCTL) 44f0177aebSdsl set('\n', CNL) 45f0177aebSdsl set('\\', CBACK) 46f0177aebSdsl set('"', CDQUOTE) 47f0177aebSdsl set('`', CBQUOTE) 48f0177aebSdsl set('$', CVAR) 49f0177aebSdsl set('}', CENDVAR) 50c83568a7Skre /* ':/' for tilde expansion, '-]' for [a\-x] pattern ranges */ 51f0177aebSdsl set('!', CCTL) 52f0177aebSdsl set('*', CCTL) 53f0177aebSdsl set('?', CCTL) 54f0177aebSdsl set('[', CCTL) 55f0177aebSdsl set('=', CCTL) 56f0177aebSdsl set('~', CCTL) 57f0177aebSdsl set(':', CCTL) 58f0177aebSdsl set('/', CCTL) 59f0177aebSdsl set('-', CCTL) 60c83568a7Skre set(']', CCTL) 61f0177aebSdsl }; 62f0177aebSdsl 63f0177aebSdsl /* syntax table used when in single quotes */ 64021ba509Skre const char sqsyntax[258] = { CFAKE, CEOF, 65*51343111Skre /* CCTL includes anything that might perhaps need to be escaped if quoted */ 66f0177aebSdsl set_range(CTL_FIRST, CTL_LAST, CCTL) 67f0177aebSdsl set('\n', CNL) 68f0177aebSdsl set('\'', CSQUOTE) 695f92382cSkre set('\\', CSBACK) 70c83568a7Skre /* ':/' for tilde expansion, '-]' for [a\-x] pattern ranges */ 71f0177aebSdsl set('!', CCTL) 72f0177aebSdsl set('*', CCTL) 73f0177aebSdsl set('?', CCTL) 74f0177aebSdsl set('[', CCTL) 75f0177aebSdsl set('=', CCTL) 76f0177aebSdsl set('~', CCTL) 77f0177aebSdsl set(':', CCTL) 78f0177aebSdsl set('/', CCTL) 79f0177aebSdsl set('-', CCTL) 80c83568a7Skre set(']', CCTL) 81f0177aebSdsl }; 82f0177aebSdsl 83f0177aebSdsl /* syntax table used when in arithmetic */ 84021ba509Skre const char arisyntax[258] = { CFAKE, CEOF, 85f0177aebSdsl set_range(CTL_FIRST, CTL_LAST, CCTL) 86f0177aebSdsl set('\n', CNL) 87f0177aebSdsl set('\\', CBACK) 88f0177aebSdsl set('`', CBQUOTE) 89f0177aebSdsl set('\'', CSQUOTE) 90f0177aebSdsl set('"', CDQUOTE) 91f0177aebSdsl set('$', CVAR) 92f0177aebSdsl set('}', CENDVAR) 93f0177aebSdsl set('(', CLP) 94f0177aebSdsl set(')', CRP) 95f0177aebSdsl }; 96f0177aebSdsl 97f0177aebSdsl /* character classification table */ 98021ba509Skre const char is_type[258] = { 0, 0, 99f0177aebSdsl set_range('0', '9', ISDIGIT) 100f0177aebSdsl set_range('a', 'z', ISLOWER) 101f0177aebSdsl set_range('A', 'Z', ISUPPER) 102f0177aebSdsl set('_', ISUNDER) 103f0177aebSdsl set('#', ISSPECL) 104f0177aebSdsl set('?', ISSPECL) 105f0177aebSdsl set('$', ISSPECL) 106f0177aebSdsl set('!', ISSPECL) 107f0177aebSdsl set('-', ISSPECL) 108f0177aebSdsl set('*', ISSPECL) 109f0177aebSdsl set('@', ISSPECL) 110727a69dcSkre set(' ', ISSPACE) 111727a69dcSkre set('\t', ISSPACE) 112727a69dcSkre set('\n', ISSPACE) 113f0177aebSdsl }; 114