It compiles. It runs. Nothing works, but it also doesn't crash. Victory!

This commit is contained in:
Simon Brooke 2026-04-23 11:50:30 +01:00
parent 8d2acbeb0f
commit aa0d60bbed
20 changed files with 390 additions and 244 deletions

View file

@ -39,3 +39,8 @@ struct pso_pointer make_integer( struct pso_pointer frame_pointer,
return result;
}
struct pso_pointer acquire_integer( struct pso_pointer frame_pointer,
int64_t value ) {
return make_integer( frame_pointer, value );
}

View file

@ -27,5 +27,7 @@ struct integer_payload {
struct pso_pointer make_integer( struct pso_pointer frame_pointer,
int64_t value );
struct pso_pointer acquire_integer( struct pso_pointer frame_pointer,
int64_t value );
#endif

View file

@ -42,7 +42,6 @@ struct pso_pointer make_frame( int arg_count, struct pso_pointer previous,
va_list args;
va_start( args, previous );
struct pso4 *prev_frame = pointer_to_pso4( previous );
struct pso_pointer new_pointer = allocate( previous, STACKTAG, 4 );
struct pso4 *new_frame = pointer_to_pso4( new_pointer );
@ -53,9 +52,9 @@ struct pso_pointer make_frame( int arg_count, struct pso_pointer previous,
arg_count, new_pointer.page, new_pointer.offset );
#endif
prev_frame->payload.stack_frame.previous = previous;
if ( stackp( previous ) ) {
struct pso4 *prev_frame = pointer_to_pso4( previous );
new_frame->payload.stack_frame.depth =
prev_frame->payload.stack_frame.depth + 1;
new_frame->payload.stack_frame.env =
@ -193,8 +192,8 @@ struct pso_pointer make_frame_with_arglist_and_env( struct pso_pointer
struct pso_pointer arg_length =
length( make_frame( 1, previous, argvalues ) );
int arg_count =
integerp( arg_length ) ? pointer_to_object( arg_length )->
payload.integer.value : 0;
integerp( arg_length ) ? pointer_to_object( arg_length )->payload.
integer.value : 0;
#ifdef DEBUG
debug_printf( DEBUG_ALLOC, 0,
L"\nAllocating stack frame with %d arguments at page %d, "
@ -252,8 +251,8 @@ struct pso_pointer make_frame_with_arglist( struct pso_pointer previous,
struct pso_pointer argvalues ) {
return make_frame_with_arglist_and_env( previous, argvalues,
pointer_to_pso4
( previous )->payload.stack_frame.
env );
( previous )->payload.
stack_frame.env );
}

57
src/c/payloads/time.c Normal file
View file

@ -0,0 +1,57 @@
/**
* payloads/time.c
*
* A time record.
*
* (c) 2026 Simon Brooke <simon@journeyman.cc>
* Licensed under GPL version 2.0, or, at your option, any later version.
*/
#include <stdlib.h>
#include <time.h>
#include "memory/tags.h"
#include "memory/pointer.h"
#include "memory/pso.h"
#include "memory/pso2.h"
#include "memory/tags.h"
#include "payloads/integer.h"
#include "payloads/stack.h"
#include "payloads/time.h"
#define _GNU_SOURCE
#define seconds_per_year 31557600L
/**
* PSSE Lisp epoch is 14 Bn years, or 441,806,400,000,000,000 seconds, before
* the UNIX epoch; the value in microseconds will break the C reader.
*/
unsigned __int128 epoch_offset =
( ( __int128 ) ( seconds_per_year * 1000000000L ) *
( __int128 ) ( 14L * 1000000000L ) );
unsigned __int128 unix_time_to_lisp_time( time_t t ) {
unsigned __int128 result = epoch_offset + ( t * 1000000000 );
return result;
}
struct pso_pointer make_time( struct pso_pointer frame_pointer,
struct pso_pointer specification ) {
struct pso_pointer result = allocate( frame_pointer, TIMETAG, 2 );
struct pso2 *cell = pointer_to_object( result );
if ( integerp( specification ) ) {
cell->payload.time.value =
pointer_to_object( specification )->payload.integer.value;
} else {
cell->payload.time.value = unix_time_to_lisp_time( time( NULL ) );
}
return result;
}

View file

@ -1,14 +1,14 @@
/**
* payloads/cons.h
* payloads/time.h
*
* A cons cell.
* A timee record.
*
* (c) 2026 Simon Brooke <simon@journeyman.cc>
* Licensed under GPL version 2.0, or, at your option, any later version.
*/
#ifndef __psse_payloads_cons_h
#define __psse_payloads_cons_h
#ifndef __psse_payloads_time_h
#define __psse_payloads_time_h
#include <ctype.h>
#include <stdint.h>
@ -31,4 +31,7 @@ struct time_payload {
unsigned __int128 value;
};
struct pso_pointer make_time( struct pso_pointer stack_frame,
struct pso_pointer time );
#endif