1 1.9 rillig /* $NetBSD: lsym_for.c,v 1.9 2023/06/26 20:23:40 rillig Exp $ */ 2 1.1 rillig 3 1.1 rillig /* 4 1.1 rillig * Tests for the token lsym_for, which represents the keyword 'for' that 5 1.1 rillig * starts a 'for' loop. 6 1.4 rillig * 7 1.4 rillig * Most 'for' loops have 3 expressions in their head. Each of these 8 1.4 rillig * expressions is optional though. 9 1.4 rillig * 10 1.4 rillig * When all 3 expressions are omitted, the 'for' loop is often called a 11 1.4 rillig * 'forever' loop. 12 1.1 rillig */ 13 1.1 rillig 14 1.3 rillig //indent input 15 1.4 rillig void 16 1.4 rillig example(void) 17 1.4 rillig { 18 1.4 rillig for (;;) 19 1.4 rillig break; 20 1.4 rillig for (var = value;;) 21 1.4 rillig break; 22 1.4 rillig for (; cond;) 23 1.4 rillig break; 24 1.4 rillig for (;; i++) 25 1.4 rillig break; 26 1.4 rillig } 27 1.4 rillig //indent end 28 1.4 rillig 29 1.4 rillig //indent run-equals-input 30 1.4 rillig 31 1.4 rillig 32 1.4 rillig //indent input 33 1.4 rillig void 34 1.4 rillig function(void) 35 1.4 rillig { 36 1.4 rillig for (int i = 0; i < 6; i++) 37 1.4 rillig print_char("hello\n"[i]); 38 1.4 rillig forever { 39 1.4 rillig stmt(); 40 1.4 rillig } 41 1.4 rillig } 42 1.4 rillig //indent end 43 1.4 rillig 44 1.4 rillig //indent run-equals-input 45 1.4 rillig 46 1.4 rillig 47 1.4 rillig /* 48 1.4 rillig * Indent can cope with various syntax errors, which may be caused by 49 1.4 rillig * syntactic macros like 'forever' or 'foreach'. 50 1.4 rillig */ 51 1.4 rillig //indent input 52 1.4 rillig #define forever for (;;) 53 1.4 rillig #define foreach(list, it) for (it = list.first; it != NULL; it = it->next) 54 1.4 rillig 55 1.4 rillig void 56 1.4 rillig function(void) 57 1.4 rillig { 58 1.4 rillig forever 59 1.4 rillig stmt(); 60 1.4 rillig 61 1.4 rillig forever { 62 1.4 rillig stmt(); 63 1.4 rillig } 64 1.4 rillig 65 1.4 rillig /* $ No space after 'foreach' since it looks like a function name. */ 66 1.4 rillig foreach(list, it) 67 1.4 rillig println(it->data); 68 1.4 rillig 69 1.4 rillig /* $ No space after 'foreach' since it looks like a function name. */ 70 1.4 rillig foreach(list, it) { 71 1.4 rillig println(it->data); 72 1.4 rillig } 73 1.4 rillig } 74 1.4 rillig //indent end 75 1.4 rillig 76 1.4 rillig //indent run-equals-input 77 1.4 rillig 78 1.4 rillig 79 1.4 rillig /* 80 1.4 rillig * Another variant of a 'for' loop, seen in sys/arch/arm/apple/apple_intc.c. 81 1.4 rillig */ 82 1.4 rillig //indent input 83 1.4 rillig { 84 1.4 rillig for (CPU_INFO_FOREACH(cii, ci)) { 85 1.4 rillig } 86 1.4 rillig } 87 1.3 rillig //indent end 88 1.1 rillig 89 1.3 rillig //indent run-equals-input 90 1.5 rillig 91 1.5 rillig 92 1.6 rillig /* Ensure that the '*' after 'list_item' is a unary operator. */ 93 1.5 rillig //indent input 94 1.5 rillig { 95 1.5 rillig for (const list_item *i = first; i != NULL; i = i->next) { 96 1.5 rillig } 97 1.6 rillig for (list_item **i = first; i != NULL; i = i->next) { 98 1.6 rillig } 99 1.6 rillig for (list_item *const *i = first; i != NULL; i = i->next) { 100 1.6 rillig } 101 1.6 rillig for (const char *const *i = first; i != NULL; i = i->next) { 102 1.6 rillig } 103 1.5 rillig } 104 1.5 rillig //indent end 105 1.5 rillig 106 1.9 rillig //indent run-equals-input 107