REBOL [
Title: "Patches"
Date: 3-Jul-2002
Name: Patches
Version: 1.0.0
File: %Patches.r
Author: "Andrew Martin"
Purpose: "Various patches to Rebol."
Email: Al.Bri@xtra.co.nz
Web: http://valley.150m.com
Category: [util 5]
]
; Wraps throw-on-error around 'function body.
if not equal? second third :function [catch] [
Function: func
head insert/only at load mold third :function 2 [catch]
compose/deep [
throw-on-error [
(copy/deep second :function)
]
]
]
; Fixes 'append so it works correctly with 'path! and doesn't evaluate 'Value.
if found? find mold second :append "insert tail series" [
Append: func [
{Appends a value to the tail of a series
and returns the series head.}
Series [series! port! path! word!]
Value [any-type!]
/Only "Appends a block value as a block."
][
head either Only [
insert/only tail :Series :Value
][
insert tail :Series :Value
]
]
]
; Fixes 'repend so it works correctly with 'path!.
if any [
unset? get/any 'repend ; Early Rebel/Core versions don't have repend.
found? find mold second :repend "insert tail series"
][
Repend: func [
{Appends a reduced value to a series
and returns the series head.}
Series [series! port! path! word!]
Value [any-type!]
/Only "Appends a block value as a block."
][
head either Only [
insert/only tail :Series reduce :Value
][
insert tail :Series reduce :Value
]
]
]
; A better choice for http user-agent.
if not found? find system/schemes/http/user-agent "Mozilla" [
system/schemes/http/user-agent: rejoin [
"Mozilla" "/" "4.0"
" (Compatible; REBOL " rebol/version ")"
]
]
; Holger's patch to ftp protocol to eliminate multi-line return bug.
change/only skip find pick find second get in system/schemes/ftp/handler 'open
to-set-word 'parse-dir-list 4 'transfer-check -2 'net-utils/confirm/multiline
; Replaces 'days with 'weekdays, to match /weekdays refinement for date! values.
rebol/Locale: make object! [
Months: rebol/locale/months
Weekdays: rebol/locale/days
]
; Modifies Extract to work with series! and adds /Only refinement.
Extract: function [
"Extracts every N-th value from a Series."
Series [series!]
N [integer!]
/Only "Appends a block value as a block."
][
New
][
New: make Series (length? Series) / N
do compose/deep [
forskip Series N [
(either Only ['insert/only]['insert]) tail New first Series
]
]
New
]
; Adds 'Alter function to Rebol/Core, which is present in Rebol/View.
if not value? 'alter [
Alter: function [
{If a value is not in the list, append it. Otherwise, remove it.}
List
Value
] [
Temp
] [
either Temp: find List Value [
remove Temp
][
append List Value
]
]
]
; Fixes 'array function.
Array: func [
"Makes and initializes a series of a given size."
size [integer! block!] "Size or block of sizes for each dimension"
/initial "Specify an initial value for all elements"
value "Initial value"
/local block rest
] [
if not initial [
value: none
]
rest: none
if block? size [
rest: next size
if tail? rest [
rest: none
]
size: first size
if not integer? size [
make error! "Integer size required"
]
]
block: make block! size
either not rest [
either series? value [
loop size [
insert/only block copy/deep value
]
] [
insert/dup block value size
]
] [
loop size [
block: insert/only block array/initial rest value
]
]
head block
]
; Removes 'plus-to-space from 'decode-cgi.
Decode-CGI: function [
{Converts CGI argument string to a block of set-words and value strings.}
Args [any-string!] "Starts at first argument word."
] [
Block Name Value
] [
Block: make block! 10
parse/all Args [
any [
copy Name to #"=" skip (
append Block to-set-word Name
)
[
#"&" (
append Block copy ""
)
| [copy Value to "&" "&" | copy Value to end] (
append Block either none? Value [
copy ""
] [
replace/all dehex replace/all Value #"+" #" " CRLF newline
]
)
]
]
end
]
Block
]