1 static int SCAN_FUNC_NAME(lisp_stream_t * stream)2SCAN_FUNC_NAME (lisp_stream_t *stream) 3 { 4 static char *delims = "\"();"; 5 6 SCAN_DECLS 7 8 int c; 9 10 do 11 { 12 c = NEXT_CHAR; 13 if (c == EOF) 14 RETURN(TOKEN_EOF); 15 else if (c == ';') /* comment start */ 16 while (1) 17 { 18 c = NEXT_CHAR; 19 if (c == EOF) 20 RETURN(TOKEN_EOF); 21 else if (c == '\n') 22 break; 23 } 24 } while (isspace(c)); 25 26 switch (c) 27 { 28 case '(' : 29 RETURN(TOKEN_OPEN_PAREN); 30 31 case ')' : 32 RETURN(TOKEN_CLOSE_PAREN); 33 34 case '"' : 35 _token_clear(); 36 while (1) 37 { 38 c = NEXT_CHAR; 39 if (c == EOF) 40 RETURN(TOKEN_ERROR); 41 if (c == '"') 42 break; 43 if (c == '\\') 44 { 45 c = NEXT_CHAR; 46 47 switch (c) 48 { 49 case EOF : 50 RETURN(TOKEN_ERROR); 51 52 case 'n' : 53 c = '\n'; 54 break; 55 56 case 't' : 57 c = '\t'; 58 break; 59 } 60 } 61 62 _token_append(c); 63 } 64 RETURN(TOKEN_STRING); 65 66 case '#' : 67 c = NEXT_CHAR; 68 if (c == EOF) 69 RETURN(TOKEN_ERROR); 70 71 switch (c) 72 { 73 case 't' : 74 RETURN(TOKEN_TRUE); 75 76 case 'f' : 77 RETURN(TOKEN_FALSE); 78 79 case '?' : 80 c = NEXT_CHAR; 81 if (c == EOF) 82 RETURN(TOKEN_ERROR); 83 84 if (c == '(') 85 RETURN(TOKEN_PATTERN_OPEN_PAREN); 86 else 87 RETURN(TOKEN_ERROR); 88 } 89 RETURN(TOKEN_ERROR); 90 91 default : 92 if (isdigit(c) || c == '-') 93 { 94 int have_nondigits = 0; 95 int have_digits = 0; 96 int have_floating_point = 0; 97 98 TOKEN_START(1); 99 100 do 101 { 102 if (isdigit(c)) 103 have_digits = 1; 104 else if (c == '.') 105 have_floating_point++; 106 TOKEN_APPEND(c); 107 108 c = NEXT_CHAR; 109 110 if (c != EOF && !isdigit(c) && !isspace(c) && c != '.' && !strchr(delims, c)) 111 have_nondigits = 1; 112 } while (c != EOF && !isspace(c) && !strchr(delims, c)); 113 114 if (c != EOF) 115 UNGET_CHAR(c); 116 117 TOKEN_STOP; 118 119 if (have_nondigits || !have_digits || have_floating_point > 1) 120 RETURN(TOKEN_SYMBOL); 121 else if (have_floating_point == 1) 122 RETURN(TOKEN_REAL); 123 else 124 RETURN(TOKEN_INTEGER); 125 } 126 else 127 { 128 if (c == '.') 129 { 130 c = NEXT_CHAR; 131 if (c != EOF && !isspace(c) && !strchr(delims, c)) 132 { 133 TOKEN_START(2); 134 TOKEN_APPEND('.'); 135 } 136 else 137 { 138 UNGET_CHAR(c); 139 RETURN(TOKEN_DOT); 140 } 141 } 142 else 143 { 144 TOKEN_START(1); 145 } 146 do 147 { 148 TOKEN_APPEND(c); 149 c = NEXT_CHAR; 150 } while (c != EOF && !isspace(c) && !strchr(delims, c)); 151 if (c != EOF) 152 UNGET_CHAR(c); 153 154 TOKEN_STOP; 155 156 RETURN(TOKEN_SYMBOL); 157 } 158 } 159 160 assert(0); 161 RETURN(TOKEN_ERROR); 162 } 163