It compiles. It runs. Nothing works, but it also doesn't crash. Victory!
This commit is contained in:
parent
8d2acbeb0f
commit
aa0d60bbed
20 changed files with 390 additions and 244 deletions
|
|
@ -32,6 +32,7 @@
|
|||
#include "memory/pso2.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "payloads/exception.h"
|
||||
#include "payloads/function.h"
|
||||
#include "payloads/integer.h"
|
||||
#include "payloads/read_stream.h"
|
||||
|
|
@ -73,12 +74,7 @@
|
|||
* 1. The read table currently in use;
|
||||
* 2. The character most recently read from that stream.
|
||||
*/
|
||||
struct pso_pointer read_example(
|
||||
#ifndef MANAGED_POINTER_ONLY
|
||||
struct pso4 *frame,
|
||||
#endif
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ) {
|
||||
struct pso_pointer read_example( struct pso_pointer frame_pointer ) {
|
||||
struct pso4 *frame = pointer_to_pso4( frame_pointer );
|
||||
struct pso_pointer stream = fetch_arg( frame, 0 );
|
||||
struct pso_pointer readtable = fetch_arg( frame, 1 );
|
||||
|
|
@ -88,6 +84,31 @@ struct pso_pointer read_example(
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function: return the next character from the stream indicated by arg 0;
|
||||
* further arguments are ignored.
|
||||
*
|
||||
* * (read-char stream)
|
||||
*
|
||||
* @param frame my stack frame.
|
||||
* @param frame_pointer a pointer to my stack frame.
|
||||
* @param env my environment.
|
||||
* @return a string of one character, namely the next available character
|
||||
* on my stream, if any, else nil.
|
||||
*/
|
||||
struct pso_pointer read_character( struct pso_pointer frame_pointer ) {
|
||||
struct pso4 *frame = pointer_to_pso4( frame_pointer );
|
||||
struct pso_pointer result = nil;
|
||||
struct pso_pointer stream_pointer = fetch_arg( frame, 0 );
|
||||
if ( readp( stream_pointer ) ) {
|
||||
result = make_string( frame_pointer,
|
||||
url_fgetwc( stream_get_url_file
|
||||
( stream_pointer ) ), nil );
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read one integer from the stream and return it.
|
||||
*
|
||||
|
|
@ -111,7 +132,8 @@ struct pso_pointer read_number( struct pso_pointer frame_pointer ) {
|
|||
|
||||
if ( readp( stream ) ) {
|
||||
if ( c_nilp( character ) ) {
|
||||
character = get_character( stream );
|
||||
character =
|
||||
read_character( make_frame( 1, frame_pointer, stream ) );
|
||||
}
|
||||
char32_t c = c_nilp( character )
|
||||
? 0 : pointer_to_object( character )->payload.character.character;
|
||||
|
|
@ -137,7 +159,8 @@ struct pso_pointer read_symbol( struct pso_pointer frame_pointer ) {
|
|||
|
||||
if ( readp( stream ) ) {
|
||||
if ( c_nilp( character ) ) {
|
||||
character = get_character( stream );
|
||||
character =
|
||||
read_character( make_frame( 1, frame_pointer, stream ) );
|
||||
}
|
||||
|
||||
char32_t c = c_nilp( character )
|
||||
|
|
@ -186,7 +209,7 @@ struct pso_pointer read( struct pso_pointer frame_pointer ) {
|
|||
}
|
||||
|
||||
if ( c_nilp( character ) ) {
|
||||
character = get_character( stream );
|
||||
character = read_character( make_frame( 1, frame_pointer, stream ) );
|
||||
}
|
||||
|
||||
struct pso_pointer readmacro = c_assoc( character, readtable );
|
||||
|
|
@ -205,12 +228,10 @@ struct pso_pointer read( struct pso_pointer frame_pointer ) {
|
|||
/* skip all characters from semi-colon to the end of the line */
|
||||
break;
|
||||
case EOF:
|
||||
// result = throw_exception( c_string_to_lisp_symbol(
|
||||
// L"read" ),
|
||||
// c_string_to_lisp_string
|
||||
// ( L"End of input while
|
||||
// reading" ),
|
||||
// frame_pointer );
|
||||
result = make_exception( make_frame( 1, frame_pointer,
|
||||
c_string_to_lisp_string
|
||||
( frame_pointer,
|
||||
L"Read: end of input while reading" ) ) );
|
||||
break;
|
||||
default:
|
||||
struct pso_pointer next = make_frame( 3, frame_pointer, stream,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue