#13: Fixed
This commit is contained in:
parent
0fea9580fa
commit
83accb2be4
|
@ -51,8 +51,9 @@
|
||||||
#ifdef FOPEN_STANDALONE
|
#ifdef FOPEN_STANDALONE
|
||||||
CURLSH *io_share;
|
CURLSH *io_share;
|
||||||
#else
|
#else
|
||||||
#include "io.h"
|
|
||||||
#include "consspaceobject.h"
|
#include "consspaceobject.h"
|
||||||
|
#include "io.h"
|
||||||
|
#include "utils.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -210,10 +211,9 @@ URL_FILE *url_fopen( const char *url, const char *operation ) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
file->handle.file = fopen( url, operation );
|
file->handle.file = fopen( url, operation );
|
||||||
if ( file->handle.file )
|
if ( file->handle.file ) {
|
||||||
file->type = CFTYPE_FILE; /* marked as URL */
|
file->type = CFTYPE_FILE; /* marked as file */
|
||||||
|
} else if ( index_of(':', url ) > -1 ) {
|
||||||
else {
|
|
||||||
file->type = CFTYPE_CURL; /* marked as URL */
|
file->type = CFTYPE_CURL; /* marked as URL */
|
||||||
file->handle.curl = curl_easy_init( );
|
file->handle.curl = curl_easy_init( );
|
||||||
|
|
||||||
|
@ -247,7 +247,11 @@ URL_FILE *url_fopen( const char *url, const char *operation ) {
|
||||||
|
|
||||||
file = NULL;
|
file = NULL;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
file->type = CFTYPE_NONE;
|
||||||
|
/* not a file, and doesn't look like a URL. */
|
||||||
}
|
}
|
||||||
|
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
60
src/io/io.c
60
src/io/io.c
|
@ -34,6 +34,7 @@
|
||||||
#include "integer.h"
|
#include "integer.h"
|
||||||
#include "intern.h"
|
#include "intern.h"
|
||||||
#include "lispops.h"
|
#include "lispops.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The sharing hub for all connections. TODO: Ultimately this probably doesn't
|
* The sharing hub for all connections. TODO: Ultimately this probably doesn't
|
||||||
|
@ -253,27 +254,6 @@ lisp_close( struct stack_frame *frame, struct cons_pointer frame_pointer,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int index_of( char c, char *s ) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for ( i = 0; s[i] != c && s[i] != 0; i++ );
|
|
||||||
|
|
||||||
return s[i] == c ? i : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *trim( char *s ) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for ( i = strlen( s ); ( isblank( s[i] ) || iscntrl( s[i] ) ) && i >= 0;
|
|
||||||
i-- ) {
|
|
||||||
s[i] = '\0';
|
|
||||||
}
|
|
||||||
for ( i = 0; ( isblank( s[i] ) || iscntrl( s[i] ) ) && s[i] != '\0'; i++ );
|
|
||||||
|
|
||||||
return ( char * ) &s[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct cons_pointer add_meta_integer( struct cons_pointer meta, wchar_t *key,
|
struct cons_pointer add_meta_integer( struct cons_pointer meta, wchar_t *key,
|
||||||
long int value ) {
|
long int value ) {
|
||||||
return
|
return
|
||||||
|
@ -289,6 +269,13 @@ struct cons_pointer add_meta_string( struct cons_pointer meta, wchar_t *key,
|
||||||
/* \todo something goes wrong here: I sometimes get junk characters on the
|
/* \todo something goes wrong here: I sometimes get junk characters on the
|
||||||
* end of the string. */
|
* end of the string. */
|
||||||
mbstowcs( buffer, value, strlen( value ) );
|
mbstowcs( buffer, value, strlen( value ) );
|
||||||
|
|
||||||
|
/* hack: get rid of 32766 as a junk character, to see whether there are
|
||||||
|
* others. */
|
||||||
|
for (int i = 0; i < wcslen( buffer); i++) {
|
||||||
|
if (buffer[i] == (wchar_t)32766) buffer[i] = (wchar_t)0;
|
||||||
|
}
|
||||||
|
|
||||||
return make_cons( make_cons( c_string_to_lisp_keyword( key ),
|
return make_cons( make_cons( c_string_to_lisp_keyword( key ),
|
||||||
c_string_to_lisp_string( buffer ) ), meta );
|
c_string_to_lisp_string( buffer ) ), meta );
|
||||||
}
|
}
|
||||||
|
@ -398,10 +385,6 @@ void collect_meta( struct cons_pointer stream, char *url ) {
|
||||||
( 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 );
|
||||||
|
|
||||||
/* this is destructive change before the cell is released into the
|
|
||||||
* wild, and consequently permissible, just. */
|
|
||||||
cell->payload.stream.meta = meta;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CFTYPE_CURL:
|
case CFTYPE_CURL:
|
||||||
|
@ -412,6 +395,10 @@ void collect_meta( struct cons_pointer stream, char *url ) {
|
||||||
curl_easy_setopt( s->handle.curl, CURLOPT_HEADERDATA, stream );
|
curl_easy_setopt( s->handle.curl, CURLOPT_HEADERDATA, stream );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this is destructive change before the cell is released into the
|
||||||
|
* wild, and consequently permissible, just. */
|
||||||
|
cell->payload.stream.meta = meta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -440,6 +427,29 @@ lisp_open( struct stack_frame *frame, struct cons_pointer frame_pointer,
|
||||||
|
|
||||||
if ( nilp( frame->arg[1] ) ) {
|
if ( nilp( frame->arg[1] ) ) {
|
||||||
URL_FILE *stream = url_fopen( url, "r" );
|
URL_FILE *stream = url_fopen( url, "r" );
|
||||||
|
|
||||||
|
debug_printf( DEBUG_IO,
|
||||||
|
L"lisp_open: stream @ %d, stream type = %d, stream handle = %d\n",
|
||||||
|
(int) &stream, (int)stream->type, (int)stream->handle.file);
|
||||||
|
|
||||||
|
switch (stream->type) {
|
||||||
|
case CFTYPE_NONE:
|
||||||
|
return make_exception(
|
||||||
|
c_string_to_lisp_string( L"Could not open stream"),
|
||||||
|
frame_pointer);
|
||||||
|
break;
|
||||||
|
case CFTYPE_FILE:
|
||||||
|
if (stream->handle.file == NULL) {
|
||||||
|
return make_exception(
|
||||||
|
c_string_to_lisp_string( L"Could not open file"),
|
||||||
|
frame_pointer);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CFTYPE_CURL:
|
||||||
|
/* can't tell whether a URL is bad without reading it */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
result = make_read_stream( stream, NIL );
|
result = make_read_stream( stream, NIL );
|
||||||
} else {
|
} else {
|
||||||
// TODO: anything more complex is a problem for another day.
|
// TODO: anything more complex is a problem for another day.
|
||||||
|
|
33
src/utils.c
Normal file
33
src/utils.c
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* utils.c
|
||||||
|
*
|
||||||
|
* little generally useful functions which aren't in any way special to PSSE.
|
||||||
|
*
|
||||||
|
* (c) 2019 Simon Brooke <simon@journeyman.cc>
|
||||||
|
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
int index_of( char c, char *s ) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for ( i = 0; s[i] != c && s[i] != 0; i++ );
|
||||||
|
|
||||||
|
return s[i] == c ? i : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *trim( char *s ) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for ( i = strlen( s ); ( isblank( s[i] ) || iscntrl( s[i] ) ) && i >= 0;
|
||||||
|
i-- ) {
|
||||||
|
s[i] = '\0';
|
||||||
|
}
|
||||||
|
for ( i = 0; ( isblank( s[i] ) || iscntrl( s[i] ) ) && s[i] != '\0'; i++ );
|
||||||
|
|
||||||
|
return ( char * ) &s[i];
|
||||||
|
}
|
15
src/utils.h
Normal file
15
src/utils.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* utils.h
|
||||||
|
*
|
||||||
|
* little generally useful functions which aren't in any way special to PSSE.
|
||||||
|
*
|
||||||
|
* (c) 2019 Simon Brooke <simon@journeyman.cc>
|
||||||
|
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __psse_utils_h
|
||||||
|
#define __psse_utils_h
|
||||||
|
|
||||||
|
int index_of( char c, char *s );
|
||||||
|
char *trim( char *s );
|
||||||
|
#endif
|
Loading…
Reference in a new issue