Home | History | Annotate | Line # | Download | only in indent
      1  1.7  rillig /* $NetBSD: lsym_word.c,v 1.7 2023/06/17 22:09:24 rillig Exp $ */
      2  1.1  rillig 
      3  1.1  rillig /*
      4  1.1  rillig  * Tests for the token lsym_word, which represents a constant, a string
      5  1.1  rillig  * literal or an identifier.
      6  1.1  rillig  *
      7  1.1  rillig  * See also:
      8  1.1  rillig  *	lsym_funcname.c		for an identifier followed by '('
      9  1.1  rillig  */
     10  1.1  rillig 
     11  1.1  rillig // TODO: Is '"string"(' syntactically valid in any context?
     12  1.1  rillig // TODO: Is '123(' syntactically valid in any context?
     13  1.1  rillig // TODO: Would the output of the above depend on -pcs/-npcs?
     14  1.6  rillig // TODO: Add more systematic tests.
     15  1.6  rillig // TODO: Completely cover each state transition in lex_number_state.
     16  1.1  rillig 
     17  1.7  rillig // TODO: Consider splitting this token into lsym_name and lsym_value, to
     18  1.7  rillig // TODO: make it easier to skip tokens during lookahead, for example since
     19  1.7  rillig // TODO: L"" is not an identifier but a string literal.
     20  1.7  rillig 
     21  1.5  rillig //indent input
     22  1.1  rillig // TODO: add input
     23  1.5  rillig //indent end
     24  1.1  rillig 
     25  1.5  rillig //indent run-equals-input
     26  1.2  rillig 
     27  1.2  rillig 
     28  1.2  rillig /*
     29  1.2  rillig  * Since 2019-04-04 and before NetBSD lexi.c 1.149 from 2021-11-20, the first
     30  1.2  rillig  * character after a backslash continuation was always considered part of a
     31  1.2  rillig  * word, no matter whether it was a word character or not.
     32  1.2  rillig  */
     33  1.5  rillig //indent input
     34  1.2  rillig int var\
     35  1.2  rillig +name = 4;
     36  1.5  rillig //indent end
     37  1.2  rillig 
     38  1.5  rillig //indent run
     39  1.3  rillig int		var + name = 4;
     40  1.5  rillig //indent end
     41  1.6  rillig 
     42  1.6  rillig 
     43  1.6  rillig //indent input
     44  1.6  rillig wchar_t wide_string[] = L"wide string";
     45  1.6  rillig //indent end
     46  1.6  rillig 
     47  1.6  rillig /*
     48  1.6  rillig  * Regardless of the line length, the 'L' must never be separated from the
     49  1.6  rillig  * string literal.  Before lexi.c 1.167 from 2021-11-28, the 'L' was a
     50  1.6  rillig  * separate token, which could have resulted in accidental spacing between the
     51  1.6  rillig  * 'L' and the following "".
     52  1.6  rillig  */
     53  1.6  rillig //indent run-equals-input -di0
     54  1.6  rillig 
     55  1.6  rillig //indent run-equals-input -di0 -l25
     56  1.6  rillig 
     57  1.6  rillig //indent run-equals-input -di0 -l1
     58  1.6  rillig 
     59  1.6  rillig 
     60  1.6  rillig //indent input
     61  1.6  rillig wchar_t wide_char[] = L'w';
     62  1.6  rillig //indent end
     63  1.6  rillig 
     64  1.6  rillig //indent run-equals-input -di0
     65  1.6  rillig 
     66  1.6  rillig 
     67  1.6  rillig /* Binary number literals, a GCC extension that was added in C11. */
     68  1.6  rillig //indent input
     69  1.6  rillig #define b00101010 -1
     70  1.6  rillig void t(void) {
     71  1.6  rillig 	unsigned a[] = {0b00101010, 0x00005678, 02, 17U};
     72  1.6  rillig 	float x[] = {.7f, 0.7f};
     73  1.6  rillig 	unsigned long ul[] = {0b00001111UL, 0x01010101UL, 02UL, 17UL};
     74  1.6  rillig 
     75  1.6  rillig 	if (0 b00101010)
     76  1.6  rillig 		return;
     77  1.6  rillig 	/* $ '0r' is not a number base prefix, so the tokens are split. */
     78  1.6  rillig 	if (0r12345)
     79  1.6  rillig 		return;
     80  1.6  rillig }
     81  1.6  rillig //indent end
     82  1.6  rillig 
     83  1.6  rillig //indent run
     84  1.6  rillig #define b00101010 -1
     85  1.6  rillig void
     86  1.6  rillig t(void)
     87  1.6  rillig {
     88  1.6  rillig 	unsigned	a[] = {0b00101010, 0x00005678, 02, 17U};
     89  1.6  rillig 	float		x[] = {.7f, 0.7f};
     90  1.6  rillig 	unsigned long	ul[] = {0b00001111UL, 0x01010101UL, 02UL, 17UL};
     91  1.6  rillig 
     92  1.6  rillig 	if (0 b00101010)
     93  1.6  rillig 		return;
     94  1.6  rillig 	if (0 r12345)
     95  1.6  rillig 		return;
     96  1.6  rillig }
     97  1.6  rillig //indent end
     98  1.6  rillig 
     99  1.6  rillig 
    100  1.6  rillig /* Floating point numbers. */
    101  1.6  rillig //indent input
    102  1.6  rillig void t(void) {
    103  1.6  rillig 	unsigned long x = 314UL;
    104  1.6  rillig 	double y[] = {0x1P+9F, 0.3, .1, 1.2f, 0xa.p01f, 3.14f, 2.L};
    105  1.6  rillig 	int z = 0b0101;
    106  1.6  rillig 	DO_NOTHING;
    107  1.6  rillig 	x._y = 5;
    108  1.6  rillig }
    109  1.6  rillig //indent end
    110  1.6  rillig 
    111  1.6  rillig //indent run
    112  1.6  rillig void
    113  1.6  rillig t(void)
    114  1.6  rillig {
    115  1.6  rillig 	unsigned long	x = 314UL;
    116  1.6  rillig 	double		y[] = {0x1P+9F, 0.3, .1, 1.2f, 0xa.p01f, 3.14f, 2.L};
    117  1.6  rillig 	int		z = 0b0101;
    118  1.6  rillig 	DO_NOTHING;
    119  1.6  rillig 	x._y = 5;
    120  1.6  rillig }
    121  1.6  rillig //indent end
    122  1.6  rillig 
    123  1.6  rillig 
    124  1.6  rillig /*
    125  1.6  rillig  * Test identifiers containing '$', which some compilers support as an
    126  1.6  rillig  * extension to the C standard.
    127  1.6  rillig  */
    128  1.6  rillig //indent input
    129  1.6  rillig int $		= jQuery;			// just kidding
    130  1.6  rillig const char SYS$LOGIN[]="$HOME";
    131  1.6  rillig //indent end
    132  1.6  rillig 
    133  1.6  rillig //indent run
    134  1.6  rillig int		$ = jQuery;	// just kidding
    135  1.6  rillig const char	SYS$LOGIN[] = "$HOME";
    136  1.6  rillig //indent end
    137  1.6  rillig 
    138  1.6  rillig 
    139  1.6  rillig /*
    140  1.6  rillig  * Test the tokenizer for number constants.
    141  1.6  rillig  *
    142  1.6  rillig  * When the tokenizer reads a character that makes a token invalid (such as
    143  1.6  rillig  * '0x') but may later be extended to form a valid token (such as '0x123'),
    144  1.6  rillig  * indent does not care about this invalid prefix and returns it nevertheless.
    145  1.6  rillig  */
    146  1.6  rillig //indent input
    147  1.6  rillig int unfinished_hex_prefix = 0x;
    148  1.6  rillig double unfinished_hex_float = 0x123p;
    149  1.6  rillig //indent end
    150  1.6  rillig 
    151  1.6  rillig //indent run-equals-input -di0
    152