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:
Simon Brooke 2026-05-07 06:47:58 +01:00
parent 6b89779bab
commit d1bfb029b8
12 changed files with 141 additions and 72 deletions

View file

@ -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,