From 271b7da46a7a02b9d4ea659cbff1ac71855db4d0 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Wed, 6 May 2026 15:32:35 +0100 Subject: [PATCH] Right, I have finally undone the issue #18 change. It was a nice idea, but I have not made it work. --- src/c/environment/function_bindings.c | 8 ++++---- src/c/io/io.c | 16 ++++++++-------- src/c/io/print.c | 4 ++-- src/c/io/read.c | 6 +++--- src/c/memory/tags.c | 2 +- src/c/ops/string_ops.c | 12 ++++++------ src/c/ops/string_ops.h | 4 ++-- src/c/payloads/character.c | 2 +- src/c/payloads/character.h | 2 +- src/sh/wchar_t_everywhere.sh | 8 ++++++++ 10 files changed, 36 insertions(+), 28 deletions(-) create mode 100644 src/sh/wchar_t_everywhere.sh diff --git a/src/c/environment/function_bindings.c b/src/c/environment/function_bindings.c index cae295e..65b1e2a 100644 --- a/src/c/environment/function_bindings.c +++ b/src/c/environment/function_bindings.c @@ -59,7 +59,7 @@ */ struct pso_pointer -bind_function(struct pso_pointer frame_pointer, char32_t *name, char32_t *doc, +bind_function(struct pso_pointer frame_pointer, wchar_t *name, wchar_t *doc, struct pso_pointer (*executable)(struct pso_pointer)) { struct pso_pointer result = fetch_env(frame_pointer); struct pso_pointer n = c_string_to_lisp_symbol(frame_pointer, name); @@ -94,7 +94,7 @@ bind_function(struct pso_pointer frame_pointer, char32_t *name, char32_t *doc, * this `name` in the `oblist`. */ struct pso_pointer -bind_special(struct pso_pointer frame_pointer, char32_t *name, char32_t *doc, +bind_special(struct pso_pointer frame_pointer, wchar_t *name, wchar_t *doc, struct pso_pointer (*executable)(struct pso_pointer)) { struct pso_pointer result = fetch_env(frame_pointer); struct pso_pointer n = c_string_to_lisp_symbol(frame_pointer, name); @@ -125,8 +125,8 @@ bind_special(struct pso_pointer frame_pointer, char32_t *name, char32_t *doc, } struct function_data { - char32_t *name; - char32_t *documentation; + wchar_t *name; + wchar_t *documentation; void *executable; }; diff --git a/src/c/io/io.c b/src/c/io/io.c index ffe5ae9..31f64c4 100644 --- a/src/c/io/io.c +++ b/src/c/io/io.c @@ -287,8 +287,8 @@ wint_t url_fgetwc( URL_FILE *input ) { break; case CFTYPE_CURL:{ char *cbuff = - calloc( sizeof( char32_t ) + 2, sizeof( char ) ); - char32_t *wbuff = calloc( 2, sizeof( char32_t ) ); + calloc( sizeof( wchar_t ) + 2, sizeof( char ) ); + wchar_t *wbuff = calloc( 2, sizeof( wchar_t ) ); size_t count = 0; debug_print( L"url_fgetwc: about to call url_fgets\n", DEBUG_IO, 0 ); @@ -409,7 +409,7 @@ struct pso_pointer lisp_close( struct pso_pointer frame_pointer) { } struct pso_pointer add_meta_integer( struct pso_pointer frame_pointer, - struct pso_pointer meta, char32_t *key, + struct pso_pointer meta, wchar_t *key, long int value ) { return make_cons( frame_pointer, make_cons( frame_pointer, @@ -420,10 +420,10 @@ struct pso_pointer add_meta_integer( struct pso_pointer frame_pointer, } struct pso_pointer add_meta_string( struct pso_pointer frame_pointer, - struct pso_pointer meta, char32_t *key, + struct pso_pointer meta, wchar_t *key, char *value ) { value = trim( value ); - char32_t buffer[strlen( value ) + 1]; + wchar_t buffer[strlen( value ) + 1]; mbstowcs( buffer, value, strlen( value ) + 1 ); return make_cons( frame_pointer, make_cons( frame_pointer, @@ -434,7 +434,7 @@ struct pso_pointer add_meta_string( struct pso_pointer frame_pointer, } struct pso_pointer add_meta_time( struct pso_pointer frame_pointer, - struct pso_pointer meta, char32_t *key, + struct pso_pointer meta, wchar_t *key, time_t *value ) { return make_cons( frame_pointer, make_cons( frame_pointer, @@ -465,7 +465,7 @@ static size_t write_meta_callback( struct pso_pointer frame_pointer, s[offset] = ( char ) 0; char *name = trim( s ); char *value = trim( &s[++offset] ); - char32_t wname[strlen( name )]; + wchar_t wname[strlen( name )]; mbstowcs( wname, name, strlen( name ) + 1 ); object->payload.stream.meta = add_meta_string( frame_pointer, object->payload.stream.meta, @@ -667,7 +667,7 @@ struct pso_pointer lisp_slurp( struct pso_pointer frame_pointer) { debug_dump_object( result, DEBUG_IO, 0 ); debug_println( DEBUG_IO ); struct pso2 *cell = pointer_to_object( cursor ); - cursor = make_string( frame_pointer, ( char32_t ) c, nil ); + cursor = make_string( frame_pointer, ( wchar_t ) c, nil ); cell->payload.string.cdr = cursor; } } diff --git a/src/c/io/print.c b/src/c/io/print.c index a850e72..c9b0f7d 100644 --- a/src/c/io/print.c +++ b/src/c/io/print.c @@ -58,7 +58,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( char32_t wc, URL_FILE *output, bool escape ) { +void write_char( wchar_t wc, URL_FILE *output, bool escape ) { if ( escape && !iswprint( wc ) ) { url_fwprintf( output, L"\\%04x", wc ); // url_fputwc(L'\\', output); @@ -83,7 +83,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; !c_nilp( cursor ); cursor = pointer_to_object( cursor )->payload.string.cdr ) { - char32_t wc = + wchar_t wc = pointer_to_object( cursor )->payload.string.character; write_char( wc, output, escape ); diff --git a/src/c/io/read.c b/src/c/io/read.c index 3331511..4813c70 100644 --- a/src/c/io/read.c +++ b/src/c/io/read.c @@ -141,7 +141,7 @@ struct pso_pointer read_number( struct pso_pointer frame_pointer ) { character = read_character( make_frame( 1, frame_pointer, stream ) ); } - char32_t c = c_nilp( character ) + wchar_t c = c_nilp( character ) ? 0 : pointer_to_object( character )->payload.character.character; URL_FILE *input = pointer_to_object( stream )->payload.stream.stream; @@ -173,7 +173,7 @@ struct pso_pointer read_symbol( struct pso_pointer frame_pointer ) { read_character( make_frame( 1, frame_pointer, stream ) ); } - char32_t c = c_nilp( character ) + wchar_t c = c_nilp( character ) ? 0 : pointer_to_object( character )->payload.character.character; URL_FILE *input = pointer_to_object( stream )->payload.stream.stream; @@ -233,7 +233,7 @@ struct pso_pointer read( struct pso_pointer frame_pointer ) { if ( !c_nilp( readmacro ) ) { // invoke the read macro on the stream } else if ( readp( stream ) && characterp( character ) ) { - char32_t c = + wchar_t c = pointer_to_object( character )->payload.character.character; URL_FILE *input = pointer_to_object( stream )->payload.stream.stream; diff --git a/src/c/memory/tags.c b/src/c/memory/tags.c index 635f19c..a77519c 100644 --- a/src/c/memory/tags.c +++ b/src/c/memory/tags.c @@ -39,7 +39,7 @@ struct pso_pointer get_tag_string( struct pso_pointer frame_pointer, for ( int i = 2 - 1; i >= 0; i-- ) { result = make_string( frame_pointer, - ( char32_t ) ( object->header.tag.bytes.mnemonic[i] ), + ( wchar_t ) ( object->header.tag.bytes.mnemonic[i] ), result ); } diff --git a/src/c/ops/string_ops.c b/src/c/ops/string_ops.c index c9ff224..7111762 100644 --- a/src/c/ops/string_ops.c +++ b/src/c/ops/string_ops.c @@ -71,7 +71,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 - * char32_t in larger pso classes, so this function may be only for strings + * wchar_t in larger pso classes, so this function may be only for strings * (and thus simpler). */ struct pso_pointer make_string_like_thing( struct pso_pointer frame_pointer, @@ -142,7 +142,7 @@ char *lisp_string_to_c_string( struct pso_pointer s ) { len++; } - wchar_t *buffer = calloc( len, sizeof( char32_t ) ); + wchar_t *buffer = calloc( len, sizeof( wchar_t ) ); int i = 0; for ( struct pso_pointer c = s; !c_nilp( c ); c = c_cdr( c ) ) { buffer[i++] = @@ -177,11 +177,11 @@ char *lisp_string_to_c_string( struct pso_pointer s ) { * symbols, I am accepting only lower case characters and certain punctuation. */ struct pso_pointer c_string_to_lisp_symbol( struct pso_pointer frame_pointer, - char32_t *symbol ) { + wchar_t *symbol ) { struct pso_pointer result = nil; for ( int i = wcslen( symbol ) - 1; i >= 0; i-- ) { - char32_t c = symbol[i]; + wchar_t c = symbol[i]; if ( symbol_char_p(c)) { result = make_symbol( frame_pointer, c, result ); @@ -196,11 +196,11 @@ struct pso_pointer c_string_to_lisp_symbol( struct pso_pointer frame_pointer, * keywords, I am accepting only lower case characters and numbers. */ struct pso_pointer c_string_to_lisp_keyword( struct pso_pointer frame_pointer, - char32_t *symbol ) { + wchar_t *symbol ) { struct pso_pointer result = nil; for ( int i = wcslen( symbol ) - 1; i >= 0; i-- ) { - char32_t c = towlower( symbol[i] ); + wchar_t c = towlower( symbol[i] ); if ( iswalnum( c ) || c == L'-' ) { result = make_keyword( frame_pointer, c, result ); diff --git a/src/c/ops/string_ops.h b/src/c/ops/string_ops.h index 4e94ae9..b265dc7 100644 --- a/src/c/ops/string_ops.h +++ b/src/c/ops/string_ops.h @@ -27,10 +27,10 @@ char *lisp_string_to_c_string( struct pso_pointer s ); struct pso_pointer c_string_to_lisp_keyword( struct pso_pointer frame_pointer, - char32_t * symbol ); + wchar_t * symbol ); struct pso_pointer c_string_to_lisp_symbol( struct pso_pointer frame_pointer, - char32_t * symbol ); + wchar_t * symbol ); bool end_of_stringp(struct pso_pointer arg); diff --git a/src/c/payloads/character.c b/src/c/payloads/character.c index 88d5b0d..4c379a7 100644 --- a/src/c/payloads/character.c +++ b/src/c/payloads/character.c @@ -28,7 +28,7 @@ struct pso_pointer make_character( struct pso_pointer frame_pointer, wint_t c ) if ( !c_nilp( result ) ) { pointer_to_object( result )->payload.character.character = - ( char32_t ) c; + ( wchar_t ) c; } return result; diff --git a/src/c/payloads/character.h b/src/c/payloads/character.h index 6995631..d1307d1 100644 --- a/src/c/payloads/character.h +++ b/src/c/payloads/character.h @@ -35,7 +35,7 @@ * @brief a single character, as returned by the reader. */ struct character_payload { - char32_t character; + wchar_t character; }; struct pso_pointer make_character( struct pso_pointer frame_pointer, diff --git a/src/sh/wchar_t_everywhere.sh b/src/sh/wchar_t_everywhere.sh new file mode 100644 index 0000000..a193083 --- /dev/null +++ b/src/sh/wchar_t_everywhere.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +for file in src/c/*/*.[ch] +do + echo $file + cp $file $file.bak + sed 's/char32_t/wchar_t/g' $file.bak > $file +done