* lib/net/imap.rb: hack for speed.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1018 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shugo 2000-10-26 08:19:04 +00:00
parent 1488b9b458
commit cac38b30e5

View File

@ -430,7 +430,7 @@ module Net
def get_all_responses(tag, cmd, &block) def get_all_responses(tag, cmd, &block)
while resp = get_response while resp = get_response
if @@debug if @@debug
$stderr.puts(resp.inspect) $stderr.printf("R: %s\n", resp.inspect)
end end
case resp case resp
when TaggedResponse when TaggedResponse
@ -754,10 +754,11 @@ module Net
private private
EXPR_BEG = :BEG EXPR_BEG = :EXPR_BEG
EXPR_TEXT = :TEXT EXPR_DATA = :EXPR_DATA
EXPR_RTEXT = :RTEXT EXPR_TEXT = :EXPR_TEXT
EXPR_CTEXT = :CTEXT EXPR_RTEXT = :EXPR_RTEXT
EXPR_CTEXT = :EXPR_CTEXT
T_SPACE = :SPACE T_SPACE = :SPACE
T_NIL = :NIL T_NIL = :NIL
@ -795,6 +796,15 @@ module Net
(?# 15: CRLF )(\r\n)|\ (?# 15: CRLF )(\r\n)|\
(?# 16: EOF )(\z))/ni (?# 16: EOF )(\z))/ni
DATA_REGEXP = /\G(?:\
(?# 1: SPACE )( )|\
(?# 2: NIL )(NIL)|\
(?# 3: NUMBER )(\d+)|\
(?# 4: QUOTED )"((?:[^\x80-\xff\x00\r\n"\\]|\\["\\])*)"|\
(?# 5: LITERAL )\{(\d+)\}\r\n|\
(?# 6: LPAR )(\()|\
(?# 7: RPAR )(\)))/ni
TEXT_REGEXP = /\G(?:\ TEXT_REGEXP = /\G(?:\
(?# 1: TEXT )([^\x00\x80-\xff\r\n]*))/ni (?# 1: TEXT )([^\x00\x80-\xff\r\n]*))/ni
@ -932,6 +942,7 @@ module Net
end end
def envelope def envelope
@lex_state = EXPR_DATA
match(T_LPAR) match(T_LPAR)
date = nstring date = nstring
match(T_SPACE) match(T_SPACE)
@ -953,6 +964,7 @@ module Net
match(T_SPACE) match(T_SPACE)
message_id = nstring message_id = nstring
match(T_RPAR) match(T_RPAR)
@lex_state = EXPR_BEG
return Envelope.new(date, subject, from, sender, reply_to, return Envelope.new(date, subject, from, sender, reply_to,
to, cc, bcc, in_reply_to, message_id) to, cc, bcc, in_reply_to, message_id)
end end
@ -1006,6 +1018,7 @@ module Net
end end
def body def body
@lex_state = EXPR_DATA
match(T_LPAR) match(T_LPAR)
token = lookahead token = lookahead
if token.symbol == T_LPAR if token.symbol == T_LPAR
@ -1014,6 +1027,7 @@ module Net
result = body_type_1part result = body_type_1part
end end
match(T_RPAR) match(T_RPAR)
@lex_state = EXPR_BEG
return result return result
end end
@ -1639,7 +1653,7 @@ module Net
return Token.new(T_ATOM, $+) return Token.new(T_ATOM, $+)
elsif $5 elsif $5
return Token.new(T_QUOTED, return Token.new(T_QUOTED,
$+.gsub(/\\(["\\])/n, "\\1")) $+.gsub(/\\(["\\])/n, "\\1"))
elsif $6 elsif $6
return Token.new(T_LPAR, $+) return Token.new(T_LPAR, $+)
elsif $7 elsif $7
@ -1672,6 +1686,34 @@ module Net
@str.index(/\S*/n, @pos) @str.index(/\S*/n, @pos)
parse_error("unknown token - %s", $&.dump) parse_error("unknown token - %s", $&.dump)
end end
when EXPR_DATA
if @str.index(DATA_REGEXP, @pos)
@pos = $~.end(0)
if $1
return Token.new(T_SPACE, $+)
elsif $2
return Token.new(T_NIL, $+)
elsif $3
return Token.new(T_NUMBER, $+)
elsif $4
return Token.new(T_QUOTED,
$+.gsub(/\\(["\\])/n, "\\1"))
elsif $5
len = $+.to_i
val = @str[@pos, len]
@pos += len
return Token.new(T_LITERAL, val)
elsif $6
return Token.new(T_LPAR, $+)
elsif $7
return Token.new(T_RPAR, $+)
else
parse_error("[Net::IMAP BUG] BEG_REGEXP is invalid")
end
else
@str.index(/\S*/n, @pos)
parse_error("unknown token - %s", $&.dump)
end
when EXPR_TEXT when EXPR_TEXT
if @str.index(TEXT_REGEXP, @pos) if @str.index(TEXT_REGEXP, @pos)
@pos = $~.end(0) @pos = $~.end(0)