Hot damn! When you see an obvious, stupid bug you created, you can't unsee it!
This commit is contained in:
parent
ca5671f613
commit
02a4bc3e28
8 changed files with 563 additions and 495 deletions
195
src/c/io/print.c
195
src/c/io/print.c
|
|
@ -39,106 +39,107 @@
|
|||
|
||||
#include "ops/truth.h"
|
||||
|
||||
struct pso_pointer in_print(struct pso_pointer p, URL_FILE *output);
|
||||
struct pso_pointer in_print( struct pso_pointer p, URL_FILE * output );
|
||||
|
||||
struct pso_pointer print_string_like_thing(struct pso_pointer p,
|
||||
URL_FILE *output) {
|
||||
switch (get_tag_value(p)) {
|
||||
case KEYTV:
|
||||
url_fputwc(L':', output);
|
||||
break;
|
||||
case STRINGTV:
|
||||
url_fputwc(L'"', output);
|
||||
break;
|
||||
}
|
||||
struct pso_pointer print_string_like_thing( struct pso_pointer p,
|
||||
URL_FILE *output ) {
|
||||
switch ( get_tag_value( p ) ) {
|
||||
case KEYTV:
|
||||
url_fputwc( L':', output );
|
||||
break;
|
||||
case STRINGTV:
|
||||
url_fputwc( L'"', output );
|
||||
break;
|
||||
}
|
||||
|
||||
if (keywordp(p) || stringp(p) || symbolp(p)) {
|
||||
for (struct pso_pointer cursor = p; !nilp(cursor);
|
||||
cursor = pointer_to_object(cursor)->payload.string.cdr) {
|
||||
url_fputwc(pointer_to_object(cursor)->payload.character.character,
|
||||
output);
|
||||
}
|
||||
}
|
||||
if ( keywordp( p ) || stringp( p ) || symbolp( p ) ) {
|
||||
for ( struct pso_pointer cursor = p; !nilp( cursor );
|
||||
cursor = pointer_to_object( cursor )->payload.string.cdr ) {
|
||||
url_fputwc( pointer_to_object( cursor )->payload.character.
|
||||
character, output );
|
||||
}
|
||||
}
|
||||
|
||||
if (stringp(p)) {
|
||||
url_fputwc(L'"', output);
|
||||
}
|
||||
if ( stringp( p ) ) {
|
||||
url_fputwc( L'"', output );
|
||||
}
|
||||
}
|
||||
|
||||
struct pso_pointer print_list_content(struct pso_pointer p, URL_FILE *output) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso_pointer print_list_content( struct pso_pointer p, URL_FILE *output ) {
|
||||
struct pso_pointer result = nil;
|
||||
|
||||
if (consp(p)) {
|
||||
for (; consp(p); p = c_cdr(p)) {
|
||||
struct pso2 *object = pointer_to_object(p);
|
||||
if ( consp( p ) ) {
|
||||
for ( ; consp( p ); p = c_cdr( p ) ) {
|
||||
struct pso2 *object = pointer_to_object( p );
|
||||
|
||||
result = in_print(object->payload.cons.car, output);
|
||||
result = in_print( object->payload.cons.car, output );
|
||||
|
||||
if (exceptionp(result))
|
||||
break;
|
||||
if ( exceptionp( result ) )
|
||||
break;
|
||||
|
||||
switch (get_tag_value(object->payload.cons.cdr)) {
|
||||
case NILTV:
|
||||
break;
|
||||
case CONSTV:
|
||||
url_fputwc(L' ', output);
|
||||
break;
|
||||
default:
|
||||
url_fputws(L" . ", output);
|
||||
result = in_print(object->payload.cons.cdr, output);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// TODO: return exception
|
||||
}
|
||||
switch ( get_tag_value( object->payload.cons.cdr ) ) {
|
||||
case NILTV:
|
||||
break;
|
||||
case CONSTV:
|
||||
url_fputwc( L' ', output );
|
||||
break;
|
||||
default:
|
||||
url_fputws( L" . ", output );
|
||||
result = in_print( object->payload.cons.cdr, output );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// TODO: return exception
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
struct pso_pointer in_print(struct pso_pointer p, URL_FILE *output) {
|
||||
struct pso2 *object = pointer_to_object(p);
|
||||
struct pso_pointer result = nil;
|
||||
struct pso_pointer in_print( struct pso_pointer p, URL_FILE *output ) {
|
||||
struct pso2 *object = pointer_to_object( p );
|
||||
struct pso_pointer result = nil;
|
||||
|
||||
if (object != NULL) {
|
||||
uint32_t v = get_tag_value(p);
|
||||
switch (v) {
|
||||
case CHARACTERTV:
|
||||
url_fputwc(object->payload.character.character, output);
|
||||
break;
|
||||
case CONSTV:
|
||||
url_fputwc(L'(', output);
|
||||
result = print_list_content(p, output);
|
||||
url_fputwc(L')', output);
|
||||
break;
|
||||
case INTEGERTV:
|
||||
url_fwprintf(output, L"%d",
|
||||
(int64_t)(object->payload.integer.value));
|
||||
break;
|
||||
case KEYTV:
|
||||
case STRINGTV:
|
||||
case SYMBOLTV:
|
||||
print_string_like_thing(p, output);
|
||||
break;
|
||||
case NILTV:
|
||||
url_fputws(L"nil", output);
|
||||
break;
|
||||
case READTV:
|
||||
case WRITETV:
|
||||
url_fwprintf(output, L"<%s stream: ", v == READTV ? "read" : "write");
|
||||
in_print(object->payload.stream.meta, output);
|
||||
url_fputwc(L'>', output);
|
||||
break;
|
||||
case TRUETV:
|
||||
url_fputwc(L't', output);
|
||||
break;
|
||||
default:
|
||||
// TODO: return exception
|
||||
}
|
||||
} else {
|
||||
// TODO: return exception
|
||||
}
|
||||
if ( object != NULL ) {
|
||||
uint32_t v = get_tag_value( p );
|
||||
switch ( v ) {
|
||||
case CHARACTERTV:
|
||||
url_fputwc( object->payload.character.character, output );
|
||||
break;
|
||||
case CONSTV:
|
||||
url_fputwc( L'(', output );
|
||||
result = print_list_content( p, output );
|
||||
url_fputwc( L')', output );
|
||||
break;
|
||||
case INTEGERTV:
|
||||
url_fwprintf( output, L"%d",
|
||||
( int64_t ) ( object->payload.integer.value ) );
|
||||
break;
|
||||
case KEYTV:
|
||||
case STRINGTV:
|
||||
case SYMBOLTV:
|
||||
print_string_like_thing( p, output );
|
||||
break;
|
||||
case NILTV:
|
||||
url_fputws( L"nil", output );
|
||||
break;
|
||||
case READTV:
|
||||
case WRITETV:
|
||||
url_fwprintf( output, L"<%s stream: ",
|
||||
v == READTV ? "read" : "write" );
|
||||
in_print( object->payload.stream.meta, output );
|
||||
url_fputwc( L'>', output );
|
||||
break;
|
||||
case TRUETV:
|
||||
url_fputwc( L't', output );
|
||||
break;
|
||||
default:
|
||||
// TODO: return exception
|
||||
}
|
||||
} else {
|
||||
// TODO: return exception
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -148,19 +149,19 @@ struct pso_pointer in_print(struct pso_pointer p, URL_FILE *output) {
|
|||
* @param stream if a pointer to an open write stream, print to there.
|
||||
* @return struct pso_pointer `nil`, or an exception if some erroe occurred.
|
||||
*/
|
||||
struct pso_pointer c_print(struct pso_pointer p, struct pso_pointer stream) {
|
||||
struct pso_pointer result = p;
|
||||
URL_FILE *output = writep(stream)
|
||||
? pointer_to_object(stream)->payload.stream.stream
|
||||
: file_to_url_file(stdout);
|
||||
struct pso_pointer c_print( struct pso_pointer p, struct pso_pointer stream ) {
|
||||
struct pso_pointer result = p;
|
||||
URL_FILE *output = writep( stream )
|
||||
? pointer_to_object( stream )->payload.stream.stream
|
||||
: file_to_url_file( stdout );
|
||||
|
||||
if (writep(stream)) {
|
||||
inc_ref(stream);
|
||||
if ( writep( stream ) ) {
|
||||
inc_ref( stream );
|
||||
|
||||
result = in_print(p, output);
|
||||
result = in_print( p, output );
|
||||
|
||||
dec_ref(stream);
|
||||
}
|
||||
dec_ref( stream );
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue