Commit 7c8304b8 authored by Erick Gallesio's avatar Erick Gallesio

Added the function CLOSE-PORT-HOOK and CLOSE-PORT-HOOK-SET!

parent 83afb8bc
......@@ -2,7 +2,7 @@
#
# Author: Erick Gallesio [eg@unice.fr]
# Creation date: 11-Apr-2000 10:30 (eg)
# Last file update: 5-May-2007 21:00 (eg)
# Last file update: 15-May-2007 13:44 (eg)
SUBDIRS = Match.d SILex.d Lalr.d ScmPkg.d @LURCDIR@
......@@ -45,6 +45,7 @@ scheme_SRCS = STklos.init \
full-conditions.stk \
getopt.stk \
gunzip.stk \
http.stk \
lex-rt.stk \
make-C-boot.stk \
pp.stk \
......@@ -81,6 +82,7 @@ scheme_OBJS = compfile.ostk \
env.ostk \
getopt.ostk \
gunzip.ostk \
http.ostk \
lex-rt.ostk \
pp.ostk \
recette.ostk \
......
......@@ -18,7 +18,7 @@
#
# Author: Erick Gallesio [eg@unice.fr]
# Creation date: 11-Apr-2000 10:30 (eg)
# Last file update: 5-May-2007 21:00 (eg)
# Last file update: 15-May-2007 13:44 (eg)
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
......@@ -234,6 +234,7 @@ scheme_SRCS = STklos.init \
full-conditions.stk \
getopt.stk \
gunzip.stk \
http.stk \
lex-rt.stk \
make-C-boot.stk \
pp.stk \
......@@ -270,6 +271,7 @@ scheme_OBJS = compfile.ostk \
env.ostk \
getopt.ostk \
gunzip.ostk \
http.ostk \
lex-rt.ostk \
pp.ostk \
recette.ostk \
......
......@@ -21,7 +21,7 @@
;;;;
;;;; Author: Erick Gallesio [eg@unice.fr]
;;;; Creation date: 01-Jan-2000 15:04 (eg)
;;;; Last file update: 14-Apr-2007 10:47 (eg)
;;;; Last file update: 15-May-2007 16:48 (eg)
;;;;
(include "runtime.stk") ; Definition necessary for the bootstrap
......@@ -53,8 +53,9 @@
(autoload "pp" pp pretty-print)
(autoload "env" null-environment scheme-report-environment
interaction-environment)
(autoload "http" http-open http-parse-status-line
http-parse-header http-find-body http-download)
(autoload "lex-rt" lexer-next-token)
;(syntax-autoload "snow-support" package*)
(syntax-autoload "scmpkg-support" interface)
(autoload "srfi-27" random-integer random-real)
(syntax-autoload "srfi-34" with-exception-handler guard)
......
;;;;
;;;; http.stk -- Minimal HTTP management for stklos-pkg
;;;;
;;;; Copyright 2007 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
;;;;
;;;;
;;;; This program is free software; you can redistribute it and/or modify
;;;; it under the terms of the GNU General Public License as published by
;;;; the Free Software Foundation; either version 2 of the License, or
;;;; (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
;;;; USA.
;;;;
;;;; Author: Erick Gallesio [eg@essi.fr]
;;;; Creation date: 12-Jan-2007 09:03 (eg)
;;;; Last file update: 12-Feb-2007 18:40 (eg)
;;;;
(define (http-get url output)
;; Copy the content of url to the output port
(define (skip-header port)
(let loop ((line (read-line port)))
(unless (or (eof-object? line) (string=? line ""))
(loop (read-line port)))))
(define (read-header port)
(let loop ((line (read-line port))
(res '()))
(if (or (eof-object? line) (string=? line ""))
res
(let ((ln (regexp-match "([^:]+): *(.*)" line)))
(if ln
(loop (read-line port)
(cons (cons (string-upcase (cadr ln)) (caddr ln))
res))
(loop (read-line port) res))))))
(define (redirect-url server port user sock)
(let* ((header (read-header (socket-input sock)))
(loc (assoc "LOCATION" header)))
(if loc
(begin
(socket-shutdown sock #t)
(copy-url server port user (cdr loc) ""))
(error "bad redirection when fetching url ~S" url))))
(define (copy-url server port user path query)
(let* ((s (make-client-socket server port))
(out (socket-output s))
(in (socket-input s))
(pth (if (equal? query "") path (format "~a?~a" path query))))
;; Send HTTP request
(fprintf out "GET ~a HTTP/1.0\r\n" pth)
(fprintf out "Host: ~a\r\n" server)
(fprintf out "Port: ~a\r\n" port)
(when user
(fprintf out "Authorization: Basic ~a\r\n" (base64-encode-string user)))
(fprintf out "Connection: close\r\n")
(fprintf out "\r\n")
(flush-output-port out)
;; Read header
(let ((line (read-line in)))
(cond
((regexp-match "[Hh][Tt][Tt][Pp].* +200 +.*" line)
;; The request is correct. Skip the header
(skip-header in)
;; copy the content of the url on output
(copy-port in output)
(socket-shutdown s #t))
((regexp-match "[Hh][Tt][Tt][Pp].* +307 +.*" line)
;; Page has moved
(redirect-url server port user s))
(else
(error "cannot get the document at url ~s. code ~s" url line))))))
(let ((info (uri-parse url)))
(unless (equal? (key-get info :scheme) "http")
(error "bad url (protocol is not http) ~S" url))
(let ((user (key-get info :user #f))
(host (key-get info :host))
(port (key-get info :port))
(path (key-get info :path))
(query (key-get info :query)))
(copy-url host port user path query))))
......@@ -21,10 +21,10 @@
;;;;
;;;; Author: Erick Gallesio [eg@essi.fr]
;;;; Creation date: 22-Dec-2006 11:32 (eg)
;;;; Last file update: 26-Apr-2007 17:40 (eg)
;;;; Last file update: 15-May-2007 16:30 (eg)
;;;;
(include "http.stk")
(include "../lib/http.stk")
(include "types.stk")
(include "params.stk")
......
......@@ -21,7 +21,7 @@
;;;;
;;;; Author: Erick Gallesio [eg@essi.fr]
;;;; Creation date: 14-Jan-2007 13:37 (eg)
;;;; Last file update: 14-Mar-2007 12:22 (eg)
;;;; Last file update: 15-May-2007 15:49 (eg)
;;;;
;; ----------------------------------------------------------------------
......@@ -159,14 +159,14 @@
(system (format "tar xfz ~a -C ~a" file directory)))
;; ----------------------------------------------------------------------
;; md5sum-file ...
;; ----------------------------------------------------------------------
(define (md5sum-file filename)
(with-input-from-file (format "| md5sum ~a" filename)
(lambda ()
(read-chars 32))))
;;//;; ----------------------------------------------------------------------
;;//;; md5sum-file ...
;;//;; ----------------------------------------------------------------------
;;//(define (md5sum-file filename)
;;// (with-input-from-file (format "| md5sum ~a" filename)
;;// (lambda ()
;;// (read-chars 32))))
;;//
;; ----------------------------------------------------------------------
;; sed ...
......
......@@ -21,7 +21,7 @@
;;;;
;;;; Author: Erick Gallesio [eg@essi.fr]
;;;; Creation date: 26-Dec-2006 16:23 (eg)
;;;; Last file update: 14-Mar-2007 11:38 (eg)
;;;; Last file update: 14-May-2007 14:56 (eg)
;;;;
......@@ -51,7 +51,7 @@
(define stklos-pkg-sync-urls
(make-parameter '(
("main" "http://scheme:scmpkg@redrock.inria.fr:8080/hop/scmpkg/sync")
("main" "http://hop.inria.fr/hop/scmpkg/sync")
; ("stklos" "http://www.stklos.org/Snow/sync")
)))
......@@ -21,7 +21,7 @@
;;;;
;;;; Author: Erick Gallesio [eg@essi.fr]
;;;; Creation date: 26-Dec-2006 18:20 (eg)
;;;; Last file update: 17-Apr-2007 12:31 (eg)
;;;; Last file update: 15-May-2007 15:49 (eg)
;;;;
......@@ -131,7 +131,7 @@
(flush-output-port (current-error-port))
(let ((out (open-output-string)))
(http-get url out)
(http-download url out)
(let ((pkgs (read-from-string (get-output-string out))))
;; Save the informations of this server
(let* ((name (make-path (stklos-pkg-servers-directory) server-name))
......@@ -228,11 +228,7 @@
package))
;; Download file
(let ((out (open-file path "w")))
(unless out
(error "cannot open file ~s when downloading ~s" path package))
(http-get url out)
(close-port out))
(http-download url path)
;; Verify file integrity
(let ((lmd5 (md5sum-file path)))
......
This diff is collapsed.
This diff is collapsed.
......@@ -21,7 +21,7 @@
*
* Author: Erick Gallesio [eg@unice.fr]
* Creation date: 8-Jan-2000 14:48 (eg)
* Last file update: 11-May-2007 15:50 (eg)
* Last file update: 14-May-2007 12:02 (eg)
*
* This implementation is built by reverse engineering on an old SUNOS 4.1.1
* stdio.h. It has been simplified to fit the needs for STklos. In particular
......@@ -432,6 +432,7 @@ make_fport(char *fname, FILE *f, int flags)
PORT_FNAME(res) = STk_strdup(fname);
PORT_LINE(res) = 1;
PORT_POS(res) = 0;
PORT_CLOSEHOOK(res) = STk_false;
PORT_PRINT(res) = fport_print;
PORT_RELEASE(res) = unregister_port;
......
/*
* md5.c -- MD5 algorithm
*
* Copyright 2007 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*
* Author: Erick Gallesio [eg@essi.fr]
* Creation date: 13-May-2007 22:21 (eg)
* Last file update: 14-May-2007 10:35 (eg)
*/
/*
* RFC 1321 compliant MD5 implementation,
* by Christophe Devine <devine@cr0.net>;
* this program is licensed under the GPL.
*/
#include <string.h>
#include "md5.h"
#define GET_UINT32(n,b,i) \
{ \
(n) = (uint32) ((uint8 *) b)[(i)] \
| (((uint32) ((uint8 *) b)[(i)+1]) << 8) \
| (((uint32) ((uint8 *) b)[(i)+2]) << 16) \
| (((uint32) ((uint8 *) b)[(i)+3]) << 24); \
}
#define PUT_UINT32(n,b,i) \
{ \
(((uint8 *) b)[(i)] ) = (uint8) (((n) ) & 0xFF); \
(((uint8 *) b)[(i)+1]) = (uint8) (((n) >> 8) & 0xFF); \
(((uint8 *) b)[(i)+2]) = (uint8) (((n) >> 16) & 0xFF); \
(((uint8 *) b)[(i)+3]) = (uint8) (((n) >> 24) & 0xFF); \
}
void md5_starts( struct md5_context *ctx )
{
ctx->total[0] = 0;
ctx->total[1] = 0;
ctx->state[0] = 0x67452301;
ctx->state[1] = 0xEFCDAB89;
ctx->state[2] = 0x98BADCFE;
ctx->state[3] = 0x10325476;
}
void md5_process( struct md5_context *ctx, uint8 data[64] )
{
uint32 A, B, C, D, X[16];
GET_UINT32( X[0], data, 0 );
GET_UINT32( X[1], data, 4 );
GET_UINT32( X[2], data, 8 );
GET_UINT32( X[3], data, 12 );
GET_UINT32( X[4], data, 16 );
GET_UINT32( X[5], data, 20 );
GET_UINT32( X[6], data, 24 );
GET_UINT32( X[7], data, 28 );
GET_UINT32( X[8], data, 32 );
GET_UINT32( X[9], data, 36 );
GET_UINT32( X[10], data, 40 );
GET_UINT32( X[11], data, 44 );
GET_UINT32( X[12], data, 48 );
GET_UINT32( X[13], data, 52 );
GET_UINT32( X[14], data, 56 );
GET_UINT32( X[15], data, 60 );
#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
#define P(a,b,c,d,k,s,t) \
{ \
a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
}
A = ctx->state[0];
B = ctx->state[1];
C = ctx->state[2];
D = ctx->state[3];
#define F(x,y,z) (z ^ (x & (y ^ z)))
P( A, B, C, D, 0, 7, 0xD76AA478 );
P( D, A, B, C, 1, 12, 0xE8C7B756 );
P( C, D, A, B, 2, 17, 0x242070DB );
P( B, C, D, A, 3, 22, 0xC1BDCEEE );
P( A, B, C, D, 4, 7, 0xF57C0FAF );
P( D, A, B, C, 5, 12, 0x4787C62A );
P( C, D, A, B, 6, 17, 0xA8304613 );
P( B, C, D, A, 7, 22, 0xFD469501 );
P( A, B, C, D, 8, 7, 0x698098D8 );
P( D, A, B, C, 9, 12, 0x8B44F7AF );
P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
P( B, C, D, A, 11, 22, 0x895CD7BE );
P( A, B, C, D, 12, 7, 0x6B901122 );
P( D, A, B, C, 13, 12, 0xFD987193 );
P( C, D, A, B, 14, 17, 0xA679438E );
P( B, C, D, A, 15, 22, 0x49B40821 );
#undef F
#define F(x,y,z) (y ^ (z & (x ^ y)))
P( A, B, C, D, 1, 5, 0xF61E2562 );
P( D, A, B, C, 6, 9, 0xC040B340 );
P( C, D, A, B, 11, 14, 0x265E5A51 );
P( B, C, D, A, 0, 20, 0xE9B6C7AA );
P( A, B, C, D, 5, 5, 0xD62F105D );
P( D, A, B, C, 10, 9, 0x02441453 );
P( C, D, A, B, 15, 14, 0xD8A1E681 );
P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
P( A, B, C, D, 9, 5, 0x21E1CDE6 );
P( D, A, B, C, 14, 9, 0xC33707D6 );
P( C, D, A, B, 3, 14, 0xF4D50D87 );
P( B, C, D, A, 8, 20, 0x455A14ED );
P( A, B, C, D, 13, 5, 0xA9E3E905 );
P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
P( C, D, A, B, 7, 14, 0x676F02D9 );
P( B, C, D, A, 12, 20, 0x8D2A4C8A );
#undef F
#define F(x,y,z) (x ^ y ^ z)
P( A, B, C, D, 5, 4, 0xFFFA3942 );
P( D, A, B, C, 8, 11, 0x8771F681 );
P( C, D, A, B, 11, 16, 0x6D9D6122 );
P( B, C, D, A, 14, 23, 0xFDE5380C );
P( A, B, C, D, 1, 4, 0xA4BEEA44 );
P( D, A, B, C, 4, 11, 0x4BDECFA9 );
P( C, D, A, B, 7, 16, 0xF6BB4B60 );
P( B, C, D, A, 10, 23, 0xBEBFBC70 );
P( A, B, C, D, 13, 4, 0x289B7EC6 );
P( D, A, B, C, 0, 11, 0xEAA127FA );
P( C, D, A, B, 3, 16, 0xD4EF3085 );
P( B, C, D, A, 6, 23, 0x04881D05 );
P( A, B, C, D, 9, 4, 0xD9D4D039 );
P( D, A, B, C, 12, 11, 0xE6DB99E5 );
P( C, D, A, B, 15, 16, 0x1FA27CF8 );
P( B, C, D, A, 2, 23, 0xC4AC5665 );
#undef F
#define F(x,y,z) (y ^ (x | ~z))
P( A, B, C, D, 0, 6, 0xF4292244 );
P( D, A, B, C, 7, 10, 0x432AFF97 );
P( C, D, A, B, 14, 15, 0xAB9423A7 );
P( B, C, D, A, 5, 21, 0xFC93A039 );
P( A, B, C, D, 12, 6, 0x655B59C3 );
P( D, A, B, C, 3, 10, 0x8F0CCC92 );
P( C, D, A, B, 10, 15, 0xFFEFF47D );
P( B, C, D, A, 1, 21, 0x85845DD1 );
P( A, B, C, D, 8, 6, 0x6FA87E4F );
P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
P( C, D, A, B, 6, 15, 0xA3014314 );
P( B, C, D, A, 13, 21, 0x4E0811A1 );
P( A, B, C, D, 4, 6, 0xF7537E82 );
P( D, A, B, C, 11, 10, 0xBD3AF235 );
P( C, D, A, B, 2, 15, 0x2AD7D2BB );
P( B, C, D, A, 9, 21, 0xEB86D391 );
#undef F
ctx->state[0] += A;
ctx->state[1] += B;
ctx->state[2] += C;
ctx->state[3] += D;
}
void md5_update( struct md5_context *ctx, uint8 *input, uint32 length )
{
uint32 left, fill;
if( ! length ) return;
left = ( ctx->total[0] >> 3 ) & 0x3F;
fill = 64 - left;
ctx->total[0] += length << 3;
ctx->total[1] += length >> 29;
ctx->total[0] &= 0xFFFFFFFF;
ctx->total[1] += ctx->total[0] < ( length << 3 );
if( left && length >= fill )
{
memcpy( (void *) (ctx->buffer + left), (void *) input, fill );
md5_process( ctx, ctx->buffer );
length -= fill;
input += fill;
left = 0;
}
while( length >= 64 )
{
md5_process( ctx, input );
length -= 64;
input += 64;
}
if( length )
{
memcpy( (void *) (ctx->buffer + left), (void *) input, length );
}
}
static uint8 md5_padding[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
void md5_finish( struct md5_context *ctx, uint8 digest[16] )
{
uint32 last, padn;
uint8 msglen[8];
PUT_UINT32( ctx->total[0], msglen, 0 );
PUT_UINT32( ctx->total[1], msglen, 4 );
last = ( ctx->total[0] >> 3 ) & 0x3F;
padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
md5_update( ctx, md5_padding, padn );
md5_update( ctx, msglen, 8 );
PUT_UINT32( ctx->state[0], digest, 0 );
PUT_UINT32( ctx->state[1], digest, 4 );
PUT_UINT32( ctx->state[2], digest, 8 );
PUT_UINT32( ctx->state[3], digest, 12 );
}
/*===========================================================================*\
*
* Scheme Primitive ...
*
\*===========================================================================*/
#include "stklos.h"
#define MD5BUFSIZ 8192
/*
<doc EXT md5sum
* (md5sum obj)
*
* Return a string contening the md5 dum of |obj|. The given parameter can
* be a string or an open input port.
doc>
*/
DEFINE_PRIMITIVE("md5sum", md5sum, subr1, (SCM obj))
{
struct md5_context ctx;
unsigned char md5sum[16];
char output[33];
int i;
md5_starts(&ctx);
if (STRINGP(obj)) { /* string */
md5_update(&ctx, (uint8 *) STRING_CHARS(obj), STRING_SIZE(obj));
}
else if (IPORTP(obj)) { /* input port */
char buffer[MD5BUFSIZ];
int n;
while((n = STk_read_buffer(obj, buffer, MD5BUFSIZ)) > 0 ) {
md5_update(&ctx, (uint8 *)buffer, n);
}
}
else /* neither string or port => error */
STk_error("bad object ~S", obj);
md5_finish(&ctx, md5sum);
/* Build the Scheme result */
for(i = 0; i < 16; i++) {
sprintf(output + i * 2, "%02x", md5sum[i]);
}
return STk_Cstring2string(output);
}
/*===========================================================================*\
*
* Initialization code
*
\*===========================================================================*/
int STk_init_md5(void)
{
ADD_PRIMITIVE(md5sum);
return TRUE;
}
/*
* md5.c -- md5
*
* Copyright © 2007 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*
* Author: Erick Gallesio [eg@essi.fr]
* Creation date: 13-May-2007 22:21 (eg)
* Last file update: 13-May-2007 22:51 (eg)
*/
/*
* RFC 1321 compliant MD5 implementation,
* by Christophe Devine <devine@cr0.net>
* this program is licensed under the GPL.
*/
#ifndef _MD5_H
#define _MD5_H
typedef unsigned char uint8;
typedef unsigned int uint32;
struct md5_context
{
uint32 total[2];
uint32 state[4];
uint8 buffer[64];
};
void md5_starts( struct md5_context *ctx );
void md5_update( struct md5_context *ctx, uint8 *input, uint32 length );
void md5_finish( struct md5_context *ctx, uint8 digest[16] );
void md5_hash(uint8 digest[16], uint8 *input, uint32 length);
#endif /* md5.h */
/*
* p o r t . c -- ports implementation
*
* Copyright 1993-2006 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
* Copyright 1993-2007 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......@@ -20,7 +20,7 @@
*
* Author: Erick Gallesio [eg@unice.fr]
* Creation date: 17-Feb-1993 12:27
* Last file update: 13-Sep-2006 08:58 (eg)
* Last file update: 15-May-2007 11:38 (eg)
*
*/
......@@ -1170,7 +1170,7 @@ DEFINE_PRIMITIVE("read-line", read_line, subr01, (SCM port))
* (copy-port in out max)
*
* Copy the content of port |in|, which must be opened for reading, on
* port |out|, which must be opened for writing. If |max| is nont specified,
* port |out|, which must be opened for writing. If |max| is not specified,
* All the characters from the input port are copied on ouput port. If |max|
* is specified, it must be an integer indicating the maximum number of characters
* which are copied from |in| to |out|.
......@@ -1203,7 +1203,6 @@ DEFINE_PRIMITIVE("copy-port", copy_port, subr23, (SCM p1, SCM p2, SCM max))
}
if (n == 0) break;
if ((n = STk_read_buffer(p1, buffer, n)) > 0) {
m = STk_write_buffer(p2, buffer, n);
if (n != m) goto Error;
......@@ -1343,6 +1342,50 @@ DEFINE_PRIMITIVE("port-rewind", port_rewind, subr1, (SCM port))
return STk_void;
}
/*
<doc EXT port-close-hook-set!
* (port-close-hook-set! port thunk)
*
* Associate the procedure |thunk| to |port|. The thunk will be called
* the first time |port| is closed.
* @lisp
* (let* ((tmp (temporary-file-name))
* (p (open-output-file tmp))
* (foo #t))
* (port-close-hook-set! p
* (lambda()
* (remove-file tmp)
* (set! foo #t)))
* (close-port p)
* foo)
* @end lisp
doc>
*/
DEFINE_PRIMITIVE("port-close-hook-set!", port_close_hook_set, subr2,
(SCM port, SCM thunk))
{
if (!PORTP(port)) STk_error_bad_port(port);
if (!STk_procedurep(thunk)) STk_error("bad procedure ~S", thunk);
PORT_CLOSEHOOK(port) = thunk;
return STk_void;
}
/*
<doc EXT port-close-hook
* (port-close-hook port)
*
* Returns the user close procedure associated to the given |port|.
doc>
*/
DEFINE_PRIMITIVE("port-close-hook", port_close_hook, subr1, (SCM port))
{
if (!PORTP(port)) STk_error_bad_port(port);
return PORT_CLOSEHOOK(port);
}
/*===========================================================================*\
*
* Initializations
......@@ -1445,6 +1488,8 @@ int STk_init_port(void)
ADD_PRIMITIVE(port_position);
ADD_PRIMITIVE(port_seek);
ADD_PRIMITIVE(port_rewind);
ADD_PRIMITIVE(port_close_hook);
ADD_PRIMITIVE(port_close_hook_set);
return STk_init_fport() &&
STk_init_sport() &&
......
/*
* s i o . c -- Low level I/O
*
* Copyright 1993-2005 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
* Copyright 1993-2007 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
*
*
* This program is free software; you can redistribute it and/or modify
......@@ -22,7 +22,7 @@
*
* Author: Erick Gallesio [eg@kaolin.unice.fr]
* Creation date: ????
* Last file update: 22-Aug-2005 12:01 (eg)