adding \e character escape
calling GC_init when appropriate fixing some ios bugs adding ios_static_buffer
This commit is contained in:
parent
0d643a05fe
commit
9e07001ae0
|
@ -2266,6 +2266,9 @@ value_t fl_toplevel_eval(value_t expr)
|
||||||
|
|
||||||
void fl_init(size_t initial_heapsize)
|
void fl_init(size_t initial_heapsize)
|
||||||
{
|
{
|
||||||
|
#ifdef BOEHM_GC
|
||||||
|
GC_init();
|
||||||
|
#endif
|
||||||
lisp_init(initial_heapsize);
|
lisp_init(initial_heapsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "dtypes.h"
|
#include "dtypes.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
char *uint2str(char *dest, size_t len, uint64_t num, uint32_t base)
|
char *uint2str(char *dest, size_t len, uint64_t num, uint32_t base)
|
||||||
{
|
{
|
||||||
|
|
66
llt/ios.c
66
llt/ios.c
|
@ -249,19 +249,19 @@ static size_t _ios_read(ios_t *s, char *dest, size_t n, int all)
|
||||||
while (n > 0) {
|
while (n > 0) {
|
||||||
avail = s->size - s->bpos;
|
avail = s->size - s->bpos;
|
||||||
|
|
||||||
if (avail >= n) {
|
|
||||||
memcpy(dest, s->buf + s->bpos, n);
|
|
||||||
s->bpos += n;
|
|
||||||
return tot+n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (avail > 0) {
|
if (avail > 0) {
|
||||||
memcpy(dest, s->buf + s->bpos, avail);
|
size_t ncopy = (avail >= n) ? n : avail;
|
||||||
|
memcpy(dest, s->buf + s->bpos, ncopy);
|
||||||
|
s->bpos += ncopy;
|
||||||
|
if (ncopy >= n) {
|
||||||
|
s->state = bst_rd;
|
||||||
|
return tot+ncopy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (s->bm == bm_mem || s->fd == -1) {
|
if (s->bm == bm_mem || s->fd == -1) {
|
||||||
// can't get any more data
|
// can't get any more data
|
||||||
s->bpos += avail;
|
s->state = bst_rd;
|
||||||
if (avail == 0 && n > 0)
|
if (avail == 0)
|
||||||
s->_eof = 1;
|
s->_eof = 1;
|
||||||
return avail;
|
return avail;
|
||||||
}
|
}
|
||||||
|
@ -362,10 +362,16 @@ size_t ios_write(ios_t *s, char *data, size_t n)
|
||||||
size_t wrote = 0;
|
size_t wrote = 0;
|
||||||
|
|
||||||
if (s->state == bst_none) s->state = bst_wr;
|
if (s->state == bst_none) s->state = bst_wr;
|
||||||
if (s->state == bst_wr)
|
if (s->state == bst_rd) {
|
||||||
space = s->maxsize - s->bpos;
|
if (!s->rereadable) {
|
||||||
else
|
s->size = 0;
|
||||||
|
s->bpos = 0;
|
||||||
|
}
|
||||||
space = s->size - s->bpos;
|
space = s->size - s->bpos;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
space = s->maxsize - s->bpos;
|
||||||
|
}
|
||||||
|
|
||||||
if (s->bm == bm_mem) {
|
if (s->bm == bm_mem) {
|
||||||
wrote = _write_grow(s, data, n);
|
wrote = _write_grow(s, data, n);
|
||||||
|
@ -766,6 +772,15 @@ ios_t *ios_str(ios_t *s, char *str)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ios_t *ios_static_buffer(ios_t *s, char *buf, size_t sz)
|
||||||
|
{
|
||||||
|
ios_mem(s, 0);
|
||||||
|
ios_setbuf(s, buf, sz, 0);
|
||||||
|
s->size = sz;
|
||||||
|
ios_set_readonly(s);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
ios_t *ios_fd(ios_t *s, long fd, int isfile)
|
ios_t *ios_fd(ios_t *s, long fd, int isfile)
|
||||||
{
|
{
|
||||||
_ios_init(s);
|
_ios_init(s);
|
||||||
|
@ -812,23 +827,26 @@ int ios_putc(int c, ios_t *s)
|
||||||
|
|
||||||
int ios_getc(ios_t *s)
|
int ios_getc(ios_t *s)
|
||||||
{
|
{
|
||||||
if (s->bpos < s->size)
|
|
||||||
return s->buf[s->bpos++];
|
|
||||||
if (s->_eof) return IOS_EOF;
|
|
||||||
char ch;
|
char ch;
|
||||||
|
if (s->state == bst_rd && s->bpos < s->size) {
|
||||||
|
ch = s->buf[s->bpos++];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (s->_eof) return IOS_EOF;
|
||||||
if (ios_read(s, &ch, 1) < 1)
|
if (ios_read(s, &ch, 1) < 1)
|
||||||
return IOS_EOF;
|
return IOS_EOF;
|
||||||
return (int)ch;
|
}
|
||||||
|
return (unsigned char)ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ios_peekc(ios_t *s)
|
int ios_peekc(ios_t *s)
|
||||||
{
|
{
|
||||||
if (s->bpos < s->size)
|
if (s->bpos < s->size)
|
||||||
return s->buf[s->bpos];
|
return (unsigned char)s->buf[s->bpos];
|
||||||
if (s->_eof) return IOS_EOF;
|
if (s->_eof) return IOS_EOF;
|
||||||
size_t n = ios_readprep(s, 1);
|
size_t n = ios_readprep(s, 1);
|
||||||
if (n == 0) return IOS_EOF;
|
if (n == 0) return IOS_EOF;
|
||||||
return s->buf[s->bpos];
|
return (unsigned char)s->buf[s->bpos];
|
||||||
}
|
}
|
||||||
|
|
||||||
int ios_ungetc(int c, ios_t *s)
|
int ios_ungetc(int c, ios_t *s)
|
||||||
|
@ -863,11 +881,11 @@ int ios_getutf8(ios_t *s, uint32_t *pwc)
|
||||||
if (c == IOS_EOF)
|
if (c == IOS_EOF)
|
||||||
return IOS_EOF;
|
return IOS_EOF;
|
||||||
c0 = (char)c;
|
c0 = (char)c;
|
||||||
sz = u8_seqlen(&c0)-1;
|
if ((unsigned char)c0 < 0x80) {
|
||||||
if (sz == 0) {
|
*pwc = (uint32_t)(unsigned char)c0;
|
||||||
*pwc = (uint32_t)c0;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
sz = u8_seqlen(&c0)-1;
|
||||||
if (ios_ungetc(c, s) == IOS_EOF)
|
if (ios_ungetc(c, s) == IOS_EOF)
|
||||||
return IOS_EOF;
|
return IOS_EOF;
|
||||||
if (ios_readprep(s, sz) < sz)
|
if (ios_readprep(s, sz) < sz)
|
||||||
|
@ -889,11 +907,11 @@ int ios_peekutf8(ios_t *s, uint32_t *pwc)
|
||||||
if (c == IOS_EOF)
|
if (c == IOS_EOF)
|
||||||
return IOS_EOF;
|
return IOS_EOF;
|
||||||
c0 = (char)c;
|
c0 = (char)c;
|
||||||
sz = u8_seqlen(&c0)-1;
|
if ((unsigned char)c0 < 0x80) {
|
||||||
if (sz == 0) {
|
*pwc = (uint32_t)(unsigned char)c0;
|
||||||
*pwc = (uint32_t)c0;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
sz = u8_seqlen(&c0)-1;
|
||||||
if (ios_readprep(s, sz) < sz)
|
if (ios_readprep(s, sz) < sz)
|
||||||
return IOS_EOF;
|
return IOS_EOF;
|
||||||
size_t i = s->bpos;
|
size_t i = s->bpos;
|
||||||
|
|
|
@ -93,6 +93,7 @@ size_t ios_readprep(ios_t *from, size_t n);
|
||||||
ios_t *ios_file(ios_t *s, char *fname, int rd, int wr, int create, int trunc);
|
ios_t *ios_file(ios_t *s, char *fname, int rd, int wr, int create, int trunc);
|
||||||
ios_t *ios_mem(ios_t *s, size_t initsize);
|
ios_t *ios_mem(ios_t *s, size_t initsize);
|
||||||
ios_t *ios_str(ios_t *s, char *str);
|
ios_t *ios_str(ios_t *s, char *str);
|
||||||
|
ios_t *ios_static_buffer(ios_t *s, char *buf, size_t sz);
|
||||||
ios_t *ios_fd(ios_t *s, long fd, int isfile);
|
ios_t *ios_fd(ios_t *s, long fd, int isfile);
|
||||||
// todo: ios_socket
|
// todo: ios_socket
|
||||||
extern ios_t *ios_stdin;
|
extern ios_t *ios_stdin;
|
||||||
|
|
|
@ -50,8 +50,6 @@ int open_tcp_port(short portno)
|
||||||
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
serv_addr.sin_port = htons(portno);
|
serv_addr.sin_port = htons(portno);
|
||||||
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
|
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
|
||||||
fprintf(stderr, "could not bind to port %d.\n",
|
|
||||||
portno);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -337,6 +337,8 @@ char read_escape_control_char(char c)
|
||||||
return '\t';
|
return '\t';
|
||||||
else if (c == 'r')
|
else if (c == 'r')
|
||||||
return '\r';
|
return '\r';
|
||||||
|
else if (c == 'e')
|
||||||
|
return '\e';
|
||||||
else if (c == 'b')
|
else if (c == 'b')
|
||||||
return '\b';
|
return '\b';
|
||||||
else if (c == 'f')
|
else if (c == 'f')
|
||||||
|
@ -432,6 +434,8 @@ int u8_escape_wchar(char *buf, size_t sz, u_int32_t ch)
|
||||||
return buf_put2c(buf, "\\t");
|
return buf_put2c(buf, "\\t");
|
||||||
else if (ch == L'\r')
|
else if (ch == L'\r')
|
||||||
return buf_put2c(buf, "\\r");
|
return buf_put2c(buf, "\\r");
|
||||||
|
else if (ch == L'\e')
|
||||||
|
return buf_put2c(buf, "\\e");
|
||||||
else if (ch == L'\b')
|
else if (ch == L'\b')
|
||||||
return buf_put2c(buf, "\\b");
|
return buf_put2c(buf, "\\b");
|
||||||
else if (ch == L'\f')
|
else if (ch == L'\f')
|
||||||
|
|
Loading…
Reference in New Issue