1 /* Copyright (C) 2013 MORIOKA Tomohiko
2 This file is part of the CONCORD Library.
4 The CONCORD Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The CONCORD Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the CONCORD Library; if not, write to the Free
16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
37 cos_skip_space (unsigned char *str, size_t len, size_t start, size_t* endp)
41 while ( ( i < len ) && isspace (str[i]) )
50 cos_read_int (unsigned char *str, size_t len, size_t start, size_t* endp)
73 if ( (i < len) && (c = str[i++])
74 && ('0' <= c) && (c <= '9') )
81 if ( ('0' <= c) && (c <= '9') )
83 dest = dest * 10 + c - '0';
86 else if ( is_delimiter (c) )
89 return cos_make_int ( negative_flag ? - dest : dest );
95 return cos_make_int ( negative_flag ? - dest : dest );
103 cos_read_utf8 (unsigned char *str, size_t len, size_t start, size_t* endp)
109 unsigned char c = str[i++];
144 if (counter + i <= len)
148 for (j = 0; j < counter; j++)
149 cid = (cid << 6) | (str[i++] & 0x3F);
158 cos_read_char (unsigned char *str, size_t len, size_t start, size_t* endp)
162 if ( (len >= start + 2) && (str[i++] == '?') )
164 if ( (len >= start + 3) && (str[i] == '\\') )
167 return cos_read_utf8 (str, len, i, endp);
170 return cos_read_utf8 (str, len, i, endp);
178 cos_read_string (unsigned char *str, size_t len, size_t start, size_t* endp)
183 if ( (len >= start + 2) && (str[i++] == '"') )
186 && ( (c = cos_read_utf8 (str, len, i, &i)) >= 0 )
192 return cos_make_string ((char*)&str[start + 1], i - 2 - start);
194 else if ( c == '\\' )
197 if ( cos_read_utf8 (str, len, i, &i) < 0 )
207 cos_read_symbol (unsigned char *str, size_t len, size_t start, size_t* endp)
215 && ( (c = cos_read_utf8 (str, len, i, &i)) >= 0 )
218 if ( is_delimiter (c) )
227 cos_intern (cos_make_string (&str[start], i - start));
230 else if ( c == '\\' )
233 if ( cos_read_utf8 (str, len, i, &i) < 0 )
243 return cos_intern (cos_make_string (&str[start], i - start));
249 cos_read_list0 (unsigned char *str, size_t len, size_t start, size_t* endp)
253 i = cos_skip_space (str, len, i, endp);
254 if ( len >= start + 1 )
256 COS_object car = cos_read_object (str, len, i, endp);
262 i = cos_skip_space (str, len, i, endp);
266 return cos_cons (car, cos_Qnil);
268 else if ( str[i] == '.' )
273 if ( isspace (str[i])
276 || ( str[i] == '(' ) )
278 cdr = cos_read_object (str, len, i, endp);
282 i = cos_skip_space (str, len, i, endp);
286 return cos_cons (car, cdr);
288 cos_release_object (car);
289 cos_release_object (cdr);
294 cos_release_object (car);
302 rest = cos_read_list0 (str, len, i, endp);
305 return cos_cons (car, rest);
312 cos_read_list (unsigned char *str, size_t len, size_t start, size_t* endp)
316 i = cos_skip_space (str, len, i, endp);
317 if ( (len >= start + 2) && (str[i++] == '(') )
319 return cos_read_list0 (str, len, i, endp);
326 cos_read_object (unsigned char *str, size_t len, size_t start, size_t* endp)
332 start = cos_skip_space (str, len, start, endp);
334 val_obj = cos_read_list (str, len, start, endp);
335 if ( val_obj != NULL )
338 val_obj = cos_read_int (str, len, start, endp);
339 if ( val_obj != NULL )
342 val_cid = cos_read_char (str, len, start, endp);
344 return cos_make_char (val_cid);
346 val_str = cos_read_string (str, len, start, endp);
347 if ( val_str != NULL )
350 val_obj = cos_read_symbol (str, len, start, endp);
351 if ( val_obj != NULL )