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
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
57
src/c/payloads/time.c
Normal 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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue