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

@ -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;