Closes #18. Change to char32_t everywhere; builds fine, behaviour as before.

This commit is contained in:
Simon Brooke 2026-04-20 12:10:38 +01:00
parent 812a1be7d9
commit c59825d7fe
33 changed files with 116 additions and 76 deletions

View file

@ -37,7 +37,7 @@ int verbosity = 0;
* `level` is non-zero, print this `message`, else don't.
* @param indent print `indent` spaces before the message.
*/
void debug_print( wchar_t *message, int level, int indent ) {
void debug_print( char32_t *message, int level, int indent ) {
#ifdef DEBUG
if ( level & verbosity ) {
fwide( stderr, 1 );
@ -116,7 +116,7 @@ void debug_println( int level ) {
*
* Remaining arguments should match the slots in the format string.
*/
void debug_printf( int level, int indent, wchar_t *format, ... ) {
void debug_printf( int level, int indent, char32_t *format, ... ) {
#ifdef DEBUG
if ( level & verbosity ) {
fwide( stderr, 1 );
@ -172,7 +172,7 @@ void debug_dump_object( struct pso_pointer pointer, int level, int indent ) {
//void debug_print_binding( struct cons_pointer key, struct cons_pointer val,
// bool deep, int level, int indent ) {
//#ifdef DEBUG
// // wchar_t * depth = (deep ? L"Deep" : L"Shallow");
// // char32_t * depth = (deep ? L"Deep" : L"Shallow");
//
// debug_print( ( deep ? L"Deep" : L"Shallow" ), level, indent );
// debug_print( L" binding `", level, indent );

View file

@ -20,6 +20,8 @@
/*
* wide characters
*/
#include <uchar.h>
#include <uchar.h>
#include <wchar.h>
#include <wctype.h>
@ -102,7 +104,7 @@
*/
extern int verbosity;
void debug_print( wchar_t *message, int level, int indent );
void debug_print( char32_t *message, int level, int indent );
void debug_print_object( struct pso_pointer object, int level, int indent );
@ -112,6 +114,6 @@ void debug_print_128bit( __int128_t n, int level );
void debug_println( int level );
void debug_printf( int level, int indent, wchar_t *format, ... );
void debug_printf( int level, int indent, char32_t *format, ... );
#endif

View file

@ -18,6 +18,7 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <uchar.h>
#include <unistd.h>
#include <uuid/uuid.h>
/*
@ -149,6 +150,9 @@ int initialise_io( ) {
}
struct pso_pointer initialise_default_streams( struct pso_pointer env ) {
// todo: issue #21: should this have stack frame passed in?
// It's called in initialisation before everything else is set
// up, so **possibly** not?
lisp_io_in = c_string_to_lisp_symbol( C_IO_IN );
lisp_io_out = c_string_to_lisp_symbol( C_IO_OUT );
lisp_io_log = c_string_to_lisp_symbol( C_IO_LOG );
@ -226,7 +230,7 @@ char *lisp_string_to_c_string( struct pso_pointer s ) {
len++;
}
wchar_t *buffer = calloc( len + 1, sizeof( wchar_t ) );
char32_t *buffer = calloc( len + 1, sizeof( char32_t ) );
/* worst case, one wide char = four utf bytes */
result = calloc( ( len * 4 ) + 1, sizeof( char ) );
@ -268,8 +272,8 @@ wint_t url_fgetwc( URL_FILE *input ) {
case CFTYPE_CURL:{
char *cbuff =
calloc( sizeof( wchar_t ) + 2, sizeof( char ) );
wchar_t *wbuff = calloc( 2, sizeof( wchar_t ) );
calloc( sizeof( char32_t ) + 2, sizeof( char ) );
char32_t *wbuff = calloc( 2, sizeof( char32_t ) );
size_t count = 0;
@ -414,18 +418,20 @@ struct pso_pointer lisp_close( struct pso_pointer frame_pointer,
return result;
}
struct pso_pointer add_meta_integer( struct pso_pointer meta, wchar_t *key,
struct pso_pointer add_meta_integer( struct pso_pointer meta, char32_t *key,
long int value ) {
// todo: issue #21: must have stack frame passed in.
return
c_cons( c_cons
( c_string_to_lisp_keyword( key ), make_integer( value ) ),
meta );
}
struct pso_pointer add_meta_string( struct pso_pointer meta, wchar_t *key,
struct pso_pointer add_meta_string( struct pso_pointer meta, char32_t *key,
char *value ) {
// todo: issue #21: must have stack frame passed in.
value = trim( value );
wchar_t buffer[strlen( value ) + 1];
char32_t buffer[strlen( value ) + 1];
mbstowcs( buffer, value, strlen( value ) + 1 );
return
@ -434,10 +440,9 @@ struct pso_pointer add_meta_string( struct pso_pointer meta, wchar_t *key,
c_string_to_lisp_string( buffer ) ), meta );
}
struct pso_pointer add_meta_time( struct pso_pointer meta, wchar_t *key,
struct pso_pointer add_meta_time( struct pso_pointer meta, char32_t *key,
time_t *value ) {
/* I don't yet have a concept of a date-time object, which is a
* bit of an oversight! */
// todo: issue #21: must have stack frame passed in.
char datestring[256];
strftime( datestring, sizeof( datestring ), nl_langinfo( D_T_FMT ),
@ -469,7 +474,7 @@ static size_t write_meta_callback( char *string, size_t size, size_t nmemb,
// s[offset] = ( char ) 0;
// char *name = trim( s );
// char *value = trim( &s[++offset] );
// wchar_t wname[strlen( name )];
// char32_t wname[strlen( name )];
// mbstowcs( wname, name, strlen( name ) + 1 );
@ -716,7 +721,7 @@ struct pso_pointer lisp_slurp( struct pso_pointer frame_pointer,
debug_println( DEBUG_IO );
struct pso2 *cell = pointer_to_object( cursor );
cursor = make_string( ( wchar_t ) c, nil );
cursor = make_string( ( char32_t ) c, nil );
cell->payload.string.cdr = cursor;
}
}

View file

@ -20,6 +20,7 @@
/*
* wide characters
*/
#include <uchar.h>
#include <wchar.h>
#include <wctype.h>
/* libcurl, used for io */
@ -54,7 +55,7 @@ struct pso_pointer in_write(struct pso_pointer p, URL_FILE *output,
* TODO: this does not yet even nearly cope with all the possible special
* cases.
*/
void write_char( wchar_t wc, URL_FILE * output, bool escape) {
void write_char( char32_t wc, URL_FILE * output, bool escape) {
if (escape && !iswprint(wc)) {
url_fwprintf(output, L"\\%04x", wc);
// url_fputwc(L'\\', output);
@ -79,7 +80,7 @@ struct pso_pointer print_string_like_thing(struct pso_pointer p,
if (keywordp(p) || stringp(p) || symbolp(p)) {
for (struct pso_pointer cursor = p; !nilp(cursor);
cursor = pointer_to_object(cursor)->payload.string.cdr) {
wchar_t wc = pointer_to_object(cursor)->payload.string.character;
char32_t wc = pointer_to_object(cursor)->payload.string.character;
write_char( wc, output, escape);
}

View file

@ -118,7 +118,7 @@ struct pso_pointer read_number(
if ( nilp( character ) ) {
character = get_character( stream );
}
wchar_t c = nilp( character )
char32_t c = nilp( character )
? 0 : pointer_to_object( character )->payload.character.character;
URL_FILE *input = pointer_to_object( stream )->payload.stream.stream;
@ -150,7 +150,7 @@ struct pso_pointer read_symbol(
character = get_character( stream );
}
wchar_t c = nilp( character )
char32_t c = nilp( character )
? 0 : pointer_to_object( character )->payload.character.character;
URL_FILE *input = pointer_to_object( stream )->payload.stream.stream;
@ -207,7 +207,7 @@ struct pso_pointer read(
if ( !nilp( readmacro ) ) {
// invoke the read macro on the stream
} else if ( readp( stream ) && characterp( character ) ) {
wchar_t c =
char32_t c =
pointer_to_object( character )->payload.character.character;
URL_FILE *input = pointer_to_object( stream )->payload.stream.stream;

View file

@ -41,6 +41,7 @@
* @return struct pso_pointer a pointer to the newly allocated object
*/
struct pso_pointer allocate( char *tag, uint8_t size_class ) {
// todo: issue #21: must have stack frame passed in.
// `t`, because if `allocate_page` fails it will be set to `nil`.
struct pso_pointer result = t;

View file

@ -15,6 +15,7 @@
#include "memory/header.h"
#include "memory/pointer.h"
// todo: issue #21: must have stack frame passed in.
struct pso_pointer allocate( char *tag, uint8_t size_class );
struct pso_pointer dec_ref( struct pso_pointer pointer );

View file

@ -37,7 +37,7 @@ struct pso_pointer get_tag_string( struct pso_pointer p ) {
for ( int i = 2 - 1; i >= 0; i-- ) {
result =
make_string( ( wchar_t ) ( object->header.tag.bytes.mnemonic[i] ),
make_string( ( char32_t ) ( object->header.tag.bytes.mnemonic[i] ),
result );
}

View file

@ -41,5 +41,6 @@ struct pso_pointer lisp_bind(
struct pso_pointer c_bind( struct pso_pointer key,
struct pso_pointer value,
struct pso_pointer store ) {
// todo: issue #21: must have stack frame passed in.
return c_cons( c_cons( key, value ), store );
}

View file

@ -48,6 +48,7 @@ void int_handler( int dummy ) {
* Very simple read/eval/print loop for bootstrapping.
*/
void c_repl( bool show_prompt ) {
// todo: issue #21: must have stack frame passed in.
signal( SIGINT, int_handler );
debug_print( L"Entered repl\n", DEBUG_REPL, 0 );

View file

@ -13,7 +13,7 @@
#define SRC_C_OPS_REPL_H_
// todo: issue #21: must have stack frame passed in.
void c_repl( );

View file

@ -36,6 +36,7 @@
* the argument was not a sequence.
*/
struct pso_pointer c_reverse( struct pso_pointer sequence ) {
// todo: issue #21: must have stack frame passed in.
struct pso_pointer result = nil;
for ( struct pso_pointer cursor = sequence; !nilp( sequence );

View file

@ -66,7 +66,7 @@ uint32_t calculate_hash( wint_t c, struct pso_pointer ptr ) {
* pointer to next is nil.
*
* NOTE THAT: in 0.1.X, we may allocate symbols and keywords as arrays of
* wchar_t in larger pso classes, so this function may be only for strings
* char32_t in larger pso classes, so this function may be only for strings
* (and thus simpler).
*/
struct pso_pointer make_string_like_thing( wint_t c, struct pso_pointer tail,
@ -138,7 +138,7 @@ struct pso_pointer make_symbol( wint_t c, struct pso_pointer tail ) {
/**
* Return a lisp string representation of this wide character string.
*/
struct pso_pointer c_string_to_lisp_string( wchar_t *string ) {
struct pso_pointer c_string_to_lisp_string( char32_t *string ) {
struct pso_pointer result = nil;
for ( int i = wcslen( string ) - 1; i >= 0; i-- ) {
@ -157,11 +157,11 @@ struct pso_pointer c_string_to_lisp_string( wchar_t *string ) {
* Return a lisp symbol representation of this wide character string. In
* symbols, I am accepting only lower case characters.
*/
struct pso_pointer c_string_to_lisp_symbol( wchar_t *symbol ) {
struct pso_pointer c_string_to_lisp_symbol( char32_t *symbol ) {
struct pso_pointer result = nil;
for ( int i = wcslen( symbol ) - 1; i >= 0; i-- ) {
wchar_t c = towlower( symbol[i] );
char32_t c = towlower( symbol[i] );
if ( iswalpha( c ) || c == L'-' || c == L'*' ) {
result = make_symbol( c, result );
@ -175,11 +175,11 @@ struct pso_pointer c_string_to_lisp_symbol( wchar_t *symbol ) {
* Return a lisp keyword representation of this wide character string. In
* keywords, I am accepting only lower case characters and numbers.
*/
struct pso_pointer c_string_to_lisp_keyword( wchar_t *symbol ) {
struct pso_pointer c_string_to_lisp_keyword( char32_t *symbol ) {
struct pso_pointer result = nil;
for ( int i = wcslen( symbol ) - 1; i >= 0; i-- ) {
wchar_t c = towlower( symbol[i] );
char32_t c = towlower( symbol[i] );
if ( iswalnum( c ) || c == L'-' ) {
result = make_keyword( c, result );

View file

@ -13,6 +13,7 @@
/*
* wide characters
*/
#include <uchar.h>
#include <wchar.h>
#include <wctype.h>
@ -25,10 +26,10 @@ struct pso_pointer make_keyword( wint_t c, struct pso_pointer tail );
struct pso_pointer make_symbol( wint_t c, struct pso_pointer tail );
struct pso_pointer c_string_to_lisp_string( wchar_t *string );
struct pso_pointer c_string_to_lisp_string( char32_t *string );
struct pso_pointer c_string_to_lisp_keyword( wchar_t *symbol );
struct pso_pointer c_string_to_lisp_keyword( char32_t *symbol );
struct pso_pointer c_string_to_lisp_symbol( wchar_t *symbol );
struct pso_pointer c_string_to_lisp_symbol( char32_t *symbol );
#endif

View file

@ -10,6 +10,7 @@
/*
* wide characters
*/
#include <uchar.h>
#include <wchar.h>
#include <wctype.h>
@ -28,7 +29,7 @@ struct pso_pointer make_character( wint_t c ) {
if ( !nilp( result ) ) {
pointer_to_object( result )->payload.character.character =
( wchar_t ) c;
( char32_t ) c;
}
return result;

View file

@ -22,6 +22,7 @@
/*
* wide characters
*/
#include <uchar.h>
#include <wchar.h>
#include <wctype.h>
@ -33,7 +34,7 @@
* @brief a single character, as returned by the reader.
*/
struct character_payload {
wchar_t character;
char32_t character;
};
struct pso_pointer make_character( wint_t c );

View file

@ -30,7 +30,8 @@
* @param cdr the pointer which should form the cdr of this cons cell.
* @return struct pso_pointer a pointer to the newly allocated cons cell.
*/
struct pso_pointer c_cons( struct pso_pointer car, struct pso_pointer cdr ) {
struct pso_pointer c_cons(struct pso_pointer car, struct pso_pointer cdr) {
// todo: issue #21: must have stack frame passed in.
struct pso_pointer result = allocate( CONSTAG, 2 );
struct pso2 *object = pointer_to_object( result );
@ -67,7 +68,8 @@ struct pso_pointer c_car( struct pso_pointer cons ) {
* @return the cdr of the indicated cell.
* @exception if the pointer does not indicate a cons cell.
*/
struct pso_pointer c_cdr( struct pso_pointer p ) {
struct pso_pointer c_cdr(struct pso_pointer p) {
// todo: issue #21: must have stack frame passed in.
struct pso_pointer result = nil;
struct pso2 *object = pointer_to_object( p );

View file

@ -30,6 +30,7 @@ struct pso_pointer c_car( struct pso_pointer cons );
struct pso_pointer c_cdr( struct pso_pointer cons );
// todo: issue #21: must have stack frame passed in.
struct pso_pointer c_cons( struct pso_pointer car, struct pso_pointer cdr );
struct pso_pointer destroy_cons( struct pso_pointer fp,

View file

@ -33,6 +33,7 @@
*/
struct pso_pointer make_frame( int arg_count, struct pso_pointer previous,
... ) {
// todo: issue #21: must have stack frame passed in.
va_list args;
va_start( args, previous );