Work on ensuring new objects are clean, but not sure it's successful.
Also, start on setting up the read ACL on new objects.
This commit is contained in:
parent
6b89779bab
commit
d1bfb029b8
12 changed files with 141 additions and 72 deletions
|
|
@ -87,11 +87,11 @@ struct pso_pointer read_example( struct pso_pointer frame_pointer ) {
|
|||
return result;
|
||||
}
|
||||
|
||||
struct pso_pointer make_eof_exception( struct pso_pointer frame_pointer) {
|
||||
struct pso_pointer make_eof_exception( struct pso_pointer frame_pointer ) {
|
||||
return make_exception( make_frame( 1, frame_pointer,
|
||||
c_string_to_lisp_string
|
||||
( frame_pointer,
|
||||
L"Read: end of input while reading" ) ) );
|
||||
c_string_to_lisp_string
|
||||
( frame_pointer,
|
||||
L"Read: end of input while reading" ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -135,19 +135,25 @@ struct pso_pointer skip_whitespace( struct pso_pointer frame_pointer ) {
|
|||
struct pso_pointer character = fetch_arg( frame, 2 );
|
||||
struct pso_pointer result = nil;
|
||||
|
||||
if (characterp(character)) {
|
||||
wchar_t wc = pointer_to_object(character)->payload.character.character;
|
||||
if (!iswspace( wc) && wc != L',') {
|
||||
if ( characterp( character ) ) {
|
||||
wchar_t wc =
|
||||
pointer_to_object( character )->payload.character.character;
|
||||
if ( !iswspace( wc ) && wc != L',' ) {
|
||||
result = character;
|
||||
}
|
||||
}
|
||||
|
||||
if (c_nilp( result) && readp( stream)) {
|
||||
URL_FILE* input = pointer_to_object(stream)->payload.stream.stream;
|
||||
if ( c_nilp( result ) && readp( stream ) ) {
|
||||
URL_FILE *input = pointer_to_object( stream )->payload.stream.stream;
|
||||
|
||||
wint_t wc = url_fgetwc( input);
|
||||
while ( iswspace(wc) || wc==L',') { wc = url_fgetwc( input); }
|
||||
result = (wc == WEOF) ? make_eof_exception(frame_pointer) : make_character(frame_pointer, wc);
|
||||
wint_t wc = url_fgetwc( input );
|
||||
while ( iswspace( wc ) || wc == L',' ) {
|
||||
wc = url_fgetwc( input );
|
||||
}
|
||||
result =
|
||||
( wc ==
|
||||
WEOF ) ? make_eof_exception( frame_pointer ) :
|
||||
make_character( frame_pointer, wc );
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
@ -160,30 +166,41 @@ struct pso_pointer read_list( struct pso_pointer frame_pointer ) {
|
|||
struct pso_pointer character = fetch_arg( frame, 2 );
|
||||
struct pso_pointer result = nil;
|
||||
|
||||
if (!c_nilp(character) && characterp(character) &&
|
||||
pointer_to_object(character)->payload.character.character == SYNTAX_LPAR) {
|
||||
if ( !c_nilp( character ) && characterp( character ) &&
|
||||
pointer_to_object( character )->payload.character.character ==
|
||||
SYNTAX_LPAR ) {
|
||||
// it's OK if an LPAR is passed in, but we don't want it now.
|
||||
character = nil;
|
||||
}
|
||||
if (!c_nilp( character)) {
|
||||
if ( !c_nilp( character ) ) {
|
||||
// if anything other than LPAR is passed in as character, TODO: throw exception.
|
||||
}
|
||||
|
||||
while ( c_nilp(character) || (characterp(character) &&
|
||||
pointer_to_object(character)->payload.character.character != SYNTAX_RPAR)) {
|
||||
character = skip_whitespace( make_frame(3, frame_pointer, stream, readtable, character));
|
||||
struct pso_pointer r = read( make_frame(3, frame_pointer, stream, readtable, character));
|
||||
while ( c_nilp( character ) || ( characterp( character ) &&
|
||||
pointer_to_object( character )->
|
||||
payload.character.character !=
|
||||
SYNTAX_RPAR ) ) {
|
||||
character =
|
||||
skip_whitespace( make_frame
|
||||
( 3, frame_pointer, stream, readtable,
|
||||
character ) );
|
||||
struct pso_pointer r =
|
||||
read( make_frame
|
||||
( 3, frame_pointer, stream, readtable, character ) );
|
||||
|
||||
if (exceptionp(r)) {
|
||||
result = r;
|
||||
break;
|
||||
} else {
|
||||
result = make_cons( frame_pointer, r, result);
|
||||
character = skip_whitespace( make_frame(3, frame_pointer, stream, readtable, character));
|
||||
}
|
||||
if ( exceptionp( r ) ) {
|
||||
result = r;
|
||||
break;
|
||||
} else {
|
||||
result = make_cons( frame_pointer, r, result );
|
||||
character =
|
||||
skip_whitespace( make_frame
|
||||
( 3, frame_pointer, stream, readtable,
|
||||
character ) );
|
||||
}
|
||||
}
|
||||
|
||||
return consp(result) ? c_reverse( frame_pointer, result) : result;
|
||||
return consp( result ) ? c_reverse( frame_pointer, result ) : result;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -317,10 +334,11 @@ struct pso_pointer read( struct pso_pointer frame_pointer ) {
|
|||
/* skip all characters from semi-colon to the end of the line */
|
||||
break;
|
||||
case SYNTAX_LPAR:
|
||||
result = read_list( make_frame(3, stream, readtable, character));
|
||||
result =
|
||||
read_list( make_frame( 3, stream, readtable, character ) );
|
||||
break;
|
||||
case EOF:
|
||||
result = make_eof_exception(frame_pointer);
|
||||
result = make_eof_exception( frame_pointer );
|
||||
break;
|
||||
default:
|
||||
struct pso_pointer next = make_frame( 3, frame_pointer, stream,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue