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
24 cos_skip_space (unsigned char *str, size_t len, size_t start, size_t* endp)
28 while ( ( i < len ) && isspace (str[i]) )
37 cos_read_int (unsigned char *str, size_t len, size_t start, size_t* endp)
60 if ( (i < len) && (c = str[i++])
61 && ('0' <= c) && (c <= '9') )
68 if ( ('0' <= c) && (c <= '9') )
70 dest = dest * 10 + c - '0';
81 return cos_make_int ( negative_flag ? - dest : dest );
87 return cos_make_int ( negative_flag ? - dest : dest );
95 cos_read_utf8 (unsigned char *str, size_t len, size_t start, size_t* endp)
101 unsigned char c = str[i++];
136 if (counter + i <= len)
140 for (j = 0; j < counter; j++)
141 cid = (cid << 6) | (str[i++] & 0x3F);
150 cos_read_char (unsigned char *str, size_t len, size_t start, size_t* endp)
154 if ( (len >= start + 2) && (str[i++] == '?') )
156 if ( (len >= start + 3) && (str[i] == '\\') )
159 return cos_read_utf8 (str, len, i, endp);
162 return cos_read_utf8 (str, len, i, endp);
170 cos_read_string (unsigned char *str, size_t len, size_t start, size_t* endp)
175 if ( (len >= start + 2) && (str[i++] == '"') )
178 && ( (c = cos_read_utf8 (str, len, i, &i)) >= 0 )
183 return cos_make_string ((char*)&str[1], i - 2);
185 else if ( c == '\\' )
188 if ( cos_read_utf8 (str, len, i, &i) < 0 )
198 cos_read_list0 (unsigned char *str, size_t len, size_t start, size_t* endp)
202 i = cos_skip_space (str, len, i, endp);
203 if ( len >= start + 1 )
205 COS_object car = cos_read_object (str, len, i, endp);
211 i = cos_skip_space (str, len, i, endp);
215 return cos_cons (car, cos_Qnil);
217 else if ( str[i] == '.' )
222 if ( isspace (str[i])
225 || ( str[i] == '(' ) )
227 cdr = cos_read_object (str, len, i, endp);
231 i = cos_skip_space (str, len, i, endp);
235 return cos_cons (car, cdr);
237 cos_release_object (car);
238 cos_release_object (cdr);
243 cos_release_object (car);
251 rest = cos_read_list0 (str, len, i, endp);
254 return cos_cons (car, rest);
261 cos_read_list (unsigned char *str, size_t len, size_t start, size_t* endp)
265 i = cos_skip_space (str, len, i, endp);
266 if ( (len >= start + 2) && (str[i++] == '(') )
268 return cos_read_list0 (str, len, i, endp);
275 cos_read_object (unsigned char *str, size_t len, size_t start, size_t* endp)
281 start = cos_skip_space (str, len, start, endp);
283 val_obj = cos_read_int (str, len, start, endp);
284 if ( val_obj != NULL )
287 val_cid = cos_read_char (str, len, start, endp);
289 return cos_make_char (val_cid);
291 val_str = cos_read_string (str, len, start, endp);
292 if ( val_str != NULL )
295 val_obj = cos_read_list (str, len, start, endp);
296 if ( val_obj != NULL )