X-Git-Url: http://git.code-monkey.de/?p=ruby-eet.git;a=blobdiff_plain;f=ext%2Fext.c;h=0ab91b3ad66c6525c3c464723c0961c09f7e2765;hp=4fb3f1e45895a2873f0ed3ee115fa320a6448eef;hb=3684e1f7b1a70989f359bc1f9ef6a1388811567c;hpb=3309a248bccc0f71fc05bafb8bfeb4ca2a73d0f3 diff --git a/ext/ext.c b/ext/ext.c index 4fb3f1e..0ab91b3 100644 --- a/ext/ext.c +++ b/ext/ext.c @@ -1,5 +1,5 @@ /* - * $Id: ext.c 72 2005-07-16 13:15:42Z tilman $ + * $Id: ext.c 74 2006-05-13 10:34:36Z tilman $ * * Copyright (c) 2005 Tilman Sauerbeck (tilman at code-monkey de) * @@ -36,6 +36,15 @@ if (!*(ef)) \ rb_raise (rb_eIOError, "closed stream"); +#define CHECK_READABLE(ef) \ + switch (eet_mode_get (*ef)) { \ + case EET_FILE_MODE_READ: \ + case EET_FILE_MODE_READ_WRITE: \ + break; \ + default: \ + rb_raise (rb_eIOError, "permission denied"); \ + } + #ifdef WORDS_BIGENDIAN # define BSWAP32(x) \ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \ @@ -179,47 +188,61 @@ c_close (VALUE self) return self; } +static VALUE +get_keys (Eet_File *ef, char *glob) +{ + VALUE ret; + char **keys; + int i, count = 0; + + keys = eet_list (ef, glob, &count); + ret = rb_ary_new2 (count); + + for (i = 0; i < count; i++) + rb_ary_store (ret, i, rb_str_new2 (keys[i])); + + free (keys); + + return ret; +} + /* * call-seq: - * ef.list([glob]) -> array + * ef.entries -> array * - * Returns an Array of entries in _ef_ that match the shell glob - * _glob_ (defaulting to "*"). + * Returns an Array with the keys of the entries in _ef_. + * If the keys cannot be retrieved, an +IOError+ is raised. */ static VALUE -c_list (int argc, VALUE *argv, VALUE self) +c_entries (VALUE self) { - VALUE glob = Qnil, ret; Eet_File **ef = NULL; - char **entries, *tmp = "*"; - int i, count = 0; Data_Get_Struct (self, Eet_File *, ef); CHECK_CLOSED (ef); + CHECK_READABLE (ef); - switch (eet_mode_get (*ef)) { - case EET_FILE_MODE_READ: - case EET_FILE_MODE_READ_WRITE: - break; - default: - rb_raise (rb_eIOError, "cannot list entries"); - } - - rb_scan_args (argc, argv, "01", &glob); - - if (!NIL_P (glob)) - tmp = StringValuePtr (glob); - - ret = rb_ary_new (); - - entries = eet_list (*ef, tmp, &count); + return get_keys (*ef, "*"); +} - for (i = 0; i < count; i++) - rb_ary_push (ret, rb_str_new2 (entries[i])); +/* + * call-seq: + * ef[glob] -> array + * + * Returns an Array with the keys of entries in _ef_ that match the + * shell glob _glob_. + * If the keys cannot be retrieved, an +IOError+ is raised. + */ +static VALUE +c_glob (VALUE self, VALUE glob) +{ + Eet_File **ef = NULL; - free (entries); + Data_Get_Struct (self, Eet_File *, ef); + CHECK_CLOSED (ef); + CHECK_READABLE (ef); - return ret; + return get_keys (*ef, StringValuePtr (glob)); } /* @@ -638,7 +661,8 @@ Init_eet_ext () rb_define_singleton_method (c, "open", c_open, -1); rb_define_method (c, "initialize", c_init, -1); rb_define_method (c, "close", c_close, 0); - rb_define_method (c, "list", c_list, -1); + rb_define_method (c, "entries", c_entries, 0); + rb_define_method (c, "[]", c_glob, 1); rb_define_method (c, "delete", c_delete, 1); rb_define_method (c, "read", c_read, 1); rb_define_method (c, "write", c_write, -1);