I think read will now read integers and symbols, but it's untested.
Everything compiles.
This commit is contained in:
parent
cc8e96eda4
commit
9eb0d3c5a0
28 changed files with 594 additions and 293 deletions
34
src/c/payloads/character.c
Normal file
34
src/c/payloads/character.c
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/**
|
||||
* payloads/character.c
|
||||
*
|
||||
* A character object.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
/*
|
||||
* wide characters
|
||||
*/
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
|
||||
#include "memory/node.h"
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "ops/truth.h"
|
||||
|
||||
#include "payloads/character.h"
|
||||
|
||||
struct pso_pointer make_character( wint_t c) {
|
||||
struct pso_pointer result = allocate( CHARACTERTAG, 2 );
|
||||
|
||||
if (!nilp(result)) {
|
||||
pointer_to_object(result)->payload.character.character = (wchar_t) c;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -36,4 +36,5 @@ struct character_payload {
|
|||
wchar_t character;
|
||||
};
|
||||
|
||||
#endif
|
||||
struct pso_pointer make_character( wint_t c);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "payloads/cons.h"
|
||||
|
|
@ -89,3 +90,19 @@ struct pso_pointer cdr( struct pso_pointer p ) {
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief When a cons cell is freed, its car and cdr pointers must be
|
||||
* decremented.
|
||||
*
|
||||
* Lisp calling conventions; one expected arg, the pointer to the cell to
|
||||
* be destroyed.
|
||||
*/
|
||||
struct pso_pointer destroy_cons( struct pso_pointer fp, struct pso_pointer env) {
|
||||
if (stackp(fp)) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp);
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
dec_ref( car( p));
|
||||
dec_ref( cdr( p));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,6 @@ struct pso_pointer cdr( struct pso_pointer cons );
|
|||
|
||||
struct pso_pointer cons( struct pso_pointer car, struct pso_pointer cdr );
|
||||
|
||||
bool consp( struct pso_pointer ptr );
|
||||
struct pso_pointer destroy_cons( struct pso_pointer fp, struct pso_pointer env);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -11,10 +11,31 @@
|
|||
#include "memory/node.h"
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "payloads/exception.h"
|
||||
|
||||
struct pso_pointer make_exception( struct pso_pointer message, struct pso_pointer frame_pointer, struct pso_pointer cause) {
|
||||
struct pso_pointer make_exception( struct pso_pointer message,
|
||||
struct pso_pointer frame_pointer, struct pso_pointer cause) {
|
||||
// TODO: not yet implemented
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief When an exception is freed, all its pointers must be decremented.
|
||||
*
|
||||
* Lisp calling conventions; one expected arg, the pointer to the object to
|
||||
* be destroyed.
|
||||
*/
|
||||
struct pso_pointer destroy_exception( struct pso_pointer fp,
|
||||
struct pso_pointer env) {
|
||||
if (stackp(fp)) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp);
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
|
||||
// TODO: decrement every pointer indicated by an exception.
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,4 +27,7 @@ struct exception_payload {
|
|||
struct pso_pointer make_exception( struct pso_pointer message,
|
||||
struct pso_pointer frame_pointer, struct pso_pointer cause);
|
||||
|
||||
struct pso_pointer destroy_exception( struct pso_pointer fp,
|
||||
struct pso_pointer env);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -18,8 +18,28 @@
|
|||
|
||||
#include "memory/node.h"
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "ops/string_ops.h"
|
||||
#include "ops/truth.h"
|
||||
|
||||
/**
|
||||
* @brief When an string is freed, its cdr pointer must be decremented.
|
||||
*
|
||||
* Lisp calling conventions; one expected arg, the pointer to the object to
|
||||
* be destroyed.
|
||||
*/
|
||||
struct pso_pointer destroy_string( struct pso_pointer fp,
|
||||
struct pso_pointer env) {
|
||||
if (stackp(fp)) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp);
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
|
||||
dec_ref( cdr(p));
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,4 +35,7 @@ struct string_payload {
|
|||
|
||||
struct pso_pointer make_string( wint_t c, struct pso_pointer tail );
|
||||
|
||||
struct pso_pointer destroy_string( struct pso_pointer fp,
|
||||
struct pso_pointer env);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@
|
|||
|
||||
#include "io/fopen.h"
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -23,7 +26,7 @@
|
|||
*/
|
||||
struct pso_pointer make_read_stream( URL_FILE *input,
|
||||
struct pso_pointer metadata ) {
|
||||
struct pso_pointer pointer = allocate( READTV, 2);
|
||||
struct pso_pointer pointer = allocate( READTAG, 2);
|
||||
struct pso2 *cell = pointer_to_object( pointer );
|
||||
|
||||
cell->payload.stream.stream = input;
|
||||
|
|
|
|||
|
|
@ -29,4 +29,7 @@ struct stream_payload {
|
|||
struct pso_pointer meta;
|
||||
};
|
||||
|
||||
struct pso_pointer make_read_stream( URL_FILE *input,
|
||||
struct pso_pointer metadata );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ struct pso_pointer make_frame( struct pso_pointer previous, ...) {
|
|||
for ( ; cursor < count && cursor < args_in_frame; cursor++) {
|
||||
struct pso_pointer argument = va_arg( args, struct pso_pointer);
|
||||
|
||||
frame->payload.stack_frame.arg[cursor] = argument;
|
||||
frame->payload.stack_frame.arg[cursor] = inc_ref( argument);
|
||||
}
|
||||
if ( cursor < count) {
|
||||
struct pso_pointer more_args = nil;
|
||||
|
|
@ -64,3 +64,31 @@ struct pso_pointer make_frame( struct pso_pointer previous, ...) {
|
|||
|
||||
return frame_pointer;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief When a stack frame is freed, all its pointers must be decremented.
|
||||
*
|
||||
* Lisp calling conventions; one expected arg, the pointer to the object to
|
||||
* be destroyed.
|
||||
*/
|
||||
struct pso_pointer destroy_stack_frame( struct pso_pointer fp,
|
||||
struct pso_pointer env) {
|
||||
if (stackp(fp)) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp);
|
||||
struct pso4 * casualty =
|
||||
pointer_to_pso4( frame->payload.stack_frame.arg[0]);
|
||||
|
||||
dec_ref( casualty->payload.stack_frame.previous);
|
||||
dec_ref( casualty->payload.stack_frame.function);
|
||||
dec_ref( casualty->payload.stack_frame.more);
|
||||
|
||||
for (int i = 0; i < args_in_frame; i++) {
|
||||
dec_ref( casualty->payload.stack_frame.arg[0]);
|
||||
}
|
||||
|
||||
casualty->payload.stack_frame.args = 0;
|
||||
casualty->payload.stack_frame.depth = 0;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,4 +39,7 @@ struct stack_frame_payload {
|
|||
|
||||
struct pso_pointer make_frame( struct pso_pointer previous, ...);
|
||||
|
||||
struct pso_pointer destroy_stack_frame( struct pso_pointer fp,
|
||||
struct pso_pointer env);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue