#time: Fixed

Major (unexpected) problem was collision between the name of my header file and that of the system header file!
This commit is contained in:
Simon Brooke 2019-02-07 15:32:06 +00:00
parent 0a9d54f97d
commit af814d8f03
5 changed files with 44 additions and 11 deletions

View file

@ -31,7 +31,7 @@
#include "peano.h" #include "peano.h"
#include "print.h" #include "print.h"
#include "repl.h" #include "repl.h"
#include "time.h" #include "psse_time.h"
// extern char *optarg; /* defined in unistd.h */ // extern char *optarg; /* defined in unistd.h */

View file

@ -378,9 +378,8 @@ void collect_meta( struct cons_pointer stream, char *url ) {
meta = meta =
add_meta_integer( meta, L"size", add_meta_integer( meta, L"size",
( intmax_t ) statbuf.st_size ); ( intmax_t ) statbuf.st_size );
/*
meta = add_meta_time( meta, L"modified", &statbuf.st_mtime ); meta = add_meta_time( meta, L"modified", &statbuf.st_mtime );
*/
} }
break; break;
case CFTYPE_CURL: case CFTYPE_CURL:

View file

@ -24,7 +24,7 @@
#include "map.h" #include "map.h"
#include "stack.h" #include "stack.h"
#include "print.h" #include "print.h"
#include "time.h" #include "psse_time.h"
#include "vectorspace.h" #include "vectorspace.h"
/** /**
@ -140,6 +140,27 @@ void print_vso( URL_FILE * output, struct cons_pointer pointer) {
} }
} }
/**
* stolen from https://stackoverflow.com/questions/11656241/how-to-print-uint128-t-number-using-gcc
*/
void print_128bit( URL_FILE * output, __int128_t n ) {
if ( n == 0 ) {
fwprintf( stderr, L"0" );
} else {
char str[40] = { 0 }; // log10(1 << 128) + '\0'
char *s = str + sizeof( str ) - 1; // start at the end
while ( n != 0 ) {
if ( s == str )
return; // never happens
*--s = "0123456789"[n % 10]; // save last digit
n /= 10; // drop it
}
url_fwprintf( output, L"%s", s );
}
}
/** /**
* Print the cons-space object indicated by `pointer` to the stream indicated * Print the cons-space object indicated by `pointer` to the stream indicated
* by `output`. * by `output`.
@ -257,7 +278,11 @@ struct cons_pointer print( URL_FILE * output, struct cons_pointer pointer ) {
url_fputwc( L'>', output); url_fputwc( L'>', output);
break; break;
case TIMETV: case TIMETV:
url_fwprintf( output, L"<Time: " );
print_string( output, time_to_string( pointer)); print_string( output, time_to_string( pointer));
url_fputws( L"; ", output);
print_128bit( output, pointer2cell(pointer).payload.time.value);
url_fputwc( L'>', output);
break; break;
case TRUETV: case TRUETV:
url_fwprintf( output, L"t" ); url_fwprintf( output, L"t" );

View file

@ -1,5 +1,5 @@
/* /*
* time.h * psse_time.c
* *
* Bare bones of PSSE time. See issue #16. * Bare bones of PSSE time. See issue #16.
* *
@ -8,6 +8,7 @@
*/ */
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <time.h> #include <time.h>
/* /*
* wide characters * wide characters
@ -18,7 +19,7 @@
#include "conspage.h" #include "conspage.h"
#include "consspaceobject.h" #include "consspaceobject.h"
#include "integer.h" #include "integer.h"
#include "time.h" #include "psse_time.h"
#define _GNU_SOURCE #define _GNU_SOURCE
#define seconds_per_year 31557600L #define seconds_per_year 31557600L
@ -90,9 +91,17 @@ struct cons_pointer lisp_time( struct stack_frame *frame, struct cons_pointer fr
* This is temporary, for bootstrapping. * This is temporary, for bootstrapping.
*/ */
struct cons_pointer time_to_string( struct cons_pointer pointer) { struct cons_pointer time_to_string( struct cons_pointer pointer) {
struct cons_pointer result = NIL;
long int t = lisp_time_to_unix_time(pointer); long int t = lisp_time_to_unix_time(pointer);
return c_string_to_lisp_string( t == 0 ? if ( t != 0) {
L"Not yet implemented: cannot print times outside UNIX time\n" : char * bytes = ctime(&t);
ctime(&t)); int l = strlen(bytes) + 1;
wchar_t buffer[ l];
mbstowcs( buffer, bytes, l);
result = c_string_to_lisp_string( buffer);
}
return result;
} }

View file

@ -1,5 +1,5 @@
/* /*
* time.h * psse_time.h
* *
* Bare bones of PSSE time. See issue #16. * Bare bones of PSSE time. See issue #16.
* *