1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/base64.rb: backported from HEAD (modularised and documented)

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@5682 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
gsinclair 2004-02-12 12:26:44 +00:00
parent 995dd862a4
commit 275bd883e4
2 changed files with 129 additions and 73 deletions

View file

@ -1,3 +1,7 @@
Thu Feb 12 21:25:00 2004 Gavin Sinclair <gsinclair@soyabean.com.au>
* lib/base64.rb: backported from HEAD (modularised and documented)
Thu Feb 12 20:31:48 2004 Nobuyoshi Nakada <nobu@ruby-lang.org> Thu Feb 12 20:31:48 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/mkmf.rb (create_tmpsrc): cpp32 of Borland C++ ignores #error * lib/mkmf.rb (create_tmpsrc): cpp32 of Borland C++ ignores #error

View file

@ -1,84 +1,136 @@
#
# = base64.rb: methods for base64-encoding and -decoding stings
#
# Author:: Yukihiro Matsumoto
# Documentation:: Dave Thomas and Gavin Sinclair
#
# Until Ruby 1.8.1, these methods were defined at the top-level. Now
# they are in the Base64 module but included in the top-level, where
# their usage is deprecated.
#
# See Base64 for documentation.
#
require "kconv" require "kconv"
# Perform encoding and decoding of binary data using a Base64
# representation. This library rather unfortunately loads its four # The Base64 module provides for the encoding (#encode64) and decoding
# methods directly into the top level namespace. # (#decode64) of binary data using a Base64 representation.
# #
# require "base64" # The following particular features are also provided:
# - encode into lines of a given length (#b64encode)
# - decode the special format specified in RFC2047 for the
# representation of email headers (decode_b)
# #
# enc = encode64('Send reinforcements') # == Example
# puts enc
# plain = decode64(enc)
# puts plain
# Returns the Base64-decoded version of \obj{str}.
# #
# require 'base64' # A simple encoding and decoding.
# str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +
# 'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +
# 'ZSB0aHJlZQpBbmQgc28gb24uLi4K'
# puts decode64(str)
# #
# <i>Generates:</i> # require "base64"
# #
# This is line one # enc = Base64.encode64('Send reinforcements')
# This is line two # # -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
# This is line three # plain = Base64.decode64(enc)
# And so on... # # -> "Send reinforcements"
def decode64(str)
str.unpack("m")[0]
end
# Decodes text formatted using a subset of RFC2047 (the one used for
# mime-encoding mail headers). Only supports an encoding type of 'b'
# (base 64), and only supports the character sets ISO-2022-JP and
# SHIFT_JIS (so the only two encoded word sequences recognized are
# <tt>=?ISO-2022-JP?B?...=</tt> and
# <tt>=?SHIFT_JIS?B?...=</tt>). Recognition of these sequences is case
# insensitive.
def decode_b(str)
str.gsub!(/=\?ISO-2022-JP\?B\?([!->@-~]+)\?=/i) {
decode64($1)
}
str = Kconv::toeuc(str)
str.gsub!(/=\?SHIFT_JIS\?B\?([!->@-~]+)\?=/i) {
decode64($1)
}
str = Kconv::toeuc(str)
str.gsub!(/\n/, ' ')
str.gsub!(/\0/, '')
str
end
# Returns the Base64-encoded version of \obj{str}.
# #
# require 'base64' # The purpose of using base64 to encode data is that it translates any
# str = "Once\nupon\na\ntime." #!sh! # binary data into purely printable characters. It is specified in
# enc = encode64(str) # RFC 2045 (http://www.faqs.org/rfcs/rfc2045.html).
# decode64(enc)
def encode64(bin) module Base64
[bin].pack("m") module_function
end
# Prints the Base64 encoded version of _bin_ (a +String+) in lines of # Returns the Base64-decoded version of +str+.
# _len_ (default 60) characters. #
# # require 'base64'
# require 'base64' # str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +
# b64encode("Now is the time for all good coders\nto learn Ruby") # 'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +
# # 'ZSB0aHJlZQpBbmQgc28gb24uLi4K'
# Generates # puts Base64.decode64(str)
# #
# Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g # <i>Generates:</i>
# UnVieQ== #
# This is line one
# This is line two
# This is line three
# And so on...
def b64encode(bin, len = 60) def decode64(str)
encode64(bin).scan(/.{1,#{len}}/o) do str.unpack("m")[0]
print $&, "\n" end
# Decodes text formatted using a subset of RFC2047 (the one used for
# mime-encoding mail headers).
#
# Only supports an encoding type of 'b' (base 64), and only supports
# the character sets ISO-2022-JP and SHIFT_JIS (so the only two
# encoded word sequences recognized are <tt>=?ISO-2022-JP?B?...=</tt> and
# <tt>=?SHIFT_JIS?B?...=</tt>). Recognition of these sequences is case
# insensitive.
def decode_b(str)
str.gsub!(/=\?ISO-2022-JP\?B\?([!->@-~]+)\?=/i) {
decode64($1)
}
str = Kconv::toeuc(str)
str.gsub!(/=\?SHIFT_JIS\?B\?([!->@-~]+)\?=/i) {
decode64($1)
}
str = Kconv::toeuc(str)
str.gsub!(/\n/, ' ')
str.gsub!(/\0/, '')
str
end
# Returns the Base64-encoded version of +str+.
#
# require 'base64'
# Base64.b64encode("Now is the time for all good coders\nto learn Ruby")
#
# <i>Generates:</i>
#
# Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
# UnVieQ==
def encode64(bin)
[bin].pack("m")
end
# _Prints_ the Base64 encoded version of +bin+ (a +String+) in lines of
# +len+ (default 60) characters.
#
# require 'base64'
# data = "Now is the time for all good coders\nto learn Ruby"
# puts Base64.b64encode(data)
#
# <i>Generates:</i>
#
# Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
# UnVieQ==
def b64encode(bin, len = 60)
encode64(bin).scan(/.{1,#{len}}/o) do
print $&, "\n"
end
end
module Deprecated # :nodoc:
include Base64
def _deprecated_base64(*args)
m0, m1 = caller(0)
m = m0[/\`(.*?)\'\z/, 1]
warn("#{m1}: #{m} is deprecated; use Base64.#{m} instead")
super
end
dep = instance_method(:_deprecated_base64)
remove_method(:_deprecated_base64)
for m in Base64.private_instance_methods(false)
define_method(m, dep)
end
end end
end end
include Base64::Deprecated