1
/* TinyScheme Extensions
2
* (c) 2002 Visual Tools, S.A.
3
* Manuel Heras-Gilsanz (manuel@heras-gilsanz.com)
5
* This software is subject to the terms stated in the
19
#include "tinyscheme/scheme-private.h"
25
FILE_TYPE_UNKNOWN = 0, FILE_TYPE_FILE, FILE_TYPE_DIR, FILE_TYPE_LINK
35
file_type_constants[] = {
36
{ "FILE-TYPE-UNKNOWN", FILE_TYPE_UNKNOWN },
37
{ "FILE-TYPE-FILE", FILE_TYPE_FILE },
38
{ "FILE-TYPE-DIR", FILE_TYPE_DIR },
39
{ "FILE-TYPE-LINK", FILE_TYPE_LINK },
43
pointer foreign_fileexists(scheme *sc, pointer args);
44
pointer foreign_filetype(scheme *sc, pointer args);
45
pointer foreign_filesize(scheme *sc, pointer args);
46
pointer foreign_filedelete(scheme *sc, pointer args);
47
pointer foreign_diropenstream(scheme *sc, pointer args);
48
pointer foreign_dirreadentry(scheme *sc, pointer args);
49
pointer foreign_dirrewind(scheme *sc, pointer args);
50
pointer foreign_dirclosestream(scheme *sc, pointer args);
51
pointer foreign_time(scheme *sc, pointer args);
52
pointer foreign_gettimeofday(scheme *sc, pointer args);
53
pointer foreign_usleep(scheme *sc, pointer args);
54
void init_ftx (scheme *sc);
57
pointer foreign_fileexists(scheme *sc, pointer args)
65
first_arg = sc->vptr->pair_car(args);
66
if (!sc->vptr->is_string(first_arg))
69
filename = sc->vptr->string_value(first_arg);
70
filename = g_filename_from_utf8 (filename, -1, NULL, NULL, NULL);
71
if (g_file_test(filename, G_FILE_TEST_EXISTS))
77
pointer foreign_filetype(scheme *sc, pointer args)
86
first_arg = sc->vptr->pair_car(args);
87
if (!sc->vptr->is_string(first_arg))
90
filename = sc->vptr->string_value(first_arg);
91
filename = g_filename_from_utf8 (filename, -1, NULL, NULL, NULL);
93
if (g_file_test(filename, G_FILE_TEST_IS_REGULAR))
94
retcode = FILE_TYPE_FILE;
95
else if (g_file_test(filename, G_FILE_TEST_IS_DIR))
96
retcode = FILE_TYPE_DIR;
97
else if (g_file_test(filename, G_FILE_TEST_IS_SYMLINK))
98
retcode = FILE_TYPE_LINK;
100
retcode = FILE_TYPE_UNKNOWN;
102
return sc->vptr->mk_integer(sc, retcode);
105
pointer foreign_filesize(scheme *sc, pointer args)
116
first_arg = sc->vptr->pair_car(args);
117
if (!sc->vptr->is_string(first_arg))
120
filename = sc->vptr->string_value(first_arg);
121
filename = g_filename_from_utf8 (filename, -1, NULL, NULL, NULL);
122
retcode = stat(filename, &buf);
124
ret = sc->vptr->mk_integer(sc,buf.st_size);
130
pointer foreign_filedelete(scheme *sc, pointer args)
140
first_arg = sc->vptr->pair_car(args);
141
if (!sc->vptr->is_string(first_arg)) {
145
filename = sc->vptr->string_value(first_arg);
146
filename = g_filename_from_utf8 (filename, -1, NULL, NULL, NULL);
147
retcode = unlink(filename);
155
pointer foreign_diropenstream(scheme *sc, pointer args)
164
first_arg = sc->vptr->pair_car(args);
165
if (!sc->vptr->is_string(first_arg))
168
dirpath = sc->vptr->string_value(first_arg);
169
dirpath = g_filename_from_utf8 (dirpath, -1, NULL, NULL, NULL);
171
dir = g_dir_open(dirpath, 0, NULL);
175
/* Stuffing a pointer in a long may not always be portable ~~~~~ */
176
return (sc->vptr->mk_integer(sc, (long) dir));
179
pointer foreign_dirreadentry(scheme *sc, pointer args)
188
first_arg = sc->vptr->pair_car(args);
189
if (!sc->vptr->is_integer(first_arg))
192
dir = (GDir *) sc->vptr->ivalue(first_arg);
196
entry = (gchar *)g_dir_read_name(dir);
200
entry = g_filename_to_utf8 (entry, -1, NULL, NULL, NULL);
201
return (sc->vptr->mk_string(sc, entry));
204
pointer foreign_dirrewind(scheme *sc, pointer args)
212
first_arg = sc->vptr->pair_car(args);
213
if (!sc->vptr->is_integer(first_arg))
216
dir = (GDir *) sc->vptr->ivalue(first_arg);
224
pointer foreign_dirclosestream(scheme *sc, pointer args)
232
first_arg = sc->vptr->pair_car(args);
233
if (!sc->vptr->is_integer(first_arg))
236
dir = (GDir *) sc->vptr->ivalue(first_arg);
245
pointer foreign_time(scheme *sc, pointer args)
256
now_tm = localtime(&now);
261
g_date_set_time(&date, &now);
262
g_date_to_struct_tm(&now, &now_tm);
265
ret = sc->vptr->cons(sc, sc->vptr->mk_integer(sc,(long) now_tm->tm_year),
266
sc->vptr->cons(sc, sc->vptr->mk_integer(sc,(long) now_tm->tm_mon),
267
sc->vptr->cons(sc, sc->vptr->mk_integer(sc,(long) now_tm->tm_mday),
268
sc->vptr->cons(sc, sc->vptr->mk_integer(sc,(long) now_tm->tm_hour),
269
sc->vptr->cons(sc, sc->vptr->mk_integer(sc,(long) now_tm->tm_min),
270
sc->vptr->cons(sc, sc->vptr->mk_integer(sc,(long) now_tm->tm_sec),sc->NIL))))));
275
pointer foreign_gettimeofday(scheme *sc, pointer args)
280
g_get_current_time(&tv);
282
ret = sc->vptr->cons(sc, sc->vptr->mk_integer(sc,(long) tv.tv_sec),
283
sc->vptr->cons(sc, sc->vptr->mk_integer(sc,(long) tv.tv_usec),
289
pointer foreign_usleep(scheme *sc, pointer args)
297
first_arg = sc->vptr->pair_car(args);
298
if (!sc->vptr->is_integer(first_arg))
301
usec = sc->vptr->ivalue(first_arg);
307
/* This function gets called when TinyScheme is loading the extension */
308
void init_ftx (scheme *sc)
312
sc->vptr->scheme_define(sc, sc->global_env,
313
sc->vptr->mk_symbol(sc,"time"),
314
sc->vptr->mk_foreign_func(sc, foreign_time));
315
sc->vptr->scheme_define(sc, sc->global_env,
316
sc->vptr->mk_symbol(sc,"gettimeofday"),
317
sc->vptr->mk_foreign_func(sc, foreign_gettimeofday));
318
sc->vptr->scheme_define(sc, sc->global_env,
319
sc->vptr->mk_symbol(sc,"usleep"),
320
sc->vptr->mk_foreign_func(sc, foreign_usleep));
322
sc->vptr->scheme_define(sc, sc->global_env,
323
sc->vptr->mk_symbol(sc,"file-exists?"),
324
sc->vptr->mk_foreign_func(sc, foreign_fileexists));
325
sc->vptr->scheme_define(sc, sc->global_env,
326
sc->vptr->mk_symbol(sc,"file-type"),
327
sc->vptr->mk_foreign_func(sc, foreign_filetype));
328
sc->vptr->scheme_define(sc, sc->global_env,
329
sc->vptr->mk_symbol(sc,"file-size"),
330
sc->vptr->mk_foreign_func(sc, foreign_filesize));
331
sc->vptr->scheme_define(sc, sc->global_env,
332
sc->vptr->mk_symbol(sc,"file-delete"),
333
sc->vptr->mk_foreign_func(sc, foreign_filedelete));
334
sc->vptr->scheme_define(sc, sc->global_env,
335
sc->vptr->mk_symbol(sc,"dir-open-stream"),
336
sc->vptr->mk_foreign_func(sc, foreign_diropenstream));
337
sc->vptr->scheme_define(sc, sc->global_env,
338
sc->vptr->mk_symbol(sc,"dir-read-entry"),
339
sc->vptr->mk_foreign_func(sc, foreign_dirreadentry));
340
sc->vptr->scheme_define(sc, sc->global_env,
341
sc->vptr->mk_symbol(sc,"dir-rewind"),
342
sc->vptr->mk_foreign_func(sc, foreign_dirrewind));
343
sc->vptr->scheme_define(sc, sc->global_env,
344
sc->vptr->mk_symbol(sc,"dir-close-stream"),
345
sc->vptr->mk_foreign_func(sc, foreign_dirclosestream));
347
for (i = 0; file_type_constants[i].name != NULL; ++i)
349
sc->vptr->scheme_define(sc, sc->global_env,
350
sc->vptr->mk_symbol(sc, file_type_constants[i].name),
351
sc->vptr->mk_integer(sc, file_type_constants[i].value));