Closes #18. Change to char32_t everywhere; builds fine, behaviour as before.
This commit is contained in:
parent
812a1be7d9
commit
c59825d7fe
33 changed files with 116 additions and 76 deletions
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
#define SRC_C_OPS_REPL_H_
|
||||
|
||||
|
||||
|
||||
// todo: issue #21: must have stack frame passed in.
|
||||
void c_repl( );
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue