1 static int
SCAN_FUNC_NAME(lisp_stream_t * stream)2 SCAN_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