mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-11 23:07:36 +02:00
Bytevector parsing
This commit is contained in:
parent
a492ea820c
commit
7ddb9f3ce6
2 changed files with 57 additions and 23 deletions
20
read.scm
20
read.scm
|
@ -759,16 +759,16 @@
|
||||||
(list->vector (reverse lis)))
|
(list->vector (reverse lis)))
|
||||||
(else
|
(else
|
||||||
(loop (cons t lis) (parse2 fp))))))))
|
(loop (cons t lis) (parse2 fp))))))))
|
||||||
;;((bytevector? token)
|
((bytevector? token)
|
||||||
;; (let loop ((lis '())
|
(let loop ((lis '())
|
||||||
;; (t (parse2 fp)))
|
(t (parse2 fp)))
|
||||||
;; (cond
|
(cond
|
||||||
;; ((eof-object? t)
|
((eof-object? t)
|
||||||
;; (error "missing closing parenthesis"))
|
(error "missing closing parenthesis"))
|
||||||
;; ((eq? t #\))
|
((eq? t #\))
|
||||||
;; (list->vector (reverse lis)))
|
(apply bytevector (reverse lis)))
|
||||||
;; (else
|
(else
|
||||||
;; (loop (cons t lis) (parse2 fp))))))
|
(loop (cons t lis) (parse2 fp))))))
|
||||||
((eq? token #\')
|
((eq? token #\')
|
||||||
(list 'quote (parse2 fp)))
|
(list 'quote (parse2 fp)))
|
||||||
((eq? token #\`)
|
((eq? token #\`)
|
||||||
|
|
60
runtime.c
60
runtime.c
|
@ -5995,13 +5995,7 @@ void Cyc_io_read_token(void *data, object cont, object port)
|
||||||
_read_next_char(data, cont, p); // Fill buffer
|
_read_next_char(data, cont, p); // Fill buffer
|
||||||
c = p->mem_buf[p->buf_idx++];
|
c = p->mem_buf[p->buf_idx++];
|
||||||
p->col_num++;
|
p->col_num++;
|
||||||
if (c == '|') { // Block comment
|
if (c == 't') {
|
||||||
_read_multiline_comment(p);
|
|
||||||
continue;
|
|
||||||
} else if (c == ';') { // Datum comment
|
|
||||||
object sym = find_or_add_symbol("#;");
|
|
||||||
return_thread_runnable(data, sym);
|
|
||||||
} else if (c == 't') {
|
|
||||||
if ((p->mem_buf_len - p->buf_idx) >= 3 &&
|
if ((p->mem_buf_len - p->buf_idx) >= 3 &&
|
||||||
p->mem_buf[p->buf_idx + 0] == 'r' &&
|
p->mem_buf[p->buf_idx + 0] == 'r' &&
|
||||||
p->mem_buf[p->buf_idx + 1] == 'u' &&
|
p->mem_buf[p->buf_idx + 1] == 'u' &&
|
||||||
|
@ -6021,15 +6015,55 @@ void Cyc_io_read_token(void *data, object cont, object port)
|
||||||
}
|
}
|
||||||
return_thread_runnable(data, boolean_f);
|
return_thread_runnable(data, boolean_f);
|
||||||
// TODO: numbers
|
// TODO: numbers
|
||||||
// TODO: bytevector
|
/*
|
||||||
// TODO: vector
|
((eq? #\e next-c)
|
||||||
} else if (c == '(') {
|
(parse-number fp toks all? parens ptbl
|
||||||
|
10 (lambda (num)
|
||||||
|
(exact
|
||||||
|
(string->number (list->string num))))))
|
||||||
|
((eq? #\i next-c)
|
||||||
|
(parse-number fp toks all? parens ptbl
|
||||||
|
10 (lambda (num)
|
||||||
|
(inexact
|
||||||
|
(string->number (list->string num))))))
|
||||||
|
((eq? #\b next-c)
|
||||||
|
(parse-number fp toks all? parens ptbl
|
||||||
|
2 (lambda (num) (string->number (list->string num) 2))))
|
||||||
|
((eq? #\o next-c)
|
||||||
|
(parse-number fp toks all? parens ptbl
|
||||||
|
8 (lambda (num) (string->number (list->string num) 8))))
|
||||||
|
((eq? #\x next-c)
|
||||||
|
(parse-number fp toks all? parens ptbl
|
||||||
|
16 (lambda (num) (string->number (list->string num) 16))))
|
||||||
|
*/
|
||||||
|
} else if (c == '(') { // Vector
|
||||||
make_empty_vector(vec);
|
make_empty_vector(vec);
|
||||||
return_thread_runnable(data, &vec);
|
return_thread_runnable(data, &vec);
|
||||||
}
|
} else if (c == 'u') { // Bytevector
|
||||||
|
_read_next_char(data, cont, p); // Fill buffer
|
||||||
|
c = p->mem_buf[p->buf_idx++];
|
||||||
|
p->col_num++;
|
||||||
|
if (c == '8') {
|
||||||
|
_read_next_char(data, cont, p); // Fill buffer
|
||||||
|
c = p->mem_buf[p->buf_idx++];
|
||||||
|
p->col_num++;
|
||||||
|
if (c == '(') {
|
||||||
|
make_empty_bytevector(vec);
|
||||||
|
return_thread_runnable(data, &vec);
|
||||||
|
} else {
|
||||||
|
_read_error(data, p, "Unhandled input sequence");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_read_error(data, p, "Unhandled input sequence");
|
||||||
|
}
|
||||||
// TODO: character
|
// TODO: character
|
||||||
// TODO: datum comment
|
} else if (c == '|') { // Block comment
|
||||||
{
|
_read_multiline_comment(p);
|
||||||
|
continue;
|
||||||
|
} else if (c == ';') { // Datum comment
|
||||||
|
object sym = find_or_add_symbol("#;");
|
||||||
|
return_thread_runnable(data, sym);
|
||||||
|
} else {
|
||||||
char buf[31];
|
char buf[31];
|
||||||
snprintf(buf, 30, "Unhandled input sequence %c", c);
|
snprintf(buf, 30, "Unhandled input sequence %c", c);
|
||||||
_read_error(data, p, buf);
|
_read_error(data, p, buf);
|
||||||
|
|
Loading…
Add table
Reference in a new issue