From: Jacob Sparre Andersen <sparre@nbi.dk>
Subject: Alternative Index implementation? (Was: Reading and writing a big file in Ada (GNAT) on Windows XP)
Date: Fri, 04 May 2007 08:53:59 +0200
Date: 2007-05-04T08:53:59+02:00 [thread overview]
Message-ID: <ygemz0l13lk.fsf_-_@hugsarin.dmusyd.edu> (raw)
In-Reply-To: m2slad3cfa.fsf@mac.com
Simon Wright <simon.j.wright@mac.com> wrote:
> That was me. I could give you my version of Index if you want ..
I would like to have a copy as well.
My demonstration of how you can make a fast implementation of the Unix
command "tail" with POSIX.Memory_Mapping was not very successful, and
I suspect that the sinner may be Index.
Greetings,
Jacob
--
Ada - the programming language still ahead of its time.
-- tail1.adb - show the last ten lines from a named text file
with Ada.Characters.Latin_1;
with Ada.Command_Line;
with Ada.Strings.Fixed;
with Ada.Text_IO;
with POSIX;
with POSIX.IO;
with POSIX.Memory_Mapping;
with System;
with System.Storage_Elements;
procedure Tail is
use POSIX;
use POSIX.IO;
use POSIX.Memory_Mapping;
use System.Storage_Elements;
Text_File : File_Descriptor;
Text_Size : System.Storage_Elements.Storage_Offset;
Text_Address : System.Address;
begin
Text_File := Open (Name => To_POSIX_String (Ada.Command_Line.Argument (1)),
Mode => Read_Only);
Text_Size := Storage_Offset (File_Size (Text_File));
Text_Address := Map_Memory (Length => Text_Size,
Protection => Allow_Read,
Mapping => Map_Shared,
File => Text_File,
Offset => 0);
declare
use Ada.Strings;
use Ada.Strings.Fixed;
package Latin_1 renames Ada.Characters.Latin_1;
Bit_Count : constant Natural :=
Natural (Text_Size) * Storage_Element'Size;
Character_Count : constant Natural :=
Bit_Count / Character'Size;
Text : String (1 .. Character_Count);
for Text'Address use Text_Address;
Last : Natural := Text'Last + 1;
begin
for Lines in 1 .. 10 loop
Last := Index (Source => Text (Text'First .. Last - 1),
Pattern => (1 => Latin_1.LF),
Going => Backward);
exit when Last = 0;
end loop;
declare
POSIX_Text : POSIX_String (Text'Range);
for POSIX_Text'Address use Text'Address;
begin
while Last < Text'Last loop
NONSTANDARD_Write
(File => Standard_Output,
Buffer => POSIX_Text (Last + 1 .. Text'Last),
Last => Last);
end loop;
end;
end;
Unmap_Memory (First => Text_Address,
Length => Text_Size);
Close (File => Text_File);
end Tail;
next prev parent reply other threads:[~2007-05-04 6:53 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-28 5:03 Reading and writing a big file in Ada (GNAT) on Windows XP Fionn Mac Cumhaill
2007-04-28 5:20 ` Gautier
2007-04-29 21:17 ` Fionn Mac Cumhaill
2007-04-28 5:25 ` tmoran
2007-04-28 6:56 ` Martin Krischik
2007-04-28 17:12 ` tmoran
2007-04-28 12:41 ` Jeffrey Creem
2007-04-29 21:35 ` Fionn Mac Cumhaill
2007-04-28 13:22 ` (see below)
2007-04-28 17:56 ` Simon Wright
2007-04-28 18:28 ` Jeffrey Creem
2007-04-29 7:20 ` Simon Wright
2007-04-29 21:44 ` Fionn Mac Cumhaill
2007-04-29 21:42 ` Fionn Mac Cumhaill
2007-04-30 0:48 ` Jeffrey R. Carter
2007-04-30 2:30 ` Fionn Mac Cumhaill
2007-04-30 4:21 ` tmoran
2007-04-28 19:12 ` Jeffrey R. Carter
2007-04-29 21:46 ` Fionn Mac Cumhaill
2007-05-01 14:10 ` Fionn Mac Cumhaill
2007-05-06 21:55 ` Quarc
2007-05-02 7:46 ` george
2007-05-03 6:31 ` Fionn Mac Cumhaill
2007-05-03 20:00 ` Simon Wright
2007-05-04 4:35 ` Jeffrey R. Carter
2007-05-04 4:45 ` Fionn Mac Cumhaill
2007-05-04 6:53 ` Jacob Sparre Andersen [this message]
2007-05-04 7:41 ` Alternative Index implementation? (Was: Reading and writing a big file in Ada (GNAT) on Windows XP) Dmitry A. Kazakov
2007-05-04 9:16 ` Copying string slices before calling subroutines? (Was: Alternative Index implementation?) Jacob Sparre Andersen
2007-05-04 9:44 ` Copying string slices before calling subroutines? Jacob Sparre Andersen
2007-05-04 10:14 ` Dmitry A. Kazakov
2007-05-04 12:07 ` Jeffrey Creem
2007-05-04 12:46 ` Dmitry A. Kazakov
2007-05-04 22:27 ` Simon Wright
2007-05-05 7:33 ` Jacob Sparre Andersen
2007-05-05 7:47 ` Dmitry A. Kazakov
2007-05-05 7:41 ` Dmitry A. Kazakov
2007-05-03 20:27 ` Reading and writing a big file in Ada (GNAT) on Windows XP Adam Beneschan
2007-05-03 23:01 ` Randy Brukardt
2007-05-04 0:28 ` Markus E Leypold
2007-05-05 16:26 ` Adam Beneschan
2007-05-05 17:27 ` Markus E Leypold
2007-05-15 23:03 ` Randy Brukardt
2007-05-04 20:04 ` Adam Beneschan
2007-05-05 16:36 ` tmoran
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox