/** * psse.c * * Post Scarcity Software Environment: entry point. * * Start up and initialise the environement - just enough to get working * and (ultimately) hand off to the executive. * * * (c) 2026 Simon Brooke * Licensed under GPL version 2.0, or, at your option, any later version. */ #include #include #include #include #include "debug.h" #include "psse.h" #include "io/io.h" #include "memory/node.h" #include "memory/pso.h" #include "memory/tags.h" #include "ops/stack_ops.h" #include "ops/truth.h" #include "payloads/cons.h" #include "payloads/stack.h" void print_banner( ) { fwprintf( stdout, L"Post-Scarcity Software Environment version %s\n\n", VERSION ); } /** * Print command line options to this `stream`. * * @stream the stream to print to. */ void print_options( FILE *stream ) { fwprintf( stream, L"Expected options are:\n" ); fwprintf( stream, L"\t-d\tDump memory to standard out at end of run (copious!);\n" ); fwprintf( stream, L"\t-h\tPrint this message and exit;\n" ); fwprintf( stream, L"\t-p\tShow a prompt (default is no prompt);\n" ); fwprintf( stream, L"\t-s LIMIT\n\t\tSet the maximum stack depth to this LIMIT (int)\n" ); #ifdef DEBUG fwprintf( stream, L"\t-v LEVEL\n\t\tSet verbosity to the specified level (0...512)\n" ); fwprintf( stream, L"\t\tWhere bits are interpreted as follows:\n" ); fwprintf( stream, L"\t\t1\tALLOC;\n" ); fwprintf( stream, L"\t\t2\tARITH;\n" ); fwprintf( stream, L"\t\t4\tBIND;\n" ); fwprintf( stream, L"\t\t8\tBOOTSTRAP;\n" ); fwprintf( stream, L"\t\t16\tEVAL;\n" ); fwprintf( stream, L"\t\t32\tINPUT/OUTPUT;\n" ); fwprintf( stream, L"\t\t64\tLAMBDA;\n" ); fwprintf( stream, L"\t\t128\tREPL;\n" ); fwprintf( stream, L"\t\t256\tSTACK;\n" ); fwprintf( stream, L"\t\t512\tEQUAL.\n" ); #endif } /** * @brief Handle an interrupt signal. * * @param dummy */ void int_handler( int dummy ) { wprintf( L"TODO: handle ctrl-C in a more interesting way\n" ); } /** * The read/eval/print loop. */ void repl( ) { signal( SIGINT, int_handler ); debug_print( L"Entered repl\n", DEBUG_REPL, 0 ); struct pso_pointer env = consp( oblist ) ? oblist : c_cons( oblist, nil ); /* bottom of stack */ struct pso_pointer frame_pointer = make_frame( 1, nil, nil, env ); if ( !nilp( frame_pointer ) ) { // lisp_repl( get_stack_frame( frame_pointer ), frame_pointer, env ); dec_ref( frame_pointer ); } debug_print( L"Leaving repl\n", DEBUG_REPL, 0 ); } /** * main entry point; parse command line arguments, initialise the environment, * and enter the read-eval-print loop. */ int main( int argc, char *argv[] ) { int option; bool dump_at_end = false; bool show_prompt = false; char *infilename = NULL; setlocale( LC_ALL, "" ); if ( initialise_io( ) != 0 ) { fputs( "Failed to initialise I/O subsystem\n", stderr ); exit( 1 ); } while ( ( option = getopt( argc, argv, "dhi:ps:v:" ) ) != -1 ) { switch ( option ) { case 'd': dump_at_end = true; break; case 'h': print_banner( ); print_options( stdout ); exit( 0 ); break; case 'i': infilename = optarg; break; case 'p': show_prompt = true; break; case 's': stack_limit = atoi( optarg ); break; case 'v': verbosity = atoi( optarg ); break; default: fwprintf( stderr, L"Unexpected option %c\n", option ); print_options( stderr ); exit( 1 ); break; } } oblist = initialise_node( 0 ); debug_print( L"Oblist: ", DEBUG_BOOTSTRAP, 0 ); debug_print_object( oblist, DEBUG_BOOTSTRAP, 0 ); debug_println( DEBUG_BOOTSTRAP ); if ( nilp( oblist ) ) { fputs( "Failed to initialise node\n", stderr ); exit( 1 ); } // repl( ); exit( 0 ); }