From a181d44ee4b78d7e016cf5b9e8fd5591723615bd Mon Sep 17 00:00:00 2001 From: guy Decoux Date: Sat, 28 Feb 2009 20:08:24 +0100 Subject: mmap-0.1.8 --- Changes | 7 + README.en | 3 + docs/b.rb | 108 ++++++++++++ docs/mmap.rb | 320 ++++++++++++++++++++++++++++++++++ extconf.rb | 22 +++ mmap.c | 116 ++++++++----- mmap.html | 529 ++++++++++++++++++++------------------------------------ mmap.rd | 126 +++++++------- tests/mmapt.rb | 15 +- tests/runit_.rb | 44 +++++ 10 files changed, 835 insertions(+), 455 deletions(-) create mode 100755 docs/b.rb create mode 100644 docs/mmap.rb create mode 100644 tests/runit_.rb diff --git a/Changes b/Changes index 8da5335..683bacc 100644 --- a/Changes +++ b/Changes @@ -37,3 +37,10 @@ * added "a" for ::new * experimental EXP_INCR_SIZE (4096) ("increment" => 4096) * tests for RUNIT/Test::Unit + +-- 0.1.8 + +* test for madvise(2) +* don't test size for MAP_ANON +* added syntax Mmap(nil, length) +* documentation : make rd2; make rdoc diff --git a/README.en b/README.en index 17d411f..a1e88d9 100644 --- a/README.en +++ b/README.en @@ -9,6 +9,9 @@ * Documentation + make rd2 + make rdoc + See mmap.rd, mmap.html * Tests : if you have rubyunit diff --git a/docs/b.rb b/docs/b.rb new file mode 100755 index 0000000..2b7adfb --- /dev/null +++ b/docs/b.rb @@ -0,0 +1,108 @@ +#!/usr/bin/ruby + +def yield_or_not(primary) + text = primary.sub(/\{\s*\|([^|]+)\|[^}]*\}/, '') + if text != primary + "def #{text}yield #$1\nend" + else + "def #{text}end" + end +end + +def normalize(text) + norm = text.gsub(/\(\(\|([^|]+)\|\)\)/, '\\1') + norm.gsub(/\(\(\{/, '').gsub!(/\}\)\)/, '') + norm.gsub!(/\(\(<([^|>]+)[^>]*>\)\)/, '\\1') + norm.gsub!(/^\s*:\s/, ' * ') + norm +end + +def intern_def(text, names, fout) + fout.puts "##{normalize(text.join('#'))}" + fout.puts yield_or_not(names[0]) + if names.size > 1 + n = names[0].chomp.sub(/\(.*/, '') + names[1 .. -1].each do |na| + nd = na.chomp.sub(/\(.*/, '') + if nd != n + fout.puts "#same than #{n}" + fout.puts yield_or_not(na) + end + end + end +end + +def output_def(text, names, keywords, fout) + if ! names.empty? + keywords.each do |k| + fout.puts k + intern_def(text, names, fout) + fout.puts "end" if k != "" + end + end +end + +def loop_file(file, fout) + text, keywords, names = [], [""], [] + comment = false + rep, indent, vide = '', -1, nil + IO.foreach(file) do |line| + if /^#\^/ =~ line + comment = ! comment + next + end + if comment + fout.puts "# #{normalize(line)}" + next + end + case line + when /^\s*$/ + vide = true + text.push line + when /^#\^/ + comment = ! comment + when /^##/ + line[0] = ?\s + fout.puts line + when /^#\s*(.+?)\s*$/ + keyword = $1 + output_def(text, names, keywords, fout) + text, names = [], [] + keywords = keyword.split(/\s*##\s*/) + if keywords.size == 1 + fout.puts keywords[0] + keywords = [""] + end + when /^#/ + when /^---/ + name = $' + if vide + output_def(text, names, keywords, fout) + text, names = [], [] + rep, indent, vide = '', -1, false + end + names.push name + else + vide = false + if line.sub!(/^(\s*): /, '* ') + indent += ($1 <=> rep) + rep = $1 + else + line.sub!(/^#{rep}/, '') + end + if indent >= 0 + line = (' ' * indent) + line + else + line.sub!(/\A\s*/, '') + end + text.push line + end + end +end + +File.open("#{ARGV[0]}.rb", "w") do |fout| + loop_file("../#{ARGV[0]}.rd", fout) + Dir['*.rd'].each do |file| + loop_file(file, fout) + end +end diff --git a/docs/mmap.rb b/docs/mmap.rb new file mode 100644 index 0000000..ba00571 --- /dev/null +++ b/docs/mmap.rb @@ -0,0 +1,320 @@ +# The Mmap class implement memory-mapped file objects +# +# === WARNING +# === The variables $' and $` are not available with gsub! and sub! +class Mmap +include Comparable +include Enumerable +class << self + +#disable paging of all pages mapped. flag can be +#Mmap::MCL_CURRENT or Mmap::MCL_FUTURE +# +def lockall(flag) +end + +#create a new Mmap object +# +#* file +# Pathname of the file, if nil is given an anonymous map +# is created Mmanp::MAP_ANON +# +#* mode +# Mode to open the file, it can be "r", "w", "rw", "a" +# +#* protection +# specify the nature of the mapping +# +# * Mmap::MAP_SHARED +# Creates a mapping that's shared with all other processes +# mapping the same areas of the file. +# The default value is Mmap::MAP_SHARED +# +# * Mmap::MAP_PRIVATE +# Creates a private copy-on-write mapping, so changes to the +# contents of the mmap object will be private to this process +# +#* options +# Hash. If one of the options length or offset +# is specified it will not possible to modify the size of +# the mapped file. +# +# * length +# Maps length bytes from the file +# +# * offset +# The mapping begin at offset +# +# * advice +# The type of the access (see #madvise) +# +# +def new(file, mode = "r", protection = Mmap::MAP_SHARED, options = {}) +end + +#reenable paging +# +def unlockall +end +end + +#add count bytes to the file (i.e. pre-extend the file) +# +def extend(count) +end + +#advice can have the value Mmap::MADV_NORMAL, +#Mmap::MADV_RANDOM, Mmap::MADV_SEQUENTIAL, +#Mmap::MADV_WILLNEED, Mmap::MADV_DONTNEED +# +def madvise(advice) +end + +#change the mode, value must be "r", "w" or "rw" +# +def mprotect(mode) +end + +#disable paging +# +def mlock +end + +#flush the file +# +def msync +end +#same than msync +def flush +end + +#reenable paging +# +def munlock +end + +#terminate the association +# +#=== Other methods with the same syntax than for the class String +# +# +def munmap +end + +# +def self == other +end + +# +def self > other +end + +# +def self >= other +end + +# +def self < other +end + +# +def self <= other +end + +# +def self === other +end + +# +def self << other +end + +# +def self =~ other +end + +# +def self[nth] +end + +# +def self[start..last] +end + +# +def self[start, length] +end + +# +def self[nth] = val +end + +# +def self[start..last] = val +end + +# +def self[start, len] = val +end + +# +def self <=> other +end + +# +def <<(other) +end + +# +def casecmp(other) >= 1.7.1 +end + +# +def concat(other) +end + +# +def capitalize! +end + +# +def chop! +end + +# +def chomp!([rs]) +end + +# +def count(o1 [, o2, ...]) +end + +# +def crypt(salt) +end + +# +def delete!(str) +end + +# +def downcase! +end + +# +def each_byte +yield char +end + +# +def each([rs]) +yield line +end + +# +def each_line([rs]) +yield line +end + +# +def empty? +end + +# +def freeze +end + +# +def frozen +end + +# +def gsub!(pattern, replace) +end + +# +def gsub!(pattern) +yield str +end + +# +def include?(other) +end + +# +def index(substr[, pos]) +end + +# +def insert(index, str) >= 1.7.1 +end + +# +def length +end + +# +def reverse! +end + +# +def rindex(substr[, pos]) +end + +# +def scan(pattern) +end + +# +def scan(pattern) +yield str +end + +# +def size +end + +# +def slice +end + +# +def slice! +end + +# +def split([sep[, limit]]) +end + +# +def squeeze!([str]) +end + +# +def strip! +end + +# +def sub!(pattern, replace) +end + +# +def sub!(pattern) +yield str +end + +# +def sum([bits]) +end + +# +def swapcase! +end + +# +def tr!(search, replace) +end + +# +def tr_s!(search, replace) +end diff --git a/extconf.rb b/extconf.rb index 73d0ce7..07c59ad 100644 --- a/extconf.rb +++ b/extconf.rb @@ -14,7 +14,29 @@ unknown: $(DLLIB) \t@echo "main() {}" > /tmp/a.c \t$(CC) -static /tmp/a.c $(OBJS) $(CPPFLAGS) $(DLDFLAGS) -lruby #{CONFIG["LIBS"]} $(LIBS) $(LOCAL_LIBS) \t@-rm /tmp/a.c a.out + +%.html: %.rd +\trd2 $< > ${<:%.rd=%.html} + EOT + make.print "HTML = mmap.html" + docs = Dir['docs/*.rd'] + docs.each {|x| make.print " \\\n\t#{x.sub(/\.rd$/, '.html')}" } + make.print "\n\nRDOC = mmap.rd" + docs.each {|x| make.print " \\\n\t#{x}" } + make.puts + make.print <<-EOF + +rdoc: docs/doc/index.html + +docs/doc/index.html: $(RDOC) +\t@-(cd docs; b.rb mmap; rdoc mmap.rb) + +rd2: html + +html: $(HTML) + + EOF ensure make.close end diff --git a/mmap.c b/mmap.c index 8b7f489..83df09a 100644 --- a/mmap.c +++ b/mmap.c @@ -8,6 +8,17 @@ #include #include "version.h" +#ifndef MADV_NORMAL +#ifdef POSIX_MADV_NORMAL +#define MADV_NORMAL POSIX_MADV_NORMAL +#define MADV_RANDOM POSIX_MADV_RANDOM +#define MADV_SEQUENTIAL POSIX_MADV_SEQUENTIAL +#define MADV_WILLNEED POSIX_MADV_WILLNEED +#define MADV_DONTNEED POSIX_MADV_DONTNEED +#define madvise posix_madvise +#endif +#endif + #include #define BEG(no) regs->beg[no] @@ -40,8 +51,7 @@ typedef struct { MMAP_RETTYPE addr; int smode, pmode, vscope; int advice, frozen, lock; - size_t len, real; - size_t size, incr; + size_t len, real, incr; off_t offset; char *path; } mm_mmap; @@ -201,9 +211,11 @@ mm_expandf(t_mm, len) if (t_mm->addr == MAP_FAILED) { rb_raise(rb_eArgError, "mmap failed"); } +#ifdef MADV_NORMAL if (t_mm->advice && madvise(t_mm->addr, len, t_mm->advice) == -1) { rb_raise(rb_eArgError, "madvise(%d)", errno); } +#endif if (t_mm->lock && mlock(t_mm->addr, len) == -1) { rb_raise(rb_eArgError, "mlock(%d)", errno); } @@ -253,9 +265,9 @@ mm_i_options(arg, obj) key = rb_obj_as_string(key); options = RSTRING(key)->ptr; if (strcmp(options, "length") == 0) { - t_mm->size = NUM2INT(value); - if (t_mm->size <= 0) { - rb_raise(rb_eArgError, "Invalid value for length %d", t_mm->size); + t_mm->len = NUM2INT(value); + if (t_mm->len <= 0) { + rb_raise(rb_eArgError, "Invalid value for length %d", t_mm->len); } t_mm->frozen |= MM_FIXED; } @@ -309,7 +321,7 @@ mm_s_new(argc, argv, obj) VALUE res, fname, vmode, scope, options; mm_mmap *t_mm; char *path, *mode; - size_t size; + size_t size = 0; off_t offset; options = Qnil; @@ -321,7 +333,7 @@ mm_s_new(argc, argv, obj) vscope = 0; #ifdef MAP_ANON if (NIL_P(fname)) { - vscope = MAP_ANON; + vscope = MAP_ANON | MAP_SHARED; path = 0; } else { @@ -338,40 +350,40 @@ mm_s_new(argc, argv, obj) Check_SafeStr(fname); path = RSTRING(fname)->ptr; #endif - perm = 0666; - if (NIL_P(vmode)) { - mode = "r"; - } - else if (TYPE(vmode) == T_ARRAY && RARRAY(vmode)->len >= 2) { - VALUE tmp = RARRAY(vmode)->ptr[0]; - mode = STR2CSTR(tmp); - perm = NUM2INT(RARRAY(vmode)->ptr[1]); - } - else { - mode = STR2CSTR(vmode); - } - if (strcmp(mode, "r") == 0) { - smode = O_RDONLY; - pmode = PROT_READ; - } - else if (strcmp(mode, "w") == 0) { - smode = O_WRONLY; - pmode = PROT_WRITE; - } - else if (strcmp(mode, "rw") == 0 || strcmp(mode, "wr") == 0) { - smode = O_RDWR; - pmode = PROT_READ | PROT_WRITE; - } - else if (strcmp(mode, "a") == 0) { - smode = O_RDWR | O_CREAT; - pmode = PROT_READ | PROT_WRITE; - } - else { - rb_raise(rb_eArgError, "Invalid mode %s", mode); - } vscope |= NIL_P(scope) ? MAP_SHARED : NUM2INT(scope); size = 0; + perm = 0666; if (path) { + if (NIL_P(vmode)) { + mode = "r"; + } + else if (TYPE(vmode) == T_ARRAY && RARRAY(vmode)->len >= 2) { + VALUE tmp = RARRAY(vmode)->ptr[0]; + mode = STR2CSTR(tmp); + perm = NUM2INT(RARRAY(vmode)->ptr[1]); + } + else { + mode = STR2CSTR(vmode); + } + if (strcmp(mode, "r") == 0) { + smode = O_RDONLY; + pmode = PROT_READ; + } + else if (strcmp(mode, "w") == 0) { + smode = O_WRONLY; + pmode = PROT_WRITE; + } + else if (strcmp(mode, "rw") == 0 || strcmp(mode, "wr") == 0) { + smode = O_RDWR; + pmode = PROT_READ | PROT_WRITE; + } + else if (strcmp(mode, "a") == 0) { + smode = O_RDWR | O_CREAT; + pmode = PROT_READ | PROT_WRITE; + } + else { + rb_raise(rb_eArgError, "Invalid mode %s", mode); + } if ((fd = open(path, smode, perm)) == -1) { rb_raise(rb_eArgError, "Can't open %s", path); } @@ -382,6 +394,9 @@ mm_s_new(argc, argv, obj) } else { fd = -1; + if (!NIL_P(vmode) && TYPE(vmode) != T_STRING) { + size = NUM2INT(vmode); + } } #if RUBY_VERSION_CODE >= 172 Data_Get_Struct(obj, mm_mmap, t_mm); @@ -393,11 +408,11 @@ mm_s_new(argc, argv, obj) offset = 0; if (options != Qnil) { rb_iterate(rb_each, options, mm_i_options, res); - if ((t_mm->size + t_mm->offset) > st.st_size) { + if (path && (t_mm->len + t_mm->offset) > st.st_size) { rb_raise(rb_eArgError, "invalid value for length (%d) or offset (%d)", - t_mm->size, t_mm->offset); + t_mm->len, t_mm->offset); } - if (t_mm->size) size = t_mm->size; + if (t_mm->len) size = t_mm->len; offset = t_mm->offset; } init = 0; @@ -409,6 +424,9 @@ mm_s_new(argc, argv, obj) rb_warning("Ignoring offset for an anonymous map"); offset = 0; } + smode = O_RDWR; + pmode = PROT_READ | PROT_WRITE; + t_mm->frozen |= MM_FIXED; } else if (size == 0 && (smode & O_RDWR)) { if (lseek(fd, t_mm->incr - 1, SEEK_END) == -1) { @@ -425,9 +443,11 @@ mm_s_new(argc, argv, obj) if (addr == MAP_FAILED || !addr) { rb_raise(rb_eArgError, "mmap failed (%x)", addr); } +#ifdef MADV_NORMAL if (t_mm->advice && madvise(addr, size, t_mm->advice) == -1) { rb_raise(rb_eArgError, "madvise(%d)", errno); } +#endif t_mm->addr = addr; t_mm->len = size; if (!init) t_mm->real = size; @@ -526,6 +546,7 @@ mm_mprotect(obj, a) return obj; } +#ifdef MADV_NORMAL static VALUE mm_madvise(obj, a) VALUE obj, a; @@ -539,6 +560,7 @@ mm_madvise(obj, a) t_mm->advice = NUM2INT(a); return Qnil; } +#endif #define StringMmap(b, bp, bl) \ do { \ @@ -992,7 +1014,13 @@ mm_slice_bang(argc, argv, str) } buf[i] = rb_str_new(0,0); result = mm_aref_m(argc, buf, str); - mm_aset_m(argc+1, buf, str); +#if RUBY_VERSION_CODE >= 172 + if (!NIL_P(result)) { +#endif + mm_aset_m(argc+1, buf, str); +#if RUBY_VERSION_CODE >= 172 + } +#endif return result; } @@ -1599,11 +1627,13 @@ Init_mmap() rb_define_const(mm_cMap, "PROT_NONE", INT2FIX(PROT_NONE)); rb_define_const(mm_cMap, "MAP_SHARED", INT2FIX(MAP_SHARED)); rb_define_const(mm_cMap, "MAP_PRIVATE", INT2FIX(MAP_PRIVATE)); +#ifdef MADV_NORMAL rb_define_const(mm_cMap, "MADV_NORMAL", INT2FIX(MADV_NORMAL)); rb_define_const(mm_cMap, "MADV_RANDOM", INT2FIX(MADV_RANDOM)); rb_define_const(mm_cMap, "MADV_SEQUENTIAL", INT2FIX(MADV_SEQUENTIAL)); rb_define_const(mm_cMap, "MADV_WILLNEED", INT2FIX(MADV_WILLNEED)); rb_define_const(mm_cMap, "MADV_DONTNEED", INT2FIX(MADV_DONTNEED)); +#endif #ifdef MAP_DENYWRITE rb_define_const(mm_cMap, "MAP_DENYWRITE", INT2FIX(MAP_DENYWRITE)); #endif @@ -1653,8 +1683,10 @@ Init_mmap() rb_define_method(mm_cMap, "flush", mm_msync, -1); rb_define_method(mm_cMap, "mprotect", mm_mprotect, 1); rb_define_method(mm_cMap, "protect", mm_mprotect, 1); +#ifdef MADV_NORMAL rb_define_method(mm_cMap, "madvise", mm_madvise, 1); rb_define_method(mm_cMap, "advise", mm_madvise, 1); +#endif rb_define_method(mm_cMap, "mlock", mm_mlock, 0); rb_define_method(mm_cMap, "lock", mm_mlock, 0); rb_define_method(mm_cMap, "munlock", mm_munlock, 0); diff --git a/mmap.html b/mmap.html index cae24b2..3eaf01a 100644 --- a/mmap.html +++ b/mmap.html @@ -1,347 +1,188 @@ - - - -mmap.rd - - -

Mmap -

-

-Download -

-

-The Mmap class implement memory-mapped file objects -

-

WARNING -

-

-The variables $' and $` are not available with gsub! and sub! -

-

SuperClass -

-

-Object -

-

Included Modules -

-
    -
  • Comparable -
  • Enumerable -
-

Class Methods -

-
-
lockall(flag) -
-

-disable paging of all pages mapped. flag can be -Mmap::MCL_CURRENT or Mmap::MCL_FUTURE -

-
-
new(file, [mode [, protection [, options]]]) -
-

-create a new object -

- -
-
file - -
-

-Pathname of the file, if nil is given an anonymous map -is created Mmanp::MAP_ANON -

-
-
mode - -
-

-Mode to open the file, it can be "r", "w" or "rw" -

-
-
protection - -
-

-specify the nature of the mapping -

- -
-
Mmap::MAP_SHARED - -
-

-Creates a mapping that's shared with all other processes + + + + +mmap.rd + + +

Mmap

+

Download

+

The Mmap class implement memory-mapped file objects

+

WARNING

+

The variables $' and $` are not available with gsub! and sub!

+

SuperClass

+

Object

+

Included Modules

+
    +
  • Comparable
  • +
  • Enumerable
  • +
+

Class Methods

+
+
lockall(flag)
+
+

disable paging of all pages mapped. flag can be +Mmap::MCL_CURRENT or Mmap::MCL_FUTURE

+
new(file, mode = "r", protection = Mmap::MAP_SHARED, options = {}) +
new(nil, length, protection = Mmap::MAP_SHARED, options = {})
+
+

create a new Mmap object

+
+
file +
+
+

Pathname of the file, if nil is given an anonymous map +is created Mmanp::MAP_ANON

+
+
mode +
+
+

Mode to open the file, it can be "r", "w", "rw", "a"

+
+
protection +
+
+

specify the nature of the mapping

+
+
Mmap::MAP_SHARED +
+
+

Creates a mapping that's shared with all other processes mapping the same areas of the file. -The default value is Mmap::MAP_SHARED -

-
-
Mmap::MAP_PRIVATE - -
-

-Creates a private copy-on-write mapping, so changes to the -contents of the mmap object will be private to this process -

-
-
-
-
options - -
-

-Hash. If one of the options length or offset +The default value is Mmap::MAP_SHARED

+
+
Mmap::MAP_PRIVATE +
+
+

Creates a private copy-on-write mapping, so changes to the +contents of the mmap object will be private to this process

+
+
+
+
options +
+
+

Hash. If one of the options length or offset is specified it will not possible to modify the size of -the mapped file. -

- -
-
length - -
-

-Maps length bytes from the file -

-
-
offset - -
-

-The mapping begin at offset -

-
-
advice - -
-

-The type of the access (see #madvise) -

-
-
-
-
-
-
unlockall -
-

-reenable paging -

-
-
-

Methods -

-
-
extend(count) -
-

-add count bytes to the file (i.e. pre-extend the file) -

-
-
madvise(advice) -
-

-advice can have the value Mmap::MADV_NORMAL, -Mmap::MADV_RANDOM, Mmap::MADV_SEQUENTIAL, -Mmap::MADV_WILLNEED, Mmap::MADV_DONTNEED -

-
-
mprotect(mode) -
-

-change the mode, value must be "r", "w" or "rw" -

-
-
mlock -
-

-disable paging -

-
-
msync -
flush -
-

-flush the file -

-
-
munlock -
-

-reenable paging -

-
-
munmap -
-

-terminate the association -

-
-
-

Other methods with the same syntax than the methods of String -

-

-self == other -

-

-self > other -

-

-self >= other -

-

-self < other -

-

-self <= other -

-

-self === other -

-

-self << other -

-

-self =~ other -

-

-self[nth] -

-

-self[start..last] -

-

-self[start, length] -

-

-self[nth] = val -

-

-self[start..last] = val -

-

-self[start, len] = val -

-

-self <=> other -

-

-<<(other) -

-

-casecmp(other) >= 1.7.1 -

-

-concat(other) -

-

-capitalize! -

-

-chop! -

-

-chomp!([rs]) -

-

-count(o1 [, o2, ...]) -

-

-crypt(salt) -

-

-delete!(str) -

-

-downcase! -

-

-each_byte {|char|...} -

-

-each([rs]) {|line|...} -

-

-each_line([rs]) {|line|...} -

-

-empty? -

-

-freeze -

-

-frozen -

-

-gsub!(pattern, replace) -

-

-gsub!(pattern) {...} -

-

-include?(other) -

-

-index(substr[, pos]) -

-

-insert(index, str) >= 1.7.1 -

-

-length -

-

-reverse! -

-

-rindex(substr[, pos]) -

-

-scan(pattern) -

-

-scan(pattern) {...} -

-

-size -

-

-slice -

-

-slice! -

-

-split([sep[, limit]]) -

-

-squeeze!([str]) -

-

-strip! -

-

-sub!(pattern, replace) -

-

-sub!(pattern) {...} -

-

-sum([bits]) -

-

-swapcase! -

-

-tr!(search, replace) -

-

-tr_s!(search, replace) -

-

-upcase! -

+the mapped file.

+
+
length +
+
+

Maps length bytes from the file

+
+
offset +
+
+

The mapping begin at offset

+
+
advice +
+
+

The type of the access (see #madvise)

+
+
+
+
+
unlockall
+
+

reenable paging

+
+

Methods

+
+
extend(count)
+
+

add count bytes to the file (i.e. pre-extend the file)

+
madvise(advice)
+
+

advice can have the value Mmap::MADV_NORMAL, +Mmap::MADV_RANDOM, Mmap::MADV_SEQUENTIAL, +Mmap::MADV_WILLNEED, Mmap::MADV_DONTNEED

+
mprotect(mode)
+
+

change the mode, value must be "r", "w" or "rw"

+
mlock
+
+

disable paging

+
msync +
flush
+
+

flush the file

+
munlock
+
+

reenable paging

+
munmap
+
+

terminate the association

+
+

Other methods with the same syntax than for the class String

+
+
self == other +
self > other +
self >= other +
self < other +
self <= other +
self === other +
self << other +
self =~ other +
self[nth] +
self[start..last] +
self[start, length] +
self[nth] = val +
self[start..last] = val +
self[start, len] = val +
self <=> other +
<<(other) +
casecmp(other) >= 1.7.1 +
concat(other) +
capitalize! +
chop! +
chomp!([rs]) +
count(o1 [, o2, ...]) +
crypt(salt) +
delete!(str) +
downcase! +
each_byte {|char|...} +
each([rs]) {|line|...} +
each_line([rs]) {|line|...} +
empty? +
freeze +
frozen +
gsub!(pattern, replace) +
gsub!(pattern) {|str|...} +
include?(other) +
index(substr[, pos]) +
insert(index, str) >= 1.7.1 +
length +
reverse! +
rindex(substr[, pos]) +
scan(pattern) +
scan(pattern) {|str| ...} +
size +
slice +
slice! +
split([sep[, limit]]) +
squeeze!([str]) +
strip! +
sub!(pattern, replace) +
sub!(pattern) {|str| ...} +
sum([bits]) +
swapcase! +
tr!(search, replace) +
tr_s!(search, replace) +
upcase! +
- - + + diff --git a/mmap.rd b/mmap.rd index 43c7f3d..81fd8d8 100644 --- a/mmap.rd +++ b/mmap.rd @@ -3,10 +3,12 @@ (()) +#^ The Mmap class implement memory-mapped file objects === WARNING -((*The variables $' and $` are not available with gsub! and sub!*)) +=== The variables $' and $` are not available with gsub! and sub! +#^ == SuperClass @@ -16,15 +18,19 @@ Object * Comparable * Enumerable - +# class Mmap +# include Comparable +# include Enumerable +# class << self == Class Methods --- lockall(flag) disable paging of all pages mapped. ((|flag|)) can be ((|Mmap::MCL_CURRENT|)) or ((|Mmap::MCL_FUTURE|)) ---- new(file, [mode [, protection [, options]]]) - create a new object +--- new(file, mode = "r", protection = Mmap::MAP_SHARED, options = {}) +--- new(nil, length, protection = Mmap::MAP_SHARED, options = {}) + create a new Mmap object : ((|file|)) Pathname of the file, if ((|nil|)) is given an anonymous map @@ -63,6 +69,7 @@ Object --- unlockall reenable paging +# end == Methods --- extend(count) @@ -89,114 +96,115 @@ Object --- munmap terminate the association -=== Other methods with the same syntax than the methods of ((|String|)) +=== Other methods with the same syntax than for the class String + -self == other +--- self == other -self > other +--- self > other -self >= other +--- self >= other -self < other +--- self < other -self <= other +--- self <= other -self === other +--- self === other -self << other +--- self << other -self =~ other +--- self =~ other -self[nth] +--- self[nth] -self[start..last] +--- self[start..last] -self[start, length] +--- self[start, length] -self[nth] = val +--- self[nth] = val -self[start..last] = val +--- self[start..last] = val -self[start, len] = val +--- self[start, len] = val -self <=> other +--- self <=> other -<<(other) +--- <<(other) -casecmp(other) >= 1.7.1 +--- casecmp(other) >= 1.7.1 -concat(other) +--- concat(other) -capitalize! +--- capitalize! -chop! +--- chop! -chomp!([rs]) +--- chomp!([rs]) -count(o1 [, o2, ...]) +--- count(o1 [, o2, ...]) -crypt(salt) +--- crypt(salt) -delete!(str) +--- delete!(str) -downcase! +--- downcase! -each_byte {|char|...} +--- each_byte {|char|...} -each([rs]) {|line|...} +--- each([rs]) {|line|...} -each_line([rs]) {|line|...} +--- each_line([rs]) {|line|...} -empty? +--- empty? -freeze +--- freeze -frozen +--- frozen -gsub!(pattern, replace) +--- gsub!(pattern, replace) -gsub!(pattern) {...} +--- gsub!(pattern) {|str|...} -include?(other) +--- include?(other) -index(substr[, pos]) +--- index(substr[, pos]) -insert(index, str) >= 1.7.1 +--- insert(index, str) >= 1.7.1 -length +--- length -reverse! +--- reverse! -rindex(substr[, pos]) +--- rindex(substr[, pos]) -scan(pattern) +--- scan(pattern) -scan(pattern) {...} +--- scan(pattern) {|str| ...} -size +--- size -slice +--- slice -slice! +--- slice! -split([sep[, limit]]) +--- split([sep[, limit]]) -squeeze!([str]) +--- squeeze!([str]) -strip! +--- strip! -sub!(pattern, replace) +--- sub!(pattern, replace) -sub!(pattern) {...} +--- sub!(pattern) {|str| ...} -sum([bits]) +--- sum([bits]) -swapcase! +--- swapcase! -tr!(search, replace) +--- tr!(search, replace) -tr_s!(search, replace) +--- tr_s!(search, replace) -upcase! +--- upcase! =end diff --git a/tests/mmapt.rb b/tests/mmapt.rb index a7a049c..c6a1fdc 100644 --- a/tests/mmapt.rb +++ b/tests/mmapt.rb @@ -2,17 +2,12 @@ $LOAD_PATH.unshift *%w{.. . tests} require 'mmap' require 'ftools' -begin - require 'test/unit' - Inh = Test::Unit -rescue LoadError - require 'runit/testcase' - require 'runit/cui/testrunner' - Inh = RUNIT -end +require 'runit_' $mmap, $str = nil, nil +Inh = defined?(RUNIT) ? RUNIT : Test::Unit + class TestMmap < Inh::TestCase def internal_init $mmap.unmap if $mmap @@ -70,7 +65,7 @@ class TestMmap < Inh::TestCase eval "$mmap#{access}" rescue IndexError, RangeError else - assert_fail("*must* fail with IndexError") + flunk("*must* fail with IndexError") end else eval "$mmap#{access}" @@ -114,7 +109,7 @@ class TestMmap < Inh::TestCase eval "$mmap#{access}" rescue IndexError, RangeError else - assert_fail("*must* fail with IndexError") + flunk("*must* fail with IndexError") end else eval "$mmap#{access}" diff --git a/tests/runit_.rb b/tests/runit_.rb new file mode 100644 index 0000000..0479592 --- /dev/null +++ b/tests/runit_.rb @@ -0,0 +1,44 @@ +begin + require 'test/unit' +rescue LoadError + require 'runit/testcase' + require 'runit/cui/testrunner' + + module RUNIT + module Assert + def assert_raises(error, message = nil) + begin + yield + rescue error + assert(true, message) + rescue + assert_fail("must fail with #{error} : #{string}") + else + assert_fail("*must* fail : #{string}") + end + end + def flunk(message = "") + assert_fail(message) + end + end + end +end + + +if RUBY_VERSION > "1.7" + class Array + alias indices select + end + class Hash + alias indexes select + end + module BDB + class Common + alias indexes select + end + + class Recnum + alias indices select + end + end +end -- cgit v1.1-2-g2b99