From ae8ba67ed72c367f1d244816b9cd59f4127359da Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Tue, 25 Dec 2018 15:32:45 +0000 Subject: [PATCH] Better exceptions, investigation on failure to read/print wide chars. --- .gitignore | 2 + src/arith/peano.c | 8 +- src/arith/ratio.c | 240 +++++++++++++++------------- src/arith/ratio.h | 16 +- src/arith/real.c | 2 +- src/init.c | 1 + src/memory/consspaceobject.c | 8 +- src/ops/equal.c | 4 +- src/ops/lispops.c | 39 ++--- src/ops/lispops.h | 4 +- src/ops/print.c | 15 +- src/ops/read.c | 44 +++-- utils_src/readprintwc/readprintwc.c | 17 ++ 13 files changed, 217 insertions(+), 183 deletions(-) create mode 100644 utils_src/readprintwc/readprintwc.c diff --git a/.gitignore b/.gitignore index 6840d19..0742055 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ log* \.project \.settings/language\.settings\.xml + +utils_src/readprintwc/out diff --git a/src/arith/peano.c b/src/arith/peano.c index 2b0183d..423bd51 100644 --- a/src/arith/peano.c +++ b/src/arith/peano.c @@ -130,7 +130,7 @@ struct cons_pointer add_2( struct stack_frame *frame, struct cons_pointer arg1, print( stderr, arg1 ); fputws( L"; arg2 = ", stderr ); print( stderr, arg2 ); - fputws( L")\n", stderr); + fputws( L")\n", stderr ); #endif if ( zerop( arg1 ) ) { @@ -264,7 +264,7 @@ struct cons_pointer multiply_2( struct stack_frame *frame, print( stderr, arg1 ); fputws( L"; arg2 = ", stderr ); print( stderr, arg2 ); - fputws( L")\n", stderr); + fputws( L")\n", stderr ); #endif if ( zerop( arg1 ) ) { @@ -406,8 +406,8 @@ struct cons_pointer inverse( struct stack_frame *frame, case RATIOTV: result = make_ratio( frame, make_integer( 0 - - to_long_int( cell.payload. - ratio.dividend ) ), + to_long_int( cell.payload.ratio. + dividend ) ), cell.payload.ratio.divisor ); break; case REALTV: diff --git a/src/arith/ratio.c b/src/arith/ratio.c index ff716ec..8a5eec7 100644 --- a/src/arith/ratio.c +++ b/src/arith/ratio.c @@ -58,27 +58,28 @@ struct cons_pointer simplify_ratio( struct stack_frame *frame, struct cons_pointer arg ) { struct cons_pointer result = arg; - if (ratiop(arg)) { - int64_t ddrv = - pointer2cell( pointer2cell( arg ).payload.ratio.dividend ). - payload.integer.value, drrv = - pointer2cell( pointer2cell( arg ).payload.ratio.divisor ). - payload.integer.value, gcd = greatest_common_divisor( ddrv, drrv ); + if ( ratiop( arg ) ) { + int64_t ddrv = + pointer2cell( pointer2cell( arg ).payload.ratio.dividend ).payload. + integer.value, drrv = + pointer2cell( pointer2cell( arg ).payload.ratio.divisor ).payload. + integer.value, gcd = greatest_common_divisor( ddrv, drrv ); - if ( gcd > 1 ) { - if ( drrv / gcd == 1 ) { - result = make_integer( ddrv / gcd ); - } else { - result = - make_ratio( frame, make_integer( ddrv / gcd ), - make_integer( drrv / gcd ) ); + if ( gcd > 1 ) { + if ( drrv / gcd == 1 ) { + result = make_integer( ddrv / gcd ); + } else { + result = + make_ratio( frame, make_integer( ddrv / gcd ), + make_integer( drrv / gcd ) ); + } } + } else { + result = + lisp_throw( make_cons( c_string_to_lisp_string + ( "Shouldn't happen: bad arg to simplify_ratio" ), + arg ), frame ); } - } else { - result = lisp_throw( - c_string_to_lisp_string( "Shouldn't happen: bad arg to simplify_ratio" ), - frame ); - } return result; } @@ -100,58 +101,61 @@ struct cons_pointer add_ratio_ratio( struct stack_frame *frame, print( stderr, arg1 ); fputws( L"; arg2 = ", stderr ); print( stderr, arg2 ); - fputws( L")\n", stderr); + fputws( L")\n", stderr ); #endif - if ( ratiop(arg1) && ratiop(arg2)) { - struct cons_space_object cell1 = pointer2cell( arg1 ); - struct cons_space_object cell2 = pointer2cell( arg2 ); - int64_t dd1v = - pointer2cell( cell1.payload.ratio.dividend ).payload.integer.value, - dd2v = - pointer2cell( cell2.payload.ratio.dividend ).payload.integer.value, - dr1v = - pointer2cell( cell1.payload.ratio.divisor ).payload.integer.value, - dr2v = - pointer2cell( cell2.payload.ratio.divisor ).payload.integer.value, - lcm = least_common_multiple( dr1v, dr2v ), - m1 = lcm / dr1v, m2 = lcm / dr2v; + if ( ratiop( arg1 ) && ratiop( arg2 ) ) { + struct cons_space_object cell1 = pointer2cell( arg1 ); + struct cons_space_object cell2 = pointer2cell( arg2 ); + int64_t dd1v = + pointer2cell( cell1.payload.ratio.dividend ).payload.integer.value, + dd2v = + pointer2cell( cell2.payload.ratio.dividend ).payload.integer.value, + dr1v = + pointer2cell( cell1.payload.ratio.divisor ).payload.integer.value, + dr2v = + pointer2cell( cell2.payload.ratio.divisor ).payload.integer.value, + lcm = least_common_multiple( dr1v, dr2v ), + m1 = lcm / dr1v, m2 = lcm / dr2v; #ifdef DEBUG - fwprintf( stderr, L"); lcm = %ld; m1 = %ld; m2 = %ld", lcm, m1, m2 ); + fwprintf( stderr, L"); lcm = %ld; m1 = %ld; m2 = %ld", lcm, m1, m2 ); #endif - if ( dr1v == dr2v ) { - r = make_ratio( frame, - make_integer( dd1v + dd2v ), - cell1.payload.ratio.divisor ); + if ( dr1v == dr2v ) { + r = make_ratio( frame, + make_integer( dd1v + dd2v ), + cell1.payload.ratio.divisor ); + } else { + struct cons_pointer dd1vm = make_integer( dd1v * m1 ), + dr1vm = make_integer( dr1v * m1 ), + dd2vm = make_integer( dd2v * m2 ), + dr2vm = make_integer( dr2v * m2 ), + r1 = make_ratio( frame, dd1vm, dr1vm ), + r2 = make_ratio( frame, dd2vm, dr2vm ); + + r = add_ratio_ratio( frame, r1, r2 ); + + /* because the references on dd1vm, dr1vm, dd2vm and dr2vm were + * never incremented except when making r1 and r2, decrementing + * r1 and r2 should be enought to garbage collect them. */ + dec_ref( r1 ); + dec_ref( r2 ); + } + + result = simplify_ratio( frame, r ); + if ( !eq( r, result ) ) { + dec_ref( r ); + } } else { - struct cons_pointer dd1vm = make_integer( dd1v * m1 ), - dr1vm = make_integer( dr1v * m1 ), - dd2vm = make_integer( dd2v * m2 ), - dr2vm = make_integer( dr2v * m2 ), - r1 = make_ratio( frame, dd1vm, dr1vm ), - r2 = make_ratio( frame, dd2vm, dr2vm ); - - r = add_ratio_ratio( frame, r1, r2 ); - - /* because the references on dd1vm, dr1vm, dd2vm and dr2vm were - * never incremented except when making r1 and r2, decrementing - * r1 and r2 should be enought to garbage collect them. */ - dec_ref( r1 ); - dec_ref( r2 ); + result = + lisp_throw( make_cons( c_string_to_lisp_string + ( "Shouldn't happen: bad arg to add_ratio_ratio" ), + make_cons( arg1, + make_cons( arg2, NIL ) ) ), + frame ); } - result = simplify_ratio( frame, r ); - if ( !eq( r, result ) ) { - dec_ref( r ); - } - } else { - result = lisp_throw( - c_string_to_lisp_string( "Shouldn't happen: bad arg to add_ratio_ratio" ), - frame ); - } - #ifdef DEBUG fputws( L" => ", stderr ); print( stderr, result ); @@ -170,23 +174,26 @@ struct cons_pointer add_ratio_ratio( struct stack_frame *frame, struct cons_pointer add_integer_ratio( struct stack_frame *frame, struct cons_pointer intarg, struct cons_pointer ratarg ) { - struct cons_pointer result; + struct cons_pointer result; - if (integerp(intarg) && ratiop(ratarg)) { - struct cons_pointer one = make_integer( 1 ), - ratio = make_ratio( frame, intarg, one ); + if ( integerp( intarg ) && ratiop( ratarg ) ) { + struct cons_pointer one = make_integer( 1 ), + ratio = make_ratio( frame, intarg, one ); - result = add_ratio_ratio( frame, ratio, ratarg ); + result = add_ratio_ratio( frame, ratio, ratarg ); - dec_ref( one ); - dec_ref( ratio ); - } else { - result = lisp_throw( - c_string_to_lisp_string( "Shouldn't happen: bad arg to add_integer_ratio" ), - frame ); - } + dec_ref( one ); + dec_ref( ratio ); + } else { + result = + lisp_throw( make_cons( c_string_to_lisp_string + ( "Shouldn't happen: bad arg to add_integer_ratio" ), + make_cons( intarg, + make_cons( ratarg, NIL ) ) ), + frame ); + } - return result; + return result; } /** @@ -198,10 +205,10 @@ struct cons_pointer divide_ratio_ratio( struct stack_frame *frame, struct cons_pointer arg1, struct cons_pointer arg2 ) { struct cons_pointer i = make_ratio( frame, - pointer2cell( arg2 ).payload. - ratio.divisor, - pointer2cell( arg2 ).payload. - ratio.dividend ), result = + pointer2cell( arg2 ).payload.ratio. + divisor, + pointer2cell( arg2 ).payload.ratio. + dividend ), result = multiply_ratio_ratio( frame, arg1, i ); dec_ref( i ); @@ -226,33 +233,35 @@ struct cons_pointer multiply_ratio_ratio( struct print( stderr, arg1 ); fputws( L"; arg2 = ", stderr ); print( stderr, arg2 ); - fputws( L")\n", stderr); + fputws( L")\n", stderr ); #endif - if ( ratiop(arg1) && ratiop(arg2)) { - struct cons_space_object cell1 = pointer2cell( arg1 ); - struct cons_space_object cell2 = pointer2cell( arg2 ); - int64_t dd1v = - pointer2cell( cell1.payload.ratio.dividend ).payload.integer.value, - dd2v = - pointer2cell( cell2.payload.ratio.dividend ).payload.integer.value, - dr1v = - pointer2cell( cell1.payload.ratio.divisor ).payload.integer.value, - dr2v = - pointer2cell( cell2.payload.ratio.divisor ).payload.integer.value, - ddrv = dd1v * dd2v, drrv = dr1v * dr2v; + if ( ratiop( arg1 ) && ratiop( arg2 ) ) { + struct cons_space_object cell1 = pointer2cell( arg1 ); + struct cons_space_object cell2 = pointer2cell( arg2 ); + int64_t dd1v = + pointer2cell( cell1.payload.ratio.dividend ).payload.integer.value, + dd2v = + pointer2cell( cell2.payload.ratio.dividend ).payload.integer.value, + dr1v = + pointer2cell( cell1.payload.ratio.divisor ).payload.integer.value, + dr2v = + pointer2cell( cell2.payload.ratio.divisor ).payload.integer.value, + ddrv = dd1v * dd2v, drrv = dr1v * dr2v; - struct cons_pointer unsimplified = make_ratio( frame, make_integer( ddrv ), - make_integer( drrv ) ); - result = simplify_ratio( frame, unsimplified ); + struct cons_pointer unsimplified = + make_ratio( frame, make_integer( ddrv ), + make_integer( drrv ) ); + result = simplify_ratio( frame, unsimplified ); - if ( !eq( unsimplified, result ) ) { - dec_ref( unsimplified ); + if ( !eq( unsimplified, result ) ) { + dec_ref( unsimplified ); + } + } else { + result = + lisp_throw( c_string_to_lisp_string + ( "Shouldn't happen: bad arg to multiply_ratio_ratio" ), + frame ); } - } else { - result = lisp_throw( - c_string_to_lisp_string( "Shouldn't happen: bad arg to multiply_ratio_ratio" ), - frame ); - } return result; } @@ -265,20 +274,21 @@ struct cons_pointer multiply_ratio_ratio( struct struct cons_pointer multiply_integer_ratio( struct stack_frame *frame, struct cons_pointer intarg, struct cons_pointer ratarg ) { - struct cons_pointer result; + struct cons_pointer result; - if (integerp(intarg) && ratiop(ratarg)) { - struct cons_pointer one = make_integer( 1 ), - ratio = make_ratio( frame, intarg, one ); - result = multiply_ratio_ratio( frame, ratio, ratarg ); + if ( integerp( intarg ) && ratiop( ratarg ) ) { + struct cons_pointer one = make_integer( 1 ), + ratio = make_ratio( frame, intarg, one ); + result = multiply_ratio_ratio( frame, ratio, ratarg ); - dec_ref( one ); - dec_ref( ratio ); - } else { - result = lisp_throw( - c_string_to_lisp_string( "Shouldn't happen: bad arg to multiply_integer_ratio" ), - frame ); - } + dec_ref( one ); + dec_ref( ratio ); + } else { + result = + lisp_throw( c_string_to_lisp_string + ( "Shouldn't happen: bad arg to multiply_integer_ratio" ), + frame ); + } return result; } @@ -319,8 +329,8 @@ struct cons_pointer make_ratio( struct stack_frame *frame, } else { result = lisp_throw( c_string_to_lisp_string - ( "Dividend and divisor of a ratio must be integers" ), - frame ); + ( "Dividend and divisor of a ratio must be integers" ), + frame ); } #ifdef DEBUG dump_object( stderr, result ); diff --git a/src/arith/ratio.h b/src/arith/ratio.h index fe650a7..c4e5548 100644 --- a/src/arith/ratio.h +++ b/src/arith/ratio.h @@ -12,37 +12,37 @@ #define __ratio_h struct cons_pointer simplify_ratio( struct stack_frame *frame, - struct cons_pointer arg ) ; + struct cons_pointer arg ); struct cons_pointer add_ratio_ratio( struct stack_frame *frame, struct cons_pointer arg1, - struct cons_pointer arg2 ) ; + struct cons_pointer arg2 ); struct cons_pointer add_integer_ratio( struct stack_frame *frame, struct cons_pointer intarg, - struct cons_pointer ratarg ) ; + struct cons_pointer ratarg ); struct cons_pointer divide_ratio_ratio( struct stack_frame *frame, struct cons_pointer arg1, - struct cons_pointer arg2 ) ; + struct cons_pointer arg2 ); struct cons_pointer multiply_ratio_ratio( struct stack_frame *frame, struct cons_pointer arg1, struct - cons_pointer arg2 ) ; + cons_pointer arg2 ); struct cons_pointer multiply_integer_ratio( struct stack_frame *frame, struct cons_pointer intarg, - struct cons_pointer ratarg ) ; + struct cons_pointer ratarg ); struct cons_pointer subtract_ratio_ratio( struct stack_frame *frame, struct cons_pointer arg1, - struct cons_pointer arg2 ) ; + struct cons_pointer arg2 ); struct cons_pointer make_ratio( struct stack_frame *frame, struct cons_pointer dividend, - struct cons_pointer divisor ) ; + struct cons_pointer divisor ); #endif diff --git a/src/arith/real.c b/src/arith/real.c index ea3cc29..a499b6a 100644 --- a/src/arith/real.c +++ b/src/arith/real.c @@ -26,5 +26,5 @@ struct cons_pointer make_real( long double value ) { dump_object( stderr, result ); #endif - return result; + return result; } diff --git a/src/init.c b/src/init.c index a7e835a..9716365 100644 --- a/src/init.c +++ b/src/init.c @@ -111,6 +111,7 @@ int main( int argc, char *argv[] ) { */ bind_special( "cond", &lisp_cond ); bind_special( "lambda", &lisp_lambda ); + /* bind_special( "λ", &lisp_lambda ); */ bind_special( "nlambda", &lisp_nlambda ); bind_special( "progn", &lisp_progn ); bind_special( "quote", &lisp_quote ); diff --git a/src/memory/consspaceobject.c b/src/memory/consspaceobject.c index 96f2cdd..39f464a 100644 --- a/src/memory/consspaceobject.c +++ b/src/memory/consspaceobject.c @@ -136,10 +136,10 @@ void dump_object( FILE * output, struct cons_pointer pointer ) { case RATIOTV: fwprintf( output, L"\t\tRational cell: value %ld/%ld, count %u\n", - pointer2cell( cell.payload.ratio.dividend ). - payload.integer.value, - pointer2cell( cell.payload.ratio.divisor ). - payload.integer.value, cell.count ); + pointer2cell( cell.payload.ratio.dividend ).payload. + integer.value, + pointer2cell( cell.payload.ratio.divisor ).payload. + integer.value, cell.count ); break; case READTV: fwprintf( output, L"\t\tInput stream\n" ); diff --git a/src/ops/equal.c b/src/ops/equal.c index 0f0597c..ebb085e 100644 --- a/src/ops/equal.c +++ b/src/ops/equal.c @@ -80,8 +80,8 @@ bool equal( struct cons_pointer a, struct cons_pointer b ) { && ( equal( cell_a->payload.string.cdr, cell_b->payload.string.cdr ) || ( end_of_string( cell_a->payload.string.cdr ) - && end_of_string( cell_b->payload. - string.cdr ) ) ); + && end_of_string( cell_b->payload.string. + cdr ) ) ); break; case INTEGERTV: result = diff --git a/src/ops/lispops.c b/src/ops/lispops.c index a0417b7..9b12faa 100644 --- a/src/ops/lispops.c +++ b/src/ops/lispops.c @@ -172,7 +172,7 @@ void log_binding( struct cons_pointer name, struct cons_pointer val ) { #ifdef DEBUG fputws( L"\n\tBinding ", stderr ); print( stderr, name ); - fputws( L" to ", stderr); + fputws( L" to ", stderr ); print( stderr, val ); fputws( L"\"\n", stderr ); #endif @@ -657,25 +657,25 @@ lisp_read( struct stack_frame *frame, struct cons_pointer env ) { /** * reverse a sequence. */ -struct cons_pointer c_reverse( struct cons_pointer arg) { - struct cons_pointer result = NIL; +struct cons_pointer c_reverse( struct cons_pointer arg ) { + struct cons_pointer result = NIL; - for (struct cons_pointer p = arg; sequencep(p); p = c_cdr(p)) { - struct cons_space_object o = pointer2cell(p); - switch (o.tag.value) { - case CONSTV: - result = make_cons(o.payload.cons.car, result); - break; - case STRINGTV: - result = make_string(o.payload.string.character, result); - break; - case SYMBOLTV: - result = make_symbol(o.payload.string.character, result); - break; + for ( struct cons_pointer p = arg; sequencep( p ); p = c_cdr( p ) ) { + struct cons_space_object o = pointer2cell( p ); + switch ( o.tag.value ) { + case CONSTV: + result = make_cons( o.payload.cons.car, result ); + break; + case STRINGTV: + result = make_string( o.payload.string.character, result ); + break; + case SYMBOLTV: + result = make_symbol( o.payload.string.character, result ); + break; + } } - } - return result; + return result; } @@ -683,8 +683,9 @@ struct cons_pointer c_reverse( struct cons_pointer arg) { * (reverse sequence) * Return a sequence like this sequence but with the members in the reverse order. */ -struct cons_pointer lisp_reverse( struct stack_frame *frame, struct cons_pointer env ) { - return c_reverse( frame->arg[0]); +struct cons_pointer lisp_reverse( struct stack_frame *frame, + struct cons_pointer env ) { + return c_reverse( frame->arg[0] ); } diff --git a/src/ops/lispops.h b/src/ops/lispops.h index 3ac53c7..961cf2e 100644 --- a/src/ops/lispops.h +++ b/src/ops/lispops.h @@ -40,7 +40,7 @@ struct cons_pointer c_car( struct cons_pointer arg ); */ struct cons_pointer c_cdr( struct cons_pointer arg ); -struct cons_pointer c_reverse( struct cons_pointer arg); +struct cons_pointer c_reverse( struct cons_pointer arg ); /** * Useful building block; evaluate this single form in the context of this @@ -123,7 +123,7 @@ struct cons_pointer lisp_print( struct stack_frame *frame, struct cons_pointer lisp_read( struct stack_frame *frame, struct cons_pointer env ); struct cons_pointer lisp_reverse( struct stack_frame *frame, - struct cons_pointer env ); + struct cons_pointer env ); /** * Function: Get the Lisp type of the single argument. * @param frame My stack frame. diff --git a/src/ops/print.c b/src/ops/print.c index 50e6f41..4ec5a15 100644 --- a/src/ops/print.c +++ b/src/ops/print.c @@ -118,7 +118,12 @@ struct cons_pointer print( FILE * output, struct cons_pointer pointer ) { case EXCEPTIONTV: fwprintf( output, L"\n%sException: ", print_use_colours ? "\x1B[31m" : "" ); - print_string_contents( output, cell.payload.exception.message ); + if ( stringp( cell.payload.exception.message ) ) { + print_string_contents( output, + cell.payload.exception.message ); + } else { + print( output, cell.payload.exception.message ); + } break; case FUNCTIONTV: fwprintf( output, L"(Function)" ); @@ -132,8 +137,8 @@ struct cons_pointer print( FILE * output, struct cons_pointer pointer ) { case LAMBDATV: print( output, make_cons( c_string_to_lisp_symbol( "lambda" ), make_cons( cell.payload.lambda.args, - cell.payload.lambda. - body ) ) ); + cell.payload. + lambda.body ) ) ); break; case NILTV: fwprintf( output, L"nil" ); @@ -141,8 +146,8 @@ struct cons_pointer print( FILE * output, struct cons_pointer pointer ) { case NLAMBDATV: print( output, make_cons( c_string_to_lisp_symbol( "nlambda" ), make_cons( cell.payload.lambda.args, - cell.payload.lambda. - body ) ) ); + cell.payload. + lambda.body ) ) ); break; case RATIOTV: print( output, cell.payload.ratio.dividend ); diff --git a/src/ops/read.c b/src/ops/read.c index 2acb99c..bd063b2 100644 --- a/src/ops/read.c +++ b/src/ops/read.c @@ -86,15 +86,15 @@ struct cons_pointer read_continuation( struct stack_frame *frame, FILE * input, case '"': result = read_string( input, fgetwc( input ) ); break; - case '-': { + case '-':{ wint_t next = fgetwc( input ); ungetwc( next, input ); if ( iswdigit( next ) ) { - result = read_number( frame, input, c, false ); + result = read_number( frame, input, c, false ); } else { - result = read_symbol( input, c ); + result = read_symbol( input, c ); } - } + } break; case '.': { @@ -119,11 +119,12 @@ struct cons_pointer read_continuation( struct stack_frame *frame, FILE * input, result = read_symbol( input, c ); } else { result = - make_exception( c_string_to_lisp_string - ( "Unrecognised start of input character" ), + make_exception( make_cons( c_string_to_lisp_string + ( "Unrecognised start of input character" ), + make_string( c, NIL ) ), frame ); } - break; + break; } } @@ -142,14 +143,11 @@ struct cons_pointer read_number( struct stack_frame *frame, FILE * input, int64_t dividend = 0; int places_of_decimals = 0; wint_t c; - bool negative = initial == btowc( '-'); + bool negative = initial == btowc( '-' ); - if (negative) { - initial = fgetwc( input ); + if ( negative ) { + initial = fgetwc( input ); } - - - #ifdef DEBUG fwprintf( stderr, L"read_number starting '%c' (%d)\n", initial, initial ); #endif @@ -171,7 +169,7 @@ struct cons_pointer read_number( struct stack_frame *frame, FILE * input, } else { dividend = negative ? 0 - accumulator : accumulator; - accumulator = 0; + accumulator = 0; } } else { accumulator = accumulator * 10 + ( ( int ) c - ( int ) '0' ); @@ -193,9 +191,9 @@ struct cons_pointer read_number( struct stack_frame *frame, FILE * input, if ( seen_period ) { long double rv = ( long double ) ( accumulator / pow( 10, places_of_decimals ) ); - if (negative) { - rv = 0 - rv; - } + if ( negative ) { + rv = 0 - rv; + } #ifdef DEBUG fwprintf( stderr, L"read_numer returning %Lf\n", rv ); #endif @@ -205,9 +203,9 @@ struct cons_pointer read_number( struct stack_frame *frame, FILE * input, make_ratio( frame, make_integer( dividend ), make_integer( accumulator ) ); } else { - if (negative) { - accumulator = 0 - accumulator; - } + if ( negative ) { + accumulator = 0 - accumulator; + } result = make_integer( accumulator ); } @@ -224,15 +222,15 @@ struct cons_pointer read_list( struct struct cons_pointer result = NIL; if ( initial != ')' ) { #ifdef DEBUG - fwprintf( stderr, + fwprintf( stderr, L"read_list starting '%C' (%d)\n", initial, initial ); #endif - struct cons_pointer car = read_continuation( frame, input, + struct cons_pointer car = read_continuation( frame, input, initial ); result = make_cons( car, read_list( frame, input, fgetwc( input ) ) ); } #ifdef DEBUG - else { + else { fwprintf( stderr, L"End of list detected\n" ); } #endif diff --git a/utils_src/readprintwc/readprintwc.c b/utils_src/readprintwc/readprintwc.c new file mode 100644 index 0000000..e221c9c --- /dev/null +++ b/utils_src/readprintwc/readprintwc.c @@ -0,0 +1,17 @@ +#include +#include +#include +#include + +int main( int argc, char *argv[] ) { + fwide( stdin, 1 ); + fwide( stdout, 1 ); + + for (wchar_t c = fgetwc( stdin ); !feof( stdin); c = fgetwc( stdin )) { + if (c != '\n') { + fwprintf( stdout, L"Read character %d, %C\t", (int)c, c); + fputwc( c, stdout); + fputws(L"\n", stdout); + } + } +}