# New Ticket Created by  Ron Schmidt 
# Please include the string:  [perl #65120]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=65120 >


Patch provides semantics for "slurp $filehandle" consistent with "slurp 
'filename'" and allow "slurp" by itself to slurp stdin.  Also provide 
consistency with existing lines implementation.

Note that according to Dr. Michaud this patch requires a spec change 
which he OKd but I don't feel qualified to make myself.  The spec seems 
to have slurp and lines subs for file names and methods for file 
handles.  The implementation already had a lines sub for file handles.  
The patch adds a corresponding slurp sub and defaults both slurp and sub 
with no arguments to read from stdin/$*IN.

This is my first attempt at submitting a patch using git branching and 
the git branch is slurp-sub.
>From 0c032d4a8b9f14effe0047fb3dc6cadb3cbcbb0d Mon Sep 17 00:00:00 2001
From: U-ron-PC\ron <r...@ron-pc.(none)>
Date: Fri, 24 Apr 2009 10:39:20 -0400
Subject: [PATCH] Provide semantics for slurp $filehandle consistent with slurp filename and
 allow slurp by itself to slurp stdin.  Also provide consistency with
 existing lines implementation.

---
 src/builtins/io.pir    |   10 ----------
 src/setting/Any-str.pm |    8 ++++++++
 src/setting/IO.pm      |   23 +++++++++++++++++++++++
 3 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/src/builtins/io.pir b/src/builtins/io.pir
index 1b92857..0c638f5 100644
--- a/src/builtins/io.pir
+++ b/src/builtins/io.pir
@@ -98,16 +98,6 @@ opened_ok:
     obj.'close'()
 .end
 
-.sub 'slurp'
-    .param string filename
-    .local string contents
-
-    $P0 = 'open'(filename, 'r')
-    contents = $P0.'slurp'()
-    'close'($P0)
-    .return(contents)
-.end
-
 
 =item unlink LIST
 
diff --git a/src/setting/Any-str.pm b/src/setting/Any-str.pm
index b427332..617dcab 100644
--- a/src/setting/Any-str.pm
+++ b/src/setting/Any-str.pm
@@ -173,6 +173,14 @@ multi sub lines(Str $filename,
     return lines($filehandle, :$bin, :$enc, :$nl, :$chomp);
 }
 
+multi sub slurp(Str $filename,
+                :$bin = False,
+                :$enc = 'Unicode') {
+
+    my $filehandle = open($filename, :r);
+    return slurp($filehandle, :$bin, :$enc);
+}
+
 sub unpack($template, $target) {
     $template.trans(/\s+/ => '') ~~ / ((<[Ax]>)(\d+))* /
         or return (); # unknown syntax
diff --git a/src/setting/IO.pm b/src/setting/IO.pm
index 0948b6c..6cac0e7 100644
--- a/src/setting/IO.pm
+++ b/src/setting/IO.pm
@@ -62,4 +62,27 @@ multi sub lines(IO $filehandle,
     return $filehandle.lines();
 }
 
+multi sub lines(:$bin = False,
+                :$enc = 'Unicode',
+                :$nl = "\n",
+                :$chomp = True) {
+
+    return lines($*IN, :$bin, :$enc, :$nl, :$chomp);
+}
+
+multi sub slurp(IO $filehandle,
+                :$bin = False,
+                :$enc = 'Unicode') {
+
+    fail 'Binary mode not supported yet'    if $bin;
+    fail 'Encodings not supported yet'      if $enc ne 'Unicode';
+
+    return $filehandle.slurp();
+}
+
+multi sub slurp(:$bin = False,
+                :$enc = 'Unicode') {
+    return slurp($*IN, :$bin, :$enc);
+}
+
 # vim: ft=perl6
-- 
1.6.1.2

Index: t/spec/S16-unfiled/slurp.t
===================================================================
--- t/spec/S16-unfiled/slurp.t	(revision 26412)
+++ t/spec/S16-unfiled/slurp.t	(working copy)
@@ -2,7 +2,7 @@
 
 use Test;
 
-plan 4;
+plan 5;
 
 # L<E07/"And every one shall share..." /returns them as a single string/>
 # L<S16/"Unfiled"/"=item IO.slurp">
@@ -30,4 +30,16 @@
 my @slurped_lines = lines(open($self));
 ok +...@slurped_lines > 30, "more than 30 lines in this file ?";
 
+{
+  my $fh = open $self, :r;
+  my $contents = slurp $fh;
+  
+  # lame use of filehandle but might be able to seek/rewind some day ...
+  # also allows 'slurp $*IN' huffmanized to just slurp
+  ok $fh.ins == 0 && $contents ~~ m/'use v6'.*'StringThatsNowhereElse'/,
+    "slurp worked through file handle";
+  
+  $fh.close;
+}
+
 # vim: ft=perl6

Reply via email to