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
-
-
-
-
-Download
-
-
-The Mmap class implement memory-mapped file objects
-
-
-
-The variables $' and $` are not available with gsub! and sub!
-
-
-
-Object
-
-
-
-- Comparable
-
- Enumerable
-
-
-
-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
+
+
+
+Download
+The Mmap class implement memory-mapped file objects
+
+
+
+Object
+
+
+- Comparable
+- Enumerable
+
+
+
+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
-
-
-
-
-
-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
-
-
-
-
-
-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
+
+
+
+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
+
+
+
+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